From 62e5680eaffd8de0017254f0d0ef04a81164a3dc Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 9 Dec 2021 15:35:40 -0500 Subject: [PATCH 001/271] Closes #7731: Require Python 3.8 or later --- .github/workflows/ci.yml | 2 +- docs/index.md | 2 +- docs/installation/3-netbox.md | 15 +++++---------- docs/installation/index.md | 2 +- docs/installation/upgrading.md | 6 +++--- docs/plugins/development.md | 4 ++-- docs/release-notes/version-3.2.md | 10 ++++++++++ netbox/netbox/settings.py | 10 +++------- 8 files changed, 26 insertions(+), 25 deletions(-) create mode 100644 docs/release-notes/version-3.2.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8e3f47ab1c..a898ab58d2d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7, 3.8, 3.9] + python-version: [3.8, 3.9, 3.10] node-version: [14.x] services: redis: diff --git a/docs/index.md b/docs/index.md index 7abbd9310e9..02e52382524 100644 --- a/docs/index.md +++ b/docs/index.md @@ -54,7 +54,7 @@ NetBox is built on the [Django](https://djangoproject.com/) Python framework and ## Supported Python Versions -NetBox supports Python 3.7, 3.8, and 3.9 environments currently. (Support for Python 3.6 was removed in NetBox v3.0.) +NetBox supports Python 3.8, 3.9, and 3.10 environments. ## Getting Started diff --git a/docs/installation/3-netbox.md b/docs/installation/3-netbox.md index b1e1e832e5a..cf9c1964101 100644 --- a/docs/installation/3-netbox.md +++ b/docs/installation/3-netbox.md @@ -6,8 +6,8 @@ This section of the documentation discusses installing and configuring the NetBo Begin by installing all system packages required by NetBox and its dependencies. -!!! warning "Python 3.7 or later required" - NetBox v3.0 and v3.1 require Python 3.7, 3.8, or 3.9. It is recommended to install at least Python v3.8, as this will become the minimum supported Python version in NetBox v3.2. +!!! warning "Python 3.8 or later required" + NetBox v3.2 requires Python 3.8, 3.9, or 3.10. === "Ubuntu" @@ -17,16 +17,11 @@ Begin by installing all system packages required by NetBox and its dependencies. === "CentOS" - !!! warning - CentOS 8 does not provide Python 3.7 or later via its native package manager. You will need to install it via some other means. [Here is an example](https://tecadmin.net/install-python-3-7-on-centos-8/) of installing Python 3.7 from source. - - Once you have Python 3.7 or later installed, install the remaining system packages: - ```no-highlight sudo yum install -y gcc libxml2-devel libxslt-devel libffi-devel libpq-devel openssl-devel redhat-rpm-config ``` -Before continuing, check that your installed Python version is at least 3.7: +Before continuing, check that your installed Python version is at least 3.8: ```no-highlight python3 -V @@ -234,10 +229,10 @@ Once NetBox has been configured, we're ready to proceed with the actual installa sudo /opt/netbox/upgrade.sh ``` -Note that **Python 3.7 or later is required** for NetBox v3.0 and later releases. If the default Python installation on your server is set to a lesser version, pass the path to the supported installation as an environment variable named `PYTHON`. (Note that the environment variable must be passed _after_ the `sudo` command.) +Note that **Python 3.8 or later is required** for NetBox v3.2 and later releases. If the default Python installation on your server is set to a lesser version, pass the path to the supported installation as an environment variable named `PYTHON`. (Note that the environment variable must be passed _after_ the `sudo` command.) ```no-highlight -sudo PYTHON=/usr/bin/python3.7 /opt/netbox/upgrade.sh +sudo PYTHON=/usr/bin/python3.8 /opt/netbox/upgrade.sh ``` !!! note diff --git a/docs/installation/index.md b/docs/installation/index.md index 74b51da7fd0..accabd8cc73 100644 --- a/docs/installation/index.md +++ b/docs/installation/index.md @@ -19,7 +19,7 @@ The video below demonstrates the installation of NetBox v3.0 on Ubuntu 20.04 for | Dependency | Minimum Version | |------------|-----------------| -| Python | 3.7 | +| Python | 3.8 | | PostgreSQL | 10 | | Redis | 4.0 | diff --git a/docs/installation/upgrading.md b/docs/installation/upgrading.md index d7f7156c83b..56b66c10d74 100644 --- a/docs/installation/upgrading.md +++ b/docs/installation/upgrading.md @@ -10,7 +10,7 @@ NetBox v3.0 and later requires the following: | Dependency | Minimum Version | |------------|-----------------| -| Python | 3.7 | +| Python | 3.8 | | PostgreSQL | 10 | | Redis | 4.0 | @@ -76,10 +76,10 @@ sudo ./upgrade.sh ``` !!! warning - If the default version of Python is not at least 3.7, you'll need to pass the path to a supported Python version as an environment variable when calling the upgrade script. For example: + If the default version of Python is not at least 3.8, you'll need to pass the path to a supported Python version as an environment variable when calling the upgrade script. For example: ```no-highlight - sudo PYTHON=/usr/bin/python3.7 ./upgrade.sh + sudo PYTHON=/usr/bin/python3.8 ./upgrade.sh ``` This script performs the following actions: diff --git a/docs/plugins/development.md b/docs/plugins/development.md index cde659a4500..89436a321ff 100644 --- a/docs/plugins/development.md +++ b/docs/plugins/development.md @@ -48,7 +48,7 @@ The plugin source directory contains all the actual Python code and other resour ### Create setup.py -`setup.py` is the [setup script](https://docs.python.org/3.7/distutils/setupscript.html) we'll use to install our plugin once it's finished. The primary function of this script is to call the setuptools library's `setup()` function to create a Python distribution package. We can pass a number of keyword arguments to inform the package creation as well as to provide metadata about the plugin. An example `setup.py` is below: +`setup.py` is the [setup script](https://docs.python.org/3.8/distutils/setupscript.html) we'll use to install our plugin once it's finished. The primary function of this script is to call the setuptools library's `setup()` function to create a Python distribution package. We can pass a number of keyword arguments to inform the package creation as well as to provide metadata about the plugin. An example `setup.py` is below: ```python from setuptools import find_packages, setup @@ -129,7 +129,7 @@ python3 -m venv /path/to/my/venv You can make NetBox available within this environment by creating a path file pointing to its location. This will add NetBox to the Python path upon activation. (Be sure to adjust the command below to specify your actual virtual environment path, Python version, and NetBox installation.) ```shell -cd $VENV/lib/python3.7/site-packages/ +cd $VENV/lib/python3.8/site-packages/ echo /opt/netbox/netbox > netbox.pth ``` diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md new file mode 100644 index 00000000000..2c4dafc5a99 --- /dev/null +++ b/docs/release-notes/version-3.2.md @@ -0,0 +1,10 @@ +# NetBox v3.2 + +## v3.2.0 (FUTURE) + +!!! warning "Python 3.8 or Later Required" + NetBox v3.2 requires Python 3.8 or later. + +### Other Changes + +* [#7731](https://github.com/netbox-community/netbox/issues/7731) - Require Python 3.8 or later diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 40c31b74d1a..9bc0dbc0c14 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -19,7 +19,7 @@ from netbox.config import PARAMS # Environment setup # -VERSION = '3.1.1-dev' +VERSION = '3.2.0-dev' # Hostname HOSTNAME = platform.node() @@ -28,13 +28,9 @@ HOSTNAME = platform.node() BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Validate Python version -if sys.version_info < (3, 7): - raise RuntimeError( - f"NetBox requires Python 3.7 or later. (Currently installed: Python {platform.python_version()})" - ) if sys.version_info < (3, 8): - warnings.warn( - f"NetBox v3.2 will require Python 3.8 or later. (Currently installed: Python {platform.python_version()})" + raise RuntimeError( + f"NetBox requires Python 3.8 or later. (Currently installed: Python {platform.python_version()})" ) From 78ca6f1a8768420ae888803d58ef492ef308bdc0 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 9 Dec 2021 15:39:50 -0500 Subject: [PATCH 002/271] Use strings for build matrix --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a898ab58d2d..9b0392d8950 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,8 +5,8 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.8, 3.9, 3.10] - node-version: [14.x] + python-version: ['3.8', '3.9', '3.10'] + node-version: ['14.x'] services: redis: image: redis From 86809819906cc82b06e94a8e1b0fb2b4ab6ca8fd Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 9 Dec 2021 15:43:41 -0500 Subject: [PATCH 003/271] Closes #8031: Remove automatic redirection of legacy slug-based URLs --- docs/release-notes/version-3.2.md | 5 +++++ netbox/circuits/urls.py | 2 -- netbox/dcim/urls.py | 2 -- netbox/tenancy/urls.py | 2 -- netbox/utilities/views.py | 11 ----------- 5 files changed, 5 insertions(+), 17 deletions(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 2c4dafc5a99..953ac36fed2 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -5,6 +5,11 @@ !!! warning "Python 3.8 or Later Required" NetBox v3.2 requires Python 3.8 or later. +### Breaking Changes + +* Automatic redirection of legacy slug-based URL paths has been removed. + ### Other Changes * [#7731](https://github.com/netbox-community/netbox/issues/7731) - Require Python 3.8 or later +* [#8031](https://github.com/netbox-community/netbox/issues/8031) - Remove automatic redirection of legacy slug-based URLs diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index 1cea1965e54..e634eeeb4ac 100644 --- a/netbox/circuits/urls.py +++ b/netbox/circuits/urls.py @@ -2,7 +2,6 @@ from django.urls import path from dcim.views import CableCreateView, PathTraceView from extras.views import ObjectChangeLogView, ObjectJournalView -from utilities.views import SlugRedirectView from . import views from .models import * @@ -16,7 +15,6 @@ urlpatterns = [ path('providers/edit/', views.ProviderBulkEditView.as_view(), name='provider_bulk_edit'), path('providers/delete/', views.ProviderBulkDeleteView.as_view(), name='provider_bulk_delete'), path('providers//', views.ProviderView.as_view(), name='provider'), - path('providers//', SlugRedirectView.as_view(), kwargs={'model': Provider}), path('providers//edit/', views.ProviderEditView.as_view(), name='provider_edit'), path('providers//delete/', views.ProviderDeleteView.as_view(), name='provider_delete'), path('providers//changelog/', ObjectChangeLogView.as_view(), name='provider_changelog', kwargs={'model': Provider}), diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index dd81ca2ba5b..713116f5eb7 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -2,7 +2,6 @@ from django.urls import path from extras.views import ObjectChangeLogView, ObjectJournalView from ipam.views import ServiceEditView -from utilities.views import SlugRedirectView from . import views from .models import * @@ -38,7 +37,6 @@ urlpatterns = [ path('sites/edit/', views.SiteBulkEditView.as_view(), name='site_bulk_edit'), path('sites/delete/', views.SiteBulkDeleteView.as_view(), name='site_bulk_delete'), path('sites//', views.SiteView.as_view(), name='site'), - path('sites//', SlugRedirectView.as_view(), kwargs={'model': Site}), path('sites//edit/', views.SiteEditView.as_view(), name='site_edit'), path('sites//delete/', views.SiteDeleteView.as_view(), name='site_delete'), path('sites//changelog/', ObjectChangeLogView.as_view(), name='site_changelog', kwargs={'model': Site}), diff --git a/netbox/tenancy/urls.py b/netbox/tenancy/urls.py index b20e1c3d1c3..6b3565bfbbc 100644 --- a/netbox/tenancy/urls.py +++ b/netbox/tenancy/urls.py @@ -1,7 +1,6 @@ from django.urls import path from extras.views import ObjectChangeLogView, ObjectJournalView -from utilities.views import SlugRedirectView from . import views from .models import * @@ -26,7 +25,6 @@ urlpatterns = [ path('tenants/edit/', views.TenantBulkEditView.as_view(), name='tenant_bulk_edit'), path('tenants/delete/', views.TenantBulkDeleteView.as_view(), name='tenant_bulk_delete'), path('tenants//', views.TenantView.as_view(), name='tenant'), - path('tenants//', SlugRedirectView.as_view(), kwargs={'model': Tenant}), path('tenants//edit/', views.TenantEditView.as_view(), name='tenant_edit'), path('tenants//delete/', views.TenantDeleteView.as_view(), name='tenant_delete'), path('tenants//changelog/', ObjectChangeLogView.as_view(), name='tenant_changelog', kwargs={'model': Tenant}), diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index a3afcb1c6e1..efea0b867d9 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -125,14 +125,3 @@ class GetReturnURLMixin: # If all else fails, return home. Ideally this should never happen. return reverse('home') - - -# -# Views -# - -class SlugRedirectView(View): - - def get(self, request, model, slug): - obj = get_object_or_404(model.objects.restrict(request.user, 'view'), slug=slug) - return redirect(obj.get_absolute_url()) From d2d29782886e89e30456d9a21716817214d0949d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 9 Dec 2021 16:20:24 -0500 Subject: [PATCH 004/271] Closes #7748: Remove legacy contact fields from site model --- docs/release-notes/version-3.2.md | 7 +++ netbox/dcim/api/serializers.py | 6 +-- netbox/dcim/filtersets.py | 10 ++-- netbox/dcim/forms/bulk_import.py | 3 +- netbox/dcim/forms/models.py | 9 ++-- .../0144_site_remove_deprecated_fields.py | 23 ++++++++++ netbox/dcim/models/sites.py | 14 +----- netbox/dcim/tables/sites.py | 3 +- netbox/dcim/tests/test_filtersets.py | 18 ++------ netbox/dcim/tests/test_views.py | 3 -- netbox/templates/dcim/site.html | 46 ------------------- 11 files changed, 45 insertions(+), 97 deletions(-) create mode 100644 netbox/dcim/migrations/0144_site_remove_deprecated_fields.py diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 953ac36fed2..5a0b266f883 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -8,8 +8,15 @@ ### Breaking Changes * Automatic redirection of legacy slug-based URL paths has been removed. +* The `contact_name`, `contact_phone`, and `contact_email` fields have been removed from the site model. Please use the new contact model introduced in NetBox v3.1 to store contact information for sites. ### Other Changes * [#7731](https://github.com/netbox-community/netbox/issues/7731) - Require Python 3.8 or later +* [#7748](https://github.com/netbox-community/netbox/issues/7748) - Remove legacy contact fields from site model * [#8031](https://github.com/netbox-community/netbox/issues/8031) - Remove automatic redirection of legacy slug-based URLs + +### REST API Changes + +* dcim.Site + * Removed the `contact_name`, `contact_phone`, and `contact_email` fields diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 45930c5f53a..02c845091b8 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -133,9 +133,9 @@ class SiteSerializer(PrimaryModelSerializer): model = Site fields = [ 'id', 'url', 'display', 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'asn', 'asns', - 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', - 'contact_phone', 'contact_email', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', - 'circuit_count', 'device_count', 'prefix_count', 'rack_count', 'virtualmachine_count', 'vlan_count', + 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', + 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', 'prefix_count', + 'rack_count', 'virtualmachine_count', 'vlan_count', ] diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 35d20f44b6e..134a555f4b4 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -140,10 +140,9 @@ class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet): class Meta: model = Site - fields = [ - 'id', 'name', 'slug', 'facility', 'asn', 'latitude', 'longitude', 'contact_name', 'contact_phone', - 'contact_email', - ] + fields = ( + 'id', 'name', 'slug', 'facility', 'asn', 'latitude', 'longitude', + ) def search(self, queryset, name, value): if not value.strip(): @@ -154,9 +153,6 @@ class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet): Q(description__icontains=value) | Q(physical_address__icontains=value) | Q(shipping_address__icontains=value) | - Q(contact_name__icontains=value) | - Q(contact_phone__icontains=value) | - Q(contact_email__icontains=value) | Q(comments__icontains=value) ) try: diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index df8c4ec01bb..081f8d466a4 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -96,8 +96,7 @@ class SiteCSVForm(CustomFieldModelCSVForm): model = Site fields = ( 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'time_zone', 'description', - 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', - 'contact_email', 'comments', + 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', ) help_texts = { 'time_zone': mark_safe( diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index db2f58a636b..309b203b127 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -132,8 +132,8 @@ class SiteForm(TenancyForm, CustomFieldModelForm): model = Site fields = [ 'name', 'slug', 'status', 'region', 'group', 'tenant_group', 'tenant', 'facility', 'asn', 'asns', - 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', - 'contact_phone', 'contact_email', 'comments', 'tags', + 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', + 'tags', ] fieldsets = ( ('Site', ( @@ -141,10 +141,7 @@ class SiteForm(TenancyForm, CustomFieldModelForm): 'tags', )), ('Tenancy', ('tenant_group', 'tenant')), - ('Contact Info', ( - 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', - 'contact_email', - )), + ('Contact Info', ('physical_address', 'shipping_address', 'latitude', 'longitude')), ) widgets = { 'physical_address': SmallTextarea( diff --git a/netbox/dcim/migrations/0144_site_remove_deprecated_fields.py b/netbox/dcim/migrations/0144_site_remove_deprecated_fields.py new file mode 100644 index 00000000000..14554d0a0ad --- /dev/null +++ b/netbox/dcim/migrations/0144_site_remove_deprecated_fields.py @@ -0,0 +1,23 @@ +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0143_remove_primary_for_related_name'), + ] + + operations = [ + migrations.RemoveField( + model_name='site', + name='contact_email', + ), + migrations.RemoveField( + model_name='site', + name='contact_name', + ), + migrations.RemoveField( + model_name='site', + name='contact_phone', + ), + ] diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index a19ae805070..5dd05734c3e 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -288,18 +288,6 @@ class Site(PrimaryModel): null=True, help_text='GPS coordinate (longitude)' ) - contact_name = models.CharField( - max_length=50, - blank=True - ) - contact_phone = models.CharField( - max_length=20, - blank=True - ) - contact_email = models.EmailField( - blank=True, - verbose_name='Contact E-mail' - ) comments = models.TextField( blank=True ) @@ -320,7 +308,7 @@ class Site(PrimaryModel): clone_fields = [ 'status', 'region', 'group', 'tenant', 'facility', 'asn', 'time_zone', 'description', 'physical_address', - 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', 'contact_email', + 'shipping_address', 'latitude', 'longitude', ] class Meta: diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 8ef17c6f2a5..ceca41c86b8 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -97,8 +97,7 @@ class SiteTable(BaseTable): model = Site fields = ( 'pk', 'id', 'name', 'slug', 'status', 'facility', 'region', 'group', 'tenant', 'asn_count', 'time_zone', - 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', - 'contact_phone', 'contact_email', 'comments', 'tags', + 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', 'tags', ) default_columns = ('pk', 'name', 'status', 'facility', 'region', 'group', 'tenant', 'description') diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index ab290f79166..396355ebb27 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -151,9 +151,9 @@ class SiteTestCase(TestCase, ChangeLoggedFilterSetTests): ASN.objects.bulk_create(asns) sites = ( - Site(name='Site 1', slug='site-1', region=regions[0], group=groups[0], tenant=tenants[0], status=SiteStatusChoices.STATUS_ACTIVE, facility='Facility 1', asn=65001, latitude=10, longitude=10, contact_name='Contact 1', contact_phone='123-555-0001', contact_email='contact1@example.com'), - Site(name='Site 2', slug='site-2', region=regions[1], group=groups[1], tenant=tenants[1], status=SiteStatusChoices.STATUS_PLANNED, facility='Facility 2', asn=65002, latitude=20, longitude=20, contact_name='Contact 2', contact_phone='123-555-0002', contact_email='contact2@example.com'), - Site(name='Site 3', slug='site-3', region=regions[2], group=groups[2], tenant=tenants[2], status=SiteStatusChoices.STATUS_RETIRED, facility='Facility 3', asn=65003, latitude=30, longitude=30, contact_name='Contact 3', contact_phone='123-555-0003', contact_email='contact3@example.com'), + Site(name='Site 1', slug='site-1', region=regions[0], group=groups[0], tenant=tenants[0], status=SiteStatusChoices.STATUS_ACTIVE, facility='Facility 1', asn=65001, latitude=10, longitude=10), + Site(name='Site 2', slug='site-2', region=regions[1], group=groups[1], tenant=tenants[1], status=SiteStatusChoices.STATUS_PLANNED, facility='Facility 2', asn=65002, latitude=20, longitude=20), + Site(name='Site 3', slug='site-3', region=regions[2], group=groups[2], tenant=tenants[2], status=SiteStatusChoices.STATUS_RETIRED, facility='Facility 3', asn=65003, latitude=30, longitude=30), ) Site.objects.bulk_create(sites) sites[0].asns.set([asns[0]]) @@ -189,18 +189,6 @@ class SiteTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'longitude': [10, 20]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_contact_name(self): - params = {'contact_name': ['Contact 1', 'Contact 2']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_contact_phone(self): - params = {'contact_phone': ['123-555-0001', '123-555-0002']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_contact_email(self): - params = {'contact_email': ['contact1@example.com', 'contact2@example.com']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_status(self): params = {'status': [SiteStatusChoices.STATUS_ACTIVE, SiteStatusChoices.STATUS_PLANNED]} 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 154ea03c348..4706cdc6af3 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -144,9 +144,6 @@ class SiteTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'shipping_address': '742 Evergreen Terrace, Springfield, USA', 'latitude': Decimal('35.780000'), 'longitude': Decimal('-78.642000'), - 'contact_name': 'Hank Hill', - 'contact_phone': '123-555-9999', - 'contact_email': 'hank@stricklandpropane.com', 'comments': 'Test site', 'tags': [t.pk for t in tags], } diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index 2ad970301ac..a8d39be4032 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -127,52 +127,6 @@ {% endif %} - {# Legacy contact fields #} - {% with deprecation_warning="This field will be removed in a future release. Please migrate this data to contact objects." %} - {% if object.contact_name %} - - Contact Name - - {% if object.contact_name %} -
- -
- {% endif %} - {{ object.contact_name|placeholder }} - - - {% endif %} - {% if object.contact_phone %} - - Contact Phone - - {% if object.contact_phone %} -
- -
- {{ object.contact_phone }} - {% else %} - - {% endif %} - - - {% endif %} - {% if object.contact_email %} - - Contact E-Mail - - {% if object.contact_email %} -
- -
- {{ object.contact_email }} - {% else %} - - {% endif %} - - - {% endif %} - {% endwith %} From 7d99e15dc30c8637b7cc04b153cd4ad95d25f001 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 9 Dec 2021 16:56:22 -0500 Subject: [PATCH 005/271] Closes #7743: Remove legacy ASN field from site model --- docs/release-notes/version-3.2.md | 5 +- netbox/dcim/api/serializers.py | 2 +- netbox/dcim/filtersets.py | 8 +- netbox/dcim/forms/bulk_edit.py | 8 +- netbox/dcim/forms/models.py | 13 ++- .../0144_site_remove_deprecated_fields.py | 4 + netbox/dcim/models/sites.py | 8 +- netbox/dcim/tests/test_filtersets.py | 8 +- netbox/extras/tests/test_customvalidator.py | 17 ++-- netbox/templates/dcim/site.html | 4 - netbox/utilities/tests/test_filters.py | 89 +++++++++---------- 11 files changed, 80 insertions(+), 86 deletions(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 5a0b266f883..a92968bc9a8 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -8,15 +8,18 @@ ### Breaking Changes * Automatic redirection of legacy slug-based URL paths has been removed. +* The `asn` field has been removed from the site model. Please use the ASN model introduced in NetBox v3.1 to track ASN assignments for sites. +* The `asn` query filter for sites now matches against the AS number of assigned ASNs. * The `contact_name`, `contact_phone`, and `contact_email` fields have been removed from the site model. Please use the new contact model introduced in NetBox v3.1 to store contact information for sites. ### Other Changes * [#7731](https://github.com/netbox-community/netbox/issues/7731) - Require Python 3.8 or later +* [#7743](https://github.com/netbox-community/netbox/issues/7743) - Remove legacy ASN field from site model * [#7748](https://github.com/netbox-community/netbox/issues/7748) - Remove legacy contact fields from site model * [#8031](https://github.com/netbox-community/netbox/issues/8031) - Remove automatic redirection of legacy slug-based URLs ### REST API Changes * dcim.Site - * Removed the `contact_name`, `contact_phone`, and `contact_email` fields + * Removed the `asn`, `contact_name`, `contact_phone`, and `contact_email` fields diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 02c845091b8..113c71745e9 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -132,7 +132,7 @@ class SiteSerializer(PrimaryModelSerializer): class Meta: model = Site fields = [ - 'id', 'url', 'display', 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'asn', 'asns', + 'id', 'url', 'display', 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'asns', 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', 'prefix_count', 'rack_count', 'virtualmachine_count', 'vlan_count', diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 134a555f4b4..990c5511524 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -131,6 +131,12 @@ class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label='Group (slug)', ) + asn = django_filters.ModelMultipleChoiceFilter( + field_name='asns__asn', + queryset=ASN.objects.all(), + to_field_name='asn', + label='AS (ID)', + ) asn_id = django_filters.ModelMultipleChoiceFilter( field_name='asns', queryset=ASN.objects.all(), @@ -141,7 +147,7 @@ class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet): class Meta: model = Site fields = ( - 'id', 'name', 'slug', 'facility', 'asn', 'latitude', 'longitude', + 'id', 'name', 'slug', 'facility', 'latitude', 'longitude', ) def search(self, queryset, name, value): diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 9127b072f70..a40396e9888 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -111,12 +111,6 @@ class SiteBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - asn = forms.IntegerField( - min_value=BGP_ASN_MIN, - max_value=BGP_ASN_MAX, - required=False, - label='ASN' - ) asns = DynamicModelMultipleChoiceField( queryset=ASN.objects.all(), label=_('ASNs'), @@ -134,7 +128,7 @@ class SiteBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): class Meta: nullable_fields = [ - 'region', 'group', 'tenant', 'asn', 'asns', 'description', 'time_zone', + 'region', 'group', 'tenant', 'asns', 'description', 'time_zone', ] diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 309b203b127..d16cf3dd110 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -130,15 +130,13 @@ class SiteForm(TenancyForm, CustomFieldModelForm): class Meta: model = Site - fields = [ - 'name', 'slug', 'status', 'region', 'group', 'tenant_group', 'tenant', 'facility', 'asn', 'asns', - 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', - 'tags', - ] + fields = ( + 'name', 'slug', 'status', 'region', 'group', 'tenant_group', 'tenant', 'facility', 'asns', 'time_zone', + 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', 'tags', + ) fieldsets = ( ('Site', ( - 'name', 'slug', 'status', 'region', 'group', 'facility', 'asn', 'asns', 'time_zone', 'description', - 'tags', + 'name', 'slug', 'status', 'region', 'group', 'facility', 'asns', 'time_zone', 'description', 'tags', )), ('Tenancy', ('tenant_group', 'tenant')), ('Contact Info', ('physical_address', 'shipping_address', 'latitude', 'longitude')), @@ -159,7 +157,6 @@ class SiteForm(TenancyForm, CustomFieldModelForm): } help_texts = { 'name': "Full name of the site", - 'asn': "BGP autonomous system number. This field is depreciated in favour of the ASN model", 'facility': "Data center provider and facility (e.g. Equinix NY7)", 'time_zone': "Local time zone", 'description': "Short description (will appear in sites list)", diff --git a/netbox/dcim/migrations/0144_site_remove_deprecated_fields.py b/netbox/dcim/migrations/0144_site_remove_deprecated_fields.py index 14554d0a0ad..1dcf4d43ca7 100644 --- a/netbox/dcim/migrations/0144_site_remove_deprecated_fields.py +++ b/netbox/dcim/migrations/0144_site_remove_deprecated_fields.py @@ -8,6 +8,10 @@ class Migration(migrations.Migration): ] operations = [ + migrations.RemoveField( + model_name='site', + name='asn', + ), migrations.RemoveField( model_name='site', name='contact_email', diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index 5dd05734c3e..0be7e4617c3 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -248,12 +248,6 @@ class Site(PrimaryModel): blank=True, help_text='Local facility ID or description' ) - asn = ASNField( - blank=True, - null=True, - verbose_name='ASN', - help_text='32-bit autonomous system number' - ) asns = models.ManyToManyField( to='ipam.ASN', related_name='sites', @@ -307,7 +301,7 @@ class Site(PrimaryModel): ) clone_fields = [ - 'status', 'region', 'group', 'tenant', 'facility', 'asn', 'time_zone', 'description', 'physical_address', + 'status', 'region', 'group', 'tenant', 'facility', 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', ] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 396355ebb27..a187c8881ee 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -151,9 +151,9 @@ class SiteTestCase(TestCase, ChangeLoggedFilterSetTests): ASN.objects.bulk_create(asns) sites = ( - Site(name='Site 1', slug='site-1', region=regions[0], group=groups[0], tenant=tenants[0], status=SiteStatusChoices.STATUS_ACTIVE, facility='Facility 1', asn=65001, latitude=10, longitude=10), - Site(name='Site 2', slug='site-2', region=regions[1], group=groups[1], tenant=tenants[1], status=SiteStatusChoices.STATUS_PLANNED, facility='Facility 2', asn=65002, latitude=20, longitude=20), - Site(name='Site 3', slug='site-3', region=regions[2], group=groups[2], tenant=tenants[2], status=SiteStatusChoices.STATUS_RETIRED, facility='Facility 3', asn=65003, latitude=30, longitude=30), + Site(name='Site 1', slug='site-1', region=regions[0], group=groups[0], tenant=tenants[0], status=SiteStatusChoices.STATUS_ACTIVE, facility='Facility 1', latitude=10, longitude=10), + Site(name='Site 2', slug='site-2', region=regions[1], group=groups[1], tenant=tenants[1], status=SiteStatusChoices.STATUS_PLANNED, facility='Facility 2', latitude=20, longitude=20), + Site(name='Site 3', slug='site-3', region=regions[2], group=groups[2], tenant=tenants[2], status=SiteStatusChoices.STATUS_RETIRED, facility='Facility 3', latitude=30, longitude=30), ) Site.objects.bulk_create(sites) sites[0].asns.set([asns[0]]) @@ -173,7 +173,7 @@ class SiteTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_asn(self): - params = {'asn': [65001, 65002]} + params = {'asn': ['64512', '64513']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_asn_id(self): diff --git a/netbox/extras/tests/test_customvalidator.py b/netbox/extras/tests/test_customvalidator.py index 89857b61562..ce3b572d137 100644 --- a/netbox/extras/tests/test_customvalidator.py +++ b/netbox/extras/tests/test_customvalidator.py @@ -2,6 +2,7 @@ from django.conf import settings from django.core.exceptions import ValidationError from django.test import TestCase, override_settings +from circuits.models import Provider from dcim.models import Site from extras.validators import CustomValidator @@ -66,26 +67,26 @@ custom_validator = MyValidator() class CustomValidatorTest(TestCase): - @override_settings(CUSTOM_VALIDATORS={'dcim.site': [min_validator]}) + @override_settings(CUSTOM_VALIDATORS={'circuits.provider': [min_validator]}) def test_configuration(self): - self.assertIn('dcim.site', settings.CUSTOM_VALIDATORS) - validator = settings.CUSTOM_VALIDATORS['dcim.site'][0] + self.assertIn('circuits.provider', settings.CUSTOM_VALIDATORS) + validator = settings.CUSTOM_VALIDATORS['circuits.provider'][0] self.assertIsInstance(validator, CustomValidator) - @override_settings(CUSTOM_VALIDATORS={'dcim.site': [min_validator]}) + @override_settings(CUSTOM_VALIDATORS={'circuits.provider': [min_validator]}) def test_min(self): with self.assertRaises(ValidationError): - Site(name='abcdef123', slug='abcdefghijk', asn=1).clean() + Provider(name='Provider 1', slug='provider-1', asn=1).clean() - @override_settings(CUSTOM_VALIDATORS={'dcim.site': [max_validator]}) + @override_settings(CUSTOM_VALIDATORS={'circuits.provider': [max_validator]}) def test_max(self): with self.assertRaises(ValidationError): - Site(name='abcdef123', slug='abcdefghijk', asn=65535).clean() + Provider(name='Provider 1', slug='provider-1', asn=65535).clean() @override_settings(CUSTOM_VALIDATORS={'dcim.site': [min_length_validator]}) def test_min_length(self): with self.assertRaises(ValidationError): - Site(name='abc', slug='abc', asn=65000).clean() + Site(name='abc', slug='abc').clean() @override_settings(CUSTOM_VALIDATORS={'dcim.site': [max_length_validator]}) def test_max_length(self): diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index a8d39be4032..539974b8656 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -78,10 +78,6 @@ Description {{ object.description|placeholder }} - - AS Number - {{ object.asn|placeholder }} - Time Zone diff --git a/netbox/utilities/tests/test_filters.py b/netbox/utilities/tests/test_filters.py index 2616dbf3606..5182722d1a6 100644 --- a/netbox/utilities/tests/test_filters.py +++ b/netbox/utilities/tests/test_filters.py @@ -5,9 +5,8 @@ from django.test import TestCase from mptt.fields import TreeForeignKey from taggit.managers import TaggableManager -from circuits.choices import CircuitStatusChoices -from circuits.filtersets import CircuitFilterSet -from circuits.models import Circuit, Provider, CircuitType +from circuits.filtersets import CircuitFilterSet, ProviderFilterSet +from circuits.models import Circuit, Provider from dcim.choices import * from dcim.fields import MACAddressField from dcim.filtersets import DeviceFilterSet, SiteFilterSet @@ -337,16 +336,16 @@ class DynamicFilterLookupExpressionTest(TestCase): """ Validate function of automatically generated filters using the Device model as an example. """ - device_queryset = Device.objects.all() - device_filterset = DeviceFilterSet - site_queryset = Site.objects.all() - site_filterset = SiteFilterSet - circuit_queryset = Circuit.objects.all() - circuit_filterset = CircuitFilterSet - @classmethod def setUpTestData(cls): + providers = ( + Provider(name='Provider 1', slug='provider-1', asn=65001), + Provider(name='Provider 2', slug='provider-2', asn=65101), + Provider(name='Provider 3', slug='provider-3', asn=65201), + ) + Provider.objects.bulk_create(providers) + manufacturers = ( Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), @@ -384,9 +383,9 @@ class DynamicFilterLookupExpressionTest(TestCase): region.save() sites = ( - Site(name='Site 1', slug='abc-site-1', region=regions[0], asn=65001), - Site(name='Site 2', slug='def-site-2', region=regions[1], asn=65101), - Site(name='Site 3', slug='ghi-site-3', region=regions[2], asn=65201), + Site(name='Site 1', slug='abc-site-1', region=regions[0]), + Site(name='Site 2', slug='def-site-2', region=regions[1]), + Site(name='Site 3', slug='ghi-site-3', region=regions[2]), ) Site.objects.bulk_create(sites) @@ -429,112 +428,112 @@ class DynamicFilterLookupExpressionTest(TestCase): def test_site_name_negation(self): params = {'name__n': ['Site 1']} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 2) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 2) def test_site_slug_icontains(self): params = {'slug__ic': ['-1']} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 1) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 1) def test_site_slug_icontains_negation(self): params = {'slug__nic': ['-1']} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 2) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 2) def test_site_slug_startswith(self): params = {'slug__isw': ['abc']} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 1) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 1) def test_site_slug_startswith_negation(self): params = {'slug__nisw': ['abc']} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 2) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 2) def test_site_slug_endswith(self): params = {'slug__iew': ['-1']} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 1) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 1) def test_site_slug_endswith_negation(self): params = {'slug__niew': ['-1']} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 2) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 2) - def test_site_asn_lt(self): + def test_provider_asn_lt(self): params = {'asn__lt': [65101]} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 1) + self.assertEqual(ProviderFilterSet(params, Provider.objects.all()).qs.count(), 1) - def test_site_asn_lte(self): + def test_provider_asn_lte(self): params = {'asn__lte': [65101]} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 2) + self.assertEqual(ProviderFilterSet(params, Provider.objects.all()).qs.count(), 2) - def test_site_asn_gt(self): + def test_provider_asn_gt(self): params = {'asn__lt': [65101]} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 1) + self.assertEqual(ProviderFilterSet(params, Provider.objects.all()).qs.count(), 1) - def test_site_asn_gte(self): + def test_provider_asn_gte(self): params = {'asn__gte': [65101]} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 2) + self.assertEqual(ProviderFilterSet(params, Provider.objects.all()).qs.count(), 2) def test_site_region_negation(self): params = {'region__n': ['region-1']} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 2) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 2) def test_site_region_id_negation(self): params = {'region_id__n': [Region.objects.first().pk]} - self.assertEqual(SiteFilterSet(params, self.site_queryset).qs.count(), 2) + self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 2) def test_device_name_eq(self): params = {'name': ['Device 1']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 1) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 1) def test_device_name_negation(self): params = {'name__n': ['Device 1']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 2) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 2) def test_device_name_startswith(self): params = {'name__isw': ['Device']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 3) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 3) def test_device_name_startswith_negation(self): params = {'name__nisw': ['Device 1']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 2) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 2) def test_device_name_endswith(self): params = {'name__iew': [' 1']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 1) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 1) def test_device_name_endswith_negation(self): params = {'name__niew': [' 1']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 2) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 2) def test_device_name_icontains(self): params = {'name__ic': [' 2']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 1) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 1) def test_device_name_icontains_negation(self): params = {'name__nic': [' ']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 0) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 0) def test_device_mac_address_negation(self): params = {'mac_address__n': ['00-00-00-00-00-01', 'aa-00-00-00-00-01']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 2) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 2) def test_device_mac_address_startswith(self): params = {'mac_address__isw': ['aa:']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 1) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 1) def test_device_mac_address_startswith_negation(self): params = {'mac_address__nisw': ['aa:']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 2) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 2) def test_device_mac_address_endswith(self): params = {'mac_address__iew': [':02']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 1) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 1) def test_device_mac_address_endswith_negation(self): params = {'mac_address__niew': [':02']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 2) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 2) def test_device_mac_address_icontains(self): params = {'mac_address__ic': ['aa:', 'bb']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 2) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 2) def test_device_mac_address_icontains_negation(self): params = {'mac_address__nic': ['aa:', 'bb']} - self.assertEqual(DeviceFilterSet(params, self.device_queryset).qs.count(), 1) + self.assertEqual(DeviceFilterSet(params, Device.objects.all()).qs.count(), 1) From 2dad35186a62524a12f0641d79c9360b05f504d9 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 14 Dec 2021 11:28:13 -0500 Subject: [PATCH 006/271] Generic view cleanup --- netbox/circuits/views.py | 2 +- netbox/dcim/views.py | 13 ++-- netbox/extras/views.py | 4 +- netbox/ipam/views.py | 6 +- netbox/netbox/views/generic.py | 126 +++++++++++++++++++++++---------- netbox/tenancy/views.py | 2 +- 6 files changed, 102 insertions(+), 51 deletions(-) diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index b549b3a012f..2f1addab104 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -320,7 +320,7 @@ class CircuitTerminationEditView(generic.ObjectEditView): model_form = forms.CircuitTerminationForm template_name = 'circuits/circuittermination_edit.html' - def alter_obj(self, obj, request, url_args, url_kwargs): + def alter_object(self, obj, request, url_args, url_kwargs): if 'circuit' in url_kwargs: obj.circuit = get_object_or_404(Circuit, pk=url_kwargs['circuit']) return obj diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index b1a53e93c06..6fb3e2a00b2 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -671,7 +671,7 @@ class RackReservationEditView(generic.ObjectEditView): queryset = RackReservation.objects.all() model_form = forms.RackReservationForm - def alter_obj(self, obj, request, args, kwargs): + def alter_object(self, obj, request, args, kwargs): if not obj.pk: if 'rack' in request.GET: obj.rack = get_object_or_404(Rack, pk=request.GET.get('rack')) @@ -2342,7 +2342,7 @@ class CableCreateView(generic.ObjectEditView): return super().dispatch(request, *args, **kwargs) - def alter_obj(self, obj, request, url_args, url_kwargs): + def alter_object(self, obj, request, url_args, url_kwargs): termination_a_type = url_kwargs.get('termination_a_type') termination_a_id = url_kwargs.get('termination_a_id') termination_b_type_name = url_kwargs.get('termination_b_type') @@ -2355,7 +2355,8 @@ class CableCreateView(generic.ObjectEditView): return obj def get(self, request, *args, **kwargs): - obj = self.alter_obj(self.get_object(kwargs), request, args, kwargs) + obj = self.get_object(**kwargs) + obj = self.alter_object(obj, request, args, kwargs) # Parse initial data manually to avoid setting field values as lists initial_data = {k: request.GET[k] for k in request.GET} @@ -2423,7 +2424,7 @@ class ConsoleConnectionsListView(generic.ObjectListView): template_name = 'dcim/connections_list.html' action_buttons = ('export',) - def extra_context(self): + def get_extra_context(self, request): return { 'title': 'Console Connections' } @@ -2437,7 +2438,7 @@ class PowerConnectionsListView(generic.ObjectListView): template_name = 'dcim/connections_list.html' action_buttons = ('export',) - def extra_context(self): + def get_extra_context(self, request): return { 'title': 'Power Connections' } @@ -2451,7 +2452,7 @@ class InterfaceConnectionsListView(generic.ObjectListView): template_name = 'dcim/connections_list.html' action_buttons = ('export',) - def extra_context(self): + def get_extra_context(self, request): return { 'title': 'Interface Connections' } diff --git a/netbox/extras/views.py b/netbox/extras/views.py index ab9e3ba5212..4382d1fbbe5 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -472,7 +472,7 @@ class ImageAttachmentEditView(generic.ObjectEditView): queryset = ImageAttachment.objects.all() model_form = forms.ImageAttachmentForm - def alter_obj(self, instance, request, args, kwargs): + def alter_object(self, instance, request, args, kwargs): if not instance.pk: # Assign the parent object based on URL kwargs content_type = get_object_or_404(ContentType, pk=request.GET.get('content_type')) @@ -510,7 +510,7 @@ class JournalEntryEditView(generic.ObjectEditView): queryset = JournalEntry.objects.all() model_form = forms.JournalEntryForm - def alter_obj(self, obj, request, args, kwargs): + def alter_object(self, obj, request, args, kwargs): if not obj.pk: obj.created_by = request.user return obj diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index c172caf0b1b..6d3963599d6 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -721,7 +721,7 @@ class IPAddressEditView(generic.ObjectEditView): model_form = forms.IPAddressForm template_name = 'ipam/ipaddress_edit.html' - def alter_obj(self, obj, request, url_args, url_kwargs): + def alter_object(self, obj, request, url_args, url_kwargs): if 'interface' in request.GET: try: @@ -975,7 +975,7 @@ class FHRPGroupAssignmentEditView(generic.ObjectEditView): model_form = forms.FHRPGroupAssignmentForm template_name = 'ipam/fhrpgroupassignment_edit.html' - def alter_obj(self, instance, request, args, kwargs): + def alter_object(self, instance, request, args, kwargs): if not instance.pk: # Assign the interface based on URL kwargs content_type = get_object_or_404(ContentType, pk=request.GET.get('interface_type')) @@ -1092,7 +1092,7 @@ class ServiceEditView(generic.ObjectEditView): model_form = forms.ServiceForm template_name = 'ipam/service_edit.html' - def alter_obj(self, obj, request, url_args, url_kwargs): + def alter_object(self, obj, request, url_args, url_kwargs): if 'device' in url_kwargs: obj.device = get_object_or_404( Device.objects.restrict(request.user), diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index 1c2ff9917e9..83eabdb23a7 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic.py @@ -55,14 +55,16 @@ class ObjectView(ObjectPermissionRequiredMixin, View): """ Return any additional context data for the template. - request: The current request - instance: The object being viewed + :param request: The current request + :param instance: The object being viewed """ return {} def get(self, request, *args, **kwargs): """ - Generic GET handler for accessing an object by PK or slug + GET request handler. *args and **kwargs are passed to identify the object being queried. + + :param request: The current request """ instance = get_object_or_404(self.queryset, **kwargs) @@ -78,10 +80,11 @@ class ObjectListView(ObjectPermissionRequiredMixin, View): queryset: The queryset of objects to display. Note: Prefetching related objects is not necessary, as the table will prefetch objects as needed depending on the columns being displayed. - filter: A django-filter FilterSet that is applied to the queryset - filter_form: The form used to render filter options + filterset: A django-filter FilterSet that is applied to the queryset + filterset_form: The form used to render filter options table: The django-tables2 Table used to render the objects list template_name: The name of the template + action_buttons: A list of buttons to include at the top of the page """ queryset = None filterset = None @@ -94,6 +97,13 @@ class ObjectListView(ObjectPermissionRequiredMixin, View): return get_permission_for_model(self.queryset.model, 'view') def get_table(self, request, permissions): + """ + Return the django-tables2 Table instance to be used for rendering the objects list. + + :param request: The current request + :param permissions: A dictionary mapping of the view, add, change, and delete permissions to booleans indicating + whether the user has each + """ table = self.table(self.queryset, user=request.user) if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']): table.columns.show('pk') @@ -143,7 +153,20 @@ class ObjectListView(ObjectPermissionRequiredMixin, View): messages.error(request, f"There was an error rendering the selected export template ({template.name}): {e}") return redirect(request.path) + def get_extra_context(self, request): + """ + Return any additional context data for the template. + + :param request: The current request + """ + return {} + def get(self, request): + """ + GET request handler. + + :param request: The current request + """ model = self.queryset.model content_type = ContentType.objects.get_for_model(model) @@ -192,19 +215,16 @@ class ObjectListView(ObjectPermissionRequiredMixin, View): 'action_buttons': self.action_buttons, 'filter_form': self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None, } - context.update(self.extra_context()) + context.update(self.get_extra_context(request)) return render(request, self.template_name, context) - def extra_context(self): - return {} - class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ Create or edit a single object. - queryset: The base queryset for the object being modified + queryset: The base QuerySet for the object being modified model_form: The form used to create or edit the object template_name: The name of the template """ @@ -217,25 +237,31 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): # we are modifying an existing object or creating a new one. return get_permission_for_model(self.queryset.model, self._permission_action) - def get_object(self, kwargs): - # Look up an existing object by slug or PK, if provided. - if 'slug' in kwargs: - obj = get_object_or_404(self.queryset, slug=kwargs['slug']) - elif 'pk' in kwargs: - obj = get_object_or_404(self.queryset, pk=kwargs['pk']) - # Otherwise, return a new instance. - else: - return self.queryset.model() + def get_object(self, **kwargs): + """ + Return an instance for editing. If a PK has been specified, this will be an existing object. - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() + :param kwargs: URL path kwargs + """ + if 'pk' in kwargs: + obj = get_object_or_404(self.queryset, **kwargs) + # Take a snapshot of change-logged models + if hasattr(obj, 'snapshot'): + obj.snapshot() + return obj - return obj + return self.queryset.model() - def alter_obj(self, obj, request, url_args, url_kwargs): - # Allow views to add extra info to an object before it is processed. For example, a parent object can be defined - # given some parameter from the request URL. + def alter_object(self, obj, request, url_args, url_kwargs): + """ + Provides a hook for views to modify an object before it is processed. For example, a parent object can be + defined given some parameter from the request URL. + + :param obj: The object being edited + :param request: The current request + :param url_args: URL path args + :param url_kwargs: URL path kwargs + """ return obj def dispatch(self, request, *args, **kwargs): @@ -245,7 +271,13 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): return super().dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): - obj = self.alter_obj(self.get_object(kwargs), request, args, kwargs) + """ + GET request handler. + + :param request: The current request + """ + obj = self.get_object(**kwargs) + obj = self.alter_object(obj, request, args, kwargs) initial_data = normalize_querydict(request.GET) form = self.model_form(instance=obj, initial=initial_data) @@ -259,8 +291,15 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) def post(self, request, *args, **kwargs): + """ + POST request handler. + + :param request: The current request + """ logger = logging.getLogger('netbox.views.ObjectEditView') - obj = self.alter_obj(self.get_object(kwargs), request, args, kwargs) + obj = self.get_object(**kwargs) + obj = self.alter_object(obj, request, args, kwargs) + form = self.model_form( data=request.POST, files=request.FILES, @@ -334,12 +373,13 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'delete') - def get_object(self, kwargs): - # Look up object by slug if one has been provided. Otherwise, use PK. - if 'slug' in kwargs: - obj = get_object_or_404(self.queryset, slug=kwargs['slug']) - else: - obj = get_object_or_404(self.queryset, pk=kwargs['pk']) + def get_object(self, **kwargs): + """ + Return an instance for deletion. If a PK has been specified, this will be an existing object. + + :param kwargs: URL path kwargs + """ + obj = get_object_or_404(self.queryset, **kwargs) # Take a snapshot of change-logged models if hasattr(obj, 'snapshot'): @@ -347,8 +387,13 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): return obj - def get(self, request, **kwargs): - obj = self.get_object(kwargs) + def get(self, request, *args, **kwargs): + """ + GET request handler. + + :param request: The current request + """ + obj = self.get_object(**kwargs) form = ConfirmationForm(initial=request.GET) return render(request, self.template_name, { @@ -358,9 +403,14 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): 'return_url': self.get_return_url(request, obj), }) - def post(self, request, **kwargs): + def post(self, request, *args, **kwargs): + """ + POST request handler. + + :param request: The current request + """ logger = logging.getLogger('netbox.views.ObjectDeleteView') - obj = self.get_object(kwargs) + obj = self.get_object(**kwargs) form = ConfirmationForm(request.POST) if form.is_valid(): diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index c848de47f3a..b41af62eef5 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -353,7 +353,7 @@ class ContactAssignmentEditView(generic.ObjectEditView): model_form = forms.ContactAssignmentForm template_name = 'tenancy/contactassignment_edit.html' - def alter_obj(self, instance, request, args, kwargs): + def alter_object(self, instance, request, args, kwargs): if not instance.pk: # Assign the object based on URL kwargs content_type = get_object_or_404(ContentType, pk=request.GET.get('content_type')) From 419f86a4a5efbfa18c5cf8cb722d8c4bc2c29fbc Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 09:36:15 -0500 Subject: [PATCH 007/271] #8054: Support configurable status choices --- docs/configuration/optional-settings.md | 35 +++++++++++++++++++++++++ netbox/circuits/choices.py | 5 ++-- netbox/dcim/choices.py | 20 ++++++++------ netbox/ipam/choices.py | 20 ++++++++------ netbox/netbox/settings.py | 1 + netbox/utilities/choices.py | 14 ++++++++++ netbox/virtualization/choices.py | 5 ++-- 7 files changed, 80 insertions(+), 20 deletions(-) diff --git a/docs/configuration/optional-settings.md b/docs/configuration/optional-settings.md index d8d79b6ec38..97c1b620140 100644 --- a/docs/configuration/optional-settings.md +++ b/docs/configuration/optional-settings.md @@ -140,6 +140,41 @@ EXEMPT_VIEW_PERMISSIONS = ['*'] --- +## FIELD_CHOICES + +Default: Empty dictionary + +Some static choice fields on models can be configured with custom values. This is done by defining `FIELD_CHOICES` as a dictionary mapping model fields to their choices list. Each choice in the list must have a database value and a human-friendly label, and may optionally specify a color. + +For example, to specify a custom set of choices for the site status field: + +```python +FIELD_CHOICES = { + 'dcim.Site.status': ( + ('foo', 'Foo'), + ('bar', 'Bar'), + ('baz', 'Baz'), + ) +} +``` + +These will be appended to the stock choices for the field. + +The following model field support configurable choices: + +* `circuits.Circuit.status` +* `dcim.Device.status` +* `dcim.PowerFeed.status` +* `dcim.Rack.status` +* `dcim.Site.status` +* `ipam.IPAddress.status` +* `ipam.IPRange.status` +* `ipam.Prefix.status` +* `ipam.VLAN.status` +* `virtualization.VirtualMachine.status` + +--- + ## HTTP_PROXIES Default: None diff --git a/netbox/circuits/choices.py b/netbox/circuits/choices.py index 0efa431fad7..e3177adb4d4 100644 --- a/netbox/circuits/choices.py +++ b/netbox/circuits/choices.py @@ -6,6 +6,7 @@ from utilities.choices import ChoiceSet # class CircuitStatusChoices(ChoiceSet): + key = 'circuits.Circuit.status' STATUS_DEPROVISIONING = 'deprovisioning' STATUS_ACTIVE = 'active' @@ -14,14 +15,14 @@ class CircuitStatusChoices(ChoiceSet): STATUS_OFFLINE = 'offline' STATUS_DECOMMISSIONED = 'decommissioned' - CHOICES = ( + CHOICES = [ (STATUS_PLANNED, 'Planned'), (STATUS_PROVISIONING, 'Provisioning'), (STATUS_ACTIVE, 'Active'), (STATUS_OFFLINE, 'Offline'), (STATUS_DEPROVISIONING, 'Deprovisioning'), (STATUS_DECOMMISSIONED, 'Decommissioned'), - ) + ] CSS_CLASSES = { STATUS_DEPROVISIONING: 'warning', diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index fcb37211f77..208a06c5dfc 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -6,6 +6,7 @@ from utilities.choices import ChoiceSet # class SiteStatusChoices(ChoiceSet): + key = 'dcim.Site.status' STATUS_PLANNED = 'planned' STATUS_STAGING = 'staging' @@ -13,13 +14,13 @@ class SiteStatusChoices(ChoiceSet): STATUS_DECOMMISSIONING = 'decommissioning' STATUS_RETIRED = 'retired' - CHOICES = ( + CHOICES = [ (STATUS_PLANNED, 'Planned'), (STATUS_STAGING, 'Staging'), (STATUS_ACTIVE, 'Active'), (STATUS_DECOMMISSIONING, 'Decommissioning'), (STATUS_RETIRED, 'Retired'), - ) + ] CSS_CLASSES = { STATUS_PLANNED: 'info', @@ -67,6 +68,7 @@ class RackWidthChoices(ChoiceSet): class RackStatusChoices(ChoiceSet): + key = 'dcim.Rack.status' STATUS_RESERVED = 'reserved' STATUS_AVAILABLE = 'available' @@ -74,13 +76,13 @@ class RackStatusChoices(ChoiceSet): STATUS_ACTIVE = 'active' STATUS_DEPRECATED = 'deprecated' - CHOICES = ( + CHOICES = [ (STATUS_RESERVED, 'Reserved'), (STATUS_AVAILABLE, 'Available'), (STATUS_PLANNED, 'Planned'), (STATUS_ACTIVE, 'Active'), (STATUS_DEPRECATED, 'Deprecated'), - ) + ] CSS_CLASSES = { STATUS_RESERVED: 'warning', @@ -144,6 +146,7 @@ class DeviceFaceChoices(ChoiceSet): class DeviceStatusChoices(ChoiceSet): + key = 'dcim.Device.status' STATUS_OFFLINE = 'offline' STATUS_ACTIVE = 'active' @@ -153,7 +156,7 @@ class DeviceStatusChoices(ChoiceSet): STATUS_INVENTORY = 'inventory' STATUS_DECOMMISSIONING = 'decommissioning' - CHOICES = ( + CHOICES = [ (STATUS_OFFLINE, 'Offline'), (STATUS_ACTIVE, 'Active'), (STATUS_PLANNED, 'Planned'), @@ -161,7 +164,7 @@ class DeviceStatusChoices(ChoiceSet): (STATUS_FAILED, 'Failed'), (STATUS_INVENTORY, 'Inventory'), (STATUS_DECOMMISSIONING, 'Decommissioning'), - ) + ] CSS_CLASSES = { STATUS_OFFLINE: 'warning', @@ -1183,18 +1186,19 @@ class CableLengthUnitChoices(ChoiceSet): # class PowerFeedStatusChoices(ChoiceSet): + key = 'dcim.PowerFeed.status' STATUS_OFFLINE = 'offline' STATUS_ACTIVE = 'active' STATUS_PLANNED = 'planned' STATUS_FAILED = 'failed' - CHOICES = ( + CHOICES = [ (STATUS_OFFLINE, 'Offline'), (STATUS_ACTIVE, 'Active'), (STATUS_PLANNED, 'Planned'), (STATUS_FAILED, 'Failed'), - ) + ] CSS_CLASSES = { STATUS_OFFLINE: 'warning', diff --git a/netbox/ipam/choices.py b/netbox/ipam/choices.py index 638ef62f6ff..c414fc11564 100644 --- a/netbox/ipam/choices.py +++ b/netbox/ipam/choices.py @@ -17,18 +17,19 @@ class IPAddressFamilyChoices(ChoiceSet): # class PrefixStatusChoices(ChoiceSet): + key = 'ipam.Prefix.status' STATUS_CONTAINER = 'container' STATUS_ACTIVE = 'active' STATUS_RESERVED = 'reserved' STATUS_DEPRECATED = 'deprecated' - CHOICES = ( + CHOICES = [ (STATUS_CONTAINER, 'Container'), (STATUS_ACTIVE, 'Active'), (STATUS_RESERVED, 'Reserved'), (STATUS_DEPRECATED, 'Deprecated'), - ) + ] CSS_CLASSES = { STATUS_CONTAINER: 'secondary', @@ -43,16 +44,17 @@ class PrefixStatusChoices(ChoiceSet): # class IPRangeStatusChoices(ChoiceSet): + key = 'ipam.IPRange.status' STATUS_ACTIVE = 'active' STATUS_RESERVED = 'reserved' STATUS_DEPRECATED = 'deprecated' - CHOICES = ( + CHOICES = [ (STATUS_ACTIVE, 'Active'), (STATUS_RESERVED, 'Reserved'), (STATUS_DEPRECATED, 'Deprecated'), - ) + ] CSS_CLASSES = { STATUS_ACTIVE: 'primary', @@ -66,6 +68,7 @@ class IPRangeStatusChoices(ChoiceSet): # class IPAddressStatusChoices(ChoiceSet): + key = 'ipam.IPAddress.status' STATUS_ACTIVE = 'active' STATUS_RESERVED = 'reserved' @@ -73,13 +76,13 @@ class IPAddressStatusChoices(ChoiceSet): STATUS_DHCP = 'dhcp' STATUS_SLAAC = 'slaac' - CHOICES = ( + CHOICES = [ (STATUS_ACTIVE, 'Active'), (STATUS_RESERVED, 'Reserved'), (STATUS_DEPRECATED, 'Deprecated'), (STATUS_DHCP, 'DHCP'), (STATUS_SLAAC, 'SLAAC'), - ) + ] CSS_CLASSES = { STATUS_ACTIVE: 'primary', @@ -161,16 +164,17 @@ class FHRPGroupAuthTypeChoices(ChoiceSet): # class VLANStatusChoices(ChoiceSet): + key = 'ipam.VLAN.status' STATUS_ACTIVE = 'active' STATUS_RESERVED = 'reserved' STATUS_DEPRECATED = 'deprecated' - CHOICES = ( + CHOICES = [ (STATUS_ACTIVE, 'Active'), (STATUS_RESERVED, 'Reserved'), (STATUS_DEPRECATED, 'Deprecated'), - ) + ] CSS_CLASSES = { STATUS_ACTIVE: 'primary', diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 9bc0dbc0c14..9d956250b9a 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -86,6 +86,7 @@ DEVELOPER = getattr(configuration, 'DEVELOPER', False) DOCS_ROOT = getattr(configuration, 'DOCS_ROOT', os.path.join(os.path.dirname(BASE_DIR), 'docs')) EMAIL = getattr(configuration, 'EMAIL', {}) EXEMPT_VIEW_PERMISSIONS = getattr(configuration, 'EXEMPT_VIEW_PERMISSIONS', []) +FIELD_CHOICES = getattr(configuration, 'FIELD_CHOICES', {}) HTTP_PROXIES = getattr(configuration, 'HTTP_PROXIES', None) INTERNAL_IPS = getattr(configuration, 'INTERNAL_IPS', ('127.0.0.1', '::1')) LOGGING = getattr(configuration, 'LOGGING', {}) diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index b831b34901e..46d74490afb 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -1,7 +1,21 @@ +from django.conf import settings + + class ChoiceSetMeta(type): """ Metaclass for ChoiceSet """ + def __new__(mcs, name, bases, attrs): + + # Extend static choices with any configured choices + if 'key' in attrs: + try: + attrs['CHOICES'].extend(settings.FIELD_CHOICES[attrs['key']]) + except KeyError: + pass + + return super().__new__(mcs, name, bases, attrs) + def __call__(cls, *args, **kwargs): # Django will check if a 'choices' value is callable, and if so assume that it returns an iterable return getattr(cls, 'CHOICES', ()) diff --git a/netbox/virtualization/choices.py b/netbox/virtualization/choices.py index 9c4eb6cd57b..c121d052ec0 100644 --- a/netbox/virtualization/choices.py +++ b/netbox/virtualization/choices.py @@ -6,6 +6,7 @@ from utilities.choices import ChoiceSet # class VirtualMachineStatusChoices(ChoiceSet): + key = 'virtualization.VirtualMachine.status' STATUS_OFFLINE = 'offline' STATUS_ACTIVE = 'active' @@ -14,14 +15,14 @@ class VirtualMachineStatusChoices(ChoiceSet): STATUS_FAILED = 'failed' STATUS_DECOMMISSIONING = 'decommissioning' - CHOICES = ( + CHOICES = [ (STATUS_OFFLINE, 'Offline'), (STATUS_ACTIVE, 'Active'), (STATUS_PLANNED, 'Planned'), (STATUS_STAGED, 'Staged'), (STATUS_FAILED, 'Failed'), (STATUS_DECOMMISSIONING, 'Decommissioning'), - ) + ] CSS_CLASSES = { STATUS_OFFLINE: 'warning', From 0d3b50a5e50ad218bfac1ede0c8559682cb7b384 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 10:03:23 -0500 Subject: [PATCH 008/271] Support CSS class definition directly in CHOICES iterable --- netbox/circuits/choices.py | 21 ++---- netbox/circuits/models/circuits.py | 2 +- netbox/dcim/choices.py | 96 +++++++----------------- netbox/dcim/models/cables.py | 2 +- netbox/dcim/models/devices.py | 2 +- netbox/dcim/models/power.py | 4 +- netbox/dcim/models/racks.py | 2 +- netbox/dcim/models/sites.py | 2 +- netbox/extras/choices.py | 45 +++-------- netbox/extras/models/change_logging.py | 2 +- netbox/extras/models/models.py | 2 +- netbox/extras/templatetags/log_levels.py | 2 +- netbox/ipam/choices.py | 82 ++++++-------------- netbox/ipam/models/ip.py | 8 +- netbox/ipam/models/vlans.py | 2 +- netbox/utilities/choices.py | 25 +++++- netbox/virtualization/choices.py | 21 ++---- netbox/virtualization/models.py | 2 +- netbox/wireless/models.py | 2 +- 19 files changed, 110 insertions(+), 214 deletions(-) diff --git a/netbox/circuits/choices.py b/netbox/circuits/choices.py index e3177adb4d4..007b4529834 100644 --- a/netbox/circuits/choices.py +++ b/netbox/circuits/choices.py @@ -16,23 +16,14 @@ class CircuitStatusChoices(ChoiceSet): STATUS_DECOMMISSIONED = 'decommissioned' CHOICES = [ - (STATUS_PLANNED, 'Planned'), - (STATUS_PROVISIONING, 'Provisioning'), - (STATUS_ACTIVE, 'Active'), - (STATUS_OFFLINE, 'Offline'), - (STATUS_DEPROVISIONING, 'Deprovisioning'), - (STATUS_DECOMMISSIONED, 'Decommissioned'), + (STATUS_PLANNED, 'Planned', 'info'), + (STATUS_PROVISIONING, 'Provisioning', 'primary'), + (STATUS_ACTIVE, 'Active', 'success'), + (STATUS_OFFLINE, 'Offline', 'danger'), + (STATUS_DEPROVISIONING, 'Deprovisioning', 'warning'), + (STATUS_DECOMMISSIONED, 'Decommissioned', 'secondary'), ] - CSS_CLASSES = { - STATUS_DEPROVISIONING: 'warning', - STATUS_ACTIVE: 'success', - STATUS_PLANNED: 'info', - STATUS_PROVISIONING: 'primary', - STATUS_OFFLINE: 'danger', - STATUS_DECOMMISSIONED: 'secondary', - } - # # CircuitTerminations diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 602c0f403ec..013aef55752 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -135,7 +135,7 @@ class Circuit(PrimaryModel): return reverse('circuits:circuit', args=[self.pk]) def get_status_class(self): - return CircuitStatusChoices.CSS_CLASSES.get(self.status) + return CircuitStatusChoices.colors.get(self.status, 'secondary') @extras_features('webhooks') diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 208a06c5dfc..bcc9265804d 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -15,21 +15,13 @@ class SiteStatusChoices(ChoiceSet): STATUS_RETIRED = 'retired' CHOICES = [ - (STATUS_PLANNED, 'Planned'), - (STATUS_STAGING, 'Staging'), - (STATUS_ACTIVE, 'Active'), - (STATUS_DECOMMISSIONING, 'Decommissioning'), - (STATUS_RETIRED, 'Retired'), + (STATUS_PLANNED, 'Planned', 'info'), + (STATUS_STAGING, 'Staging', 'primary'), + (STATUS_ACTIVE, 'Active', 'primary'), + (STATUS_DECOMMISSIONING, 'Decommissioning', 'warning'), + (STATUS_RETIRED, 'Retired', 'danger'), ] - CSS_CLASSES = { - STATUS_PLANNED: 'info', - STATUS_STAGING: 'primary', - STATUS_ACTIVE: 'success', - STATUS_DECOMMISSIONING: 'warning', - STATUS_RETIRED: 'danger', - } - # # Racks @@ -77,21 +69,13 @@ class RackStatusChoices(ChoiceSet): STATUS_DEPRECATED = 'deprecated' CHOICES = [ - (STATUS_RESERVED, 'Reserved'), - (STATUS_AVAILABLE, 'Available'), - (STATUS_PLANNED, 'Planned'), - (STATUS_ACTIVE, 'Active'), - (STATUS_DEPRECATED, 'Deprecated'), + (STATUS_RESERVED, 'Reserved', 'warning'), + (STATUS_AVAILABLE, 'Available', 'success'), + (STATUS_PLANNED, 'Planned', 'info'), + (STATUS_ACTIVE, 'Active', 'primary'), + (STATUS_DEPRECATED, 'Deprecated', 'danger'), ] - CSS_CLASSES = { - STATUS_RESERVED: 'warning', - STATUS_AVAILABLE: 'success', - STATUS_PLANNED: 'info', - STATUS_ACTIVE: 'primary', - STATUS_DEPRECATED: 'danger', - } - class RackDimensionUnitChoices(ChoiceSet): @@ -157,25 +141,15 @@ class DeviceStatusChoices(ChoiceSet): STATUS_DECOMMISSIONING = 'decommissioning' CHOICES = [ - (STATUS_OFFLINE, 'Offline'), - (STATUS_ACTIVE, 'Active'), - (STATUS_PLANNED, 'Planned'), - (STATUS_STAGED, 'Staged'), - (STATUS_FAILED, 'Failed'), - (STATUS_INVENTORY, 'Inventory'), - (STATUS_DECOMMISSIONING, 'Decommissioning'), + (STATUS_OFFLINE, 'Offline', 'warning'), + (STATUS_ACTIVE, 'Active', 'success'), + (STATUS_PLANNED, 'Planned', 'info'), + (STATUS_STAGED, 'Staged', 'primary'), + (STATUS_FAILED, 'Failed', 'danger'), + (STATUS_INVENTORY, 'Inventory', 'secondary'), + (STATUS_DECOMMISSIONING, 'Decommissioning', 'warning'), ] - CSS_CLASSES = { - STATUS_OFFLINE: 'warning', - STATUS_ACTIVE: 'success', - STATUS_PLANNED: 'info', - STATUS_STAGED: 'primary', - STATUS_FAILED: 'danger', - STATUS_INVENTORY: 'secondary', - STATUS_DECOMMISSIONING: 'warning', - } - class DeviceAirflowChoices(ChoiceSet): @@ -1147,17 +1121,11 @@ class LinkStatusChoices(ChoiceSet): STATUS_DECOMMISSIONING = 'decommissioning' CHOICES = ( - (STATUS_CONNECTED, 'Connected'), - (STATUS_PLANNED, 'Planned'), - (STATUS_DECOMMISSIONING, 'Decommissioning'), + (STATUS_CONNECTED, 'Connected', 'success'), + (STATUS_PLANNED, 'Planned', 'info'), + (STATUS_DECOMMISSIONING, 'Decommissioning', 'warning'), ) - CSS_CLASSES = { - STATUS_CONNECTED: 'success', - STATUS_PLANNED: 'info', - STATUS_DECOMMISSIONING: 'warning', - } - class CableLengthUnitChoices(ChoiceSet): @@ -1194,19 +1162,12 @@ class PowerFeedStatusChoices(ChoiceSet): STATUS_FAILED = 'failed' CHOICES = [ - (STATUS_OFFLINE, 'Offline'), - (STATUS_ACTIVE, 'Active'), - (STATUS_PLANNED, 'Planned'), - (STATUS_FAILED, 'Failed'), + (STATUS_OFFLINE, 'Offline', 'warning'), + (STATUS_ACTIVE, 'Active', 'success'), + (STATUS_PLANNED, 'Planned', 'info'), + (STATUS_FAILED, 'Failed', 'danger'), ] - CSS_CLASSES = { - STATUS_OFFLINE: 'warning', - STATUS_ACTIVE: 'success', - STATUS_PLANNED: 'info', - STATUS_FAILED: 'danger', - } - class PowerFeedTypeChoices(ChoiceSet): @@ -1214,15 +1175,10 @@ class PowerFeedTypeChoices(ChoiceSet): TYPE_REDUNDANT = 'redundant' CHOICES = ( - (TYPE_PRIMARY, 'Primary'), - (TYPE_REDUNDANT, 'Redundant'), + (TYPE_PRIMARY, 'Primary', 'success'), + (TYPE_REDUNDANT, 'Redundant', 'info'), ) - CSS_CLASSES = { - TYPE_PRIMARY: 'success', - TYPE_REDUNDANT: 'info', - } - class PowerFeedSupplyChoices(ChoiceSet): diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 333972b2182..12fe9103608 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -289,7 +289,7 @@ class Cable(PrimaryModel): self._pk = self.pk def get_status_class(self): - return LinkStatusChoices.CSS_CLASSES.get(self.status) + return LinkStatusChoices.colors.get(self.status) def get_compatible_types(self): """ diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index a2ae203193c..24eeb7ac3ff 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -862,7 +862,7 @@ class Device(PrimaryModel, ConfigContextModel): return Device.objects.filter(parent_bay__device=self.pk) def get_status_class(self): - return DeviceStatusChoices.CSS_CLASSES.get(self.status) + return DeviceStatusChoices.colors.get(self.status, 'secondary') # diff --git a/netbox/dcim/models/power.py b/netbox/dcim/models/power.py index b5d8d4c8358..e3146c16779 100644 --- a/netbox/dcim/models/power.py +++ b/netbox/dcim/models/power.py @@ -174,7 +174,7 @@ class PowerFeed(PrimaryModel, PathEndpoint, LinkTermination): return self.power_panel def get_type_class(self): - return PowerFeedTypeChoices.CSS_CLASSES.get(self.type) + return PowerFeedTypeChoices.colors.get(self.type) def get_status_class(self): - return PowerFeedStatusChoices.CSS_CLASSES.get(self.status) + return PowerFeedStatusChoices.colors.get(self.status, 'secondary') diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 082ecfe5728..c324d4cbaa9 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -251,7 +251,7 @@ class Rack(PrimaryModel): return reversed(range(1, self.u_height + 1)) def get_status_class(self): - return RackStatusChoices.CSS_CLASSES.get(self.status) + return RackStatusChoices.colors.get(self.status, 'secondary') def get_rack_units(self, user=None, face=DeviceFaceChoices.FACE_FRONT, exclude=None, expand_devices=True): """ diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index 0be7e4617c3..a712062246b 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -315,7 +315,7 @@ class Site(PrimaryModel): return reverse('dcim:site', args=[self.pk]) def get_status_class(self): - return SiteStatusChoices.CSS_CLASSES.get(self.status) + return SiteStatusChoices.colors.get(self.status, 'secondary') # diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index 7503b4110a5..ff117c4e5d4 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -91,17 +91,11 @@ class ObjectChangeActionChoices(ChoiceSet): ACTION_DELETE = 'delete' CHOICES = ( - (ACTION_CREATE, 'Created'), - (ACTION_UPDATE, 'Updated'), - (ACTION_DELETE, 'Deleted'), + (ACTION_CREATE, 'Created', 'success'), + (ACTION_UPDATE, 'Updated', 'primary'), + (ACTION_DELETE, 'Deleted', 'danger'), ) - CSS_CLASSES = { - ACTION_CREATE: 'success', - ACTION_UPDATE: 'primary', - ACTION_DELETE: 'danger', - } - # # Jounral entries @@ -115,19 +109,12 @@ class JournalEntryKindChoices(ChoiceSet): KIND_DANGER = 'danger' CHOICES = ( - (KIND_INFO, 'Info'), - (KIND_SUCCESS, 'Success'), - (KIND_WARNING, 'Warning'), - (KIND_DANGER, 'Danger'), + (KIND_INFO, 'Info', 'info'), + (KIND_SUCCESS, 'Success', 'success'), + (KIND_WARNING, 'Warning', 'warning'), + (KIND_DANGER, 'Danger', 'danger'), ) - CSS_CLASSES = { - KIND_INFO: 'info', - KIND_SUCCESS: 'success', - KIND_WARNING: 'warning', - KIND_DANGER: 'danger', - } - # # Log Levels for Reports and Scripts @@ -142,21 +129,13 @@ class LogLevelChoices(ChoiceSet): LOG_FAILURE = 'failure' CHOICES = ( - (LOG_DEFAULT, 'Default'), - (LOG_SUCCESS, 'Success'), - (LOG_INFO, 'Info'), - (LOG_WARNING, 'Warning'), - (LOG_FAILURE, 'Failure'), + (LOG_DEFAULT, 'Default', 'secondary'), + (LOG_SUCCESS, 'Success', 'success'), + (LOG_INFO, 'Info', 'info'), + (LOG_WARNING, 'Warning', 'warning'), + (LOG_FAILURE, 'Failure', 'danger'), ) - CSS_CLASSES = { - LOG_DEFAULT: 'secondary', - LOG_SUCCESS: 'success', - LOG_INFO: 'info', - LOG_WARNING: 'warning', - LOG_FAILURE: 'danger', - } - # # Job results diff --git a/netbox/extras/models/change_logging.py b/netbox/extras/models/change_logging.py index 15bd3cbd83e..8dfeb2f18eb 100644 --- a/netbox/extras/models/change_logging.py +++ b/netbox/extras/models/change_logging.py @@ -105,4 +105,4 @@ class ObjectChange(BigIDModel): return reverse('extras:objectchange', args=[self.pk]) def get_action_class(self): - return ObjectChangeActionChoices.CSS_CLASSES.get(self.action) + return ObjectChangeActionChoices.colors.get(self.action) diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 47da21e1974..c20117b91e7 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -440,7 +440,7 @@ class JournalEntry(ChangeLoggedModel): return reverse('extras:journalentry', args=[self.pk]) def get_kind_class(self): - return JournalEntryKindChoices.CSS_CLASSES.get(self.kind) + return JournalEntryKindChoices.colors.get(self.kind) class JobResult(BigIDModel): diff --git a/netbox/extras/templatetags/log_levels.py b/netbox/extras/templatetags/log_levels.py index 050a6996dea..0779a87ebd0 100644 --- a/netbox/extras/templatetags/log_levels.py +++ b/netbox/extras/templatetags/log_levels.py @@ -13,5 +13,5 @@ def log_level(level): """ return { 'name': LogLevelChoices.as_dict()[level], - 'class': LogLevelChoices.CSS_CLASSES.get(level) + 'class': LogLevelChoices.colors.get(level) } diff --git a/netbox/ipam/choices.py b/netbox/ipam/choices.py index c414fc11564..693ee6689c8 100644 --- a/netbox/ipam/choices.py +++ b/netbox/ipam/choices.py @@ -25,19 +25,12 @@ class PrefixStatusChoices(ChoiceSet): STATUS_DEPRECATED = 'deprecated' CHOICES = [ - (STATUS_CONTAINER, 'Container'), - (STATUS_ACTIVE, 'Active'), - (STATUS_RESERVED, 'Reserved'), - (STATUS_DEPRECATED, 'Deprecated'), + (STATUS_CONTAINER, 'Container', 'secondary'), + (STATUS_ACTIVE, 'Active', 'primary'), + (STATUS_RESERVED, 'Reserved', 'info'), + (STATUS_DEPRECATED, 'Deprecated', 'danger'), ] - CSS_CLASSES = { - STATUS_CONTAINER: 'secondary', - STATUS_ACTIVE: 'primary', - STATUS_RESERVED: 'info', - STATUS_DEPRECATED: 'danger', - } - # # IP Ranges @@ -51,17 +44,11 @@ class IPRangeStatusChoices(ChoiceSet): STATUS_DEPRECATED = 'deprecated' CHOICES = [ - (STATUS_ACTIVE, 'Active'), - (STATUS_RESERVED, 'Reserved'), - (STATUS_DEPRECATED, 'Deprecated'), + (STATUS_ACTIVE, 'Active', 'primary'), + (STATUS_RESERVED, 'Reserved', 'info'), + (STATUS_DEPRECATED, 'Deprecated', 'danger'), ] - CSS_CLASSES = { - STATUS_ACTIVE: 'primary', - STATUS_RESERVED: 'info', - STATUS_DEPRECATED: 'danger', - } - # # IP Addresses @@ -77,21 +64,13 @@ class IPAddressStatusChoices(ChoiceSet): STATUS_SLAAC = 'slaac' CHOICES = [ - (STATUS_ACTIVE, 'Active'), - (STATUS_RESERVED, 'Reserved'), - (STATUS_DEPRECATED, 'Deprecated'), - (STATUS_DHCP, 'DHCP'), - (STATUS_SLAAC, 'SLAAC'), + (STATUS_ACTIVE, 'Active', 'primary'), + (STATUS_RESERVED, 'Reserved', 'info'), + (STATUS_DEPRECATED, 'Deprecated', 'danger'), + (STATUS_DHCP, 'DHCP', 'success'), + (STATUS_SLAAC, 'SLAAC', 'success'), ] - CSS_CLASSES = { - STATUS_ACTIVE: 'primary', - STATUS_RESERVED: 'info', - STATUS_DEPRECATED: 'danger', - STATUS_DHCP: 'success', - STATUS_SLAAC: 'success', - } - class IPAddressRoleChoices(ChoiceSet): @@ -105,27 +84,16 @@ class IPAddressRoleChoices(ChoiceSet): ROLE_CARP = 'carp' CHOICES = ( - (ROLE_LOOPBACK, 'Loopback'), - (ROLE_SECONDARY, 'Secondary'), - (ROLE_ANYCAST, 'Anycast'), + (ROLE_LOOPBACK, 'Loopback', 'secondary'), + (ROLE_SECONDARY, 'Secondary', 'primary'), + (ROLE_ANYCAST, 'Anycast', 'warning'), (ROLE_VIP, 'VIP'), - (ROLE_VRRP, 'VRRP'), - (ROLE_HSRP, 'HSRP'), - (ROLE_GLBP, 'GLBP'), - (ROLE_CARP, 'CARP'), + (ROLE_VRRP, 'VRRP', 'success'), + (ROLE_HSRP, 'HSRP', 'success'), + (ROLE_GLBP, 'GLBP', 'success'), + (ROLE_CARP, 'CARP'), 'success', ) - CSS_CLASSES = { - ROLE_LOOPBACK: 'secondary', - ROLE_SECONDARY: 'primary', - ROLE_ANYCAST: 'warning', - ROLE_VIP: 'success', - ROLE_VRRP: 'success', - ROLE_HSRP: 'success', - ROLE_GLBP: 'success', - ROLE_CARP: 'success', - } - # # FHRP @@ -171,17 +139,11 @@ class VLANStatusChoices(ChoiceSet): STATUS_DEPRECATED = 'deprecated' CHOICES = [ - (STATUS_ACTIVE, 'Active'), - (STATUS_RESERVED, 'Reserved'), - (STATUS_DEPRECATED, 'Deprecated'), + (STATUS_ACTIVE, 'Active', 'primary'), + (STATUS_RESERVED, 'Reserved', 'info'), + (STATUS_DEPRECATED, 'Deprecated', 'danger'), ] - CSS_CLASSES = { - STATUS_ACTIVE: 'primary', - STATUS_RESERVED: 'info', - STATUS_DEPRECATED: 'danger', - } - # # Services diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index aeb71e70fe2..0b03cbe79d8 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -403,7 +403,7 @@ class Prefix(PrimaryModel): prefix_length = property(fset=_set_prefix_length) def get_status_class(self): - return PrefixStatusChoices.CSS_CLASSES.get(self.status) + return PrefixStatusChoices.colors.get(self.status, 'secondary') def get_parents(self, include_self=False): """ @@ -692,7 +692,7 @@ class IPRange(PrimaryModel): prefix_length = property(fset=_set_prefix_length) def get_status_class(self): - return IPRangeStatusChoices.CSS_CLASSES.get(self.status) + return IPRangeStatusChoices.colors.get(self.status, 'secondary') def get_child_ips(self): """ @@ -909,7 +909,7 @@ class IPAddress(PrimaryModel): mask_length = property(fset=_set_mask_length) def get_status_class(self): - return IPAddressStatusChoices.CSS_CLASSES.get(self.status) + return IPAddressStatusChoices.colors.get(self.status, 'secondary') def get_role_class(self): - return IPAddressRoleChoices.CSS_CLASSES.get(self.role) + return IPAddressRoleChoices.colors.get(self.role) diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 1c1691a62f5..3a17257708a 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -173,7 +173,7 @@ class VLAN(PrimaryModel): }) def get_status_class(self): - return VLANStatusChoices.CSS_CLASSES.get(self.status) + return VLANStatusChoices.colors.get(self.status, 'secondary') def get_interfaces(self): # Return all device interfaces assigned to this VLAN diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index 46d74490afb..18fd2f5a63d 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -8,20 +8,37 @@ class ChoiceSetMeta(type): def __new__(mcs, name, bases, attrs): # Extend static choices with any configured choices - if 'key' in attrs: + key = attrs.get('key') + if key: try: - attrs['CHOICES'].extend(settings.FIELD_CHOICES[attrs['key']]) + attrs['CHOICES'].extend(settings.FIELD_CHOICES[key]) except KeyError: pass + # Define choice tuples + # TODO: Support optgroup nesting + attrs['_choices'] = [ + (c[0], c[1]) for c in attrs['CHOICES'] + ] + + # Define color maps + # TODO: Support optgroup nesting + colors = {} + for c in attrs['CHOICES']: + try: + colors[c[0]] = c[2] + except IndexError: + pass + attrs['colors'] = colors + return super().__new__(mcs, name, bases, attrs) def __call__(cls, *args, **kwargs): # Django will check if a 'choices' value is callable, and if so assume that it returns an iterable - return getattr(cls, 'CHOICES', ()) + return getattr(cls, '_choices', ()) def __iter__(cls): - choices = getattr(cls, 'CHOICES', ()) + choices = getattr(cls, '_choices', ()) return iter(choices) diff --git a/netbox/virtualization/choices.py b/netbox/virtualization/choices.py index c121d052ec0..1aaaf6bf9a2 100644 --- a/netbox/virtualization/choices.py +++ b/netbox/virtualization/choices.py @@ -16,19 +16,10 @@ class VirtualMachineStatusChoices(ChoiceSet): STATUS_DECOMMISSIONING = 'decommissioning' CHOICES = [ - (STATUS_OFFLINE, 'Offline'), - (STATUS_ACTIVE, 'Active'), - (STATUS_PLANNED, 'Planned'), - (STATUS_STAGED, 'Staged'), - (STATUS_FAILED, 'Failed'), - (STATUS_DECOMMISSIONING, 'Decommissioning'), + (STATUS_OFFLINE, 'Offline', 'warning'), + (STATUS_ACTIVE, 'Active', 'success'), + (STATUS_PLANNED, 'Planned', 'info'), + (STATUS_STAGED, 'Staged', 'primary'), + (STATUS_FAILED, 'Failed', 'danger'), + (STATUS_DECOMMISSIONING, 'Decommissioning', 'warning'), ] - - CSS_CLASSES = { - STATUS_OFFLINE: 'warning', - STATUS_ACTIVE: 'success', - STATUS_PLANNED: 'info', - STATUS_STAGED: 'primary', - STATUS_FAILED: 'danger', - STATUS_DECOMMISSIONING: 'warning', - } diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 5a1bcd42fa9..b1971512728 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -329,7 +329,7 @@ class VirtualMachine(PrimaryModel, ConfigContextModel): }) def get_status_class(self): - return VirtualMachineStatusChoices.CSS_CLASSES.get(self.status) + return VirtualMachineStatusChoices.colors.get(self.status, 'secondary') @property def primary_ip(self): diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index 151828c883c..2fcfc97aade 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -182,7 +182,7 @@ class WirelessLink(WirelessAuthenticationBase, PrimaryModel): return reverse('wireless:wirelesslink', args=[self.pk]) def get_status_class(self): - return LinkStatusChoices.CSS_CLASSES.get(self.status) + return LinkStatusChoices.colors.get(self.status) def clean(self): From 124302908a1889549a896e7ed818af85f9bde79d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 10:19:16 -0500 Subject: [PATCH 009/271] Support nested choice groups --- netbox/utilities/choices.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index 18fd2f5a63d..ade1bd6fb78 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -15,21 +15,21 @@ class ChoiceSetMeta(type): except KeyError: pass - # Define choice tuples - # TODO: Support optgroup nesting - attrs['_choices'] = [ - (c[0], c[1]) for c in attrs['CHOICES'] - ] - - # Define color maps - # TODO: Support optgroup nesting - colors = {} - for c in attrs['CHOICES']: - try: - colors[c[0]] = c[2] - except IndexError: - pass - attrs['colors'] = colors + # Define choice tuples and color maps + attrs['_choices'] = [] + attrs['colors'] = {} + for choice in attrs['CHOICES']: + if isinstance(choice[1], (list, tuple)): + grouped_choices = [] + for c in choice[1]: + grouped_choices.append((c[0], c[1])) + if len(c) == 3: + attrs['colors'][c[0]] = c[2] + attrs['_choices'].append((choice[0], grouped_choices)) + else: + attrs['_choices'].append((choice[0], choice[1])) + if len(choice) == 3: + attrs['colors'][choice[0]] = choice[2] return super().__new__(mcs, name, bases, attrs) @@ -48,12 +48,12 @@ class ChoiceSet(metaclass=ChoiceSetMeta): @classmethod def values(cls): - return [c[0] for c in unpack_grouped_choices(cls.CHOICES)] + return [c[0] for c in unpack_grouped_choices(cls._choices)] @classmethod def as_dict(cls): # Unpack grouped choices before casting as a dict - return dict(unpack_grouped_choices(cls.CHOICES)) + return dict(unpack_grouped_choices(cls._choices)) def unpack_grouped_choices(choices): From 1902ecb8ca92c6a80b3113ba01770dd2078c6400 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 10:22:05 -0500 Subject: [PATCH 010/271] Drop as_dict() method from ChoiceSet --- netbox/extras/reports.py | 4 ++-- netbox/extras/templatetags/log_levels.py | 2 +- netbox/utilities/choices.py | 5 ----- netbox/utilities/tests/test_choices.py | 5 ----- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index cc623b37c33..f53c0ecd047 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -167,8 +167,8 @@ class Report(object): """ Log a message from a test method. Do not call this method directly; use one of the log_* wrappers below. """ - if level not in LogLevelChoices.as_dict(): - raise Exception("Unknown logging level: {}".format(level)) + if level not in LogLevelChoices.values(): + raise Exception(f"Unknown logging level: {level}") self._results[self.active_test]['log'].append(( timezone.now().isoformat(), level, diff --git a/netbox/extras/templatetags/log_levels.py b/netbox/extras/templatetags/log_levels.py index 0779a87ebd0..fba73a74f8c 100644 --- a/netbox/extras/templatetags/log_levels.py +++ b/netbox/extras/templatetags/log_levels.py @@ -12,6 +12,6 @@ def log_level(level): Display a label indicating a syslog severity (e.g. info, warning, etc.). """ return { - 'name': LogLevelChoices.as_dict()[level], + 'name': dict(LogLevelChoices)[level], 'class': LogLevelChoices.colors.get(level) } diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index ade1bd6fb78..f5756ffc4d0 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -50,11 +50,6 @@ class ChoiceSet(metaclass=ChoiceSetMeta): def values(cls): return [c[0] for c in unpack_grouped_choices(cls._choices)] - @classmethod - def as_dict(cls): - # Unpack grouped choices before casting as a dict - return dict(unpack_grouped_choices(cls._choices)) - def unpack_grouped_choices(choices): """ diff --git a/netbox/utilities/tests/test_choices.py b/netbox/utilities/tests/test_choices.py index bbf75e40e0d..8dbf5d6027a 100644 --- a/netbox/utilities/tests/test_choices.py +++ b/netbox/utilities/tests/test_choices.py @@ -30,8 +30,3 @@ class ChoiceSetTestCase(TestCase): def test_values(self): self.assertListEqual(ExampleChoices.values(), ['a', 'b', 'c', 1, 2, 3]) - - def test_as_dict(self): - self.assertEqual(ExampleChoices.as_dict(), { - 'a': 'A', 'b': 'B', 'c': 'C', 1: 'One', 2: 'Two', 3: 'Three' - }) From d8be8e25a53d1484b6ffb601bfae8c4ac0b77192 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 10:31:32 -0500 Subject: [PATCH 011/271] ChoiceSet cleanup --- netbox/utilities/choices.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index f5756ffc4d0..7127834481b 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -34,16 +34,18 @@ class ChoiceSetMeta(type): return super().__new__(mcs, name, bases, attrs) def __call__(cls, *args, **kwargs): - # Django will check if a 'choices' value is callable, and if so assume that it returns an iterable + # django-filters will check if a 'choices' value is callable, and if so assume that it returns an iterable return getattr(cls, '_choices', ()) def __iter__(cls): - choices = getattr(cls, '_choices', ()) - return iter(choices) + return iter(getattr(cls, '_choices', ())) class ChoiceSet(metaclass=ChoiceSetMeta): - + """ + Holds an interable of choice tuples suitable for passing to a Django model or form field. Choices can be defined + statically within the class as CHOICES and/or gleaned from the FIELD_CHOICES configuration parameter. + """ CHOICES = list() @classmethod From ea6cdc96737669bf87aef606bbca396d57712465 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 11:28:57 -0500 Subject: [PATCH 012/271] Closes #7650: Add support for local account password validation --- docs/configuration/optional-settings.md | 17 +++++++++++++++++ docs/release-notes/version-3.2.md | 4 ++++ netbox/netbox/configuration.example.py | 11 +++++++++++ netbox/netbox/settings.py | 1 + 4 files changed, 33 insertions(+) diff --git a/docs/configuration/optional-settings.md b/docs/configuration/optional-settings.md index 97c1b620140..fcebf7af629 100644 --- a/docs/configuration/optional-settings.md +++ b/docs/configuration/optional-settings.md @@ -13,6 +13,23 @@ ADMINS = [ --- +## AUTH_PASSWORD_VALIDATORS + +This parameter acts as a pass-through for configuring Django's built-in password validators for local user accounts. If configured, these will be applied whenever a user's password is updated to ensure that it meets minimum criteria such as length or complexity. An example is provided below. For more detail on the available options, please see [the Django documentation](https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-validation). + +```python +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + 'OPTIONS': { + 'min_length': 10, + } + }, +] +``` + +--- + ## BASE_PATH Default: None diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index a92968bc9a8..2b48aa711cf 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -12,6 +12,10 @@ * The `asn` query filter for sites now matches against the AS number of assigned ASNs. * The `contact_name`, `contact_phone`, and `contact_email` fields have been removed from the site model. Please use the new contact model introduced in NetBox v3.1 to store contact information for sites. +### Enhancements + +* [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation + ### Other Changes * [#7731](https://github.com/netbox-community/netbox/issues/7731) - Require Python 3.8 or later diff --git a/netbox/netbox/configuration.example.py b/netbox/netbox/configuration.example.py index 8130acb2eb2..c82749e3f53 100644 --- a/netbox/netbox/configuration.example.py +++ b/netbox/netbox/configuration.example.py @@ -72,6 +72,17 @@ ADMINS = [ # ('John Doe', 'jdoe@example.com'), ] +# Enable any desired validators for local account passwords below. For a list of included validators, please see the +# Django documentation at https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-validation. +AUTH_PASSWORD_VALIDATORS = [ + # { + # 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + # 'OPTIONS': { + # 'min_length': 10, + # } + # }, +] + # Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set: # BASE_PATH = 'netbox/' BASE_PATH = '' diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 9d956250b9a..5808602a22b 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -73,6 +73,7 @@ SECRET_KEY = getattr(configuration, 'SECRET_KEY') # Set static config parameters ADMINS = getattr(configuration, 'ADMINS', []) +AUTH_PASSWORD_VALIDATORS = getattr(configuration, 'AUTH_PASSWORD_VALIDATORS', []) BASE_PATH = getattr(configuration, 'BASE_PATH', '') if BASE_PATH: BASE_PATH = BASE_PATH.strip('/') + '/' # Enforce trailing slash only From 1dd3d2ec48a3b795d5d77e33937a7cd3ab8619ad Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 11:32:31 -0500 Subject: [PATCH 013/271] Changelog for #8054 --- docs/release-notes/version-3.2.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 2b48aa711cf..cce60b581b6 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -12,6 +12,22 @@ * The `asn` query filter for sites now matches against the AS number of assigned ASNs. * The `contact_name`, `contact_phone`, and `contact_email` fields have been removed from the site model. Please use the new contact model introduced in NetBox v3.1 to store contact information for sites. +### New Features + +#### Custom Status Choices ([#8054](https://github.com/netbox-community/netbox/issues/8054)) + +Custom choices can be now added to most status fields in NetBox. This is done by defining the `FIELD_CHOICES` configuration parameter to map field identifiers to an iterable of custom choices. These choices are populated automatically when NetBox initializes. For example, the following will add three custom choices for the site status field: + +```python +FIELD_CHOICES = { + 'dcim.Site.status': ( + ('foo', 'Foo'), + ('bar', 'Bar'), + ('baz', 'Baz'), + ) +} +``` + ### Enhancements * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation From e91a76c936dc88ade43e541af0cf6e5e09181d05 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 16:28:23 -0500 Subject: [PATCH 014/271] Refactor bulk generic views --- netbox/netbox/views/generic.py | 362 +++++++++++++++++---------------- 1 file changed, 191 insertions(+), 171 deletions(-) diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index c6f6305cb10..3096b86fc89 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic.py @@ -539,6 +539,31 @@ class BulkCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') + def _create_objects(self, form, request): + new_objects = [] + + # Create objects from the expanded. Abort the transaction on the first validation error. + for value in form.cleaned_data['pattern']: + + # Reinstantiate the model form each time to avoid overwriting the same instance. Use a mutable + # copy of the POST QueryDict so that we can update the target field value. + model_form = self.model_form(request.POST.copy()) + model_form.data[self.pattern_target] = value + + # Validate each new object independently. + if model_form.is_valid(): + obj = model_form.save() + new_objects.append(obj) + else: + # Copy any errors on the pattern target field to the pattern form. + errors = model_form.errors.as_data() + if errors.get(self.pattern_target): + form.add_error('pattern', errors[self.pattern_target]) + # Raise an IntegrityError to break the for loop and abort the transaction. + raise IntegrityError() + + return new_objects + def get(self, request): # Set initial values for visible form fields from query args initial = {} @@ -564,45 +589,23 @@ class BulkCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): if form.is_valid(): logger.debug("Form validation was successful") - pattern = form.cleaned_data['pattern'] - new_objs = [] try: with transaction.atomic(): - - # Create objects from the expanded. Abort the transaction on the first validation error. - for value in pattern: - - # Reinstantiate the model form each time to avoid overwriting the same instance. Use a mutable - # copy of the POST QueryDict so that we can update the target field value. - model_form = self.model_form(request.POST.copy()) - model_form.data[self.pattern_target] = value - - # Validate each new object independently. - if model_form.is_valid(): - obj = model_form.save() - logger.debug(f"Created {obj} (PK: {obj.pk})") - new_objs.append(obj) - else: - # Copy any errors on the pattern target field to the pattern form. - errors = model_form.errors.as_data() - if errors.get(self.pattern_target): - form.add_error('pattern', errors[self.pattern_target]) - # Raise an IntegrityError to break the for loop and abort the transaction. - raise IntegrityError() + new_objs = self._create_objects(form, request) # Enforce object-level permissions if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs): raise PermissionsViolation - # If we make it to this point, validation has succeeded on all new objects. - msg = "Added {} {}".format(len(new_objs), model._meta.verbose_name_plural) - logger.info(msg) - messages.success(request, msg) + # If we make it to this point, validation has succeeded on all new objects. + msg = f"Added {len(new_objs)} {model._meta.verbose_name_plural}" + logger.info(msg) + messages.success(request, msg) - if '_addanother' in request.POST: - return redirect(request.path) - return redirect(self.get_return_url(request)) + if '_addanother' in request.POST: + return redirect(request.path) + return redirect(self.get_return_url(request)) except IntegrityError: pass @@ -640,6 +643,45 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') + def _create_object(self, model_form): + + # Save the primary object + obj = model_form.save() + + # Enforce object-level permissions + if not self.queryset.filter(pk=obj.pk).first(): + raise PermissionsViolation() + + # Iterate through the related object forms (if any), validating and saving each instance. + for field_name, related_object_form in self.related_object_forms.items(): + + related_obj_pks = [] + for i, rel_obj_data in enumerate(model_form.data.get(field_name, list())): + + f = related_object_form(obj, rel_obj_data) + + for subfield_name, field in f.fields.items(): + if subfield_name not in rel_obj_data and hasattr(field, 'initial'): + f.data[subfield_name] = field.initial + + if f.is_valid(): + related_obj = f.save() + related_obj_pks.append(related_obj.pk) + else: + # Replicate errors on the related object form to the primary form for display + for subfield_name, errors in f.errors.items(): + for err in errors: + err_msg = "{}[{}] {}: {}".format(field_name, i, subfield_name, err) + model_form.add_error(None, err_msg) + raise AbortTransaction() + + # Enforce object-level permissions on related objects + model = related_object_form.Meta.model + if model.objects.filter(pk__in=related_obj_pks).count() != len(related_obj_pks): + raise ObjectDoesNotExist + + return obj + def get(self, request): form = ImportForm() @@ -673,44 +715,7 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): try: with transaction.atomic(): - - # Save the primary object - obj = model_form.save() - - # Enforce object-level permissions - if not self.queryset.filter(pk=obj.pk).first(): - raise PermissionsViolation() - - logger.debug(f"Created {obj} (PK: {obj.pk})") - - # Iterate through the related object forms (if any), validating and saving each instance. - for field_name, related_object_form in self.related_object_forms.items(): - logger.debug("Processing form for related objects: {related_object_form}") - - related_obj_pks = [] - for i, rel_obj_data in enumerate(data.get(field_name, list())): - - f = related_object_form(obj, rel_obj_data) - - for subfield_name, field in f.fields.items(): - if subfield_name not in rel_obj_data and hasattr(field, 'initial'): - f.data[subfield_name] = field.initial - - if f.is_valid(): - related_obj = f.save() - related_obj_pks.append(related_obj.pk) - else: - # Replicate errors on the related object form to the primary form for display - for subfield_name, errors in f.errors.items(): - for err in errors: - err_msg = "{}[{}] {}: {}".format(field_name, i, subfield_name, err) - model_form.add_error(None, err_msg) - raise AbortTransaction() - - # Enforce object-level permissions on related objects - model = related_object_form.Meta.model - if model.objects.filter(pk__in=related_obj_pks).count() != len(related_obj_pks): - raise ObjectDoesNotExist + obj = self._create_object(model_form) except AbortTransaction: clear_webhooks.send(sender=self) @@ -723,9 +728,8 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): if not model_form.errors: logger.info(f"Import object {obj} (PK: {obj.pk})") - messages.success(request, mark_safe('Imported object: {}'.format( - obj.get_absolute_url(), obj - ))) + msg = f'Imported object: {obj}' + messages.success(request, mark_safe(msg)) if '_addanother' in request.POST: return redirect(request.get_full_path()) @@ -733,8 +737,7 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): return_url = form.cleaned_data.get('return_url') if return_url is not None and is_safe_url(url=return_url, allowed_hosts=request.get_host()): return redirect(return_url) - else: - return redirect(self.get_return_url(request, obj)) + return redirect(self.get_return_url(request, obj)) else: logger.debug("Model form validation failed") @@ -799,6 +802,27 @@ class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): return ImportForm(*args, **kwargs) + def _create_objects(self, form, request): + new_objs = [] + if request.FILES: + headers, records = form.cleaned_data['csv_file'] + else: + headers, records = form.cleaned_data['csv'] + + for row, data in enumerate(records, start=1): + obj_form = self.model_form(data, headers=headers) + restrict_form_fields(obj_form, request.user) + + if obj_form.is_valid(): + obj = self._save_obj(obj_form, request) + new_objs.append(obj) + else: + for field, err in obj_form.errors.items(): + form.add_error('csv', f'Row {row} {field}: {err[0]}') + raise ValidationError("") + + return new_objs + def _save_obj(self, obj_form, request): """ Provide a hook to modify the object immediately before saving it (e.g. to encrypt secret data). @@ -819,7 +843,6 @@ class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): def post(self, request): logger = logging.getLogger('netbox.views.BulkImportView') - new_objs = [] form = self._import_form(request.POST, request.FILES) if form.is_valid(): @@ -828,21 +851,7 @@ class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): try: # Iterate through CSV data and bind each row to a new model form instance. with transaction.atomic(): - if request.FILES: - headers, records = form.cleaned_data['csv_file'] - else: - headers, records = form.cleaned_data['csv'] - for row, data in enumerate(records, start=1): - obj_form = self.model_form(data, headers=headers) - restrict_form_fields(obj_form, request.user) - - if obj_form.is_valid(): - obj = self._save_obj(obj_form, request) - new_objs.append(obj) - else: - for field, err in obj_form.errors.items(): - form.add_error('csv', "Row {} {}: {}".format(row, field, err[0])) - raise ValidationError("") + new_objs = self._create_objects(form, request) # Enforce object-level permissions if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs): @@ -886,7 +895,7 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): Edit objects in bulk. queryset: Custom queryset to use when retrieving objects (e.g. to select related objects) - filter: FilterSet to apply when deleting by QuerySet + filterset: FilterSet to apply when deleting by QuerySet table: The table used to display devices being edited form: The form class used to edit objects in bulk template_name: The name of the template @@ -900,6 +909,63 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'change') + def _update_objects(self, form, request): + custom_fields = form.custom_fields if hasattr(form, 'custom_fields') else [] + standard_fields = [ + field for field in form.fields if field not in custom_fields + ['pk'] + ] + nullified_fields = request.POST.getlist('_nullify') + updated_objects = [] + + for obj in self.queryset.filter(pk__in=form.cleaned_data['pk']): + + # Take a snapshot of change-logged models + if hasattr(obj, 'snapshot'): + obj.snapshot() + + # Update standard fields. If a field is listed in _nullify, delete its value. + for name in standard_fields: + + try: + model_field = self.queryset.model._meta.get_field(name) + except FieldDoesNotExist: + # This form field is used to modify a field rather than set its value directly + model_field = None + + # Handle nullification + if name in form.nullable_fields and name in nullified_fields: + if isinstance(model_field, ManyToManyField): + getattr(obj, name).set([]) + else: + setattr(obj, name, None if model_field.null else '') + + # ManyToManyFields + elif isinstance(model_field, ManyToManyField): + if form.cleaned_data[name]: + getattr(obj, name).set(form.cleaned_data[name]) + # Normal fields + elif name in form.changed_data: + setattr(obj, name, form.cleaned_data[name]) + + # Update custom fields + for name in custom_fields: + if name in form.nullable_fields and name in nullified_fields: + obj.custom_field_data[name] = None + elif name in form.changed_data: + obj.custom_field_data[name] = form.cleaned_data[name] + + obj.full_clean() + obj.save() + updated_objects.append(obj) + + # Add/remove tags + if form.cleaned_data.get('add_tags', None): + obj.tags.add(*form.cleaned_data['add_tags']) + if form.cleaned_data.get('remove_tags', None): + obj.tags.remove(*form.cleaned_data['remove_tags']) + + return updated_objects + def get(self, request): return redirect(self.get_return_url(request)) @@ -932,78 +998,26 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): if form.is_valid(): logger.debug("Form validation was successful") - custom_fields = form.custom_fields if hasattr(form, 'custom_fields') else [] - standard_fields = [ - field for field in form.fields if field not in custom_fields + ['pk'] - ] - nullified_fields = request.POST.getlist('_nullify') try: with transaction.atomic(): - - updated_objects = [] - for obj in self.queryset.filter(pk__in=form.cleaned_data['pk']): - - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() - - # Update standard fields. If a field is listed in _nullify, delete its value. - for name in standard_fields: - - try: - model_field = model._meta.get_field(name) - except FieldDoesNotExist: - # This form field is used to modify a field rather than set its value directly - model_field = None - - # Handle nullification - if name in form.nullable_fields and name in nullified_fields: - if isinstance(model_field, ManyToManyField): - getattr(obj, name).set([]) - else: - setattr(obj, name, None if model_field.null else '') - - # ManyToManyFields - elif isinstance(model_field, ManyToManyField): - if form.cleaned_data[name]: - getattr(obj, name).set(form.cleaned_data[name]) - # Normal fields - elif name in form.changed_data: - setattr(obj, name, form.cleaned_data[name]) - - # Update custom fields - for name in custom_fields: - if name in form.nullable_fields and name in nullified_fields: - obj.custom_field_data[name] = None - elif name in form.changed_data: - obj.custom_field_data[name] = form.cleaned_data[name] - - obj.full_clean() - obj.save() - updated_objects.append(obj) - logger.debug(f"Saved {obj} (PK: {obj.pk})") - - # Add/remove tags - if form.cleaned_data.get('add_tags', None): - obj.tags.add(*form.cleaned_data['add_tags']) - if form.cleaned_data.get('remove_tags', None): - obj.tags.remove(*form.cleaned_data['remove_tags']) + updated_objects = self._update_objects(form, request) # Enforce object-level permissions - if self.queryset.filter(pk__in=[obj.pk for obj in updated_objects]).count() != len(updated_objects): + object_count = self.queryset.filter(pk__in=[obj.pk for obj in updated_objects]).count() + if object_count != len(updated_objects): raise PermissionsViolation if updated_objects: - msg = 'Updated {} {}'.format(len(updated_objects), model._meta.verbose_name_plural) + msg = f'Updated {len(updated_objects)} {model._meta.verbose_name_plural}' logger.info(msg) messages.success(self.request, msg) return redirect(self.get_return_url(request)) except ValidationError as e: - messages.error(self.request, "{} failed validation: {}".format(obj, ", ".join(e.messages))) + messages.error(self.request, ", ".join(e.messages)) clear_webhooks.send(sender=self) except PermissionsViolation: @@ -1016,7 +1030,6 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): logger.debug("Form validation failed") else: - form = self.form(model, initial=initial_data) restrict_form_fields(form, request.user) @@ -1037,6 +1050,9 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): class BulkRenameView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ An extendable view for renaming objects in bulk. + + queryset: QuerySet of objects being renamed + template_name: The name of the template """ queryset = None template_name = 'generic/object_bulk_rename.html' @@ -1056,6 +1072,29 @@ class BulkRenameView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'change') + def _rename_objects(self, form, selected_objects): + renamed_pks = [] + + for obj in selected_objects: + + # Take a snapshot of change-logged models + if hasattr(obj, 'snapshot'): + obj.snapshot() + + find = form.cleaned_data['find'] + replace = form.cleaned_data['replace'] + if form.cleaned_data['use_regex']: + try: + obj.new_name = re.sub(find, replace, obj.name) + # Catch regex group reference errors + except re.error: + obj.new_name = obj.name + else: + obj.new_name = obj.name.replace(find, replace) + renamed_pks.append(obj.pk) + + return renamed_pks + def post(self, request): logger = logging.getLogger('netbox.views.BulkRenameView') @@ -1066,24 +1105,7 @@ class BulkRenameView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): if form.is_valid(): try: with transaction.atomic(): - renamed_pks = [] - for obj in selected_objects: - - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() - - find = form.cleaned_data['find'] - replace = form.cleaned_data['replace'] - if form.cleaned_data['use_regex']: - try: - obj.new_name = re.sub(find, replace, obj.name) - # Catch regex group reference errors - except re.error: - obj.new_name = obj.name - else: - obj.new_name = obj.name.replace(find, replace) - renamed_pks.append(obj.pk) + renamed_pks = self._rename_objects(form, selected_objects) if '_apply' in request.POST: for obj in selected_objects: @@ -1094,10 +1116,8 @@ class BulkRenameView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): if self.queryset.filter(pk__in=renamed_pks).count() != len(selected_objects): raise PermissionsViolation - messages.success(request, "Renamed {} {}".format( - len(selected_objects), - self.queryset.model._meta.verbose_name_plural - )) + model_name = self.queryset.model._meta.verbose_name_plural + messages.success(request, f"Renamed {len(selected_objects)} {model_name}") return redirect(self.get_return_url(request)) except PermissionsViolation: @@ -1123,7 +1143,7 @@ class BulkDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): Delete objects in bulk. queryset: Custom queryset to use when retrieving objects (e.g. to select related objects) - filter: FilterSet to apply when deleting by QuerySet + filterset: FilterSet to apply when deleting by QuerySet table: The table used to display devices being deleted form: The form class used to delete objects in bulk template_name: The name of the template From 5f9f0e3ed3379582db43718f0252931ed23f622e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 16 Dec 2021 16:39:45 -0500 Subject: [PATCH 015/271] Split generic views into separate modules --- netbox/netbox/views/generic/__init__.py | 2 + netbox/netbox/views/generic/bulk_views.py | 721 +++++++++++++ .../{generic.py => generic/object_views.py} | 978 +++--------------- 3 files changed, 871 insertions(+), 830 deletions(-) create mode 100644 netbox/netbox/views/generic/__init__.py create mode 100644 netbox/netbox/views/generic/bulk_views.py rename netbox/netbox/views/{generic.py => generic/object_views.py} (50%) diff --git a/netbox/netbox/views/generic/__init__.py b/netbox/netbox/views/generic/__init__.py new file mode 100644 index 00000000000..9dd93356846 --- /dev/null +++ b/netbox/netbox/views/generic/__init__.py @@ -0,0 +1,2 @@ +from .object_views import * +from .bulk_views import * diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py new file mode 100644 index 00000000000..bef2c015db5 --- /dev/null +++ b/netbox/netbox/views/generic/bulk_views.py @@ -0,0 +1,721 @@ +import logging +import re +from copy import deepcopy + +from django.contrib import messages +from django.core.exceptions import FieldDoesNotExist, ValidationError +from django.db import transaction, IntegrityError +from django.db.models import ManyToManyField, ProtectedError +from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput, Textarea +from django.shortcuts import redirect, render +from django.views.generic import View + +from extras.signals import clear_webhooks +from utilities.error_handlers import handle_protectederror +from utilities.exceptions import PermissionsViolation +from utilities.forms import ( + BootstrapMixin, BulkRenameForm, ConfirmationForm, CSVDataField, CSVFileField, restrict_form_fields, +) +from utilities.permissions import get_permission_for_model +from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin + +__all__ = ( + 'BulkComponentCreateView', + 'BulkCreateView', + 'BulkDeleteView', + 'BulkEditView', + 'BulkImportView', + 'BulkRenameView', +) + + +class BulkCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): + """ + Create new objects in bulk. + + queryset: Base queryset for the objects being created + form: Form class which provides the `pattern` field + model_form: The ModelForm used to create individual objects + pattern_target: Name of the field to be evaluated as a pattern (if any) + template_name: The name of the template + """ + queryset = None + form = None + model_form = None + pattern_target = '' + template_name = None + + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'add') + + def _create_objects(self, form, request): + new_objects = [] + + # Create objects from the expanded. Abort the transaction on the first validation error. + for value in form.cleaned_data['pattern']: + + # Reinstantiate the model form each time to avoid overwriting the same instance. Use a mutable + # copy of the POST QueryDict so that we can update the target field value. + model_form = self.model_form(request.POST.copy()) + model_form.data[self.pattern_target] = value + + # Validate each new object independently. + if model_form.is_valid(): + obj = model_form.save() + new_objects.append(obj) + else: + # Copy any errors on the pattern target field to the pattern form. + errors = model_form.errors.as_data() + if errors.get(self.pattern_target): + form.add_error('pattern', errors[self.pattern_target]) + # Raise an IntegrityError to break the for loop and abort the transaction. + raise IntegrityError() + + return new_objects + + def get(self, request): + # Set initial values for visible form fields from query args + initial = {} + for field in getattr(self.model_form._meta, 'fields', []): + if request.GET.get(field): + initial[field] = request.GET[field] + + 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), + }) + + def post(self, request): + logger = logging.getLogger('netbox.views.BulkCreateView') + model = self.queryset.model + form = self.form(request.POST) + model_form = self.model_form(request.POST) + + if form.is_valid(): + logger.debug("Form validation was successful") + + try: + with transaction.atomic(): + new_objs = self._create_objects(form, request) + + # Enforce object-level permissions + if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs): + raise PermissionsViolation + + # If we make it to this point, validation has succeeded on all new objects. + msg = f"Added {len(new_objs)} {model._meta.verbose_name_plural}" + logger.info(msg) + messages.success(request, msg) + + if '_addanother' in request.POST: + return redirect(request.path) + return redirect(self.get_return_url(request)) + + except IntegrityError: + pass + + except PermissionsViolation: + msg = "Object creation failed due to object-level permissions violation" + logger.debug(msg) + form.add_error(None, msg) + + 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), + }) + + +class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): + """ + Import objects in bulk (CSV format). + + queryset: Base queryset for the model + model_form: The form used to create each imported object + table: The django-tables2 Table used to render the list of imported objects + template_name: The name of the template + widget_attrs: A dict of attributes to apply to the import widget (e.g. to require a session key) + """ + queryset = None + model_form = None + table = None + template_name = 'generic/object_bulk_import.html' + widget_attrs = {} + + def _import_form(self, *args, **kwargs): + + class ImportForm(BootstrapMixin, Form): + csv = CSVDataField( + from_form=self.model_form, + widget=Textarea(attrs=self.widget_attrs) + ) + csv_file = CSVFileField( + label="CSV file", + from_form=self.model_form, + required=False + ) + + def clean(self): + csv_rows = self.cleaned_data['csv'][1] if 'csv' in self.cleaned_data else None + csv_file = self.files.get('csv_file') + + # Check that the user has not submitted both text data and a file + if csv_rows and csv_file: + raise ValidationError( + "Cannot process CSV text and file attachment simultaneously. Please choose only one import " + "method." + ) + + return ImportForm(*args, **kwargs) + + def _create_objects(self, form, request): + new_objs = [] + if request.FILES: + headers, records = form.cleaned_data['csv_file'] + else: + headers, records = form.cleaned_data['csv'] + + for row, data in enumerate(records, start=1): + obj_form = self.model_form(data, headers=headers) + restrict_form_fields(obj_form, request.user) + + if obj_form.is_valid(): + obj = self._save_obj(obj_form, request) + new_objs.append(obj) + else: + for field, err in obj_form.errors.items(): + form.add_error('csv', f'Row {row} {field}: {err[0]}') + raise ValidationError("") + + return new_objs + + def _save_obj(self, obj_form, request): + """ + Provide a hook to modify the object immediately before saving it (e.g. to encrypt secret data). + """ + return obj_form.save() + + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'add') + + def get(self, request): + + return render(request, self.template_name, { + 'form': self._import_form(), + 'fields': self.model_form().fields, + 'obj_type': self.model_form._meta.model._meta.verbose_name, + 'return_url': self.get_return_url(request), + }) + + def post(self, request): + logger = logging.getLogger('netbox.views.BulkImportView') + form = self._import_form(request.POST, request.FILES) + + if form.is_valid(): + logger.debug("Form validation was successful") + + try: + # Iterate through CSV data and bind each row to a new model form instance. + with transaction.atomic(): + new_objs = self._create_objects(form, request) + + # Enforce object-level permissions + if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs): + raise PermissionsViolation + + # Compile a table containing the imported objects + obj_table = self.table(new_objs) + + if new_objs: + msg = 'Imported {} {}'.format(len(new_objs), new_objs[0]._meta.verbose_name_plural) + logger.info(msg) + messages.success(request, msg) + + return render(request, "import_success.html", { + 'table': obj_table, + 'return_url': self.get_return_url(request), + }) + + except ValidationError: + clear_webhooks.send(sender=self) + + except PermissionsViolation: + msg = "Object import failed due to object-level permissions violation" + logger.debug(msg) + form.add_error(None, msg) + clear_webhooks.send(sender=self) + + else: + logger.debug("Form validation failed") + + return render(request, self.template_name, { + 'form': form, + 'fields': self.model_form().fields, + 'obj_type': self.model_form._meta.model._meta.verbose_name, + 'return_url': self.get_return_url(request), + }) + + +class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): + """ + Edit objects in bulk. + + queryset: Custom queryset to use when retrieving objects (e.g. to select related objects) + filterset: FilterSet to apply when deleting by QuerySet + table: The table used to display devices being edited + form: The form class used to edit objects in bulk + template_name: The name of the template + """ + queryset = None + filterset = None + table = None + form = None + template_name = 'generic/object_bulk_edit.html' + + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'change') + + def _update_objects(self, form, request): + custom_fields = form.custom_fields if hasattr(form, 'custom_fields') else [] + standard_fields = [ + field for field in form.fields if field not in custom_fields + ['pk'] + ] + nullified_fields = request.POST.getlist('_nullify') + updated_objects = [] + + for obj in self.queryset.filter(pk__in=form.cleaned_data['pk']): + + # Take a snapshot of change-logged models + if hasattr(obj, 'snapshot'): + obj.snapshot() + + # Update standard fields. If a field is listed in _nullify, delete its value. + for name in standard_fields: + + try: + model_field = self.queryset.model._meta.get_field(name) + except FieldDoesNotExist: + # This form field is used to modify a field rather than set its value directly + model_field = None + + # Handle nullification + if name in form.nullable_fields and name in nullified_fields: + if isinstance(model_field, ManyToManyField): + getattr(obj, name).set([]) + else: + setattr(obj, name, None if model_field.null else '') + + # ManyToManyFields + elif isinstance(model_field, ManyToManyField): + if form.cleaned_data[name]: + getattr(obj, name).set(form.cleaned_data[name]) + # Normal fields + elif name in form.changed_data: + setattr(obj, name, form.cleaned_data[name]) + + # Update custom fields + for name in custom_fields: + if name in form.nullable_fields and name in nullified_fields: + obj.custom_field_data[name] = None + elif name in form.changed_data: + obj.custom_field_data[name] = form.cleaned_data[name] + + obj.full_clean() + obj.save() + updated_objects.append(obj) + + # Add/remove tags + if form.cleaned_data.get('add_tags', None): + obj.tags.add(*form.cleaned_data['add_tags']) + if form.cleaned_data.get('remove_tags', None): + obj.tags.remove(*form.cleaned_data['remove_tags']) + + return updated_objects + + def get(self, request): + return redirect(self.get_return_url(request)) + + def post(self, request, **kwargs): + logger = logging.getLogger('netbox.views.BulkEditView') + model = self.queryset.model + + # If we are editing *all* objects in the queryset, replace the PK list with all matched objects. + if request.POST.get('_all') and self.filterset is not None: + pk_list = self.filterset(request.GET, self.queryset.values_list('pk', flat=True)).qs + else: + pk_list = request.POST.getlist('pk') + + # Include the PK list as initial data for the form + initial_data = {'pk': pk_list} + + # Check for other contextual data needed for the form. We avoid passing all of request.GET because the + # filter values will conflict with the bulk edit form fields. + # TODO: Find a better way to accomplish this + if 'device' in request.GET: + initial_data['device'] = request.GET.get('device') + elif 'device_type' in request.GET: + initial_data['device_type'] = request.GET.get('device_type') + elif 'virtual_machine' in request.GET: + initial_data['virtual_machine'] = request.GET.get('virtual_machine') + + if '_apply' in request.POST: + form = self.form(model, request.POST, initial=initial_data) + restrict_form_fields(form, request.user) + + if form.is_valid(): + logger.debug("Form validation was successful") + + try: + + with transaction.atomic(): + updated_objects = self._update_objects(form, request) + + # Enforce object-level permissions + object_count = self.queryset.filter(pk__in=[obj.pk for obj in updated_objects]).count() + if object_count != len(updated_objects): + raise PermissionsViolation + + if updated_objects: + msg = f'Updated {len(updated_objects)} {model._meta.verbose_name_plural}' + logger.info(msg) + messages.success(self.request, msg) + + return redirect(self.get_return_url(request)) + + except ValidationError as e: + messages.error(self.request, ", ".join(e.messages)) + clear_webhooks.send(sender=self) + + except PermissionsViolation: + msg = "Object update failed due to object-level permissions violation" + logger.debug(msg) + form.add_error(None, msg) + clear_webhooks.send(sender=self) + + else: + logger.debug("Form validation failed") + + else: + form = self.form(model, initial=initial_data) + restrict_form_fields(form, request.user) + + # Retrieve objects being edited + table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False) + if not table.rows: + messages.warning(request, "No {} were selected.".format(model._meta.verbose_name_plural)) + return redirect(self.get_return_url(request)) + + return render(request, self.template_name, { + 'form': form, + 'table': table, + 'obj_type_plural': model._meta.verbose_name_plural, + 'return_url': self.get_return_url(request), + }) + + +class BulkRenameView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): + """ + An extendable view for renaming objects in bulk. + + queryset: QuerySet of objects being renamed + template_name: The name of the template + """ + queryset = None + template_name = 'generic/object_bulk_rename.html' + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Create a new Form class from BulkRenameForm + class _Form(BulkRenameForm): + pk = ModelMultipleChoiceField( + queryset=self.queryset, + widget=MultipleHiddenInput() + ) + + self.form = _Form + + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'change') + + def _rename_objects(self, form, selected_objects): + renamed_pks = [] + + for obj in selected_objects: + + # Take a snapshot of change-logged models + if hasattr(obj, 'snapshot'): + obj.snapshot() + + find = form.cleaned_data['find'] + replace = form.cleaned_data['replace'] + if form.cleaned_data['use_regex']: + try: + obj.new_name = re.sub(find, replace, obj.name) + # Catch regex group reference errors + except re.error: + obj.new_name = obj.name + else: + obj.new_name = obj.name.replace(find, replace) + renamed_pks.append(obj.pk) + + return renamed_pks + + def post(self, request): + logger = logging.getLogger('netbox.views.BulkRenameView') + + if '_preview' in request.POST or '_apply' in request.POST: + form = self.form(request.POST, initial={'pk': request.POST.getlist('pk')}) + selected_objects = self.queryset.filter(pk__in=form.initial['pk']) + + if form.is_valid(): + try: + with transaction.atomic(): + renamed_pks = self._rename_objects(form, selected_objects) + + if '_apply' in request.POST: + for obj in selected_objects: + obj.name = obj.new_name + obj.save() + + # Enforce constrained permissions + if self.queryset.filter(pk__in=renamed_pks).count() != len(selected_objects): + raise PermissionsViolation + + model_name = self.queryset.model._meta.verbose_name_plural + messages.success(request, f"Renamed {len(selected_objects)} {model_name}") + return redirect(self.get_return_url(request)) + + except PermissionsViolation: + msg = "Object update failed due to object-level permissions violation" + logger.debug(msg) + form.add_error(None, msg) + clear_webhooks.send(sender=self) + + else: + form = self.form(initial={'pk': request.POST.getlist('pk')}) + selected_objects = self.queryset.filter(pk__in=form.initial['pk']) + + return render(request, self.template_name, { + 'form': form, + 'obj_type_plural': self.queryset.model._meta.verbose_name_plural, + 'selected_objects': selected_objects, + 'return_url': self.get_return_url(request), + }) + + +class BulkDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): + """ + Delete objects in bulk. + + queryset: Custom queryset to use when retrieving objects (e.g. to select related objects) + filterset: FilterSet to apply when deleting by QuerySet + table: The table used to display devices being deleted + form: The form class used to delete objects in bulk + template_name: The name of the template + """ + queryset = None + filterset = None + table = None + form = None + template_name = 'generic/object_bulk_delete.html' + + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'delete') + + def get(self, request): + return redirect(self.get_return_url(request)) + + def post(self, request, **kwargs): + logger = logging.getLogger('netbox.views.BulkDeleteView') + model = self.queryset.model + + # Are we deleting *all* objects in the queryset or just a selected subset? + if request.POST.get('_all'): + qs = model.objects.all() + if self.filterset is not None: + qs = self.filterset(request.GET, qs).qs + pk_list = qs.only('pk').values_list('pk', flat=True) + else: + pk_list = [int(pk) for pk in request.POST.getlist('pk')] + + form_cls = self.get_form() + + if '_confirm' in request.POST: + form = form_cls(request.POST) + if form.is_valid(): + logger.debug("Form validation was successful") + + # Delete objects + queryset = self.queryset.filter(pk__in=pk_list) + deleted_count = queryset.count() + try: + for obj in queryset: + # Take a snapshot of change-logged models + if hasattr(obj, 'snapshot'): + obj.snapshot() + obj.delete() + except ProtectedError as e: + logger.info("Caught ProtectedError while attempting to delete objects") + handle_protectederror(queryset, request, e) + return redirect(self.get_return_url(request)) + + msg = f"Deleted {deleted_count} {model._meta.verbose_name_plural}" + logger.info(msg) + messages.success(request, msg) + return redirect(self.get_return_url(request)) + + else: + logger.debug("Form validation failed") + + else: + form = form_cls(initial={ + 'pk': pk_list, + 'return_url': self.get_return_url(request), + }) + + # Retrieve objects being deleted + table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False) + if not table.rows: + messages.warning(request, "No {} were selected for deletion.".format(model._meta.verbose_name_plural)) + return redirect(self.get_return_url(request)) + + return render(request, self.template_name, { + 'form': form, + 'obj_type_plural': model._meta.verbose_name_plural, + 'table': table, + 'return_url': self.get_return_url(request), + }) + + def get_form(self): + """ + Provide a standard bulk delete form if none has been specified for the view + """ + class BulkDeleteForm(ConfirmationForm): + pk = ModelMultipleChoiceField(queryset=self.queryset, widget=MultipleHiddenInput) + + if self.form: + return self.form + + return BulkDeleteForm + + +# +# Device/VirtualMachine components +# + +class BulkComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): + """ + Add one or more components (e.g. interfaces, console ports, etc.) to a set of Devices or VirtualMachines. + """ + parent_model = None + parent_field = None + form = None + queryset = None + model_form = None + filterset = None + table = None + template_name = 'generic/object_bulk_add_component.html' + + def get_required_permission(self): + return f'dcim.add_{self.queryset.model._meta.model_name}' + + def post(self, request): + logger = logging.getLogger('netbox.views.BulkComponentCreateView') + parent_model_name = self.parent_model._meta.verbose_name_plural + model_name = self.queryset.model._meta.verbose_name_plural + + # Are we editing *all* objects in the queryset or just a selected subset? + if request.POST.get('_all') and self.filterset is not None: + pk_list = [obj.pk for obj in self.filterset(request.GET, self.parent_model.objects.only('pk')).qs] + else: + pk_list = [int(pk) for pk in request.POST.getlist('pk')] + + selected_objects = self.parent_model.objects.filter(pk__in=pk_list) + if not selected_objects: + messages.warning(request, "No {} were selected.".format(self.parent_model._meta.verbose_name_plural)) + return redirect(self.get_return_url(request)) + table = self.table(selected_objects) + + if '_create' in request.POST: + form = self.form(request.POST) + + if form.is_valid(): + logger.debug("Form validation was successful") + + new_components = [] + data = deepcopy(form.cleaned_data) + + try: + with transaction.atomic(): + + for obj in data['pk']: + + names = data['name_pattern'] + labels = data['label_pattern'] if 'label_pattern' in data else None + for i, name in enumerate(names): + label = labels[i] if labels else None + + component_data = { + self.parent_field: obj.pk, + 'name': name, + 'label': label + } + component_data.update(data) + component_form = self.model_form(component_data) + if component_form.is_valid(): + instance = component_form.save() + logger.debug(f"Created {instance} on {instance.parent_object}") + new_components.append(instance) + else: + for field, errors in component_form.errors.as_data().items(): + for e in errors: + form.add_error(field, '{} {}: {}'.format(obj, name, ', '.join(e))) + + # Enforce object-level permissions + if self.queryset.filter(pk__in=[obj.pk for obj in new_components]).count() != len(new_components): + raise PermissionsViolation + + except IntegrityError: + clear_webhooks.send(sender=self) + + except PermissionsViolation: + msg = "Component creation failed due to object-level permissions violation" + logger.debug(msg) + form.add_error(None, msg) + clear_webhooks.send(sender=self) + + if not form.errors: + msg = "Added {} {} to {} {}.".format( + len(new_components), + model_name, + len(form.cleaned_data['pk']), + parent_model_name + ) + logger.info(msg) + messages.success(request, msg) + + return redirect(self.get_return_url(request)) + + else: + logger.debug("Form validation failed") + + else: + form = self.form(initial={'pk': pk_list}) + + return render(request, self.template_name, { + 'form': form, + 'parent_model_name': parent_model_name, + 'model_name': model_name, + 'table': table, + 'return_url': self.get_return_url(request), + }) diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic/object_views.py similarity index 50% rename from netbox/netbox/views/generic.py rename to netbox/netbox/views/generic/object_views.py index 3096b86fc89..588b51062ee 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic/object_views.py @@ -1,13 +1,11 @@ import logging -import re from copy import deepcopy from django.contrib import messages from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist, ValidationError -from django.db import transaction, IntegrityError -from django.db.models import ManyToManyField, ProtectedError -from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput, Textarea +from django.core.exceptions import ObjectDoesNotExist +from django.db import transaction +from django.db.models import ProtectedError from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.utils.html import escape @@ -20,15 +18,23 @@ from extras.models import ExportTemplate from extras.signals import clear_webhooks from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortTransaction, PermissionsViolation -from utilities.forms import ( - BootstrapMixin, BulkRenameForm, ConfirmationForm, CSVDataField, CSVFileField, ImportForm, restrict_form_fields, -) +from utilities.forms import ConfirmationForm, ImportForm, restrict_form_fields from utilities.htmx import is_htmx from utilities.permissions import get_permission_for_model from utilities.tables import paginate_table from utilities.utils import normalize_querydict, prepare_cloned_fields from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin +__all__ = ( + 'ComponentCreateView', + 'ObjectChildrenView', + 'ObjectDeleteView', + 'ObjectEditView', + 'ObjectImportView', + 'ObjectListView', + 'ObjectView', +) + class ObjectView(ObjectPermissionRequiredMixin, View): """ @@ -296,6 +302,140 @@ class ObjectListView(ObjectPermissionRequiredMixin, View): return render(request, self.template_name, context) +class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): + """ + Import a single object (YAML or JSON format). + + queryset: Base queryset for the objects being created + model_form: The ModelForm used to create individual objects + related_object_forms: A dictionary mapping of forms to be used for the creation of related (child) objects + template_name: The name of the template + """ + queryset = None + model_form = None + related_object_forms = dict() + template_name = 'generic/object_import.html' + + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'add') + + def _create_object(self, model_form): + + # Save the primary object + obj = model_form.save() + + # Enforce object-level permissions + if not self.queryset.filter(pk=obj.pk).first(): + raise PermissionsViolation() + + # Iterate through the related object forms (if any), validating and saving each instance. + for field_name, related_object_form in self.related_object_forms.items(): + + related_obj_pks = [] + for i, rel_obj_data in enumerate(model_form.data.get(field_name, list())): + + f = related_object_form(obj, rel_obj_data) + + for subfield_name, field in f.fields.items(): + if subfield_name not in rel_obj_data and hasattr(field, 'initial'): + f.data[subfield_name] = field.initial + + if f.is_valid(): + related_obj = f.save() + related_obj_pks.append(related_obj.pk) + else: + # Replicate errors on the related object form to the primary form for display + for subfield_name, errors in f.errors.items(): + for err in errors: + err_msg = "{}[{}] {}: {}".format(field_name, i, subfield_name, err) + model_form.add_error(None, err_msg) + raise AbortTransaction() + + # Enforce object-level permissions on related objects + model = related_object_form.Meta.model + if model.objects.filter(pk__in=related_obj_pks).count() != len(related_obj_pks): + raise ObjectDoesNotExist + + return obj + + def get(self, request): + form = ImportForm() + + return render(request, self.template_name, { + 'form': form, + 'obj_type': self.queryset.model._meta.verbose_name, + 'return_url': self.get_return_url(request), + }) + + def post(self, request): + logger = logging.getLogger('netbox.views.ObjectImportView') + form = ImportForm(request.POST) + + if form.is_valid(): + logger.debug("Import form validation was successful") + + # Initialize model form + data = form.cleaned_data['data'] + model_form = self.model_form(data) + restrict_form_fields(model_form, request.user) + + # Assign default values for any fields which were not specified. We have to do this manually because passing + # 'initial=' to the form on initialization merely sets default values for the widgets. Since widgets are not + # used for YAML/JSON import, we first bind the imported data normally, then update the form's data with the + # applicable field defaults as needed prior to form validation. + for field_name, field in model_form.fields.items(): + if field_name not in data and hasattr(field, 'initial'): + model_form.data[field_name] = field.initial + + if model_form.is_valid(): + + try: + with transaction.atomic(): + obj = self._create_object(model_form) + + except AbortTransaction: + clear_webhooks.send(sender=self) + + except PermissionsViolation: + msg = "Object creation failed due to object-level permissions violation" + logger.debug(msg) + form.add_error(None, msg) + clear_webhooks.send(sender=self) + + if not model_form.errors: + logger.info(f"Import object {obj} (PK: {obj.pk})") + msg = f'Imported object: {obj}' + messages.success(request, mark_safe(msg)) + + if '_addanother' in request.POST: + return redirect(request.get_full_path()) + + return_url = form.cleaned_data.get('return_url') + if return_url is not None and is_safe_url(url=return_url, allowed_hosts=request.get_host()): + return redirect(return_url) + return redirect(self.get_return_url(request, obj)) + + else: + logger.debug("Model form validation failed") + + # Replicate model form errors for display + for field, errors in model_form.errors.items(): + for err in errors: + if field == '__all__': + form.add_error(None, err) + else: + form.add_error(None, "{}: {}".format(field, err)) + + else: + logger.debug("Import form validation failed") + + return render(request, self.template_name, { + 'form': form, + 'obj_type': self.queryset.model._meta.verbose_name, + 'return_url': self.get_return_url(request), + }) + + class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ Create or edit a single object. @@ -520,720 +660,6 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) -class BulkCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): - """ - Create new objects in bulk. - - queryset: Base queryset for the objects being created - form: Form class which provides the `pattern` field - model_form: The ModelForm used to create individual objects - pattern_target: Name of the field to be evaluated as a pattern (if any) - template_name: The name of the template - """ - queryset = None - form = None - model_form = None - pattern_target = '' - template_name = None - - def get_required_permission(self): - return get_permission_for_model(self.queryset.model, 'add') - - def _create_objects(self, form, request): - new_objects = [] - - # Create objects from the expanded. Abort the transaction on the first validation error. - for value in form.cleaned_data['pattern']: - - # Reinstantiate the model form each time to avoid overwriting the same instance. Use a mutable - # copy of the POST QueryDict so that we can update the target field value. - model_form = self.model_form(request.POST.copy()) - model_form.data[self.pattern_target] = value - - # Validate each new object independently. - if model_form.is_valid(): - obj = model_form.save() - new_objects.append(obj) - else: - # Copy any errors on the pattern target field to the pattern form. - errors = model_form.errors.as_data() - if errors.get(self.pattern_target): - form.add_error('pattern', errors[self.pattern_target]) - # Raise an IntegrityError to break the for loop and abort the transaction. - raise IntegrityError() - - return new_objects - - def get(self, request): - # Set initial values for visible form fields from query args - initial = {} - for field in getattr(self.model_form._meta, 'fields', []): - if request.GET.get(field): - initial[field] = request.GET[field] - - 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), - }) - - def post(self, request): - logger = logging.getLogger('netbox.views.BulkCreateView') - model = self.queryset.model - form = self.form(request.POST) - model_form = self.model_form(request.POST) - - if form.is_valid(): - logger.debug("Form validation was successful") - - try: - with transaction.atomic(): - new_objs = self._create_objects(form, request) - - # Enforce object-level permissions - if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs): - raise PermissionsViolation - - # If we make it to this point, validation has succeeded on all new objects. - msg = f"Added {len(new_objs)} {model._meta.verbose_name_plural}" - logger.info(msg) - messages.success(request, msg) - - if '_addanother' in request.POST: - return redirect(request.path) - return redirect(self.get_return_url(request)) - - except IntegrityError: - pass - - except PermissionsViolation: - msg = "Object creation failed due to object-level permissions violation" - logger.debug(msg) - form.add_error(None, msg) - - 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), - }) - - -class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): - """ - Import a single object (YAML or JSON format). - - queryset: Base queryset for the objects being created - model_form: The ModelForm used to create individual objects - related_object_forms: A dictionary mapping of forms to be used for the creation of related (child) objects - template_name: The name of the template - """ - queryset = None - model_form = None - related_object_forms = dict() - template_name = 'generic/object_import.html' - - def get_required_permission(self): - return get_permission_for_model(self.queryset.model, 'add') - - def _create_object(self, model_form): - - # Save the primary object - obj = model_form.save() - - # Enforce object-level permissions - if not self.queryset.filter(pk=obj.pk).first(): - raise PermissionsViolation() - - # Iterate through the related object forms (if any), validating and saving each instance. - for field_name, related_object_form in self.related_object_forms.items(): - - related_obj_pks = [] - for i, rel_obj_data in enumerate(model_form.data.get(field_name, list())): - - f = related_object_form(obj, rel_obj_data) - - for subfield_name, field in f.fields.items(): - if subfield_name not in rel_obj_data and hasattr(field, 'initial'): - f.data[subfield_name] = field.initial - - if f.is_valid(): - related_obj = f.save() - related_obj_pks.append(related_obj.pk) - else: - # Replicate errors on the related object form to the primary form for display - for subfield_name, errors in f.errors.items(): - for err in errors: - err_msg = "{}[{}] {}: {}".format(field_name, i, subfield_name, err) - model_form.add_error(None, err_msg) - raise AbortTransaction() - - # Enforce object-level permissions on related objects - model = related_object_form.Meta.model - if model.objects.filter(pk__in=related_obj_pks).count() != len(related_obj_pks): - raise ObjectDoesNotExist - - return obj - - def get(self, request): - form = ImportForm() - - return render(request, self.template_name, { - 'form': form, - 'obj_type': self.queryset.model._meta.verbose_name, - 'return_url': self.get_return_url(request), - }) - - def post(self, request): - logger = logging.getLogger('netbox.views.ObjectImportView') - form = ImportForm(request.POST) - - if form.is_valid(): - logger.debug("Import form validation was successful") - - # Initialize model form - data = form.cleaned_data['data'] - model_form = self.model_form(data) - restrict_form_fields(model_form, request.user) - - # Assign default values for any fields which were not specified. We have to do this manually because passing - # 'initial=' to the form on initialization merely sets default values for the widgets. Since widgets are not - # used for YAML/JSON import, we first bind the imported data normally, then update the form's data with the - # applicable field defaults as needed prior to form validation. - for field_name, field in model_form.fields.items(): - if field_name not in data and hasattr(field, 'initial'): - model_form.data[field_name] = field.initial - - if model_form.is_valid(): - - try: - with transaction.atomic(): - obj = self._create_object(model_form) - - except AbortTransaction: - clear_webhooks.send(sender=self) - - except PermissionsViolation: - msg = "Object creation failed due to object-level permissions violation" - logger.debug(msg) - form.add_error(None, msg) - clear_webhooks.send(sender=self) - - if not model_form.errors: - logger.info(f"Import object {obj} (PK: {obj.pk})") - msg = f'Imported object: {obj}' - messages.success(request, mark_safe(msg)) - - if '_addanother' in request.POST: - return redirect(request.get_full_path()) - - return_url = form.cleaned_data.get('return_url') - if return_url is not None and is_safe_url(url=return_url, allowed_hosts=request.get_host()): - return redirect(return_url) - return redirect(self.get_return_url(request, obj)) - - else: - logger.debug("Model form validation failed") - - # Replicate model form errors for display - for field, errors in model_form.errors.items(): - for err in errors: - if field == '__all__': - form.add_error(None, err) - else: - form.add_error(None, "{}: {}".format(field, err)) - - else: - logger.debug("Import form validation failed") - - return render(request, self.template_name, { - 'form': form, - 'obj_type': self.queryset.model._meta.verbose_name, - 'return_url': self.get_return_url(request), - }) - - -class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): - """ - Import objects in bulk (CSV format). - - queryset: Base queryset for the model - model_form: The form used to create each imported object - table: The django-tables2 Table used to render the list of imported objects - template_name: The name of the template - widget_attrs: A dict of attributes to apply to the import widget (e.g. to require a session key) - """ - queryset = None - model_form = None - table = None - template_name = 'generic/object_bulk_import.html' - widget_attrs = {} - - def _import_form(self, *args, **kwargs): - - class ImportForm(BootstrapMixin, Form): - csv = CSVDataField( - from_form=self.model_form, - widget=Textarea(attrs=self.widget_attrs) - ) - csv_file = CSVFileField( - label="CSV file", - from_form=self.model_form, - required=False - ) - - def clean(self): - csv_rows = self.cleaned_data['csv'][1] if 'csv' in self.cleaned_data else None - csv_file = self.files.get('csv_file') - - # Check that the user has not submitted both text data and a file - if csv_rows and csv_file: - raise ValidationError( - "Cannot process CSV text and file attachment simultaneously. Please choose only one import " - "method." - ) - - return ImportForm(*args, **kwargs) - - def _create_objects(self, form, request): - new_objs = [] - if request.FILES: - headers, records = form.cleaned_data['csv_file'] - else: - headers, records = form.cleaned_data['csv'] - - for row, data in enumerate(records, start=1): - obj_form = self.model_form(data, headers=headers) - restrict_form_fields(obj_form, request.user) - - if obj_form.is_valid(): - obj = self._save_obj(obj_form, request) - new_objs.append(obj) - else: - for field, err in obj_form.errors.items(): - form.add_error('csv', f'Row {row} {field}: {err[0]}') - raise ValidationError("") - - return new_objs - - def _save_obj(self, obj_form, request): - """ - Provide a hook to modify the object immediately before saving it (e.g. to encrypt secret data). - """ - return obj_form.save() - - def get_required_permission(self): - return get_permission_for_model(self.queryset.model, 'add') - - def get(self, request): - - return render(request, self.template_name, { - 'form': self._import_form(), - 'fields': self.model_form().fields, - 'obj_type': self.model_form._meta.model._meta.verbose_name, - 'return_url': self.get_return_url(request), - }) - - def post(self, request): - logger = logging.getLogger('netbox.views.BulkImportView') - form = self._import_form(request.POST, request.FILES) - - if form.is_valid(): - logger.debug("Form validation was successful") - - try: - # Iterate through CSV data and bind each row to a new model form instance. - with transaction.atomic(): - new_objs = self._create_objects(form, request) - - # Enforce object-level permissions - if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs): - raise PermissionsViolation - - # Compile a table containing the imported objects - obj_table = self.table(new_objs) - - if new_objs: - msg = 'Imported {} {}'.format(len(new_objs), new_objs[0]._meta.verbose_name_plural) - logger.info(msg) - messages.success(request, msg) - - return render(request, "import_success.html", { - 'table': obj_table, - 'return_url': self.get_return_url(request), - }) - - except ValidationError: - clear_webhooks.send(sender=self) - - except PermissionsViolation: - msg = "Object import failed due to object-level permissions violation" - logger.debug(msg) - form.add_error(None, msg) - clear_webhooks.send(sender=self) - - else: - logger.debug("Form validation failed") - - return render(request, self.template_name, { - 'form': form, - 'fields': self.model_form().fields, - 'obj_type': self.model_form._meta.model._meta.verbose_name, - 'return_url': self.get_return_url(request), - }) - - -class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): - """ - Edit objects in bulk. - - queryset: Custom queryset to use when retrieving objects (e.g. to select related objects) - filterset: FilterSet to apply when deleting by QuerySet - table: The table used to display devices being edited - form: The form class used to edit objects in bulk - template_name: The name of the template - """ - queryset = None - filterset = None - table = None - form = None - template_name = 'generic/object_bulk_edit.html' - - def get_required_permission(self): - return get_permission_for_model(self.queryset.model, 'change') - - def _update_objects(self, form, request): - custom_fields = form.custom_fields if hasattr(form, 'custom_fields') else [] - standard_fields = [ - field for field in form.fields if field not in custom_fields + ['pk'] - ] - nullified_fields = request.POST.getlist('_nullify') - updated_objects = [] - - for obj in self.queryset.filter(pk__in=form.cleaned_data['pk']): - - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() - - # Update standard fields. If a field is listed in _nullify, delete its value. - for name in standard_fields: - - try: - model_field = self.queryset.model._meta.get_field(name) - except FieldDoesNotExist: - # This form field is used to modify a field rather than set its value directly - model_field = None - - # Handle nullification - if name in form.nullable_fields and name in nullified_fields: - if isinstance(model_field, ManyToManyField): - getattr(obj, name).set([]) - else: - setattr(obj, name, None if model_field.null else '') - - # ManyToManyFields - elif isinstance(model_field, ManyToManyField): - if form.cleaned_data[name]: - getattr(obj, name).set(form.cleaned_data[name]) - # Normal fields - elif name in form.changed_data: - setattr(obj, name, form.cleaned_data[name]) - - # Update custom fields - for name in custom_fields: - if name in form.nullable_fields and name in nullified_fields: - obj.custom_field_data[name] = None - elif name in form.changed_data: - obj.custom_field_data[name] = form.cleaned_data[name] - - obj.full_clean() - obj.save() - updated_objects.append(obj) - - # Add/remove tags - if form.cleaned_data.get('add_tags', None): - obj.tags.add(*form.cleaned_data['add_tags']) - if form.cleaned_data.get('remove_tags', None): - obj.tags.remove(*form.cleaned_data['remove_tags']) - - return updated_objects - - def get(self, request): - return redirect(self.get_return_url(request)) - - def post(self, request, **kwargs): - logger = logging.getLogger('netbox.views.BulkEditView') - model = self.queryset.model - - # If we are editing *all* objects in the queryset, replace the PK list with all matched objects. - if request.POST.get('_all') and self.filterset is not None: - pk_list = self.filterset(request.GET, self.queryset.values_list('pk', flat=True)).qs - else: - pk_list = request.POST.getlist('pk') - - # Include the PK list as initial data for the form - initial_data = {'pk': pk_list} - - # Check for other contextual data needed for the form. We avoid passing all of request.GET because the - # filter values will conflict with the bulk edit form fields. - # TODO: Find a better way to accomplish this - if 'device' in request.GET: - initial_data['device'] = request.GET.get('device') - elif 'device_type' in request.GET: - initial_data['device_type'] = request.GET.get('device_type') - elif 'virtual_machine' in request.GET: - initial_data['virtual_machine'] = request.GET.get('virtual_machine') - - if '_apply' in request.POST: - form = self.form(model, request.POST, initial=initial_data) - restrict_form_fields(form, request.user) - - if form.is_valid(): - logger.debug("Form validation was successful") - - try: - - with transaction.atomic(): - updated_objects = self._update_objects(form, request) - - # Enforce object-level permissions - object_count = self.queryset.filter(pk__in=[obj.pk for obj in updated_objects]).count() - if object_count != len(updated_objects): - raise PermissionsViolation - - if updated_objects: - msg = f'Updated {len(updated_objects)} {model._meta.verbose_name_plural}' - logger.info(msg) - messages.success(self.request, msg) - - return redirect(self.get_return_url(request)) - - except ValidationError as e: - messages.error(self.request, ", ".join(e.messages)) - clear_webhooks.send(sender=self) - - except PermissionsViolation: - msg = "Object update failed due to object-level permissions violation" - logger.debug(msg) - form.add_error(None, msg) - clear_webhooks.send(sender=self) - - else: - logger.debug("Form validation failed") - - else: - form = self.form(model, initial=initial_data) - restrict_form_fields(form, request.user) - - # Retrieve objects being edited - table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False) - if not table.rows: - messages.warning(request, "No {} were selected.".format(model._meta.verbose_name_plural)) - return redirect(self.get_return_url(request)) - - return render(request, self.template_name, { - 'form': form, - 'table': table, - 'obj_type_plural': model._meta.verbose_name_plural, - 'return_url': self.get_return_url(request), - }) - - -class BulkRenameView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): - """ - An extendable view for renaming objects in bulk. - - queryset: QuerySet of objects being renamed - template_name: The name of the template - """ - queryset = None - template_name = 'generic/object_bulk_rename.html' - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Create a new Form class from BulkRenameForm - class _Form(BulkRenameForm): - pk = ModelMultipleChoiceField( - queryset=self.queryset, - widget=MultipleHiddenInput() - ) - - self.form = _Form - - def get_required_permission(self): - return get_permission_for_model(self.queryset.model, 'change') - - def _rename_objects(self, form, selected_objects): - renamed_pks = [] - - for obj in selected_objects: - - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() - - find = form.cleaned_data['find'] - replace = form.cleaned_data['replace'] - if form.cleaned_data['use_regex']: - try: - obj.new_name = re.sub(find, replace, obj.name) - # Catch regex group reference errors - except re.error: - obj.new_name = obj.name - else: - obj.new_name = obj.name.replace(find, replace) - renamed_pks.append(obj.pk) - - return renamed_pks - - def post(self, request): - logger = logging.getLogger('netbox.views.BulkRenameView') - - if '_preview' in request.POST or '_apply' in request.POST: - form = self.form(request.POST, initial={'pk': request.POST.getlist('pk')}) - selected_objects = self.queryset.filter(pk__in=form.initial['pk']) - - if form.is_valid(): - try: - with transaction.atomic(): - renamed_pks = self._rename_objects(form, selected_objects) - - if '_apply' in request.POST: - for obj in selected_objects: - obj.name = obj.new_name - obj.save() - - # Enforce constrained permissions - if self.queryset.filter(pk__in=renamed_pks).count() != len(selected_objects): - raise PermissionsViolation - - model_name = self.queryset.model._meta.verbose_name_plural - messages.success(request, f"Renamed {len(selected_objects)} {model_name}") - return redirect(self.get_return_url(request)) - - except PermissionsViolation: - msg = "Object update failed due to object-level permissions violation" - logger.debug(msg) - form.add_error(None, msg) - clear_webhooks.send(sender=self) - - else: - form = self.form(initial={'pk': request.POST.getlist('pk')}) - selected_objects = self.queryset.filter(pk__in=form.initial['pk']) - - return render(request, self.template_name, { - 'form': form, - 'obj_type_plural': self.queryset.model._meta.verbose_name_plural, - 'selected_objects': selected_objects, - 'return_url': self.get_return_url(request), - }) - - -class BulkDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): - """ - Delete objects in bulk. - - queryset: Custom queryset to use when retrieving objects (e.g. to select related objects) - filterset: FilterSet to apply when deleting by QuerySet - table: The table used to display devices being deleted - form: The form class used to delete objects in bulk - template_name: The name of the template - """ - queryset = None - filterset = None - table = None - form = None - template_name = 'generic/object_bulk_delete.html' - - def get_required_permission(self): - return get_permission_for_model(self.queryset.model, 'delete') - - def get(self, request): - return redirect(self.get_return_url(request)) - - def post(self, request, **kwargs): - logger = logging.getLogger('netbox.views.BulkDeleteView') - model = self.queryset.model - - # Are we deleting *all* objects in the queryset or just a selected subset? - if request.POST.get('_all'): - qs = model.objects.all() - if self.filterset is not None: - qs = self.filterset(request.GET, qs).qs - pk_list = qs.only('pk').values_list('pk', flat=True) - else: - pk_list = [int(pk) for pk in request.POST.getlist('pk')] - - form_cls = self.get_form() - - if '_confirm' in request.POST: - form = form_cls(request.POST) - if form.is_valid(): - logger.debug("Form validation was successful") - - # Delete objects - queryset = self.queryset.filter(pk__in=pk_list) - deleted_count = queryset.count() - try: - for obj in queryset: - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() - obj.delete() - except ProtectedError as e: - logger.info("Caught ProtectedError while attempting to delete objects") - handle_protectederror(queryset, request, e) - return redirect(self.get_return_url(request)) - - msg = f"Deleted {deleted_count} {model._meta.verbose_name_plural}" - logger.info(msg) - messages.success(request, msg) - return redirect(self.get_return_url(request)) - - else: - logger.debug("Form validation failed") - - else: - form = form_cls(initial={ - 'pk': pk_list, - 'return_url': self.get_return_url(request), - }) - - # Retrieve objects being deleted - table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False) - if not table.rows: - messages.warning(request, "No {} were selected for deletion.".format(model._meta.verbose_name_plural)) - return redirect(self.get_return_url(request)) - - return render(request, self.template_name, { - 'form': form, - 'obj_type_plural': model._meta.verbose_name_plural, - 'table': table, - 'return_url': self.get_return_url(request), - }) - - def get_form(self): - """ - Provide a standard bulk delete form if none has been specified for the view - """ - class BulkDeleteForm(ConfirmationForm): - pk = ModelMultipleChoiceField(queryset=self.queryset, widget=MultipleHiddenInput) - - if self.form: - return self.form - - return BulkDeleteForm - - # # Device/VirtualMachine components # @@ -1342,111 +768,3 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View clear_webhooks.send(sender=self) return None - - -class BulkComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): - """ - Add one or more components (e.g. interfaces, console ports, etc.) to a set of Devices or VirtualMachines. - """ - parent_model = None - parent_field = None - form = None - queryset = None - model_form = None - filterset = None - table = None - template_name = 'generic/object_bulk_add_component.html' - - def get_required_permission(self): - return f'dcim.add_{self.queryset.model._meta.model_name}' - - def post(self, request): - logger = logging.getLogger('netbox.views.BulkComponentCreateView') - parent_model_name = self.parent_model._meta.verbose_name_plural - model_name = self.queryset.model._meta.verbose_name_plural - - # Are we editing *all* objects in the queryset or just a selected subset? - if request.POST.get('_all') and self.filterset is not None: - pk_list = [obj.pk for obj in self.filterset(request.GET, self.parent_model.objects.only('pk')).qs] - else: - pk_list = [int(pk) for pk in request.POST.getlist('pk')] - - selected_objects = self.parent_model.objects.filter(pk__in=pk_list) - if not selected_objects: - messages.warning(request, "No {} were selected.".format(self.parent_model._meta.verbose_name_plural)) - return redirect(self.get_return_url(request)) - table = self.table(selected_objects) - - if '_create' in request.POST: - form = self.form(request.POST) - - if form.is_valid(): - logger.debug("Form validation was successful") - - new_components = [] - data = deepcopy(form.cleaned_data) - - try: - with transaction.atomic(): - - for obj in data['pk']: - - names = data['name_pattern'] - labels = data['label_pattern'] if 'label_pattern' in data else None - for i, name in enumerate(names): - label = labels[i] if labels else None - - component_data = { - self.parent_field: obj.pk, - 'name': name, - 'label': label - } - component_data.update(data) - component_form = self.model_form(component_data) - if component_form.is_valid(): - instance = component_form.save() - logger.debug(f"Created {instance} on {instance.parent_object}") - new_components.append(instance) - else: - for field, errors in component_form.errors.as_data().items(): - for e in errors: - form.add_error(field, '{} {}: {}'.format(obj, name, ', '.join(e))) - - # Enforce object-level permissions - if self.queryset.filter(pk__in=[obj.pk for obj in new_components]).count() != len(new_components): - raise PermissionsViolation - - except IntegrityError: - clear_webhooks.send(sender=self) - - except PermissionsViolation: - msg = "Component creation failed due to object-level permissions violation" - logger.debug(msg) - form.add_error(None, msg) - clear_webhooks.send(sender=self) - - if not form.errors: - msg = "Added {} {} to {} {}.".format( - len(new_components), - model_name, - len(form.cleaned_data['pk']), - parent_model_name - ) - logger.info(msg) - messages.success(request, msg) - - return redirect(self.get_return_url(request)) - - else: - logger.debug("Form validation failed") - - else: - form = self.form(initial={'pk': pk_list}) - - return render(request, self.template_name, { - 'form': form, - 'parent_model_name': parent_model_name, - 'model_name': model_name, - 'table': table, - 'return_url': self.get_return_url(request), - }) From e529d7fd3b721c3cf5b2e5c2c61c4df45aa474d5 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 17 Dec 2021 09:35:57 -0500 Subject: [PATCH 016/271] Add ModuleBay and ModuleBayTemplate models --- netbox/dcim/api/nested_serializers.py | 19 +++ netbox/dcim/api/serializers.py | 22 +++ netbox/dcim/api/urls.py | 2 + netbox/dcim/api/views.py | 17 +- netbox/dcim/filtersets.py | 30 ++++ netbox/dcim/forms/bulk_create.py | 6 + netbox/dcim/forms/bulk_edit.py | 34 +++- netbox/dcim/forms/bulk_import.py | 12 ++ netbox/dcim/forms/filtersets.py | 11 ++ netbox/dcim/forms/models.py | 29 ++++ netbox/dcim/forms/object_create.py | 11 ++ netbox/dcim/forms/object_import.py | 10 ++ netbox/dcim/graphql/schema.py | 6 + netbox/dcim/graphql/types.py | 18 ++ netbox/dcim/migrations/0145_modules.py | 53 ++++++ netbox/dcim/models/__init__.py | 2 + .../dcim/models/device_component_templates.py | 20 ++- netbox/dcim/models/device_components.py | 30 ++-- netbox/dcim/models/devices.py | 3 + netbox/dcim/tables/devices.py | 35 +++- netbox/dcim/tables/devicetypes.py | 16 +- netbox/dcim/tests/test_api.py | 79 +++++++++ netbox/dcim/tests/test_filtersets.py | 155 ++++++++++++++++++ netbox/dcim/tests/test_models.py | 10 ++ netbox/dcim/tests/test_views.py | 109 ++++++++++++ netbox/dcim/urls.py | 23 +++ netbox/dcim/views.py | 121 +++++++++++++- netbox/netbox/navigation_menu.py | 1 + netbox/templates/dcim/device/base.html | 15 ++ netbox/templates/dcim/device/modulebays.html | 43 +++++ netbox/templates/dcim/device_list.html | 7 + netbox/templates/dcim/devicetype/base.html | 11 ++ netbox/templates/dcim/modulebay.html | 69 ++++++++ 33 files changed, 1008 insertions(+), 21 deletions(-) create mode 100644 netbox/dcim/migrations/0145_modules.py create mode 100644 netbox/templates/dcim/device/modulebays.html create mode 100644 netbox/templates/dcim/modulebay.html diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 1fdde78d761..e050a22dbec 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -20,6 +20,8 @@ __all__ = [ 'NestedInterfaceTemplateSerializer', 'NestedInventoryItemSerializer', 'NestedManufacturerSerializer', + 'NestedModuleBaySerializer', + 'NestedModuleBayTemplateSerializer', 'NestedPlatformSerializer', 'NestedPowerFeedSerializer', 'NestedPowerOutletSerializer', @@ -195,6 +197,14 @@ class NestedFrontPortTemplateSerializer(WritableNestedSerializer): fields = ['id', 'url', 'display', 'name'] +class NestedModuleBayTemplateSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') + + class Meta: + model = models.ModuleBayTemplate + fields = ['id', 'url', 'display', 'name'] + + class NestedDeviceBayTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') @@ -298,6 +308,15 @@ class NestedFrontPortSerializer(WritableNestedSerializer): fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] +class NestedModuleBaySerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') + # module = NestedModuleSerializer(read_only=True) + + class Meta: + model = models.DeviceBay + fields = ['id', 'url', 'display', 'name'] + + class NestedDeviceBaySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') device = NestedDeviceSerializer(read_only=True) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 113c71745e9..1d1294b7acd 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -409,6 +409,15 @@ class FrontPortTemplateSerializer(ValidatedModelSerializer): ] +class ModuleBayTemplateSerializer(ValidatedModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') + device_type = NestedDeviceTypeSerializer() + + class Meta: + model = ModuleBayTemplate + fields = ['id', 'url', 'display', 'device_type', 'name', 'label', 'description', 'created', 'last_updated'] + + class DeviceBayTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') device_type = NestedDeviceTypeSerializer() @@ -707,6 +716,19 @@ class FrontPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer): ] +class ModuleBaySerializer(PrimaryModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') + device = NestedDeviceSerializer() + # installed_module = NestedModuleSerializer(required=False, allow_null=True) + + class Meta: + model = ModuleBay + fields = [ + 'id', 'url', 'display', 'device', 'name', 'label', 'description', 'tags', 'custom_fields', 'created', + 'last_updated', + ] + + class DeviceBaySerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') device = NestedDeviceSerializer() diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 491f4e7f29c..bf68106f589 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -28,6 +28,7 @@ router.register('power-outlet-templates', views.PowerOutletTemplateViewSet) router.register('interface-templates', views.InterfaceTemplateViewSet) router.register('front-port-templates', views.FrontPortTemplateViewSet) router.register('rear-port-templates', views.RearPortTemplateViewSet) +router.register('module-bay-templates', views.ModuleBayTemplateViewSet) router.register('device-bay-templates', views.DeviceBayTemplateViewSet) # Devices @@ -43,6 +44,7 @@ router.register('power-outlets', views.PowerOutletViewSet) router.register('interfaces', views.InterfaceViewSet) router.register('front-ports', views.FrontPortViewSet) router.register('rear-ports', views.RearPortViewSet) +router.register('module-bays', views.ModuleBayViewSet) router.register('device-bays', views.DeviceBayViewSet) router.register('inventory-items', views.InventoryItemViewSet) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index f359f0f2489..25dfda36005 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -329,6 +329,12 @@ class RearPortTemplateViewSet(ModelViewSet): filterset_class = filtersets.RearPortTemplateFilterSet +class ModuleBayTemplateViewSet(ModelViewSet): + queryset = ModuleBayTemplate.objects.prefetch_related('device_type__manufacturer') + serializer_class = serializers.ModuleBayTemplateSerializer + filterset_class = filtersets.ModuleBayTemplateFilterSet + + class DeviceBayTemplateViewSet(ModelViewSet): queryset = DeviceBayTemplate.objects.prefetch_related('device_type__manufacturer') serializer_class = serializers.DeviceBayTemplateSerializer @@ -569,15 +575,22 @@ class RearPortViewSet(PassThroughPortMixin, ModelViewSet): brief_prefetch_fields = ['device'] +class ModuleBayViewSet(ModelViewSet): + queryset = ModuleBay.objects.prefetch_related('tags') + serializer_class = serializers.ModuleBaySerializer + filterset_class = filtersets.ModuleBayFilterSet + brief_prefetch_fields = ['device'] + + class DeviceBayViewSet(ModelViewSet): - queryset = DeviceBay.objects.prefetch_related('installed_device').prefetch_related('tags') + queryset = DeviceBay.objects.prefetch_related('installed_device', 'tags') serializer_class = serializers.DeviceBaySerializer filterset_class = filtersets.DeviceBayFilterSet brief_prefetch_fields = ['device'] class InventoryItemViewSet(ModelViewSet): - queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer').prefetch_related('tags') + queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer', 'tags') serializer_class = serializers.InventoryItemSerializer filterset_class = filtersets.InventoryItemFilterSet brief_prefetch_fields = ['device'] diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 8b1369be991..d4c5f8e5a71 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -41,6 +41,8 @@ __all__ = ( 'InventoryItemFilterSet', 'LocationFilterSet', 'ManufacturerFilterSet', + 'ModuleBayFilterSet', + 'ModuleBayTemplateFilterSet', 'PathEndpointFilterSet', 'PlatformFilterSet', 'PowerConnectionFilterSet', @@ -447,6 +449,10 @@ class DeviceTypeFilterSet(PrimaryModelFilterSet): method='_pass_through_ports', label='Has pass-through ports', ) + module_bays = django_filters.BooleanFilter( + method='_module_bays', + label='Has module bays', + ) device_bays = django_filters.BooleanFilter( method='_device_bays', label='Has device bays', @@ -490,6 +496,9 @@ class DeviceTypeFilterSet(PrimaryModelFilterSet): rearporttemplates__isnull=value ) + def _module_bays(self, queryset, name, value): + return queryset.exclude(modulebaytemplates__isnull=value) + def _device_bays(self, queryset, name, value): return queryset.exclude(devicebaytemplates__isnull=value) @@ -576,6 +585,13 @@ class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentF fields = ['id', 'name', 'type', 'color', 'positions'] +class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): + + class Meta: + model = ModuleBayTemplate + fields = ['id', 'name'] + + class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): class Meta: @@ -760,6 +776,10 @@ class DeviceFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContex method='_pass_through_ports', label='Has pass-through ports', ) + module_bays = django_filters.BooleanFilter( + method='_module_bays', + label='Has module bays', + ) device_bays = django_filters.BooleanFilter( method='_device_bays', label='Has device bays', @@ -811,6 +831,9 @@ class DeviceFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContex rearports__isnull=value ) + def _module_bays(self, queryset, name, value): + return queryset.exclude(modulebays__isnull=value) + def _device_bays(self, queryset, name, value): return queryset.exclude(devicebays__isnull=value) @@ -1104,6 +1127,13 @@ class RearPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTe fields = ['id', 'name', 'label', 'type', 'color', 'positions', 'description'] +class ModuleBayFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): + + class Meta: + model = ModuleBay + fields = ['id', 'name', 'label', 'description'] + + class DeviceBayFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): class Meta: diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py index 16e860c388d..8eae46111e0 100644 --- a/netbox/dcim/forms/bulk_create.py +++ b/netbox/dcim/forms/bulk_create.py @@ -13,6 +13,7 @@ __all__ = ( # 'FrontPortBulkCreateForm', 'InterfaceBulkCreateForm', 'InventoryItemBulkCreateForm', + 'ModuleBayBulkCreateForm', 'PowerOutletBulkCreateForm', 'PowerPortBulkCreateForm', 'RearPortBulkCreateForm', @@ -95,6 +96,11 @@ class RearPortBulkCreateForm( field_order = ('name_pattern', 'label_pattern', 'type', 'positions', 'mark_connected', 'description', 'tags') +class ModuleBayBulkCreateForm(DeviceBulkAddComponentForm): + model = ModuleBay + field_order = ('name_pattern', 'label_pattern', 'description', 'tags') + + class DeviceBayBulkCreateForm(DeviceBulkAddComponentForm): model = DeviceBay field_order = ('name_pattern', 'label_pattern', 'description', 'tags') diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index a40396e9888..02492c63009 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -7,7 +7,6 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm -from ipam.constants import BGP_ASN_MIN, BGP_ASN_MAX from ipam.models import VLAN, ASN from tenancy.models import Tenant from utilities.forms import ( @@ -33,6 +32,8 @@ __all__ = ( 'InventoryItemBulkEditForm', 'LocationBulkEditForm', 'ManufacturerBulkEditForm', + 'ModuleBayBulkEditForm', + 'ModuleBayTemplateBulkEditForm', 'PlatformBulkEditForm', 'PowerFeedBulkEditForm', 'PowerOutletBulkEditForm', @@ -823,6 +824,23 @@ class RearPortTemplateBulkEditForm(BulkEditForm): nullable_fields = ('description',) +class ModuleBayTemplateBulkEditForm(BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=ModuleBayTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('label', 'description') + + class DeviceBayTemplateBulkEditForm(BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=DeviceBayTemplate.objects.all(), @@ -1076,6 +1094,20 @@ class RearPortBulkEditForm( nullable_fields = ['label', 'description'] +class ModuleBayBulkEditForm( + form_from_model(DeviceBay, ['label', 'description']), + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=ModuleBay.objects.all(), + widget=forms.MultipleHiddenInput() + ) + + class Meta: + nullable_fields = ['label', 'description'] + + class DeviceBayBulkEditForm( form_from_model(DeviceBay, ['label', 'description']), AddRemoveTagsForm, diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 081f8d466a4..6092b3d4171 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -26,6 +26,7 @@ __all__ = ( 'InventoryItemCSVForm', 'LocationCSVForm', 'ManufacturerCSVForm', + 'ModuleBayCSVForm', 'PlatformCSVForm', 'PowerFeedCSVForm', 'PowerOutletCSVForm', @@ -678,6 +679,17 @@ class RearPortCSVForm(CustomFieldModelCSVForm): } +class ModuleBayCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + + class Meta: + model = ModuleBay + fields = ('device', 'name', 'label', 'description') + + class DeviceBayCSVForm(CustomFieldModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index a1d996b2c8d..e134adace71 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -29,6 +29,7 @@ __all__ = ( 'InventoryItemFilterForm', 'LocationFilterForm', 'ManufacturerFilterForm', + 'ModuleBayFilterForm', 'PlatformFilterForm', 'PowerConnectionFilterForm', 'PowerFeedFilterForm', @@ -970,6 +971,16 @@ class RearPortFilterForm(DeviceComponentFilterForm): tag = TagFilterField(model) +class ModuleBayFilterForm(DeviceComponentFilterForm): + model = ModuleBay + field_groups = [ + ['q', 'tag'], + ['name', 'label'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], + ] + tag = TagFilterField(model) + + class DeviceBayFilterForm(DeviceComponentFilterForm): model = DeviceBay field_groups = [ diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index d16cf3dd110..2fcd2321153 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -39,6 +39,8 @@ __all__ = ( 'InventoryItemForm', 'LocationForm', 'ManufacturerForm', + 'ModuleBayForm', + 'ModuleBayTemplateForm', 'PlatformForm', 'PopulateDeviceBayForm', 'PowerFeedForm', @@ -984,6 +986,17 @@ class RearPortTemplateForm(BootstrapMixin, forms.ModelForm): } +class ModuleBayTemplateForm(BootstrapMixin, forms.ModelForm): + class Meta: + model = ModuleBayTemplate + fields = [ + 'device_type', 'name', 'label', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + } + + class DeviceBayTemplateForm(BootstrapMixin, forms.ModelForm): class Meta: model = DeviceBayTemplate @@ -1222,6 +1235,22 @@ class RearPortForm(CustomFieldModelForm): } +class ModuleBayForm(CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = ModuleBay + fields = [ + 'device', 'name', 'label', 'description', 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + } + + class DeviceBayForm(CustomFieldModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 92b92ef3ef2..bf90602250f 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -25,6 +25,8 @@ __all__ = ( 'InterfaceCreateForm', 'InterfaceTemplateCreateForm', 'InventoryItemCreateForm', + 'ModuleBayCreateForm', + 'ModuleBayTemplateCreateForm', 'PowerOutletCreateForm', 'PowerOutletTemplateCreateForm', 'PowerPortCreateForm', @@ -327,6 +329,10 @@ class RearPortTemplateCreateForm(ComponentTemplateCreateForm): ) +class ModuleBayTemplateCreateForm(ComponentTemplateCreateForm): + field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'description') + + class DeviceBayTemplateCreateForm(ComponentTemplateCreateForm): field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'description') @@ -619,6 +625,11 @@ class RearPortCreateForm(ComponentCreateForm): ) +class ModuleBayCreateForm(ComponentCreateForm): + model = ModuleBay + field_order = ('device', 'name_pattern', 'label_pattern', 'description', 'tags') + + class DeviceBayCreateForm(ComponentCreateForm): model = DeviceBay field_order = ('device', 'name_pattern', 'label_pattern', 'description', 'tags') diff --git a/netbox/dcim/forms/object_import.py b/netbox/dcim/forms/object_import.py index 03f040a000d..49924b62369 100644 --- a/netbox/dcim/forms/object_import.py +++ b/netbox/dcim/forms/object_import.py @@ -11,6 +11,7 @@ __all__ = ( 'DeviceTypeImportForm', 'FrontPortTemplateImportForm', 'InterfaceTemplateImportForm', + 'ModuleBayTemplateImportForm', 'PowerOutletTemplateImportForm', 'PowerPortTemplateImportForm', 'RearPortTemplateImportForm', @@ -139,6 +140,15 @@ class RearPortTemplateImportForm(ComponentTemplateImportForm): ] +class ModuleBayTemplateImportForm(ComponentTemplateImportForm): + + class Meta: + model = ModuleBayTemplate + fields = [ + 'device_type', 'name', 'label', 'description', + ] + + class DeviceBayTemplateImportForm(ComponentTemplateImportForm): class Meta: diff --git a/netbox/dcim/graphql/schema.py b/netbox/dcim/graphql/schema.py index 13e0c20ec5a..60b7526bdc8 100644 --- a/netbox/dcim/graphql/schema.py +++ b/netbox/dcim/graphql/schema.py @@ -56,6 +56,12 @@ class DCIMQuery(graphene.ObjectType): manufacturer = ObjectField(ManufacturerType) manufacturer_list = ObjectListField(ManufacturerType) + module_bay = ObjectField(ModuleBayType) + module_bay_list = ObjectListField(ModuleBayType) + + module_bay_template = ObjectField(ModuleBayTemplateType) + module_bay_template_list = ObjectListField(ModuleBayTemplateType) + platform = ObjectField(PlatformType) platform_list = ObjectListField(PlatformType) diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index 8ce10979eae..355c14dc368 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -27,6 +27,8 @@ __all__ = ( 'InventoryItemType', 'LocationType', 'ManufacturerType', + 'ModuleBayType', + 'ModuleBayTemplateType', 'PlatformType', 'PowerFeedType', 'PowerOutletType', @@ -254,6 +256,22 @@ class ManufacturerType(OrganizationalObjectType): filterset_class = filtersets.ManufacturerFilterSet +class ModuleBayType(ComponentObjectType): + + class Meta: + model = models.ModuleBay + fields = '__all__' + filterset_class = filtersets.ModuleBayFilterSet + + +class ModuleBayTemplateType(ComponentTemplateObjectType): + + class Meta: + model = models.ModuleBayTemplate + fields = '__all__' + filterset_class = filtersets.ModuleBayTemplateFilterSet + + class PlatformType(OrganizationalObjectType): class Meta: diff --git a/netbox/dcim/migrations/0145_modules.py b/netbox/dcim/migrations/0145_modules.py new file mode 100644 index 00000000000..c469e059c66 --- /dev/null +++ b/netbox/dcim/migrations/0145_modules.py @@ -0,0 +1,53 @@ +import django.core.serializers.json +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers +import utilities.fields +import utilities.ordering + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0066_customfield_name_validation'), + ('dcim', '0144_site_remove_deprecated_fields'), + ] + + operations = [ + migrations.CreateModel( + name='ModuleBayTemplate', + fields=[ + ('created', models.DateField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=64)), + ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)), + ('label', models.CharField(blank=True, max_length=64)), + ('description', models.CharField(blank=True, max_length=200)), + ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modulebaytemplates', to='dcim.devicetype')), + ], + options={ + 'ordering': ('device_type', '_name'), + 'unique_together': {('device_type', 'name')}, + }, + ), + migrations.CreateModel( + name='ModuleBay', + fields=[ + ('created', models.DateField(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=django.core.serializers.json.DjangoJSONEncoder)), + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=64)), + ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)), + ('label', models.CharField(blank=True, max_length=64)), + ('description', models.CharField(blank=True, max_length=200)), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modulebays', to='dcim.device')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'ordering': ('device', '_name'), + 'unique_together': {('device', 'name')}, + }, + ), + ] diff --git a/netbox/dcim/models/__init__.py b/netbox/dcim/models/__init__.py index 58a3e1de5de..86e49c42ea5 100644 --- a/netbox/dcim/models/__init__.py +++ b/netbox/dcim/models/__init__.py @@ -27,6 +27,8 @@ __all__ = ( 'InventoryItem', 'Location', 'Manufacturer', + 'ModuleBay', + 'ModuleBayTemplate', 'Platform', 'PowerFeed', 'PowerOutlet', diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 42e45366951..c8ab8f5f01a 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -9,7 +9,7 @@ from netbox.models import ChangeLoggedModel from utilities.fields import ColorField, NaturalOrderingField from utilities.ordering import naturalize_interface from .device_components import ( - ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface, PowerOutlet, PowerPort, RearPort, + ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface, ModuleBay, PowerOutlet, PowerPort, RearPort, ) @@ -19,6 +19,7 @@ __all__ = ( 'DeviceBayTemplate', 'FrontPortTemplate', 'InterfaceTemplate', + 'ModuleBayTemplate', 'PowerOutletTemplate', 'PowerPortTemplate', 'RearPortTemplate', @@ -360,6 +361,23 @@ class RearPortTemplate(ComponentTemplateModel): ) +@extras_features('webhooks') +class ModuleBayTemplate(ComponentTemplateModel): + """ + A template for a ModuleBay to be created for a new parent Device. + """ + class Meta: + ordering = ('device_type', '_name') + unique_together = ('device_type', 'name') + + def instantiate(self, device): + return ModuleBay( + device=device, + name=self.name, + label=self.label + ) + + @extras_features('webhooks') class DeviceBayTemplate(ComponentTemplateModel): """ diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index e105bd80423..08e0692390c 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -30,6 +30,7 @@ __all__ = ( 'FrontPort', 'Interface', 'InventoryItem', + 'ModuleBay', 'PathEndpoint', 'PowerOutlet', 'PowerPort', @@ -229,7 +230,7 @@ class PathEndpoint(models.Model): # -# Console ports +# Console components # @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') @@ -260,10 +261,6 @@ class ConsolePort(ComponentModel, LinkTermination, PathEndpoint): return reverse('dcim:consoleport', kwargs={'pk': self.pk}) -# -# Console server ports -# - @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ConsoleServerPort(ComponentModel, LinkTermination, PathEndpoint): """ @@ -293,7 +290,7 @@ class ConsoleServerPort(ComponentModel, LinkTermination, PathEndpoint): # -# Power ports +# Power components # @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') @@ -389,10 +386,6 @@ class PowerPort(ComponentModel, LinkTermination, PathEndpoint): } -# -# Power outlets -# - @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class PowerOutlet(ComponentModel, LinkTermination, PathEndpoint): """ @@ -866,9 +859,24 @@ class RearPort(ComponentModel, LinkTermination): # -# Device bays +# Bays # +@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') +class ModuleBay(ComponentModel): + """ + An empty space within a Device which can house a child device + """ + clone_fields = ['device'] + + class Meta: + ordering = ('device', '_name') + unique_together = ('device', 'name') + + def get_absolute_url(self): + return reverse('dcim:modulebay', kwargs={'pk': self.pk}) + + @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class DeviceBay(ComponentModel): """ diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 24eeb7ac3ff..18c0fe9defd 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -786,6 +786,9 @@ class Device(PrimaryModel, ConfigContextModel): FrontPort.objects.bulk_create( [x.instantiate(self) for x in self.device_type.frontporttemplates.all()] ) + ModuleBay.objects.bulk_create( + [x.instantiate(self) for x in self.device_type.modulebaytemplates.all()] + ) DeviceBay.objects.bulk_create( [x.instantiate(self) for x in self.device_type.devicebaytemplates.all()] ) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index f0e9c9bb0a5..df1d79aa403 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -2,8 +2,8 @@ import django_tables2 as tables from django_tables2.utils import Accessor from dcim.models import ( - ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, FrontPort, Interface, InventoryItem, Platform, - PowerOutlet, PowerPort, RearPort, VirtualChassis, + ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, FrontPort, Interface, InventoryItem, ModuleBay, + Platform, PowerOutlet, PowerPort, RearPort, VirtualChassis, ) from tenancy.tables import TenantColumn from utilities.tables import ( @@ -25,6 +25,7 @@ __all__ = ( 'DeviceImportTable', 'DeviceInterfaceTable', 'DeviceInventoryItemTable', + 'DeviceModuleBayTable', 'DevicePowerPortTable', 'DevicePowerOutletTable', 'DeviceRearPortTable', @@ -33,6 +34,7 @@ __all__ = ( 'FrontPortTable', 'InterfaceTable', 'InventoryItemTable', + 'ModuleBayTable', 'PlatformTable', 'PowerOutletTable', 'PowerPortTable', @@ -716,6 +718,35 @@ class DeviceDeviceBayTable(DeviceBayTable): ) +class ModuleBayTable(DeviceComponentTable): + device = tables.Column( + linkify={ + 'viewname': 'dcim:device_modulebays', + 'args': [Accessor('device_id')], + } + ) + tags = TagColumn( + url_name='dcim:modulebay_list' + ) + + class Meta(DeviceComponentTable.Meta): + model = ModuleBay + fields = ('pk', 'id', 'name', 'device', 'label', 'description', 'tags') + default_columns = ('pk', 'name', 'device', 'label', 'description') + + +class DeviceModuleBayTable(ModuleBayTable): + actions = ButtonsColumn( + model=ModuleBay, + buttons=('edit', 'delete') + ) + + class Meta(DeviceComponentTable.Meta): + model = ModuleBay + fields = ('pk', 'id', 'name', 'label', 'description', 'tags', 'actions') + default_columns = ('pk', 'name', 'label', 'description', 'actions') + + class InventoryItemTable(DeviceComponentTable): device = tables.Column( linkify={ diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index f932b7994dd..6fc03854217 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -2,7 +2,7 @@ import django_tables2 as tables from dcim.models import ( ConsolePortTemplate, ConsoleServerPortTemplate, DeviceBayTemplate, DeviceType, FrontPortTemplate, InterfaceTemplate, - Manufacturer, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, + Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, ) from utilities.tables import ( BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, @@ -16,6 +16,7 @@ __all__ = ( 'FrontPortTemplateTable', 'InterfaceTemplateTable', 'ManufacturerTable', + 'ModuleBayTemplateTable', 'PowerOutletTemplateTable', 'PowerPortTemplateTable', 'RearPortTemplateTable', @@ -207,6 +208,19 @@ class RearPortTemplateTable(ComponentTemplateTable): empty_text = "None" +class ModuleBayTemplateTable(ComponentTemplateTable): + actions = ButtonsColumn( + model=ModuleBayTemplate, + buttons=('edit', 'delete'), + return_url_extra='%23tab_modulebays' + ) + + class Meta(ComponentTemplateTable.Meta): + model = ModuleBayTemplate + fields = ('pk', 'name', 'label', 'description', 'actions') + empty_text = "None" + + class DeviceBayTemplateTable(ComponentTemplateTable): actions = ButtonsColumn( model=DeviceBayTemplate, diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index bc6b18eade4..2f68b0fbf4b 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -778,6 +778,46 @@ class RearPortTemplateTest(APIViewTestCases.APIViewTestCase): ] +class ModuleBayTemplateTest(APIViewTestCases.APIViewTestCase): + model = ModuleBayTemplate + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + devicetype = DeviceType.objects.create( + manufacturer=manufacturer, + model='Device Type 1', + slug='device-type-1', + subdevice_role=SubdeviceRoleChoices.ROLE_PARENT + ) + + 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.objects.bulk_create(module_bay_templates) + + cls.create_data = [ + { + 'device_type': devicetype.pk, + 'name': 'Module Bay Template 4', + }, + { + 'device_type': devicetype.pk, + 'name': 'Module Bay Template 5', + }, + { + 'device_type': devicetype.pk, + 'name': 'Module Bay Template 6', + }, + ] + + class DeviceBayTemplateTest(APIViewTestCases.APIViewTestCase): model = DeviceBayTemplate brief_fields = ['display', 'id', 'name', 'url'] @@ -1369,6 +1409,45 @@ class RearPortTest(APIViewTestCases.APIViewTestCase): ] +class ModuleBayTest(APIViewTestCases.APIViewTestCase): + model = ModuleBay + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + + device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + device = Device.objects.create(device_type=device_type, device_role=devicerole, name='Device 1', site=site) + + device_bays = ( + ModuleBay(device=device, name='Device Bay 1'), + ModuleBay(device=device, name='Device Bay 2'), + ModuleBay(device=device, name='Device Bay 3'), + ) + ModuleBay.objects.bulk_create(device_bays) + + cls.create_data = [ + { + 'device': device.pk, + 'name': 'Device Bay 4', + }, + { + 'device': device.pk, + 'name': 'Device Bay 5', + }, + { + 'device': device.pk, + 'name': 'Device Bay 6', + }, + ] + + class DeviceBayTest(APIViewTestCases.APIViewTestCase): model = DeviceBay brief_fields = ['device', 'display', 'id', 'name', 'url'] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index a187c8881ee..c3573932025 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -678,6 +678,10 @@ class DeviceTypeTestCase(TestCase, ChangeLoggedFilterSetTests): FrontPortTemplate(device_type=device_types[0], name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[0]), FrontPortTemplate(device_type=device_types[1], name='Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[1]), )) + ModuleBayTemplate.objects.bulk_create(( + ModuleBayTemplate(device_type=device_types[0], name='Module Bay 1'), + ModuleBayTemplate(device_type=device_types[1], name='Module Bay 2'), + )) DeviceBayTemplate.objects.bulk_create(( DeviceBayTemplate(device_type=device_types[0], name='Device Bay 1'), DeviceBayTemplate(device_type=device_types[1], name='Device Bay 2'), @@ -762,6 +766,12 @@ class DeviceTypeTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'device_bays': 'false'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_module_bays(self): + params = {'module_bays': 'true'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'module_bays': 'false'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + class ConsolePortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = ConsolePortTemplate.objects.all() @@ -1036,6 +1046,38 @@ class RearPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class ModuleBayTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = ModuleBayTemplate.objects.all() + filterset = ModuleBayTemplateFilterSet + + @classmethod + def setUpTestData(cls): + + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + + device_types = ( + DeviceType(manufacturer=manufacturer, model='Model 1', slug='model-1'), + DeviceType(manufacturer=manufacturer, model='Model 2', slug='model-2'), + DeviceType(manufacturer=manufacturer, model='Model 3', slug='model-3'), + ) + DeviceType.objects.bulk_create(device_types) + + ModuleBayTemplate.objects.bulk_create(( + ModuleBayTemplate(device_type=device_types[0], name='Module Bay 1'), + ModuleBayTemplate(device_type=device_types[1], name='Module Bay 2'), + ModuleBayTemplate(device_type=device_types[2], name='Module Bay 3'), + )) + + def test_name(self): + params = {'name': ['Module Bay 1', 'Module Bay 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_devicetype_id(self): + device_types = DeviceType.objects.all()[:2] + params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class DeviceBayTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = DeviceBayTemplate.objects.all() filterset = DeviceBayTemplateFilterSet @@ -1280,6 +1322,10 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): FrontPort(device=devices[0], name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[0]), FrontPort(device=devices[1], name='Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[1]), )) + ModuleBay.objects.bulk_create(( + ModuleBay(device=devices[0], name='Module Bay 1'), + ModuleBay(device=devices[1], name='Module Bay 2'), + )) DeviceBay.objects.bulk_create(( DeviceBay(device=devices[0], name='Device Bay 1'), DeviceBay(device=devices[1], name='Device Bay 2'), @@ -1465,6 +1511,12 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'pass_through_ports': 'false'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_module_bays(self): + params = {'module_bays': 'true'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'module_bays': 'false'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_device_bays(self): params = {'device_bays': 'true'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -2508,6 +2560,109 @@ class RearPortTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class ModuleBayTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = ModuleBay.objects.all() + filterset = ModuleBayFilterSet + + @classmethod + def setUpTestData(cls): + + regions = ( + Region(name='Region 1', slug='region-1'), + Region(name='Region 2', slug='region-2'), + Region(name='Region 3', slug='region-3'), + ) + for region in regions: + region.save() + + 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() + + sites = Site.objects.bulk_create(( + 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 X', slug='site-x'), + )) + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1') + device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1') + + locations = ( + Location(name='Location 1', slug='location-1', site=sites[0]), + Location(name='Location 2', slug='location-2', site=sites[1]), + Location(name='Location 3', slug='location-3', site=sites[2]), + ) + for location in locations: + location.save() + + devices = ( + Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], location=locations[0]), + Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1], location=locations[1]), + Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2], location=locations[2]), + ) + 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.objects.bulk_create(module_bays) + + def test_name(self): + params = {'name': ['Module Bay 1', 'Module Bay 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_label(self): + params = {'label': ['A', 'B']} + 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) + + def test_region(self): + regions = Region.objects.all()[:2] + params = {'region_id': [regions[0].pk, regions[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'region': [regions[0].slug, regions[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_site_group(self): + site_groups = SiteGroup.objects.all()[:2] + params = {'site_group_id': [site_groups[0].pk, site_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'site_group': [site_groups[0].slug, site_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_site(self): + sites = Site.objects.all()[:2] + params = {'site_id': [sites[0].pk, sites[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'site': [sites[0].slug, sites[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_location(self): + locations = Location.objects.all()[:2] + params = {'location_id': [locations[0].pk, locations[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'location': [locations[0].slug, locations[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_device(self): + devices = Device.objects.all()[:2] + params = {'device_id': [devices[0].pk, devices[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'device': [devices[0].name, devices[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class DeviceBayTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = DeviceBay.objects.all() filterset = DeviceBayFilterSet diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 1042057de53..8566f969bc3 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -308,6 +308,11 @@ class DeviceTestCase(TestCase): rear_port_position=2 ).save() + ModuleBayTemplate( + device_type=self.device_type, + name='Module Bay 1' + ).save() + DeviceBayTemplate( device_type=self.device_type, name='Device Bay 1' @@ -371,6 +376,11 @@ class DeviceTestCase(TestCase): rear_port_position=2 ) + ModuleBay.objects.get( + device=d, + name='Module Bay 1' + ) + DeviceBay.objects.get( device=d, name='Device Bay 1' diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 4706cdc6af3..7f93c10a245 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -554,6 +554,19 @@ class DeviceTypeTestCase( url = reverse('dcim:devicetype_frontports', kwargs={'pk': devicetype.pk}) self.assertHttpStatus(self.client.get(url), 200) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_devicetype_modulebays(self): + devicetype = DeviceType.objects.first() + module_bays = ( + ModuleBayTemplate(device_type=devicetype, name='Module Bay 1'), + ModuleBayTemplate(device_type=devicetype, name='Module Bay 2'), + ModuleBayTemplate(device_type=devicetype, name='Module Bay 3'), + ) + ModuleBayTemplate.objects.bulk_create(module_bays) + + url = reverse('dcim:devicetype_modulebays', kwargs={'pk': devicetype.pk}) + self.assertHttpStatus(self.client.get(url), 200) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_devicetype_devicebays(self): devicetype = DeviceType.objects.first() @@ -638,6 +651,10 @@ front-ports: - name: Front Port 3 type: 8p8c rear_port: Rear Port 3 +module-bays: + - name: Module Bay 1 + - name: Module Bay 2 + - name: Module Bay 3 device-bays: - name: Device Bay 1 - name: Device Bay 2 @@ -658,6 +675,7 @@ device-bays: 'dcim.add_interfacetemplate', 'dcim.add_frontporttemplate', 'dcim.add_rearporttemplate', + 'dcim.add_modulebaytemplate', 'dcim.add_devicebaytemplate', ) @@ -710,6 +728,10 @@ device-bays: self.assertEqual(fp1.rear_port, rp1) self.assertEqual(fp1.rear_port_position, 1) + self.assertEqual(dt.modulebaytemplates.count(), 3) + db1 = ModuleBayTemplate.objects.first() + self.assertEqual(db1.name, 'Module Bay 1') + self.assertEqual(dt.devicebaytemplates.count(), 3) db1 = DeviceBayTemplate.objects.first() self.assertEqual(db1.name, 'Device Bay 1') @@ -1011,6 +1033,39 @@ class RearPortTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase } +class ModuleBayTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase): + model = ModuleBayTemplate + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetypes = ( + DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(devicetypes) + + ModuleBayTemplate.objects.bulk_create(( + ModuleBayTemplate(device_type=devicetypes[0], name='Module Bay Template 1'), + ModuleBayTemplate(device_type=devicetypes[0], name='Module Bay Template 2'), + ModuleBayTemplate(device_type=devicetypes[0], name='Module Bay Template 3'), + )) + + cls.form_data = { + 'device_type': devicetypes[1].pk, + 'name': 'Module Bay Template X', + } + + cls.bulk_create_data = { + 'device_type': devicetypes[1].pk, + 'name_pattern': 'Module Bay Template [4-6]', + } + + cls.bulk_edit_data = { + 'description': 'Foo bar', + } + + class DeviceBayTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase): model = DeviceBayTemplate @@ -1307,6 +1362,19 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase): url = reverse('dcim:device_frontports', kwargs={'pk': device.pk}) self.assertHttpStatus(self.client.get(url), 200) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_device_modulebays(self): + device = Device.objects.first() + device_bays = ( + ModuleBay(device=device, name='Module Bay 1'), + ModuleBay(device=device, name='Module Bay 2'), + ModuleBay(device=device, name='Module Bay 3'), + ) + ModuleBay.objects.bulk_create(device_bays) + + url = reverse('dcim:device_modulebays', kwargs={'pk': device.pk}) + self.assertHttpStatus(self.client.get(url), 200) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_device_devicebays(self): device = Device.objects.first() @@ -1807,6 +1875,47 @@ class RearPortTestCase(ViewTestCases.DeviceComponentViewTestCase): self.assertHttpStatus(response, 200) +class ModuleBayTestCase(ViewTestCases.DeviceComponentViewTestCase): + model = ModuleBay + + @classmethod + def setUpTestData(cls): + device = create_test_device('Device 1') + + ModuleBay.objects.bulk_create([ + ModuleBay(device=device, name='Module Bay 1'), + ModuleBay(device=device, name='Module Bay 2'), + ModuleBay(device=device, name='Module Bay 3'), + ]) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'device': device.pk, + 'name': 'Module Bay X', + 'description': 'A device bay', + 'tags': [t.pk for t in tags], + } + + cls.bulk_create_data = { + 'device': device.pk, + 'name_pattern': 'Module Bay [4-6]', + 'description': 'A module bay', + 'tags': [t.pk for t in tags], + } + + cls.bulk_edit_data = { + 'description': 'New description', + } + + cls.csv_data = ( + "device,name", + "Device 1,Module Bay 4", + "Device 1,Module Bay 5", + "Device 1,Module Bay 6", + ) + + class DeviceBayTestCase(ViewTestCases.DeviceComponentViewTestCase): model = DeviceBay diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 11665f22ac4..dbde8e34895 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -113,6 +113,7 @@ urlpatterns = [ path('device-types//interfaces/', views.DeviceTypeInterfacesView.as_view(), name='devicetype_interfaces'), path('device-types//front-ports/', views.DeviceTypeFrontPortsView.as_view(), name='devicetype_frontports'), path('device-types//rear-ports/', views.DeviceTypeRearPortsView.as_view(), name='devicetype_rearports'), + path('device-types//module-bays/', views.DeviceTypeModuleBaysView.as_view(), name='devicetype_modulebays'), path('device-types//device-bays/', views.DeviceTypeDeviceBaysView.as_view(), name='devicetype_devicebays'), path('device-types//edit/', views.DeviceTypeEditView.as_view(), name='devicetype_edit'), path('device-types//delete/', views.DeviceTypeDeleteView.as_view(), name='devicetype_delete'), @@ -183,6 +184,14 @@ urlpatterns = [ path('device-bay-templates//edit/', views.DeviceBayTemplateEditView.as_view(), name='devicebaytemplate_edit'), path('device-bay-templates//delete/', views.DeviceBayTemplateDeleteView.as_view(), name='devicebaytemplate_delete'), + # Device bay templates + path('module-bay-templates/add/', views.ModuleBayTemplateCreateView.as_view(), name='modulebaytemplate_add'), + path('module-bay-templates/edit/', views.ModuleBayTemplateBulkEditView.as_view(), name='modulebaytemplate_bulk_edit'), + path('module-bay-templates/rename/', views.ModuleBayTemplateBulkRenameView.as_view(), name='modulebaytemplate_bulk_rename'), + path('module-bay-templates/delete/', views.ModuleBayTemplateBulkDeleteView.as_view(), name='modulebaytemplate_bulk_delete'), + path('module-bay-templates//edit/', views.ModuleBayTemplateEditView.as_view(), name='modulebaytemplate_edit'), + path('module-bay-templates//delete/', views.ModuleBayTemplateDeleteView.as_view(), name='modulebaytemplate_delete'), + # Device roles path('device-roles/', views.DeviceRoleListView.as_view(), name='devicerole_list'), path('device-roles/add/', views.DeviceRoleEditView.as_view(), name='devicerole_add'), @@ -222,6 +231,7 @@ urlpatterns = [ path('devices//interfaces/', views.DeviceInterfacesView.as_view(), name='device_interfaces'), path('devices//front-ports/', views.DeviceFrontPortsView.as_view(), name='device_frontports'), path('devices//rear-ports/', views.DeviceRearPortsView.as_view(), name='device_rearports'), + path('devices//module-bays/', views.DeviceModuleBaysView.as_view(), name='device_modulebays'), path('devices//device-bays/', views.DeviceDeviceBaysView.as_view(), name='device_devicebays'), path('devices//inventory/', views.DeviceInventoryView.as_view(), name='device_inventory'), path('devices//config-context/', views.DeviceConfigContextView.as_view(), name='device_configcontext'), @@ -343,6 +353,19 @@ urlpatterns = [ path('rear-ports//connect//', views.CableCreateView.as_view(), name='rearport_connect', kwargs={'termination_a_type': RearPort}), path('devices/rear-ports/add/', views.DeviceBulkAddRearPortView.as_view(), name='device_bulk_add_rearport'), + # Module bays + path('module-bays/', views.ModuleBayListView.as_view(), name='modulebay_list'), + path('module-bays/add/', views.ModuleBayCreateView.as_view(), name='modulebay_add'), + path('module-bays/import/', views.ModuleBayBulkImportView.as_view(), name='modulebay_import'), + path('module-bays/edit/', views.ModuleBayBulkEditView.as_view(), name='modulebay_bulk_edit'), + path('module-bays/rename/', views.ModuleBayBulkRenameView.as_view(), name='modulebay_bulk_rename'), + path('module-bays/delete/', views.ModuleBayBulkDeleteView.as_view(), name='modulebay_bulk_delete'), + path('module-bays//', views.ModuleBayView.as_view(), name='modulebay'), + path('module-bays//edit/', views.ModuleBayEditView.as_view(), name='modulebay_edit'), + path('module-bays//delete/', views.ModuleBayDeleteView.as_view(), name='modulebay_delete'), + path('module-bays//changelog/', ObjectChangeLogView.as_view(), name='modulebay_changelog', kwargs={'model': ModuleBay}), + path('devices/module-bays/add/', views.DeviceBulkAddModuleBayView.as_view(), name='device_bulk_add_modulebay'), + # Device bays path('device-bays/', views.DeviceBayListView.as_view(), name='devicebay_list'), path('device-bays/add/', views.DeviceBayCreateView.as_view(), name='devicebay_add'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 4ec31e60c3f..fed6ea31d03 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -30,9 +30,9 @@ from .constants import NONCONNECTABLE_IFACE_TYPES from .models import ( Cable, CablePath, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate, - InventoryItem, Manufacturer, PathEndpoint, Platform, PowerFeed, PowerOutlet, PowerOutletTemplate, PowerPanel, - PowerPort, PowerPortTemplate, Rack, Location, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, - SiteGroup, VirtualChassis, + InventoryItem, Manufacturer, ModuleBay, ModuleBayTemplate, PathEndpoint, Platform, PowerFeed, PowerOutlet, + PowerOutletTemplate, PowerPanel, PowerPort, PowerPortTemplate, Rack, Location, RackReservation, RackRole, RearPort, + RearPortTemplate, Region, Site, SiteGroup, VirtualChassis, ) @@ -836,6 +836,12 @@ class DeviceTypeRearPortsView(DeviceTypeComponentsView): filterset = filtersets.RearPortTemplateFilterSet +class DeviceTypeModuleBaysView(DeviceTypeComponentsView): + child_model = ModuleBayTemplate + table = tables.ModuleBayTemplateTable + filterset = filtersets.ModuleBayTemplateFilterSet + + class DeviceTypeDeviceBaysView(DeviceTypeComponentsView): child_model = DeviceBayTemplate table = tables.DeviceBayTemplateTable @@ -861,6 +867,7 @@ class DeviceTypeImportView(generic.ObjectImportView): 'dcim.add_interfacetemplate', 'dcim.add_frontporttemplate', 'dcim.add_rearporttemplate', + 'dcim.add_modulebaytemplate', 'dcim.add_devicebaytemplate', ] queryset = DeviceType.objects.all() @@ -873,6 +880,7 @@ class DeviceTypeImportView(generic.ObjectImportView): ('interfaces', forms.InterfaceTemplateImportForm), ('rear-ports', forms.RearPortTemplateImportForm), ('front-ports', forms.FrontPortTemplateImportForm), + ('module-bays', forms.ModuleBayTemplateImportForm), ('device-bays', forms.DeviceBayTemplateImportForm), )) @@ -1132,6 +1140,40 @@ class RearPortTemplateBulkDeleteView(generic.BulkDeleteView): table = tables.RearPortTemplateTable +# +# Module bay templates +# + +class ModuleBayTemplateCreateView(generic.ComponentCreateView): + queryset = ModuleBayTemplate.objects.all() + form = forms.ModuleBayTemplateCreateForm + model_form = forms.ModuleBayTemplateForm + + +class ModuleBayTemplateEditView(generic.ObjectEditView): + queryset = ModuleBayTemplate.objects.all() + model_form = forms.ModuleBayTemplateForm + + +class ModuleBayTemplateDeleteView(generic.ObjectDeleteView): + queryset = ModuleBayTemplate.objects.all() + + +class ModuleBayTemplateBulkEditView(generic.BulkEditView): + queryset = ModuleBayTemplate.objects.all() + table = tables.ModuleBayTemplateTable + form = forms.ModuleBayTemplateBulkEditForm + + +class ModuleBayTemplateBulkRenameView(generic.BulkRenameView): + queryset = ModuleBayTemplate.objects.all() + + +class ModuleBayTemplateBulkDeleteView(generic.BulkDeleteView): + queryset = ModuleBayTemplate.objects.all() + table = tables.ModuleBayTemplateTable + + # # Device bay templates # @@ -1388,6 +1430,13 @@ class DeviceRearPortsView(DeviceComponentsView): template_name = 'dcim/device/rearports.html' +class DeviceModuleBaysView(DeviceComponentsView): + child_model = ModuleBay + table = tables.DeviceModuleBayTable + filterset = filtersets.ModuleBayFilterSet + template_name = 'dcim/device/modulebays.html' + + class DeviceDeviceBaysView(DeviceComponentsView): child_model = DeviceBay table = tables.DeviceDeviceBayTable @@ -1978,6 +2027,61 @@ class RearPortBulkDeleteView(generic.BulkDeleteView): table = tables.RearPortTable +# +# Module bays +# + +class ModuleBayListView(generic.ObjectListView): + queryset = ModuleBay.objects.all() + filterset = filtersets.ModuleBayFilterSet + filterset_form = forms.ModuleBayFilterForm + table = tables.ModuleBayTable + action_buttons = ('import', 'export') + + +class ModuleBayView(generic.ObjectView): + queryset = ModuleBay.objects.all() + + +class ModuleBayCreateView(generic.ComponentCreateView): + queryset = ModuleBay.objects.all() + form = forms.ModuleBayCreateForm + model_form = forms.ModuleBayForm + + +class ModuleBayEditView(generic.ObjectEditView): + queryset = ModuleBay.objects.all() + model_form = forms.ModuleBayForm + template_name = 'dcim/device_component_edit.html' + + +class ModuleBayDeleteView(generic.ObjectDeleteView): + queryset = ModuleBay.objects.all() + + +class ModuleBayBulkImportView(generic.BulkImportView): + queryset = ModuleBay.objects.all() + model_form = forms.ModuleBayCSVForm + table = tables.ModuleBayTable + + +class ModuleBayBulkEditView(generic.BulkEditView): + queryset = ModuleBay.objects.all() + filterset = filtersets.ModuleBayFilterSet + table = tables.ModuleBayTable + form = forms.ModuleBayBulkEditForm + + +class ModuleBayBulkRenameView(generic.BulkRenameView): + queryset = ModuleBay.objects.all() + + +class ModuleBayBulkDeleteView(generic.BulkDeleteView): + queryset = ModuleBay.objects.all() + filterset = filtersets.ModuleBayFilterSet + table = tables.ModuleBayTable + + # # Device bays # @@ -2234,6 +2338,17 @@ class DeviceBulkAddRearPortView(generic.BulkComponentCreateView): default_return_url = 'dcim:device_list' +class DeviceBulkAddModuleBayView(generic.BulkComponentCreateView): + parent_model = Device + parent_field = 'device' + form = forms.ModuleBayBulkCreateForm + queryset = ModuleBay.objects.all() + model_form = forms.ModuleBayForm + filterset = filtersets.DeviceFilterSet + table = tables.DeviceTable + default_return_url = 'dcim:device_list' + + class DeviceBulkAddDeviceBayView(generic.BulkComponentCreateView): parent_model = Device parent_field = 'device' diff --git a/netbox/netbox/navigation_menu.py b/netbox/netbox/navigation_menu.py index 488fa163dc1..71be861f8f0 100644 --- a/netbox/netbox/navigation_menu.py +++ b/netbox/netbox/navigation_menu.py @@ -161,6 +161,7 @@ DEVICES_MENU = Menu( get_model_item('dcim', 'consoleserverport', 'Console Server Ports', actions=['import']), get_model_item('dcim', 'powerport', 'Power Ports', actions=['import']), get_model_item('dcim', 'poweroutlet', 'Power Outlets', actions=['import']), + get_model_item('dcim', 'modulebay', 'Module Bays', actions=['import']), get_model_item('dcim', 'devicebay', 'Device Bays', actions=['import']), get_model_item('dcim', 'inventoryitem', 'Inventory Items', actions=['import']), ), diff --git a/netbox/templates/dcim/device/base.html b/netbox/templates/dcim/device/base.html index 13d4bbcbcd5..80ccb69a2b4 100644 --- a/netbox/templates/dcim/device/base.html +++ b/netbox/templates/dcim/device/base.html @@ -69,6 +69,13 @@ {% endif %} + {% if perms.dcim.add_devicebay %} +
  • + + Module Bays + +
  • + {% endif %} {% if perms.dcim.add_devicebay %}
  • @@ -151,6 +158,14 @@ {% endif %} {% endwith %} + {% with modulebay_count=object.modulebays.count %} + {% if modulebay_count %} +
  • + {% endif %} + {% endwith %} + {% with devicebay_count=object.devicebays.count %} {% if devicebay_count %} {% endif %} + {% if perms.dcim.add_modulebay %} +
  • + +
  • + {% endif %} {% if perms.dcim.add_inventoryitem %}
  • + + + {% endif %} +{% endblock %} + +{% block tab_items %} +
  • + + {% with interface_count=object.interfacetemplates.count %} + {% if interface_count %} + + {% endif %} + {% endwith %} + + {% with frontport_count=object.frontporttemplates.count %} + {% if frontport_count %} + + {% endif %} + {% endwith %} + + {% with rearport_count=object.rearporttemplates.count %} + {% if rearport_count %} + + {% endif %} + {% endwith %} + + {% with consoleport_count=object.consoleporttemplates.count %} + {% if consoleport_count %} + + {% endif %} + {% endwith %} + + {% with consoleserverport_count=object.consoleserverporttemplates.count %} + {% if consoleserverport_count %} + + {% endif %} + {% endwith %} + + {% with powerport_count=object.powerporttemplates.count %} + {% if powerport_count %} + + {% endif %} + {% endwith %} + + {% with poweroutlet_count=object.poweroutlettemplates.count %} + {% if poweroutlet_count %} + + {% endif %} + {% endwith %} +{% endblock %} diff --git a/netbox/templates/dcim/moduletype/component_templates.html b/netbox/templates/dcim/moduletype/component_templates.html new file mode 100644 index 00000000000..9930588b8a7 --- /dev/null +++ b/netbox/templates/dcim/moduletype/component_templates.html @@ -0,0 +1,44 @@ +{% extends 'dcim/moduletype/base.html' %} +{% load render_table from django_tables2 %} +{% load helpers %} + +{% block content %} + {% if perms.dcim.change_moduletype %} +
    + {% csrf_token %} +
    +
    {{ title }}
    +
    + {% include 'htmx/table.html' %} +
    + +
    +
    + {% else %} +
    +
    {{ title }}
    +
    + {% include 'htmx/table.html' %} +
    +
    + {% endif %} +{% endblock content %} From 5bd223a4683bb1ea72cffeb5e7c2ed7b13f65d70 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 17 Dec 2021 13:28:17 -0500 Subject: [PATCH 018/271] Fix YAML import for ModuleTypes --- netbox/dcim/forms/object_import.py | 42 ++++++++++----------- netbox/dcim/views.py | 8 ++++ netbox/netbox/views/generic/object_views.py | 11 +++++- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/netbox/dcim/forms/object_import.py b/netbox/dcim/forms/object_import.py index 9df02938682..cc0c7dc417d 100644 --- a/netbox/dcim/forms/object_import.py +++ b/netbox/dcim/forms/object_import.py @@ -50,23 +50,21 @@ class ModuleTypeImportForm(BootstrapMixin, forms.ModelForm): class ComponentTemplateImportForm(BootstrapMixin, forms.ModelForm): - def __init__(self, device_type, data=None, *args, **kwargs): - - # Must pass the parent DeviceType on form initialization - data.update({ - 'device_type': device_type.pk, - }) - - super().__init__(data, *args, **kwargs) - def clean_device_type(self): - - data = self.cleaned_data['device_type'] - # Limit fields referencing other components to the parent DeviceType - for field_name, field in self.fields.items(): - if isinstance(field, forms.ModelChoiceField) and field_name != 'device_type': - field.queryset = field.queryset.filter(device_type=data) + if data := self.cleaned_data['device_type']: + for field_name, field in self.fields.items(): + if isinstance(field, forms.ModelChoiceField) and field_name not in ['device_type', 'module_type']: + field.queryset = field.queryset.filter(device_type=data) + + return data + + def clean_module_type(self): + # Limit fields referencing other components to the parent ModuleType + if data := self.cleaned_data['module_type']: + for field_name, field in self.fields.items(): + if isinstance(field, forms.ModelChoiceField) and field_name not in ['device_type', 'module_type']: + field.queryset = field.queryset.filter(module_type=data) return data @@ -76,7 +74,7 @@ class ConsolePortTemplateImportForm(ComponentTemplateImportForm): class Meta: model = ConsolePortTemplate fields = [ - 'device_type', 'name', 'label', 'type', 'description', + 'device_type', 'module_type', 'name', 'label', 'type', 'description', ] @@ -85,7 +83,7 @@ class ConsoleServerPortTemplateImportForm(ComponentTemplateImportForm): class Meta: model = ConsoleServerPortTemplate fields = [ - 'device_type', 'name', 'label', 'type', 'description', + 'device_type', 'module_type', 'name', 'label', 'type', 'description', ] @@ -94,7 +92,7 @@ class PowerPortTemplateImportForm(ComponentTemplateImportForm): class Meta: model = PowerPortTemplate fields = [ - 'device_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', + 'device_type', 'module_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', ] @@ -108,7 +106,7 @@ class PowerOutletTemplateImportForm(ComponentTemplateImportForm): class Meta: model = PowerOutletTemplate fields = [ - 'device_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', + 'device_type', 'module_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', ] @@ -120,7 +118,7 @@ class InterfaceTemplateImportForm(ComponentTemplateImportForm): class Meta: model = InterfaceTemplate fields = [ - 'device_type', 'name', 'label', 'type', 'mgmt_only', 'description', + 'device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'description', ] @@ -136,7 +134,7 @@ class FrontPortTemplateImportForm(ComponentTemplateImportForm): class Meta: model = FrontPortTemplate fields = [ - 'device_type', 'name', 'type', 'rear_port', 'rear_port_position', 'label', 'description', + 'device_type', 'module_type', 'name', 'type', 'rear_port', 'rear_port_position', 'label', 'description', ] @@ -148,7 +146,7 @@ class RearPortTemplateImportForm(ComponentTemplateImportForm): class Meta: model = RearPortTemplate fields = [ - 'device_type', 'name', 'type', 'positions', 'label', 'description', + 'device_type', 'module_type', 'name', 'type', 'positions', 'label', 'description', ] diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 15e7d240642..f673e64d58d 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -892,6 +892,10 @@ class DeviceTypeImportView(generic.ObjectImportView): ('device-bays', forms.DeviceBayTemplateImportForm), )) + def prep_related_object_data(self, parent, data): + data.update({'device_type': parent}) + return data + class DeviceTypeBulkEditView(generic.BulkEditView): queryset = DeviceType.objects.prefetch_related('manufacturer').annotate( @@ -1009,6 +1013,10 @@ class ModuleTypeImportView(generic.ObjectImportView): ('front-ports', forms.FrontPortTemplateImportForm), )) + def prep_related_object_data(self, parent, data): + data.update({'module_type': parent}) + return data + class ModuleTypeBulkEditView(generic.BulkEditView): queryset = ModuleType.objects.prefetch_related('manufacturer').annotate( diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 588b51062ee..eda3658a615 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -319,6 +319,13 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') + def prep_related_object_data(self, parent, data): + """ + Hook to modify the data for related objects before it's passed to the related object form (for example, to + assign a parent object). + """ + return data + def _create_object(self, model_form): # Save the primary object @@ -333,8 +340,8 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): related_obj_pks = [] for i, rel_obj_data in enumerate(model_form.data.get(field_name, list())): - - f = related_object_form(obj, rel_obj_data) + rel_obj_data = self.prep_related_object_data(obj, rel_obj_data) + f = related_object_form(rel_obj_data) for subfield_name, field in f.fields.items(): if subfield_name not in rel_obj_data and hasattr(field, 'initial'): From 7777922bef32663f0817f11fbf1e4ec3676b10c3 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 17 Dec 2021 16:12:03 -0500 Subject: [PATCH 019/271] Add Module model --- netbox/dcim/api/nested_serializers.py | 19 ++- netbox/dcim/api/serializers.py | 14 ++ netbox/dcim/api/urls.py | 3 +- netbox/dcim/api/views.py | 10 +- netbox/dcim/filtersets.py | 37 +++++ netbox/dcim/forms/bulk_edit.py | 27 +++ netbox/dcim/forms/bulk_import.py | 30 ++++ netbox/dcim/forms/filtersets.py | 33 ++++ netbox/dcim/forms/models.py | 41 +++++ netbox/dcim/graphql/schema.py | 3 + netbox/dcim/graphql/types.py | 9 + netbox/dcim/migrations/0145_modules.py | 95 ++++++++--- netbox/dcim/models/__init__.py | 1 + .../dcim/models/device_component_templates.py | 46 +++--- netbox/dcim/models/device_components.py | 27 ++- netbox/dcim/models/devices.py | 98 ++++++++++- netbox/dcim/tables/__init__.py | 2 +- netbox/dcim/tables/devices.py | 17 +- netbox/dcim/tables/modules.py | 61 +++++++ netbox/dcim/tables/moduletypes.py | 34 ---- netbox/dcim/tables/template_code.py | 14 ++ netbox/dcim/tests/test_api.py | 63 ++++++- netbox/dcim/tests/test_filtersets.py | 75 ++++++++- netbox/dcim/tests/test_views.py | 69 ++++++++ netbox/dcim/urls.py | 16 +- netbox/dcim/views.py | 55 +++++-- netbox/netbox/navigation_menu.py | 1 + netbox/templates/dcim/device/base.html | 32 ++-- netbox/templates/dcim/devicetype/base.html | 32 ++-- netbox/templates/dcim/module.html | 154 ++++++++++++++++++ 30 files changed, 967 insertions(+), 151 deletions(-) create mode 100644 netbox/dcim/tables/modules.py delete mode 100644 netbox/dcim/tables/moduletypes.py create mode 100644 netbox/templates/dcim/module.html diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index a6e359feb63..6ed7c63c681 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -22,6 +22,7 @@ __all__ = [ 'NestedManufacturerSerializer', 'NestedModuleBaySerializer', 'NestedModuleBayTemplateSerializer', + 'NestedModuleSerializer', 'NestedModuleTypeSerializer', 'NestedPlatformSerializer', 'NestedPowerFeedSerializer', @@ -260,6 +261,18 @@ class NestedDeviceSerializer(WritableNestedSerializer): fields = ['id', 'url', 'display', 'name'] +class NestedModuleSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') + device = NestedDeviceSerializer(read_only=True) + # TODO: Solve circular dependency + # module_bay = NestedModuleBaySerializer(read_only=True) + module_type = NestedModuleTypeSerializer(read_only=True) + + class Meta: + model = models.Module + fields = ['id', 'url', 'display', 'device', 'module_bay', 'module_type'] + + class NestedConsoleServerPortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') device = NestedDeviceSerializer(read_only=True) @@ -325,11 +338,11 @@ class NestedFrontPortSerializer(WritableNestedSerializer): class NestedModuleBaySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') - # module = NestedModuleSerializer(read_only=True) + module = NestedModuleSerializer(read_only=True) class Meta: - model = models.DeviceBay - fields = ['id', 'url', 'display', 'name'] + model = models.ModuleBay + fields = ['id', 'url', 'display', 'module', 'name'] class NestedDeviceBaySerializer(WritableNestedSerializer): diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index c3d6b5cb4a4..b58355f324c 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -517,6 +517,20 @@ class DeviceSerializer(PrimaryModelSerializer): return data +class ModuleSerializer(PrimaryModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') + device = NestedDeviceSerializer() + module_bay = NestedModuleBaySerializer() + module_type = NestedModuleTypeSerializer() + + class Meta: + model = Module + fields = [ + 'id', 'url', 'display', 'device', 'module_bay', 'module_type', 'serial', 'asset_tag', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', + ] + + class DeviceWithConfigContextSerializer(DeviceSerializer): config_context = serializers.SerializerMethodField() diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 7a866063fd9..71a768fd573 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -32,10 +32,11 @@ router.register('rear-port-templates', views.RearPortTemplateViewSet) router.register('module-bay-templates', views.ModuleBayTemplateViewSet) router.register('device-bay-templates', views.DeviceBayTemplateViewSet) -# Devices +# Device/modules router.register('device-roles', views.DeviceRoleViewSet) router.register('platforms', views.PlatformViewSet) router.register('devices', views.DeviceViewSet) +router.register('modules', views.ModuleViewSet) # Device components router.register('console-ports', views.ConsolePortViewSet) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index e50f9b1b6dd..378e697c82d 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -377,7 +377,7 @@ class PlatformViewSet(CustomFieldModelViewSet): # -# Devices +# Devices/modules # class DeviceViewSet(ConfigContextQuerySetMixin, CustomFieldModelViewSet): @@ -526,6 +526,14 @@ class DeviceViewSet(ConfigContextQuerySetMixin, CustomFieldModelViewSet): return Response(response) +class ModuleViewSet(CustomFieldModelViewSet): + queryset = Module.objects.prefetch_related( + 'device', 'module_bay', 'module_type__manufacturer', 'tags', + ) + serializer_class = serializers.ModuleSerializer + filterset_class = filtersets.ModuleFilterSet + + # # Device components # diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index b0ff992a7a7..d91a9b574c8 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -43,6 +43,7 @@ __all__ = ( 'ManufacturerFilterSet', 'ModuleBayFilterSet', 'ModuleBayTemplateFilterSet', + 'ModuleFilterSet', 'ModuleTypeFilterSet', 'PathEndpointFilterSet', 'PlatformFilterSet', @@ -924,6 +925,42 @@ class DeviceFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContex return queryset.exclude(devicebays__isnull=value) +class ModuleFilterSet(PrimaryModelFilterSet): + q = django_filters.CharFilter( + method='search', + label='Search', + ) + manufacturer_id = django_filters.ModelMultipleChoiceFilter( + field_name='module_type__manufacturer', + queryset=Manufacturer.objects.all(), + label='Manufacturer (ID)', + ) + manufacturer = django_filters.ModelMultipleChoiceFilter( + field_name='module_type__manufacturer__slug', + queryset=Manufacturer.objects.all(), + to_field_name='slug', + label='Manufacturer (slug)', + ) + device_id = django_filters.ModelMultipleChoiceFilter( + queryset=Device.objects.all(), + label='Device (ID)', + ) + tag = TagFilter() + + class Meta: + model = Module + fields = ['id', 'serial', 'asset_tag'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(serial__icontains=value.strip()) | + Q(asset_tag__icontains=value.strip()) | + Q(comments__icontains=value) + ).distinct() + + class DeviceComponentFilterSet(django_filters.FilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 360fb81cb02..3786201800b 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -32,6 +32,7 @@ __all__ = ( 'InventoryItemBulkEditForm', 'LocationBulkEditForm', 'ManufacturerBulkEditForm', + 'ModuleBulkEditForm', 'ModuleBayBulkEditForm', 'ModuleBayTemplateBulkEditForm', 'ModuleTypeBulkEditForm', @@ -473,6 +474,32 @@ class DeviceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] +class ModuleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Module.objects.all(), + widget=forms.MultipleHiddenInput() + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + module_type = DynamicModelChoiceField( + queryset=ModuleType.objects.all(), + required=False, + query_params={ + 'manufacturer_id': '$manufacturer' + } + ) + serial = forms.CharField( + max_length=50, + required=False, + label='Serial Number' + ) + + class Meta: + nullable_fields = ['serial'] + + class CableBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Cable.objects.all(), diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 6092b3d4171..8f5ba25b73a 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -26,6 +26,7 @@ __all__ = ( 'InventoryItemCSVForm', 'LocationCSVForm', 'ManufacturerCSVForm', + 'ModuleCSVForm', 'ModuleBayCSVForm', 'PlatformCSVForm', 'PowerFeedCSVForm', @@ -400,6 +401,35 @@ class DeviceCSVForm(BaseDeviceCSVForm): self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) +class ModuleCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + module_bay = CSVModelChoiceField( + queryset=ModuleBay.objects.all(), + to_field_name='name' + ) + module_type = CSVModelChoiceField( + queryset=ModuleType.objects.all(), + to_field_name='model' + ) + + class Meta: + model = Module + fields = ( + 'device', 'module_bay', 'module_type', 'serial', 'asset_tag', 'comments', + ) + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + # Limit module_bay queryset by assigned device + params = {f"device__{self.fields['device'].to_field_name}": data.get('device')} + self.fields['module_bay'].queryset = self.fields['module_bay'].queryset.filter(**params) + + class ChildDeviceCSVForm(BaseDeviceCSVForm): parent = CSVModelChoiceField( queryset=Device.objects.all(), diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 5e8b333b9d4..29c09c7f7f9 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -29,6 +29,8 @@ __all__ = ( 'InventoryItemFilterForm', 'LocationFilterForm', 'ManufacturerFilterForm', + 'ModuleFilterForm', + 'ModuleFilterForm', 'ModuleBayFilterForm', 'ModuleTypeFilterForm', 'PlatformFilterForm', @@ -645,6 +647,37 @@ class DeviceFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFi tag = TagFilterField(model) +class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm): + model = Module + field_groups = [ + ['q', 'tag'], + ['manufacturer_id', 'module_type_id'], + ['serial', 'asset_tag'], + ] + manufacturer_id = DynamicModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + label=_('Manufacturer'), + fetch_trigger='open' + ) + module_type_id = DynamicModelMultipleChoiceField( + queryset=ModuleType.objects.all(), + required=False, + query_params={ + 'manufacturer_id': '$manufacturer_id' + }, + label=_('Type'), + fetch_trigger='open' + ) + serial = forms.CharField( + required=False + ) + asset_tag = forms.CharField( + required=False + ) + tag = TagFilterField(model) + + class VirtualChassisFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): model = VirtualChassis field_groups = [ diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index ae3cfeaef3c..672c54c68b4 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -39,6 +39,7 @@ __all__ = ( 'InventoryItemForm', 'LocationForm', 'ManufacturerForm', + 'ModuleForm', 'ModuleBayForm', 'ModuleBayTemplateForm', 'ModuleTypeForm', @@ -651,6 +652,46 @@ class DeviceForm(TenancyForm, CustomFieldModelForm): self.fields['position'].widget.choices = [(position, f'U{position}')] +class ModuleForm(CustomFieldModelForm): + device = DynamicModelChoiceField( + queryset=Device.objects.all(), + required=False, + initial_params={ + 'modulebays': '$module_bay' + } + ) + module_bay = DynamicModelChoiceField( + queryset=ModuleBay.objects.all(), + query_params={ + 'device_id': '$device' + } + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + initial_params={ + 'device_types': '$device_type' + } + ) + module_type = DynamicModelChoiceField( + queryset=ModuleType.objects.all(), + query_params={ + 'manufacturer_id': '$manufacturer' + } + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Module + fields = [ + 'device', 'module_bay', 'manufacturer', 'module_type', 'serial', 'asset_tag', 'tags', 'comments', + ] + + class CableForm(TenancyForm, CustomFieldModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), diff --git a/netbox/dcim/graphql/schema.py b/netbox/dcim/graphql/schema.py index d50c64d33ab..7f660b1922c 100644 --- a/netbox/dcim/graphql/schema.py +++ b/netbox/dcim/graphql/schema.py @@ -56,6 +56,9 @@ class DCIMQuery(graphene.ObjectType): manufacturer = ObjectField(ManufacturerType) manufacturer_list = ObjectListField(ManufacturerType) + module = ObjectField(ModuleType) + module_list = ObjectListField(ModuleType) + module_bay = ObjectField(ModuleBayType) module_bay_list = ObjectListField(ModuleBayType) diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index c1a8822d892..51e1960761f 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -27,6 +27,7 @@ __all__ = ( 'InventoryItemType', 'LocationType', 'ManufacturerType', + 'ModuleType', 'ModuleBayType', 'ModuleBayTemplateType', 'ModuleTypeType', @@ -257,6 +258,14 @@ class ManufacturerType(OrganizationalObjectType): filterset_class = filtersets.ManufacturerFilterSet +class ModuleType(ComponentObjectType): + + class Meta: + model = models.Module + fields = '__all__' + filterset_class = filtersets.ModuleFilterSet + + class ModuleBayType(ComponentObjectType): class Meta: diff --git a/netbox/dcim/migrations/0145_modules.py b/netbox/dcim/migrations/0145_modules.py index b9cb7bcc526..c9a3328462b 100644 --- a/netbox/dcim/migrations/0145_modules.py +++ b/netbox/dcim/migrations/0145_modules.py @@ -95,36 +95,110 @@ class Migration(migrations.Migration): 'unique_together': {('manufacturer', 'model')}, }, ), + migrations.CreateModel( + name='ModuleBay', + fields=[ + ('created', models.DateField(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=django.core.serializers.json.DjangoJSONEncoder)), + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=64)), + ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)), + ('label', models.CharField(blank=True, max_length=64)), + ('description', models.CharField(blank=True, max_length=200)), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modulebays', to='dcim.device')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'ordering': ('device', '_name'), + 'unique_together': {('device', 'name')}, + }, + ), + migrations.CreateModel( + name='Module', + fields=[ + ('created', models.DateField(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=django.core.serializers.json.DjangoJSONEncoder)), + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('local_context_data', models.JSONField(blank=True, null=True)), + ('serial', models.CharField(blank=True, max_length=50)), + ('asset_tag', models.CharField(blank=True, max_length=50, null=True, unique=True)), + ('comments', models.TextField(blank=True)), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modules', to='dcim.device')), + ('module_bay', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='installed_module', to='dcim.modulebay')), + ('module_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='instances', to='dcim.moduletype')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'ordering': ('module_bay',), + }, + ), + migrations.AddField( + model_name='consoleport', + name='module', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleports', to='dcim.module'), + ), migrations.AddField( model_name='consoleporttemplate', name='module_type', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleporttemplates', to='dcim.moduletype'), ), + migrations.AddField( + model_name='consoleserverport', + name='module', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverports', to='dcim.module'), + ), migrations.AddField( model_name='consoleserverporttemplate', name='module_type', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverporttemplates', to='dcim.moduletype'), ), + migrations.AddField( + model_name='frontport', + name='module', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='frontports', to='dcim.module'), + ), migrations.AddField( model_name='frontporttemplate', name='module_type', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='frontporttemplates', to='dcim.moduletype'), ), + migrations.AddField( + model_name='interface', + name='module', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interfaces', to='dcim.module'), + ), migrations.AddField( model_name='interfacetemplate', name='module_type', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interfacetemplates', to='dcim.moduletype'), ), + migrations.AddField( + model_name='poweroutlet', + name='module', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlets', to='dcim.module'), + ), migrations.AddField( model_name='poweroutlettemplate', name='module_type', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlettemplates', to='dcim.moduletype'), ), + migrations.AddField( + model_name='powerport', + name='module', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='powerports', to='dcim.module'), + ), migrations.AddField( model_name='powerporttemplate', name='module_type', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='powerporttemplates', to='dcim.moduletype'), ), + migrations.AddField( + model_name='rearport', + name='module', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rearports', to='dcim.module'), + ), migrations.AddField( model_name='rearporttemplate', name='module_type', @@ -140,7 +214,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='frontporttemplate', - unique_together={('device_type', 'name'), ('module_type', 'name'), ('rear_port', 'rear_port_position')}, + unique_together={('device_type', 'name'), ('rear_port', 'rear_port_position'), ('module_type', 'name')}, ), migrations.AlterUniqueTogether( name='interfacetemplate', @@ -175,23 +249,4 @@ class Migration(migrations.Migration): 'unique_together': {('device_type', 'name')}, }, ), - migrations.CreateModel( - name='ModuleBay', - fields=[ - ('created', models.DateField(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=django.core.serializers.json.DjangoJSONEncoder)), - ('id', models.BigAutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=64)), - ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)), - ('label', models.CharField(blank=True, max_length=64)), - ('description', models.CharField(blank=True, max_length=200)), - ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modulebays', to='dcim.device')), - ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), - ], - options={ - 'ordering': ('device', '_name'), - 'unique_together': {('device', 'name')}, - }, - ), ] diff --git a/netbox/dcim/models/__init__.py b/netbox/dcim/models/__init__.py index a030dc3a85e..8d4b1dce699 100644 --- a/netbox/dcim/models/__init__.py +++ b/netbox/dcim/models/__init__.py @@ -27,6 +27,7 @@ __all__ = ( 'InventoryItem', 'Location', 'Manufacturer', + 'Module', 'ModuleBay', 'ModuleBayTemplate', 'ModuleType', diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index d522d543a3a..a22118de01f 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -142,12 +142,12 @@ class ConsolePortTemplate(ModularComponentTemplateModel): ('module_type', 'name'), ) - def instantiate(self, device): + def instantiate(self, **kwargs): return ConsolePort( - device=device, name=self.name, label=self.label, - type=self.type + type=self.type, + **kwargs ) @@ -169,12 +169,12 @@ class ConsoleServerPortTemplate(ModularComponentTemplateModel): ('module_type', 'name'), ) - def instantiate(self, device): + def instantiate(self, **kwargs): return ConsoleServerPort( - device=device, name=self.name, label=self.label, - type=self.type + type=self.type, + **kwargs ) @@ -208,14 +208,14 @@ class PowerPortTemplate(ModularComponentTemplateModel): ('module_type', 'name'), ) - def instantiate(self, device): + def instantiate(self, **kwargs): return PowerPort( - device=device, name=self.name, label=self.label, type=self.type, maximum_draw=self.maximum_draw, - allocated_draw=self.allocated_draw + allocated_draw=self.allocated_draw, + **kwargs ) def clean(self): @@ -273,18 +273,18 @@ class PowerOutletTemplate(ModularComponentTemplateModel): f"Parent power port ({self.power_port}) must belong to the same module type" ) - def instantiate(self, device): + def instantiate(self, **kwargs): if self.power_port: - power_port = PowerPort.objects.get(device=device, name=self.power_port.name) + power_port = PowerPort.objects.get(name=self.power_port.name, **kwargs) else: power_port = None return PowerOutlet( - device=device, name=self.name, label=self.label, type=self.type, power_port=power_port, - feed_leg=self.feed_leg + feed_leg=self.feed_leg, + **kwargs ) @@ -316,13 +316,13 @@ class InterfaceTemplate(ModularComponentTemplateModel): ('module_type', 'name'), ) - def instantiate(self, device): + def instantiate(self, **kwargs): return Interface( - device=device, name=self.name, label=self.label, type=self.type, - mgmt_only=self.mgmt_only + mgmt_only=self.mgmt_only, + **kwargs ) @@ -381,19 +381,19 @@ class FrontPortTemplate(ModularComponentTemplateModel): except RearPortTemplate.DoesNotExist: pass - def instantiate(self, device): + def instantiate(self, **kwargs): if self.rear_port: - rear_port = RearPort.objects.get(device=device, name=self.rear_port.name) + rear_port = RearPort.objects.get(name=self.rear_port.name, **kwargs) else: rear_port = None return FrontPort( - device=device, name=self.name, label=self.label, type=self.type, color=self.color, rear_port=rear_port, - rear_port_position=self.rear_port_position + rear_port_position=self.rear_port_position, + **kwargs ) @@ -424,14 +424,14 @@ class RearPortTemplate(ModularComponentTemplateModel): ('module_type', 'name'), ) - def instantiate(self, device): + def instantiate(self, **kwargs): return RearPort( - device=device, name=self.name, label=self.label, type=self.type, color=self.color, - positions=self.positions + positions=self.positions, + **kwargs ) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 08e0692390c..fc80b29c983 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -87,6 +87,19 @@ class ComponentModel(PrimaryModel): return self.device +class ModularComponentModel(ComponentModel): + module = models.ForeignKey( + to='dcim.Module', + on_delete=models.CASCADE, + related_name='%(class)ss', + blank=True, + null=True + ) + + class Meta: + abstract = True + + class LinkTermination(models.Model): """ An abstract model inherited by all models to which a Cable, WirelessLink, or other such link can terminate. Examples @@ -234,7 +247,7 @@ class PathEndpoint(models.Model): # @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class ConsolePort(ComponentModel, LinkTermination, PathEndpoint): +class ConsolePort(ModularComponentModel, LinkTermination, PathEndpoint): """ A physical console port within a Device. ConsolePorts connect to ConsoleServerPorts. """ @@ -262,7 +275,7 @@ class ConsolePort(ComponentModel, LinkTermination, PathEndpoint): @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class ConsoleServerPort(ComponentModel, LinkTermination, PathEndpoint): +class ConsoleServerPort(ModularComponentModel, LinkTermination, PathEndpoint): """ A physical port within a Device (typically a designated console server) which provides access to ConsolePorts. """ @@ -294,7 +307,7 @@ class ConsoleServerPort(ComponentModel, LinkTermination, PathEndpoint): # @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class PowerPort(ComponentModel, LinkTermination, PathEndpoint): +class PowerPort(ModularComponentModel, LinkTermination, PathEndpoint): """ A physical power supply (intake) port within a Device. PowerPorts connect to PowerOutlets. """ @@ -387,7 +400,7 @@ class PowerPort(ComponentModel, LinkTermination, PathEndpoint): @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class PowerOutlet(ComponentModel, LinkTermination, PathEndpoint): +class PowerOutlet(ModularComponentModel, LinkTermination, PathEndpoint): """ A physical power outlet (output) within a Device which provides power to a PowerPort. """ @@ -502,7 +515,7 @@ class BaseInterface(models.Model): @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class Interface(ComponentModel, BaseInterface, LinkTermination, PathEndpoint): +class Interface(ModularComponentModel, BaseInterface, LinkTermination, PathEndpoint): """ A network interface within a Device. A physical Interface can connect to exactly one other Interface. """ @@ -765,7 +778,7 @@ class Interface(ComponentModel, BaseInterface, LinkTermination, PathEndpoint): # @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class FrontPort(ComponentModel, LinkTermination): +class FrontPort(ModularComponentModel, LinkTermination): """ A pass-through port on the front of a Device. """ @@ -819,7 +832,7 @@ class FrontPort(ComponentModel, LinkTermination): @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class RearPort(ComponentModel, LinkTermination): +class RearPort(ModularComponentModel, LinkTermination): """ A pass-through port on the rear of a Device. """ diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index ab06b7dc562..8d0a7ae19e6 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -26,6 +26,7 @@ __all__ = ( 'DeviceRole', 'DeviceType', 'Manufacturer', + 'Module', 'ModuleType', 'Platform', 'VirtualChassis', @@ -906,31 +907,31 @@ class Device(PrimaryModel, ConfigContextModel): # If this is a new Device, instantiate all of the related components per the DeviceType definition if is_new: ConsolePort.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.consoleporttemplates.all()] + [x.instantiate(device=self) for x in self.device_type.consoleporttemplates.all()] ) ConsoleServerPort.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.consoleserverporttemplates.all()] + [x.instantiate(device=self) for x in self.device_type.consoleserverporttemplates.all()] ) PowerPort.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.powerporttemplates.all()] + [x.instantiate(device=self) for x in self.device_type.powerporttemplates.all()] ) PowerOutlet.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.poweroutlettemplates.all()] + [x.instantiate(device=self) for x in self.device_type.poweroutlettemplates.all()] ) Interface.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.interfacetemplates.all()] + [x.instantiate(device=self) for x in self.device_type.interfacetemplates.all()] ) RearPort.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.rearporttemplates.all()] + [x.instantiate(device=self) for x in self.device_type.rearporttemplates.all()] ) FrontPort.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.frontporttemplates.all()] + [x.instantiate(device=self) for x in self.device_type.frontporttemplates.all()] ) ModuleBay.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.modulebaytemplates.all()] + [x.instantiate(device=self) for x in self.device_type.modulebaytemplates.all()] ) DeviceBay.objects.bulk_create( - [x.instantiate(self) for x in self.device_type.devicebaytemplates.all()] + [x.instantiate(device=self) for x in self.device_type.devicebaytemplates.all()] ) # Update Site and Rack assignment for any child Devices @@ -1008,6 +1009,85 @@ class Device(PrimaryModel, ConfigContextModel): return DeviceStatusChoices.colors.get(self.status, 'secondary') +@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') +class Module(PrimaryModel, ConfigContextModel): + """ + A Module represents a field-installable component within a Device which may itself hold multiple device components + (for example, a line card within a chassis switch). Modules are instantiated from ModuleTypes. + """ + device = models.ForeignKey( + to='dcim.Device', + on_delete=models.CASCADE, + related_name='modules' + ) + module_bay = models.OneToOneField( + to='dcim.ModuleBay', + on_delete=models.CASCADE, + related_name='installed_module' + ) + module_type = models.ForeignKey( + to='dcim.ModuleType', + on_delete=models.PROTECT, + related_name='instances' + ) + serial = models.CharField( + max_length=50, + blank=True, + verbose_name='Serial number' + ) + asset_tag = models.CharField( + max_length=50, + blank=True, + null=True, + unique=True, + verbose_name='Asset tag', + help_text='A unique tag used to identify this device' + ) + comments = models.TextField( + blank=True + ) + + clone_fields = ('device', 'module_type') + + class Meta: + ordering = ('module_bay',) + + def __str__(self): + return str(self.module_type) + + def get_absolute_url(self): + return reverse('dcim:module', args=[self.pk]) + + def save(self, *args, **kwargs): + is_new = not bool(self.pk) + + super().save(*args, **kwargs) + + # If this is a new Module, instantiate all its related components per the ModuleType definition + if is_new: + ConsolePort.objects.bulk_create( + [x.instantiate(device=self.device, module=self) for x in self.module_type.consoleporttemplates.all()] + ) + ConsoleServerPort.objects.bulk_create( + [x.instantiate(device=self.device, module=self) for x in self.module_type.consoleserverporttemplates.all()] + ) + PowerPort.objects.bulk_create( + [x.instantiate(device=self.device, module=self) for x in self.module_type.powerporttemplates.all()] + ) + PowerOutlet.objects.bulk_create( + [x.instantiate(device=self.device, module=self) for x in self.module_type.poweroutlettemplates.all()] + ) + Interface.objects.bulk_create( + [x.instantiate(device=self.device, module=self) for x in self.module_type.interfacetemplates.all()] + ) + RearPort.objects.bulk_create( + [x.instantiate(device=self.device, module=self) for x in self.module_type.rearporttemplates.all()] + ) + FrontPort.objects.bulk_create( + [x.instantiate(device=self.device, module=self) for x in self.module_type.frontporttemplates.all()] + ) + + # # Virtual chassis # diff --git a/netbox/dcim/tables/__init__.py b/netbox/dcim/tables/__init__.py index 688b8771ca2..993ae0518f9 100644 --- a/netbox/dcim/tables/__init__.py +++ b/netbox/dcim/tables/__init__.py @@ -6,7 +6,7 @@ from dcim.models import ConsolePort, Interface, PowerPort from .cables import * from .devices import * from .devicetypes import * -from .moduletypes import * +from .modules import * from .power import * from .racks import * from .sites import * diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index df1d79aa403..f8616b64227 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -725,26 +725,31 @@ class ModuleBayTable(DeviceComponentTable): 'args': [Accessor('device_id')], } ) + installed_module = tables.Column( + linkify=True, + verbose_name='Installed module' + ) tags = TagColumn( url_name='dcim:modulebay_list' ) class Meta(DeviceComponentTable.Meta): model = ModuleBay - fields = ('pk', 'id', 'name', 'device', 'label', 'description', 'tags') - default_columns = ('pk', 'name', 'device', 'label', 'description') + fields = ('pk', 'id', 'name', 'device', 'label', 'installed_module', 'description', 'tags') + default_columns = ('pk', 'name', 'device', 'label', 'installed_module', 'description') class DeviceModuleBayTable(ModuleBayTable): actions = ButtonsColumn( - model=ModuleBay, - buttons=('edit', 'delete') + model=DeviceBay, + buttons=('edit', 'delete'), + prepend_template=MODULEBAY_BUTTONS ) class Meta(DeviceComponentTable.Meta): model = ModuleBay - fields = ('pk', 'id', 'name', 'label', 'description', 'tags', 'actions') - default_columns = ('pk', 'name', 'label', 'description', 'actions') + fields = ('pk', 'id', 'name', 'label', 'description', 'installed_module', 'tags', 'actions') + default_columns = ('pk', 'name', 'label', 'description', 'installed_module', 'actions') class InventoryItemTable(DeviceComponentTable): diff --git a/netbox/dcim/tables/modules.py b/netbox/dcim/tables/modules.py new file mode 100644 index 00000000000..6d620433a68 --- /dev/null +++ b/netbox/dcim/tables/modules.py @@ -0,0 +1,61 @@ +import django_tables2 as tables + +from dcim.models import Module, ModuleType +from utilities.tables import BaseTable, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn + +__all__ = ( + 'ModuleTable', + 'ModuleTypeTable', +) + + +class ModuleTypeTable(BaseTable): + pk = ToggleColumn() + model = tables.Column( + linkify=True, + verbose_name='Module Type' + ) + instance_count = LinkedCountColumn( + viewname='dcim:module_list', + url_params={'module_type_id': 'pk'}, + verbose_name='Instances' + ) + comments = MarkdownColumn() + tags = TagColumn( + url_name='dcim:moduletype_list' + ) + + class Meta(BaseTable.Meta): + model = ModuleType + fields = ( + 'pk', 'id', 'model', 'manufacturer', 'part_number', 'comments', 'tags', + ) + default_columns = ( + 'pk', 'model', 'manufacturer', 'part_number', + ) + + +class ModuleTable(BaseTable): + pk = ToggleColumn() + device = tables.Column( + linkify=True + ) + module_bay = tables.Column( + linkify=True + ) + module_type = tables.Column( + linkify=True + ) + comments = MarkdownColumn() + tags = TagColumn( + url_name='dcim:module_list' + ) + + class Meta(BaseTable.Meta): + model = Module + fields = ( + 'pk', 'id', 'device', 'module_bay', 'module_type', 'serial', 'asset_tag', 'comments', 'tags', + ) + default_columns = ( + 'pk', 'id', 'device', 'module_bay', 'module_type', 'serial', 'asset_tag', + ) diff --git a/netbox/dcim/tables/moduletypes.py b/netbox/dcim/tables/moduletypes.py deleted file mode 100644 index 23bf2e96546..00000000000 --- a/netbox/dcim/tables/moduletypes.py +++ /dev/null @@ -1,34 +0,0 @@ -import django_tables2 as tables - -from dcim.models import ModuleType -from utilities.tables import BaseTable, MarkdownColumn, TagColumn, ToggleColumn - -__all__ = ( - 'ModuleTypeTable', -) - - -class ModuleTypeTable(BaseTable): - pk = ToggleColumn() - model = tables.Column( - linkify=True, - verbose_name='Device Type' - ) - # instance_count = LinkedCountColumn( - # viewname='dcim:module_list', - # url_params={'module_type_id': 'pk'}, - # verbose_name='Instances' - # ) - comments = MarkdownColumn() - tags = TagColumn( - url_name='dcim:moduletype_list' - ) - - class Meta(BaseTable.Meta): - model = ModuleType - fields = ( - 'pk', 'id', 'model', 'manufacturer', 'part_number', 'comments', 'tags', - ) - default_columns = ( - 'pk', 'model', 'manufacturer', 'part_number', - ) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index ccca32be874..6b44c4b3f0b 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -321,3 +321,17 @@ DEVICEBAY_BUTTONS = """ {% endif %} {% endif %} """ + +MODULEBAY_BUTTONS = """ +{% if perms.dcim.add_module %} + {% if record.installed_module %} + + + + {% else %} + + + + {% endif %} +{% endif %} +""" diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 597b6d50be6..3b6410c8c86 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -7,7 +7,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from ipam.models import ASN, RIR, VLAN -from utilities.testing import APITestCase, APIViewTestCases +from utilities.testing import APITestCase, APIViewTestCases, create_test_device from virtualization.models import Cluster, ClusterType from wireless.models import WirelessLAN @@ -1105,6 +1105,67 @@ class DeviceTest(APIViewTestCases.APIViewTestCase): self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) +class ModuleTest(APIViewTestCases.APIViewTestCase): + model = Module + brief_fields = ['device', 'display', 'id', 'module_bay', 'module_type', 'url'] + bulk_update_data = { + 'serial': '1234ABCD', + } + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Generic', slug='generic') + device = create_test_device('Test Device 1') + + module_types = ( + ModuleType(manufacturer=manufacturer, model='Module Type 1'), + ModuleType(manufacturer=manufacturer, model='Module Type 2'), + ModuleType(manufacturer=manufacturer, model='Module Type 3'), + ) + ModuleType.objects.bulk_create(module_types) + + module_bays = ( + ModuleBay(device=device, name='Module Bay 1'), + ModuleBay(device=device, name='Module Bay 2'), + ModuleBay(device=device, name='Module Bay 3'), + ModuleBay(device=device, name='Module Bay 4'), + ModuleBay(device=device, name='Module Bay 5'), + ModuleBay(device=device, name='Module Bay 6'), + ) + ModuleBay.objects.bulk_create(module_bays) + + modules = ( + Module(device=device, module_bay=module_bays[0], module_type=module_types[0]), + Module(device=device, module_bay=module_bays[1], module_type=module_types[1]), + Module(device=device, module_bay=module_bays[2], module_type=module_types[2]), + ) + Module.objects.bulk_create(modules) + + cls.create_data = [ + { + 'device': device.pk, + 'module_bay': module_bays[3].pk, + 'module_type': module_types[0].pk, + 'serial': 'ABC123', + 'asset_tag': 'Foo1', + }, + { + 'device': device.pk, + 'module_bay': module_bays[4].pk, + 'module_type': module_types[1].pk, + 'serial': 'DEF456', + 'asset_tag': 'Foo2', + }, + { + 'device': device.pk, + 'module_bay': module_bays[5].pk, + 'module_type': module_types[2].pk, + 'serial': 'GHI789', + 'asset_tag': 'Foo3', + }, + ] + + class ConsolePortTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase): model = ConsolePort brief_fields = ['_occupied', 'cable', 'device', 'display', 'id', 'name', 'url'] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 4fd1286da3e..8f04fb4d99e 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -7,7 +7,7 @@ from dcim.models import * from ipam.models import ASN, IPAddress, RIR from tenancy.models import Tenant, TenantGroup from utilities.choices import ColorChoices -from utilities.testing import ChangeLoggedFilterSetTests +from utilities.testing import ChangeLoggedFilterSetTests, create_test_device from virtualization.models import Cluster, ClusterType from wireless.choices import WirelessChannelChoices, WirelessRoleChoices @@ -1648,6 +1648,79 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class ModuleTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = Module.objects.all() + filterset = ModuleFilterSet + + @classmethod + def setUpTestData(cls): + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + Manufacturer(name='Manufacturer 3', slug='manufacturer-3'), + ) + Manufacturer.objects.bulk_create(manufacturers) + + devices = ( + create_test_device('Test Device 1'), + create_test_device('Test Device 2'), + create_test_device('Test Device 3'), + ) + + module_types = ( + ModuleType(manufacturer=manufacturers[0], model='Module Type 1'), + ModuleType(manufacturer=manufacturers[1], model='Module Type 2'), + ModuleType(manufacturer=manufacturers[2], model='Module Type 3'), + ) + ModuleType.objects.bulk_create(module_types) + + module_bays = ( + ModuleBay(device=devices[0], name='Module Bay 1'), + ModuleBay(device=devices[0], name='Module Bay 2'), + ModuleBay(device=devices[0], name='Module Bay 3'), + ModuleBay(device=devices[1], name='Module Bay 1'), + ModuleBay(device=devices[1], name='Module Bay 2'), + ModuleBay(device=devices[1], name='Module Bay 3'), + ModuleBay(device=devices[2], name='Module Bay 1'), + ModuleBay(device=devices[2], name='Module Bay 2'), + ModuleBay(device=devices[2], name='Module Bay 3'), + ) + ModuleBay.objects.bulk_create(module_bays) + + modules = ( + Module(device=devices[0], module_bay=module_bays[0], module_type=module_types[0], serial='A', asset_tag='A'), + Module(device=devices[0], module_bay=module_bays[1], module_type=module_types[1], serial='B', asset_tag='B'), + Module(device=devices[0], module_bay=module_bays[2], module_type=module_types[2], serial='C', asset_tag='C'), + Module(device=devices[1], module_bay=module_bays[3], module_type=module_types[0], serial='D', asset_tag='D'), + Module(device=devices[1], module_bay=module_bays[4], module_type=module_types[1], serial='E', asset_tag='E'), + Module(device=devices[1], module_bay=module_bays[5], module_type=module_types[2], serial='F', asset_tag='F'), + Module(device=devices[2], module_bay=module_bays[6], module_type=module_types[0], serial='G', asset_tag='G'), + Module(device=devices[2], module_bay=module_bays[7], module_type=module_types[1], serial='H', asset_tag='H'), + Module(device=devices[2], module_bay=module_bays[8], module_type=module_types[2], serial='I', asset_tag='I'), + ) + Module.objects.bulk_create(modules) + + def test_manufacturer(self): + manufacturers = Manufacturer.objects.all()[:2] + params = {'manufacturer_id': [manufacturers[0].pk, manufacturers[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + params = {'manufacturer': [manufacturers[0].slug, manufacturers[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + + def test_device(self): + device_types = Device.objects.all()[:2] + params = {'device_id': [device_types[0].pk, device_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + + def test_serial(self): + params = {'asset_tag': ['A', 'B']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_asset_tag(self): + params = {'asset_tag': ['A', 'B']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class ConsolePortTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = ConsolePort.objects.all() filterset = ConsolePortFilterSet diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 6094fe73973..12216a8ac3d 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -1697,6 +1697,75 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase): self.assertHttpStatus(self.client.get(url), 200) +class ModuleTestCase( + # Module does not support bulk renaming (no name field) or + # bulk creation (need to specify module bays) + ViewTestCases.GetObjectViewTestCase, + ViewTestCases.GetObjectChangelogViewTestCase, + ViewTestCases.EditObjectViewTestCase, + ViewTestCases.DeleteObjectViewTestCase, + ViewTestCases.ListObjectsViewTestCase, + ViewTestCases.BulkImportObjectsViewTestCase, + ViewTestCases.BulkEditObjectsViewTestCase, + ViewTestCases.BulkDeleteObjectsViewTestCase, +): + model = Module + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Generic', slug='generic') + devices = ( + create_test_device('Device 1'), + create_test_device('Device 2'), + ) + + module_types = ( + ModuleType(manufacturer=manufacturer, model='Module Type 1'), + ModuleType(manufacturer=manufacturer, model='Module Type 2'), + ModuleType(manufacturer=manufacturer, model='Module Type 3'), + ModuleType(manufacturer=manufacturer, model='Module Type 4'), + ) + ModuleType.objects.bulk_create(module_types) + + module_bays = ( + ModuleBay(device=devices[0], name='Module Bay 1'), + ModuleBay(device=devices[0], name='Module Bay 2'), + ModuleBay(device=devices[0], name='Module Bay 3'), + ModuleBay(device=devices[1], name='Module Bay 1'), + ModuleBay(device=devices[1], name='Module Bay 2'), + ModuleBay(device=devices[1], name='Module Bay 3'), + ) + ModuleBay.objects.bulk_create(module_bays) + + modules = ( + Module(device=devices[0], module_bay=module_bays[0], module_type=module_types[0]), + Module(device=devices[0], module_bay=module_bays[1], module_type=module_types[1]), + Module(device=devices[0], module_bay=module_bays[2], module_type=module_types[2]), + ) + Module.objects.bulk_create(modules) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'device': devices[1].pk, + 'module_bay': module_bays[3].pk, + 'module_type': module_types[0].pk, + 'serial': 'A', + 'tags': [t.pk for t in tags], + } + + cls.bulk_edit_data = { + 'module_type': module_types[3].pk, + } + + cls.csv_data = ( + "device,module_bay,module_type,serial,asset_tag", + "Device 2,Module Bay 1,Module Type 1,A,A", + "Device 2,Module Bay 2,Module Type 2,B,B", + "Device 2,Module Bay 3,Module Type 3,C,C", + ) + + class ConsolePortTestCase(ViewTestCases.DeviceComponentViewTestCase): model = ConsolePort diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index e1c1e200ff6..8ec30c0ccb1 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -254,12 +254,24 @@ urlpatterns = [ path('devices//device-bays/', views.DeviceDeviceBaysView.as_view(), name='device_devicebays'), path('devices//inventory/', views.DeviceInventoryView.as_view(), name='device_inventory'), path('devices//config-context/', views.DeviceConfigContextView.as_view(), name='device_configcontext'), - path('devices//changelog/', views.DeviceChangeLogView.as_view(), name='device_changelog', kwargs={'model': Device}), - path('devices//journal/', views.DeviceJournalView.as_view(), name='device_journal', kwargs={'model': Device}), + path('devices//changelog/', ObjectChangeLogView.as_view(), name='device_changelog', kwargs={'model': Device}), + path('devices//journal/', ObjectJournalView.as_view(), name='device_journal', kwargs={'model': Device}), path('devices//status/', views.DeviceStatusView.as_view(), name='device_status'), path('devices//lldp-neighbors/', views.DeviceLLDPNeighborsView.as_view(), name='device_lldp_neighbors'), path('devices//config/', views.DeviceConfigView.as_view(), name='device_config'), + # Modules + path('modules/', views.ModuleListView.as_view(), name='module_list'), + path('modules/add/', views.ModuleEditView.as_view(), name='module_add'), + path('modules/import/', views.ModuleBulkImportView.as_view(), name='module_import'), + path('modules/edit/', views.ModuleBulkEditView.as_view(), name='module_bulk_edit'), + path('modules/delete/', views.ModuleBulkDeleteView.as_view(), name='module_bulk_delete'), + path('modules//', views.ModuleView.as_view(), name='module'), + path('modules//edit/', views.ModuleEditView.as_view(), name='module_edit'), + path('modules//delete/', views.ModuleDeleteView.as_view(), name='module_delete'), + path('modules//changelog/', ObjectChangeLogView.as_view(), name='module_changelog', kwargs={'model': Module}), + path('modules//journal/', ObjectJournalView.as_view(), name='module_journal', kwargs={'model': Module}), + # Console ports path('console-ports/', views.ConsolePortListView.as_view(), name='consoleport_list'), path('console-ports/add/', views.ConsolePortCreateView.as_view(), name='consoleport_add'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index f673e64d58d..3bc26455457 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -13,7 +13,7 @@ from django.utils.safestring import mark_safe from django.views.generic import View from circuits.models import Circuit -from extras.views import ObjectChangeLogView, ObjectConfigContextView, ObjectJournalView +from extras.views import ObjectConfigContextView from ipam.models import ASN, IPAddress, Prefix, Service, VLAN from ipam.tables import AssignedIPAddressesTable, InterfaceVLANTable from netbox.views import generic @@ -30,7 +30,7 @@ from .constants import NONCONNECTABLE_IFACE_TYPES from .models import ( Cable, CablePath, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate, - InventoryItem, Manufacturer, ModuleBay, ModuleBayTemplate, ModuleType, PathEndpoint, Platform, PowerFeed, + InventoryItem, Manufacturer, Module, ModuleBay, ModuleBayTemplate, ModuleType, PathEndpoint, Platform, PowerFeed, PowerOutlet, PowerOutletTemplate, PowerPanel, PowerPort, PowerPortTemplate, Rack, Location, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, SiteGroup, VirtualChassis, ) @@ -1629,14 +1629,6 @@ class DeviceConfigContextView(ObjectConfigContextView): base_template = 'dcim/device/base.html' -class DeviceChangeLogView(ObjectChangeLogView): - base_template = 'dcim/device/base.html' - - -class DeviceJournalView(ObjectJournalView): - base_template = 'dcim/device/base.html' - - class DeviceEditView(generic.ObjectEditView): queryset = Device.objects.all() model_form = forms.DeviceForm @@ -1685,6 +1677,49 @@ class DeviceBulkDeleteView(generic.BulkDeleteView): table = tables.DeviceTable +# +# Devices +# + +class ModuleListView(generic.ObjectListView): + queryset = Module.objects.prefetch_related('device', 'module_type__manufacturer') + filterset = filtersets.ModuleFilterSet + filterset_form = forms.ModuleFilterForm + table = tables.ModuleTable + + +class ModuleView(generic.ObjectView): + queryset = Module.objects.all() + + +class ModuleEditView(generic.ObjectEditView): + queryset = Module.objects.all() + model_form = forms.ModuleForm + + +class ModuleDeleteView(generic.ObjectDeleteView): + queryset = Module.objects.all() + + +class ModuleBulkImportView(generic.BulkImportView): + queryset = Module.objects.all() + model_form = forms.ModuleCSVForm + table = tables.ModuleTable + + +class ModuleBulkEditView(generic.BulkEditView): + queryset = Module.objects.prefetch_related('device', 'module_type__manufacturer') + filterset = filtersets.ModuleFilterSet + table = tables.ModuleTable + form = forms.ModuleBulkEditForm + + +class ModuleBulkDeleteView(generic.BulkDeleteView): + queryset = Module.objects.prefetch_related('device', 'module_type__manufacturer') + filterset = filtersets.ModuleFilterSet + table = tables.ModuleTable + + # # Console ports # diff --git a/netbox/netbox/navigation_menu.py b/netbox/netbox/navigation_menu.py index a2bec4710f2..52359dcc671 100644 --- a/netbox/netbox/navigation_menu.py +++ b/netbox/netbox/navigation_menu.py @@ -139,6 +139,7 @@ DEVICES_MENU = Menu( label='Devices', items=( get_model_item('dcim', 'device', 'Devices'), + get_model_item('dcim', 'module', 'Modules'), get_model_item('dcim', 'devicerole', 'Device Roles'), get_model_item('dcim', 'platform', 'Platforms'), get_model_item('dcim', 'virtualchassis', 'Virtual Chassis'), diff --git a/netbox/templates/dcim/device/base.html b/netbox/templates/dcim/device/base.html index 80ccb69a2b4..d9ff0657ce6 100644 --- a/netbox/templates/dcim/device/base.html +++ b/netbox/templates/dcim/device/base.html @@ -102,6 +102,22 @@ + {% with devicebay_count=object.devicebays.count %} + {% if devicebay_count %} + + {% endif %} + {% endwith %} + + {% with modulebay_count=object.modulebays.count %} + {% if modulebay_count %} + + {% endif %} + {% endwith %} + {% with interface_count=object.interfaces_count %} {% if interface_count %} - {% endif %} - {% endwith %} - - {% with devicebay_count=object.devicebays.count %} - {% if devicebay_count %} - - {% endif %} - {% endwith %} - {% with inventoryitem_count=object.inventoryitems.count %} {% if inventoryitem_count %} + {% with devicebay_count=object.devicebaytemplates.count %} + {% if devicebay_count %} + + {% endif %} + {% endwith %} + + {% with modulebay_count=object.modulebaytemplates.count %} + {% if modulebay_count %} + + {% endif %} + {% endwith %} + {% with interface_count=object.interfacetemplates.count %} {% if interface_count %} {% endif %} {% endwith %} - - {% with modulebay_count=object.modulebaytemplates.count %} - {% if modulebay_count %} - - {% endif %} - {% endwith %} - - {% with devicebay_count=object.devicebaytemplates.count %} - {% if devicebay_count %} - - {% endif %} - {% endwith %} {% endblock %} diff --git a/netbox/templates/dcim/module.html b/netbox/templates/dcim/module.html new file mode 100644 index 00000000000..8410b955691 --- /dev/null +++ b/netbox/templates/dcim/module.html @@ -0,0 +1,154 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load tz %} + +{% block breadcrumbs %} + {{ block.super }} + +{% endblock %} + +{% block content %} +
    +
    +
    +
    Module
    +
    + + + + + + + + + + + + + + + + + + + + + +
    Device + {{ object.device }} +
    Device Type + {{ object.device.device_type }} +
    Module Type + {{ object.module_type }} +
    Serial Number{{ object.serial|placeholder }}
    Asset Tag{{ object.asset_tag|placeholder }}
    +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/comments.html' %} + {% plugin_left_page object %} +
    +
    +
    +
    Components
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Interfaces + {% with component_count=object.interfaces.count %} + {% if component_count %} + {{ component_count }} + {% else %} + None + {% endif %} + {% endwith %} +
    Console Ports + {% with component_count=object.consoleports.count %} + {% if component_count %} + {{ component_count }} + {% else %} + None + {% endif %} + {% endwith %} +
    Console Server Ports + {% with component_count=object.consoleserverports.count %} + {% if component_count %} + {{ component_count }} + {% else %} + None + {% endif %} + {% endwith %} +
    Power Ports + {% with component_count=object.powerports.count %} + {% if component_count %} + {{ component_count }} + {% else %} + None + {% endif %} + {% endwith %} +
    Power Outlets + {% with component_count=object.poweroutlets.count %} + {% if component_count %} + {{ component_count }} + {% else %} + None + {% endif %} + {% endwith %} +
    Front Ports + {% with component_count=object.frontports.count %} + {% if component_count %} + {{ component_count }} + {% else %} + None + {% endif %} + {% endwith %} +
    Rear Ports + {% with component_count=object.rearports.count %} + {% if component_count %} + {{ component_count }} + {% else %} + None + {% endif %} + {% endwith %} +
    +
    +
    + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} From e0d7511eaa963eb0298ece41d1c431e092b20d65 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 17 Dec 2021 16:27:03 -0500 Subject: [PATCH 020/271] Misc cleanup --- netbox/dcim/views.py | 2 +- netbox/templates/dcim/modulebay.html | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 3bc26455457..7ce67ab97dc 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2200,7 +2200,7 @@ class RearPortBulkDeleteView(generic.BulkDeleteView): # class ModuleBayListView(generic.ObjectListView): - queryset = ModuleBay.objects.all() + queryset = ModuleBay.objects.select_related('installed_module__module_type') filterset = filtersets.ModuleBayFilterSet filterset_form = forms.ModuleBayFilterForm table = tables.ModuleBayTable diff --git a/netbox/templates/dcim/modulebay.html b/netbox/templates/dcim/modulebay.html index 3dfcc68b995..0f903483a8c 100644 --- a/netbox/templates/dcim/modulebay.html +++ b/netbox/templates/dcim/modulebay.html @@ -12,7 +12,7 @@ Device - {{ object.device }} + {{ object.device }} @@ -30,26 +30,28 @@ - {% include 'inc/panels/custom_fields.html' %} - {% include 'inc/panels/tags.html' %} - {% plugin_left_page object %} + {% include 'inc/panels/tags.html' %} + {% plugin_left_page object %}
    + {% include 'inc/panels/custom_fields.html' %}
    Installed Module
    - {% if object.module %} - {% with module=object.module %} + {% if object.installed_module %} + {% with module=object.installed_module %} - + - +
    ModuleManufacturer - {{ module }} + {{ module.module_type.manufacturer }}
    Module Type{{ module.module_type }} + {{ module.module_type }} +
    {% endwith %} From 7dc4e00b4d0f27e089f4b24ef780b7501510ccf3 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 17 Dec 2021 20:15:49 -0500 Subject: [PATCH 021/271] Add module, module_bay columns to device component tables --- netbox/dcim/tables/devices.py | 92 ++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index f8616b64227..08f229d33f6 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -257,6 +257,19 @@ class DeviceComponentTable(BaseTable): order_by = ('device', 'name') +class ModularDeviceComponentTable(DeviceComponentTable): + module_bay = tables.Column( + accessor=Accessor('module__module_bay'), + linkify={ + 'viewname': 'dcim:device_modulebays', + 'args': [Accessor('device_id')], + } + ) + module = tables.Column( + linkify=True + ) + + class CableTerminationTable(BaseTable): cable = tables.Column( linkify=True @@ -284,7 +297,7 @@ class PathEndpointTable(CableTerminationTable): ) -class ConsolePortTable(DeviceComponentTable, PathEndpointTable): +class ConsolePortTable(ModularDeviceComponentTable, PathEndpointTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_consoleports', @@ -298,8 +311,8 @@ class ConsolePortTable(DeviceComponentTable, PathEndpointTable): class Meta(DeviceComponentTable.Meta): model = ConsolePort fields = ( - 'pk', 'id', 'name', 'device', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_color', - 'link_peer', 'connection', 'tags', + 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'speed', 'description', + 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'speed', 'description') @@ -319,8 +332,8 @@ class DeviceConsolePortTable(ConsolePortTable): class Meta(DeviceComponentTable.Meta): model = ConsolePort fields = ( - 'pk', 'id', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_color', - 'link_peer', 'connection', 'tags', 'actions' + 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'type', 'speed', 'description', 'mark_connected', + 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions' ) default_columns = ('pk', 'name', 'label', 'type', 'speed', 'description', 'cable', 'connection', 'actions') row_attrs = { @@ -328,7 +341,7 @@ class DeviceConsolePortTable(ConsolePortTable): } -class ConsoleServerPortTable(DeviceComponentTable, PathEndpointTable): +class ConsoleServerPortTable(ModularDeviceComponentTable, PathEndpointTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_consoleserverports', @@ -342,8 +355,8 @@ class ConsoleServerPortTable(DeviceComponentTable, PathEndpointTable): class Meta(DeviceComponentTable.Meta): model = ConsoleServerPort fields = ( - 'pk', 'id', 'name', 'device', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', - 'cable_color', 'link_peer', 'connection', 'tags', + 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'speed', 'description', + 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'speed', 'description') @@ -364,8 +377,8 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable): class Meta(DeviceComponentTable.Meta): model = ConsoleServerPort fields = ( - 'pk', 'id', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_color', - 'link_peer', 'connection', 'tags', 'actions', + 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'type', 'speed', 'description', 'mark_connected', + 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions', ) default_columns = ('pk', 'name', 'label', 'type', 'speed', 'description', 'cable', 'connection', 'actions') row_attrs = { @@ -373,7 +386,7 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable): } -class PowerPortTable(DeviceComponentTable, PathEndpointTable): +class PowerPortTable(ModularDeviceComponentTable, PathEndpointTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_powerports', @@ -387,8 +400,8 @@ class PowerPortTable(DeviceComponentTable, PathEndpointTable): class Meta(DeviceComponentTable.Meta): model = PowerPort fields = ( - 'pk', 'id', 'name', 'device', 'label', 'type', 'description', 'mark_connected', 'maximum_draw', - 'allocated_draw', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', + 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'description', 'mark_connected', + 'maximum_draw', 'allocated_draw', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description') @@ -409,8 +422,8 @@ class DevicePowerPortTable(PowerPortTable): class Meta(DeviceComponentTable.Meta): model = PowerPort fields = ( - 'pk', 'id', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'mark_connected', - 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions', + 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'type', 'maximum_draw', 'allocated_draw', + 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'cable', 'connection', @@ -421,7 +434,7 @@ class DevicePowerPortTable(PowerPortTable): } -class PowerOutletTable(DeviceComponentTable, PathEndpointTable): +class PowerOutletTable(ModularDeviceComponentTable, PathEndpointTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_poweroutlets', @@ -438,8 +451,8 @@ class PowerOutletTable(DeviceComponentTable, PathEndpointTable): class Meta(DeviceComponentTable.Meta): model = PowerOutlet fields = ( - 'pk', 'id', 'name', 'device', 'label', 'type', 'description', 'power_port', 'feed_leg', 'mark_connected', - 'cable', 'cable_color', 'link_peer', 'connection', 'tags', + 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'description', 'power_port', + 'feed_leg', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'power_port', 'feed_leg', 'description') @@ -459,8 +472,8 @@ class DevicePowerOutletTable(PowerOutletTable): class Meta(DeviceComponentTable.Meta): model = PowerOutlet fields = ( - 'pk', 'id', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', 'mark_connected', 'cable', - 'cable_color', 'link_peer', 'connection', 'tags', 'actions', + 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'type', 'power_port', 'feed_leg', 'description', + 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', 'cable', 'connection', 'actions', @@ -491,7 +504,7 @@ class BaseInterfaceTable(BaseTable): ) -class InterfaceTable(DeviceComponentTable, BaseInterfaceTable, PathEndpointTable): +class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpointTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_interfaces', @@ -514,10 +527,10 @@ class InterfaceTable(DeviceComponentTable, BaseInterfaceTable, PathEndpointTable class Meta(DeviceComponentTable.Meta): model = Interface fields = ( - 'pk', 'id', 'name', 'device', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', 'mode', 'mac_address', 'wwn', - 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', - 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', - 'tags', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', + 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', + 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', + 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', + 'link_peer', 'connection', 'tags', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', ) default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description') @@ -549,10 +562,11 @@ class DeviceInterfaceTable(InterfaceTable): class Meta(DeviceComponentTable.Meta): model = Interface fields = ( - 'pk', 'id', 'name', 'label', 'enabled', 'type', 'parent', 'bridge', 'lag', 'mgmt_only', 'mtu', 'mode', - 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', - 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', - 'connection', 'tags', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions', + 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'enabled', 'type', 'parent', 'bridge', 'lag', + 'mgmt_only', 'mtu', 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', + 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', + 'wireless_lans', 'link_peer', 'connection', 'tags', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', + 'tagged_vlans', 'actions', ) order_by = ('name',) default_columns = ( @@ -566,7 +580,7 @@ class DeviceInterfaceTable(InterfaceTable): } -class FrontPortTable(DeviceComponentTable, CableTerminationTable): +class FrontPortTable(ModularDeviceComponentTable, CableTerminationTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_frontports', @@ -587,8 +601,8 @@ class FrontPortTable(DeviceComponentTable, CableTerminationTable): class Meta(DeviceComponentTable.Meta): model = FrontPort fields = ( - 'pk', 'id', 'name', 'device', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', - 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', + 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'color', 'rear_port', + 'rear_port_position', 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', ) default_columns = ( 'pk', 'name', 'device', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', @@ -611,8 +625,8 @@ class DeviceFrontPortTable(FrontPortTable): class Meta(DeviceComponentTable.Meta): model = FrontPort fields = ( - 'pk', 'id', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'mark_connected', 'cable', - 'cable_color', 'link_peer', 'tags', 'actions', + 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'type', 'rear_port', 'rear_port_position', + 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'cable', 'link_peer', @@ -623,7 +637,7 @@ class DeviceFrontPortTable(FrontPortTable): } -class RearPortTable(DeviceComponentTable, CableTerminationTable): +class RearPortTable(ModularDeviceComponentTable, CableTerminationTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_rearports', @@ -638,8 +652,8 @@ class RearPortTable(DeviceComponentTable, CableTerminationTable): class Meta(DeviceComponentTable.Meta): model = RearPort fields = ( - 'pk', 'id', 'name', 'device', 'label', 'type', 'color', 'positions', 'description', 'mark_connected', 'cable', - 'cable_color', 'link_peer', 'tags', + 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'color', 'positions', 'description', + 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'color', 'description') @@ -660,8 +674,8 @@ class DeviceRearPortTable(RearPortTable): class Meta(DeviceComponentTable.Meta): model = RearPort fields = ( - 'pk', 'id', 'name', 'label', 'type', 'positions', 'description', 'mark_connected', 'cable', 'cable_color', - 'link_peer', 'tags', 'actions', + 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'type', 'positions', 'description', 'mark_connected', + 'cable', 'cable_color', 'link_peer', 'tags', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'type', 'positions', 'description', 'cable', 'link_peer', 'actions', From ed6a160372fbfd46602accd6b57278625656640d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 17 Dec 2021 20:31:15 -0500 Subject: [PATCH 022/271] Add modules to device component serializers --- netbox/dcim/api/nested_serializers.py | 24 ++++++++- netbox/dcim/api/serializers.py | 70 +++++++++++++++++++-------- netbox/dcim/api/views.py | 26 +++++++--- 3 files changed, 90 insertions(+), 30 deletions(-) diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 6ed7c63c681..9440e5d4b13 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -4,6 +4,7 @@ from dcim import models from netbox.api.serializers import BaseModelSerializer, WritableNestedSerializer __all__ = [ + 'ComponentNestedModuleSerializer', 'NestedCableSerializer', 'NestedConsolePortSerializer', 'NestedConsolePortTemplateSerializer', @@ -261,11 +262,30 @@ class NestedDeviceSerializer(WritableNestedSerializer): fields = ['id', 'url', 'display', 'name'] +class ModuleNestedModuleBaySerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') + + class Meta: + model = models.ModuleBay + fields = ['id', 'url', 'display', 'name'] + + +class ComponentNestedModuleSerializer(WritableNestedSerializer): + """ + Used by device component serializers. + """ + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') + module_bay = ModuleNestedModuleBaySerializer(read_only=True) + + class Meta: + model = models.Module + fields = ['id', 'url', 'display', 'device', 'module_bay'] + + class NestedModuleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') device = NestedDeviceSerializer(read_only=True) - # TODO: Solve circular dependency - # module_bay = NestedModuleBaySerializer(read_only=True) + module_bay = ModuleNestedModuleBaySerializer(read_only=True) module_type = NestedModuleTypeSerializer(read_only=True) class Meta: diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index b58355f324c..c81b26d1f18 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -558,6 +558,10 @@ class DeviceNAPALMSerializer(serializers.Serializer): class ConsoleServerPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') device = NestedDeviceSerializer() + module = ComponentNestedModuleSerializer( + required=False, + allow_null=True + ) type = ChoiceField( choices=ConsolePortTypeChoices, allow_blank=True, @@ -573,8 +577,8 @@ class ConsoleServerPortSerializer(PrimaryModelSerializer, LinkTerminationSeriali class Meta: model = ConsoleServerPort fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', - 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type', + 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', + 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -582,6 +586,10 @@ class ConsoleServerPortSerializer(PrimaryModelSerializer, LinkTerminationSeriali class ConsolePortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') device = NestedDeviceSerializer() + module = ComponentNestedModuleSerializer( + required=False, + allow_null=True + ) type = ChoiceField( choices=ConsolePortTypeChoices, allow_blank=True, @@ -597,8 +605,8 @@ class ConsolePortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, C class Meta: model = ConsolePort fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', - 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type', + 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', + 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -606,6 +614,10 @@ class ConsolePortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, C class PowerOutletSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') device = NestedDeviceSerializer() + module = ComponentNestedModuleSerializer( + required=False, + allow_null=True + ) type = ChoiceField( choices=PowerOutletTypeChoices, allow_blank=True, @@ -627,15 +639,20 @@ class PowerOutletSerializer(PrimaryModelSerializer, LinkTerminationSerializer, C class Meta: model = PowerOutlet fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', - 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type', - 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', + 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'power_port', 'feed_leg', + 'description', 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', + 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', + 'last_updated', '_occupied', ] class PowerPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') device = NestedDeviceSerializer() + module = ComponentNestedModuleSerializer( + required=False, + allow_null=True + ) type = ChoiceField( choices=PowerPortTypeChoices, allow_blank=True, @@ -646,15 +663,20 @@ class PowerPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con class Meta: model = PowerPort fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', - 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type', - 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', + 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', + 'description', 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', + 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', + 'last_updated', '_occupied', ] class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') device = NestedDeviceSerializer() + module = ComponentNestedModuleSerializer( + required=False, + allow_null=True + ) type = ChoiceField(choices=InterfaceTypeChoices) parent = NestedInterfaceSerializer(required=False, allow_null=True) bridge = NestedInterfaceSerializer(required=False, allow_null=True) @@ -683,12 +705,12 @@ class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con class Meta: model = Interface fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', 'mtu', - 'mac_address', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', - 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'wireless_link', - 'link_peer', 'link_peer_type', 'wireless_lans', 'connected_endpoint', 'connected_endpoint_type', - 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses', - 'count_fhrp_groups', '_occupied', + 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', + 'mtu', 'mac_address', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', + 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', + 'cable', 'wireless_link', 'link_peer', 'link_peer_type', 'wireless_lans', 'connected_endpoint', + 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', + 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied', ] def validate(self, data): @@ -708,13 +730,17 @@ class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con class RearPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') device = NestedDeviceSerializer() + module = ComponentNestedModuleSerializer( + required=False, + allow_null=True + ) type = ChoiceField(choices=PortTypeChoices) cable = NestedCableSerializer(read_only=True) class Meta: model = RearPort fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'color', 'positions', 'description', + 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'positions', 'description', 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -734,6 +760,10 @@ class FrontPortRearPortSerializer(WritableNestedSerializer): class FrontPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') device = NestedDeviceSerializer() + module = ComponentNestedModuleSerializer( + required=False, + allow_null=True + ) type = ChoiceField(choices=PortTypeChoices) rear_port = FrontPortRearPortSerializer() cable = NestedCableSerializer(read_only=True) @@ -741,9 +771,9 @@ class FrontPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer): class Meta: model = FrontPort fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', - 'description', 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'tags', 'custom_fields', - 'created', 'last_updated', '_occupied', + 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'rear_port', + 'rear_port_position', 'description', 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'tags', + 'custom_fields', 'created', 'last_updated', '_occupied', ] diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 378e697c82d..9d1be93d531 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -539,7 +539,9 @@ class ModuleViewSet(CustomFieldModelViewSet): # class ConsolePortViewSet(PathEndpointMixin, ModelViewSet): - queryset = ConsolePort.objects.prefetch_related('device', '_path__destination', 'cable', '_link_peer', 'tags') + queryset = ConsolePort.objects.prefetch_related( + 'device', 'module__module_bay', '_path__destination', 'cable', '_link_peer', 'tags' + ) serializer_class = serializers.ConsolePortSerializer filterset_class = filtersets.ConsolePortFilterSet brief_prefetch_fields = ['device'] @@ -547,7 +549,7 @@ class ConsolePortViewSet(PathEndpointMixin, ModelViewSet): class ConsoleServerPortViewSet(PathEndpointMixin, ModelViewSet): queryset = ConsoleServerPort.objects.prefetch_related( - 'device', '_path__destination', 'cable', '_link_peer', 'tags' + 'device', 'module__module_bay', '_path__destination', 'cable', '_link_peer', 'tags' ) serializer_class = serializers.ConsoleServerPortSerializer filterset_class = filtersets.ConsoleServerPortFilterSet @@ -555,14 +557,18 @@ class ConsoleServerPortViewSet(PathEndpointMixin, ModelViewSet): class PowerPortViewSet(PathEndpointMixin, ModelViewSet): - queryset = PowerPort.objects.prefetch_related('device', '_path__destination', 'cable', '_link_peer', 'tags') + queryset = PowerPort.objects.prefetch_related( + 'device', 'module__module_bay', '_path__destination', 'cable', '_link_peer', 'tags' + ) serializer_class = serializers.PowerPortSerializer filterset_class = filtersets.PowerPortFilterSet brief_prefetch_fields = ['device'] class PowerOutletViewSet(PathEndpointMixin, ModelViewSet): - queryset = PowerOutlet.objects.prefetch_related('device', '_path__destination', 'cable', '_link_peer', 'tags') + queryset = PowerOutlet.objects.prefetch_related( + 'device', 'module__module_bay', '_path__destination', 'cable', '_link_peer', 'tags' + ) serializer_class = serializers.PowerOutletSerializer filterset_class = filtersets.PowerOutletFilterSet brief_prefetch_fields = ['device'] @@ -570,8 +576,8 @@ class PowerOutletViewSet(PathEndpointMixin, ModelViewSet): class InterfaceViewSet(PathEndpointMixin, ModelViewSet): queryset = Interface.objects.prefetch_related( - 'device', 'parent', 'bridge', 'lag', '_path__destination', 'cable', '_link_peer', 'wireless_lans', - 'untagged_vlan', 'tagged_vlans', 'ip_addresses', 'fhrp_group_assignments', 'tags' + 'device', 'module__module_bay', 'parent', 'bridge', 'lag', '_path__destination', 'cable', '_link_peer', + 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'ip_addresses', 'fhrp_group_assignments', 'tags' ) serializer_class = serializers.InterfaceSerializer filterset_class = filtersets.InterfaceFilterSet @@ -579,14 +585,18 @@ class InterfaceViewSet(PathEndpointMixin, ModelViewSet): class FrontPortViewSet(PassThroughPortMixin, ModelViewSet): - queryset = FrontPort.objects.prefetch_related('device__device_type__manufacturer', 'rear_port', 'cable', 'tags') + queryset = FrontPort.objects.prefetch_related( + 'device__device_type__manufacturer', 'module__module_bay', 'rear_port', 'cable', 'tags' + ) serializer_class = serializers.FrontPortSerializer filterset_class = filtersets.FrontPortFilterSet brief_prefetch_fields = ['device'] class RearPortViewSet(PassThroughPortMixin, ModelViewSet): - queryset = RearPort.objects.prefetch_related('device__device_type__manufacturer', 'cable', 'tags') + queryset = RearPort.objects.prefetch_related( + 'device__device_type__manufacturer', 'module__module_bay', 'cable', 'tags' + ) serializer_class = serializers.RearPortSerializer filterset_class = filtersets.RearPortFilterSet brief_prefetch_fields = ['device'] From eaa1165611999bb5a44980622f9335c0da3cda93 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 20 Dec 2021 09:51:55 -0500 Subject: [PATCH 023/271] Add position field for module bays --- netbox/dcim/api/serializers.py | 9 ++++-- netbox/dcim/forms/bulk_edit.py | 4 +-- netbox/dcim/forms/bulk_import.py | 2 +- netbox/dcim/forms/filtersets.py | 5 +++- netbox/dcim/forms/models.py | 4 +-- netbox/dcim/forms/object_create.py | 24 +++++++++------- netbox/dcim/forms/object_import.py | 2 +- netbox/dcim/migrations/0145_modules.py | 2 ++ .../dcim/models/device_component_templates.py | 28 +++++++++++++------ netbox/dcim/models/device_components.py | 6 ++++ netbox/dcim/tables/devices.py | 2 +- netbox/dcim/tables/devicetypes.py | 2 +- netbox/templates/dcim/modulebay.html | 4 +++ netbox/templates/dcim/moduletype/base.html | 2 +- 14 files changed, 65 insertions(+), 31 deletions(-) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index c81b26d1f18..cf6c89333ab 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -432,7 +432,10 @@ class ModuleBayTemplateSerializer(ValidatedModelSerializer): class Meta: model = ModuleBayTemplate - fields = ['id', 'url', 'display', 'device_type', 'name', 'label', 'description', 'created', 'last_updated'] + fields = [ + 'id', 'url', 'display', 'device_type', 'name', 'label', 'position', 'description', 'created', + 'last_updated', + ] class DeviceBayTemplateSerializer(ValidatedModelSerializer): @@ -785,8 +788,8 @@ class ModuleBaySerializer(PrimaryModelSerializer): class Meta: model = ModuleBay fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', + 'id', 'url', 'display', 'device', 'name', 'label', 'position', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', ] diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 3786201800b..d40ac6fca1f 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -886,7 +886,7 @@ class ModuleBayTemplateBulkEditForm(BulkEditForm): ) class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'position', 'description') class DeviceBayTemplateBulkEditForm(BulkEditForm): @@ -1153,7 +1153,7 @@ class ModuleBayBulkEditForm( ) class Meta: - nullable_fields = ['label', 'description'] + nullable_fields = ['label', 'position', 'description'] class DeviceBayBulkEditForm( diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 8f5ba25b73a..23d589abf2b 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -717,7 +717,7 @@ class ModuleBayCSVForm(CustomFieldModelCSVForm): class Meta: model = ModuleBay - fields = ('device', 'name', 'label', 'description') + fields = ('device', 'name', 'label', 'position', 'description') class DeviceBayCSVForm(CustomFieldModelCSVForm): diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 29c09c7f7f9..819cb91cc93 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -1073,10 +1073,13 @@ class ModuleBayFilterForm(DeviceComponentFilterForm): model = ModuleBay field_groups = [ ['q', 'tag'], - ['name', 'label'], + ['name', 'label', 'position'], ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], ] tag = TagFilterField(model) + position = forms.CharField( + required=False + ) class DeviceBayFilterForm(DeviceComponentFilterForm): diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 672c54c68b4..2d32093c444 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1059,7 +1059,7 @@ class ModuleBayTemplateForm(BootstrapMixin, forms.ModelForm): class Meta: model = ModuleBayTemplate fields = [ - 'device_type', 'name', 'label', 'description', + 'device_type', 'name', 'label', 'position', 'description', ] widgets = { 'device_type': forms.HiddenInput(), @@ -1313,7 +1313,7 @@ class ModuleBayForm(CustomFieldModelForm): class Meta: model = ModuleBay fields = [ - 'device', 'name', 'label', 'description', 'tags', + 'device', 'name', 'label', 'position', 'description', 'tags', ] widgets = { 'device': forms.HiddenInput(), diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 1619f5424c6..681a17a5aa9 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -163,6 +163,12 @@ class ComponentTemplateCreateForm(ComponentForm): 'manufacturer_id': '$manufacturer' } ) + description = forms.CharField( + required=False + ) + + +class ModularComponentTemplateCreateForm(ComponentTemplateCreateForm): module_type = DynamicModelChoiceField( queryset=ModuleType.objects.all(), required=False, @@ -170,12 +176,9 @@ class ComponentTemplateCreateForm(ComponentForm): 'manufacturer_id': '$manufacturer' } ) - description = forms.CharField( - required=False - ) -class ConsolePortTemplateCreateForm(ComponentTemplateCreateForm): +class ConsolePortTemplateCreateForm(ModularComponentTemplateCreateForm): type = forms.ChoiceField( choices=add_blank_choice(ConsolePortTypeChoices), widget=StaticSelect() @@ -185,7 +188,7 @@ class ConsolePortTemplateCreateForm(ComponentTemplateCreateForm): ) -class ConsoleServerPortTemplateCreateForm(ComponentTemplateCreateForm): +class ConsoleServerPortTemplateCreateForm(ModularComponentTemplateCreateForm): type = forms.ChoiceField( choices=add_blank_choice(ConsolePortTypeChoices), widget=StaticSelect() @@ -195,7 +198,7 @@ class ConsoleServerPortTemplateCreateForm(ComponentTemplateCreateForm): ) -class PowerPortTemplateCreateForm(ComponentTemplateCreateForm): +class PowerPortTemplateCreateForm(ModularComponentTemplateCreateForm): type = forms.ChoiceField( choices=add_blank_choice(PowerPortTypeChoices), required=False @@ -216,7 +219,7 @@ class PowerPortTemplateCreateForm(ComponentTemplateCreateForm): ) -class PowerOutletTemplateCreateForm(ComponentTemplateCreateForm): +class PowerOutletTemplateCreateForm(ModularComponentTemplateCreateForm): type = forms.ChoiceField( choices=add_blank_choice(PowerOutletTypeChoices), required=False @@ -240,7 +243,7 @@ class PowerOutletTemplateCreateForm(ComponentTemplateCreateForm): ) -class InterfaceTemplateCreateForm(ComponentTemplateCreateForm): +class InterfaceTemplateCreateForm(ModularComponentTemplateCreateForm): type = forms.ChoiceField( choices=InterfaceTypeChoices, widget=StaticSelect() @@ -255,7 +258,7 @@ class InterfaceTemplateCreateForm(ComponentTemplateCreateForm): ) -class FrontPortTemplateCreateForm(ComponentTemplateCreateForm): +class FrontPortTemplateCreateForm(ModularComponentTemplateCreateForm): type = forms.ChoiceField( choices=PortTypeChoices, widget=StaticSelect() @@ -320,7 +323,7 @@ class FrontPortTemplateCreateForm(ComponentTemplateCreateForm): } -class RearPortTemplateCreateForm(ComponentTemplateCreateForm): +class RearPortTemplateCreateForm(ModularComponentTemplateCreateForm): type = forms.ChoiceField( choices=PortTypeChoices, widget=StaticSelect(), @@ -341,6 +344,7 @@ class RearPortTemplateCreateForm(ComponentTemplateCreateForm): class ModuleBayTemplateCreateForm(ComponentTemplateCreateForm): + # TODO: Support patterned position assignment field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'description') diff --git a/netbox/dcim/forms/object_import.py b/netbox/dcim/forms/object_import.py index cc0c7dc417d..36c6ae8bc8e 100644 --- a/netbox/dcim/forms/object_import.py +++ b/netbox/dcim/forms/object_import.py @@ -155,7 +155,7 @@ class ModuleBayTemplateImportForm(ComponentTemplateImportForm): class Meta: model = ModuleBayTemplate fields = [ - 'device_type', 'name', 'label', 'description', + 'device_type', 'name', 'label', 'position', 'description', ] diff --git a/netbox/dcim/migrations/0145_modules.py b/netbox/dcim/migrations/0145_modules.py index c9a3328462b..1f99c7c0448 100644 --- a/netbox/dcim/migrations/0145_modules.py +++ b/netbox/dcim/migrations/0145_modules.py @@ -105,6 +105,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=64)), ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)), ('label', models.CharField(blank=True, max_length=64)), + ('position', models.CharField(blank=True, max_length=30)), ('description', models.CharField(blank=True, max_length=200)), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modulebays', to='dcim.device')), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), @@ -241,6 +242,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=64)), ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)), ('label', models.CharField(blank=True, max_length=64)), + ('position', models.CharField(blank=True, max_length=30)), ('description', models.CharField(blank=True, max_length=200)), ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modulebaytemplates', to='dcim.devicetype')), ], diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index a22118de01f..71fed25c582 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -123,6 +123,11 @@ class ModularComponentTemplateModel(ComponentTemplateModel): "A component template must be associated with either a device type or a module type." ) + def resolve_name(self, module): + if module: + return self.name.replace('{module}', module.module_bay.position) + return self.name + @extras_features('webhooks') class ConsolePortTemplate(ModularComponentTemplateModel): @@ -144,7 +149,7 @@ class ConsolePortTemplate(ModularComponentTemplateModel): def instantiate(self, **kwargs): return ConsolePort( - name=self.name, + name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, **kwargs @@ -171,7 +176,7 @@ class ConsoleServerPortTemplate(ModularComponentTemplateModel): def instantiate(self, **kwargs): return ConsoleServerPort( - name=self.name, + name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, **kwargs @@ -210,7 +215,7 @@ class PowerPortTemplate(ModularComponentTemplateModel): def instantiate(self, **kwargs): return PowerPort( - name=self.name, + name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, maximum_draw=self.maximum_draw, @@ -279,7 +284,7 @@ class PowerOutletTemplate(ModularComponentTemplateModel): else: power_port = None return PowerOutlet( - name=self.name, + name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, power_port=power_port, @@ -318,7 +323,7 @@ class InterfaceTemplate(ModularComponentTemplateModel): def instantiate(self, **kwargs): return Interface( - name=self.name, + name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, mgmt_only=self.mgmt_only, @@ -387,7 +392,7 @@ class FrontPortTemplate(ModularComponentTemplateModel): else: rear_port = None return FrontPort( - name=self.name, + name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, color=self.color, @@ -426,7 +431,7 @@ class RearPortTemplate(ModularComponentTemplateModel): def instantiate(self, **kwargs): return RearPort( - name=self.name, + name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, color=self.color, @@ -440,6 +445,12 @@ class ModuleBayTemplate(ComponentTemplateModel): """ A template for a ModuleBay to be created for a new parent Device. """ + position = models.CharField( + max_length=30, + blank=True, + help_text='Identifier to reference when renaming installed components' + ) + class Meta: ordering = ('device_type', '_name') unique_together = ('device_type', 'name') @@ -448,7 +459,8 @@ class ModuleBayTemplate(ComponentTemplateModel): return ModuleBay( device=device, name=self.name, - label=self.label + label=self.label, + position=self.position ) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index fc80b29c983..ccfe538d707 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -880,6 +880,12 @@ class ModuleBay(ComponentModel): """ An empty space within a Device which can house a child device """ + position = models.CharField( + max_length=30, + blank=True, + help_text='Identifier to reference when renaming installed components' + ) + clone_fields = ['device'] class Meta: diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 08f229d33f6..7805e60c15b 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -749,7 +749,7 @@ class ModuleBayTable(DeviceComponentTable): class Meta(DeviceComponentTable.Meta): model = ModuleBay - fields = ('pk', 'id', 'name', 'device', 'label', 'installed_module', 'description', 'tags') + fields = ('pk', 'id', 'name', 'device', 'label', 'position', 'installed_module', 'description', 'tags') default_columns = ('pk', 'name', 'device', 'label', 'installed_module', 'description') diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 6fc03854217..38a33c652b6 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -217,7 +217,7 @@ class ModuleBayTemplateTable(ComponentTemplateTable): class Meta(ComponentTemplateTable.Meta): model = ModuleBayTemplate - fields = ('pk', 'name', 'label', 'description', 'actions') + fields = ('pk', 'name', 'label', 'position', 'description', 'actions') empty_text = "None" diff --git a/netbox/templates/dcim/modulebay.html b/netbox/templates/dcim/modulebay.html index 0f903483a8c..9f04ba22509 100644 --- a/netbox/templates/dcim/modulebay.html +++ b/netbox/templates/dcim/modulebay.html @@ -23,6 +23,10 @@ Label {{ object.label|placeholder }} + + Position + {{ object.position|placeholder }} + Description {{ object.description|placeholder }} diff --git a/netbox/templates/dcim/moduletype/base.html b/netbox/templates/dcim/moduletype/base.html index 563e23a7b03..2d0bca7d805 100644 --- a/netbox/templates/dcim/moduletype/base.html +++ b/netbox/templates/dcim/moduletype/base.html @@ -45,7 +45,7 @@ {% block tab_items %} From e35aa4bd1e479690a3ca23ec40d7ee897eaeee8a Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 20 Dec 2021 10:31:18 -0500 Subject: [PATCH 024/271] Add documentation for modules --- docs/core-functionality/device-types.md | 1 + docs/core-functionality/devices.md | 1 + docs/core-functionality/modules.md | 4 ++++ docs/models/dcim/devicebay.md | 2 +- docs/models/dcim/devicebaytemplate.md | 2 +- docs/models/dcim/module.md | 5 +++++ docs/models/dcim/modulebay.md | 3 +++ docs/models/dcim/modulebaytemplate.md | 3 +++ docs/models/dcim/moduletype.md | 23 +++++++++++++++++++++++ mkdocs.yml | 1 + 10 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 docs/core-functionality/modules.md create mode 100644 docs/models/dcim/module.md create mode 100644 docs/models/dcim/modulebay.md create mode 100644 docs/models/dcim/modulebaytemplate.md create mode 100644 docs/models/dcim/moduletype.md diff --git a/docs/core-functionality/device-types.md b/docs/core-functionality/device-types.md index 037d3cfd03b..ec5cbacdb10 100644 --- a/docs/core-functionality/device-types.md +++ b/docs/core-functionality/device-types.md @@ -37,4 +37,5 @@ Once component templates have been created, every new device that you create as {!models/dcim/interfacetemplate.md!} {!models/dcim/frontporttemplate.md!} {!models/dcim/rearporttemplate.md!} +{!models/dcim/modulebaytemplate.md!} {!models/dcim/devicebaytemplate.md!} diff --git a/docs/core-functionality/devices.md b/docs/core-functionality/devices.md index 982ee307115..35c9782102c 100644 --- a/docs/core-functionality/devices.md +++ b/docs/core-functionality/devices.md @@ -17,6 +17,7 @@ Device components represent discrete objects within a device which are used to t {!models/dcim/interface.md!} {!models/dcim/frontport.md!} {!models/dcim/rearport.md!} +{!models/dcim/modulebay.md!} {!models/dcim/devicebay.md!} {!models/dcim/inventoryitem.md!} diff --git a/docs/core-functionality/modules.md b/docs/core-functionality/modules.md new file mode 100644 index 00000000000..4d32fe18cd8 --- /dev/null +++ b/docs/core-functionality/modules.md @@ -0,0 +1,4 @@ +# Modules + +{!models/dcim/moduletype.md!} +{!models/dcim/module.md!} diff --git a/docs/models/dcim/devicebay.md b/docs/models/dcim/devicebay.md index 2aea14a7a48..e79c426dc28 100644 --- a/docs/models/dcim/devicebay.md +++ b/docs/models/dcim/devicebay.md @@ -5,4 +5,4 @@ Device bays represent a space or slot within a parent device in which a child de Child devices are first-class Devices in their own right: That is, they are fully independent managed entities which don't share any control plane with the parent. Just like normal devices, child devices have their own platform (OS), role, tags, and components. LAG interfaces may not group interfaces belonging to different child devices. !!! note - Device bays are **not** suitable for modeling line cards (such as those commonly found in chassis-based routers and switches), as these components depend on the control plane of the parent device to operate. Instead, line cards and similarly non-autonomous hardware should be modeled as inventory items within a device, with any associated interfaces or other components assigned directly to the device. + Device bays are **not** suitable for modeling line cards (such as those commonly found in chassis-based routers and switches), as these components depend on the control plane of the parent device to operate. Instead, these should be modeled as modules installed within module bays. diff --git a/docs/models/dcim/devicebaytemplate.md b/docs/models/dcim/devicebaytemplate.md index ebf7bd63cfe..a4c50067a18 100644 --- a/docs/models/dcim/devicebaytemplate.md +++ b/docs/models/dcim/devicebaytemplate.md @@ -1,3 +1,3 @@ ## Device Bay Templates -A template for a device bay that will be created on all instantiations of the parent device type. +A template for a device bay that will be created on all instantiations of the parent device type. Device bays hold child devices, such as blade servers. diff --git a/docs/models/dcim/module.md b/docs/models/dcim/module.md new file mode 100644 index 00000000000..bc9753ecc3f --- /dev/null +++ b/docs/models/dcim/module.md @@ -0,0 +1,5 @@ +# Modules + +A module is a field-replaceable hardware component installed within a device which houses its own child components. The most common example is a chassis-based router or switch. + +Similar to devices, modules are instantiated from module types, and any components associated with the module type are automatically instantiated on the new model. Each module must be installed within a module bay on a device, and each module bay may have only one module installed in it. A module may optionally be assigned a serial number and asset tag. diff --git a/docs/models/dcim/modulebay.md b/docs/models/dcim/modulebay.md new file mode 100644 index 00000000000..6c6f94598f4 --- /dev/null +++ b/docs/models/dcim/modulebay.md @@ -0,0 +1,3 @@ +## Module Bays + +Module bays represent a space or slot within a device in which a field-replaceable module 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. diff --git a/docs/models/dcim/modulebaytemplate.md b/docs/models/dcim/modulebaytemplate.md new file mode 100644 index 00000000000..46378930574 --- /dev/null +++ b/docs/models/dcim/modulebaytemplate.md @@ -0,0 +1,3 @@ +## Module Bay Templates + +A template for a module bay that will be created on all instantiations of the parent device type. Module bays hold installed modules that do not have an independent management plane, such as line cards. diff --git a/docs/models/dcim/moduletype.md b/docs/models/dcim/moduletype.md new file mode 100644 index 00000000000..c1c8c507911 --- /dev/null +++ b/docs/models/dcim/moduletype.md @@ -0,0 +1,23 @@ +# Module Types + +A module type represent a specific make and model of hardware component which is installable within a device and has its own child components. For example, consider a chassis-based switch or router with a number of field-replaceable line cards. Each line card has its own model number and includes a certain set of components such as interfaces. Each module type may have a manufacturer, model number, and part number assigned to it. + +Similar to device types, each module type can have any of the following component templates associated with it: + +* Interfaces +* Console ports +* Console server ports +* Power ports +* Power Outlets +* Front pass-through ports +* Rear pass-through ports + +Note that device bays and module bays may _not_ be added to modules. + +## Automatic Component Renaming + +When adding component templates to a module type, the string `{module}` can be used to reference the `position` field of the module bay into which an instance of the module type is being installed. + +For example, you can create a module type with interface templates named `Gi{module}/0/[1-48]`. When a new module of this type is "installed" to a module bay with a position of "3", NetBox will automatically name these interfaces `Gi3/0/[1-48]`. + +Automatic renaming is supported for all modular component types (those listed above). diff --git a/mkdocs.yml b/mkdocs.yml index 3fb838ffd01..f89bdaea7a3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -59,6 +59,7 @@ nav: - Sites and Racks: 'core-functionality/sites-and-racks.md' - Devices and Cabling: 'core-functionality/devices.md' - Device Types: 'core-functionality/device-types.md' + - Modules: 'core-functionality/modules.md' - Virtualization: 'core-functionality/virtualization.md' - Service Mapping: 'core-functionality/services.md' - Circuits: 'core-functionality/circuits.md' From ae55ca7fd74782f1a7b0804d4e2d72b148769991 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 20 Dec 2021 11:02:56 -0500 Subject: [PATCH 025/271] Changelog for #7844 --- docs/release-notes/version-3.2.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index cce60b581b6..ad8c4697a29 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -14,6 +14,12 @@ ### New Features +#### Modules & Module Types ([#7844](https://github.com/netbox-community/netbox/issues/7844)) + +Several new models have been added to support field-replaceable device modules, such as those within a chassis-based switch or router. Similar to devices, each module is instantiated from a user-defined module type, and can have components associated with it. These components become available to the parent device once the module has been installed within a module bay. This makes it very convenient to replicate the addition and deletion of device components as modules are installed and removed. + +Automatic renaming of module components is also supported. When a new module is created, any occurrence of the string `{module}` in a component name will be replaced with the position of the module bay into which the module is being installed. + #### Custom Status Choices ([#8054](https://github.com/netbox-community/netbox/issues/8054)) Custom choices can be now added to most status fields in NetBox. This is done by defining the `FIELD_CHOICES` configuration parameter to map field identifiers to an iterable of custom choices. These choices are populated automatically when NetBox initializes. For example, the following will add three custom choices for the site status field: From 70f257b1ea64aae4d6e5868d2eb3d2e7c3889420 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 21 Dec 2021 16:29:01 -0500 Subject: [PATCH 026/271] Introduce UserConfigForm for managing user preferences --- netbox/project-static/dist/netbox.js | 14 ++-- netbox/project-static/dist/netbox.js.map | 4 +- netbox/project-static/src/buttons/index.ts | 2 - .../project-static/src/buttons/preferences.ts | 30 --------- netbox/templates/users/preferences.html | 60 +++++------------ netbox/users/forms.py | 66 ++++++++++++++++++- netbox/users/views.py | 30 ++++----- netbox/utilities/utils.py | 2 +- 8 files changed, 103 insertions(+), 105 deletions(-) delete mode 100644 netbox/project-static/src/buttons/preferences.ts diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 95fd99270f6..740fbe7e788 100644 --- a/netbox/project-static/dist/netbox.js +++ b/netbox/project-static/dist/netbox.js @@ -1,12 +1,12 @@ -(()=>{var a_=Object.create;var as=Object.defineProperty,l_=Object.defineProperties,c_=Object.getOwnPropertyDescriptor,u_=Object.getOwnPropertyDescriptors,f_=Object.getOwnPropertyNames,Qf=Object.getOwnPropertySymbols,d_=Object.getPrototypeOf,Zf=Object.prototype.hasOwnProperty,h_=Object.prototype.propertyIsEnumerable;var Xl=(tn,en,nn)=>en in tn?as(tn,en,{enumerable:!0,configurable:!0,writable:!0,value:nn}):tn[en]=nn,Jn=(tn,en)=>{for(var nn in en||(en={}))Zf.call(en,nn)&&Xl(tn,nn,en[nn]);if(Qf)for(var nn of Qf(en))h_.call(en,nn)&&Xl(tn,nn,en[nn]);return tn},la=(tn,en)=>l_(tn,u_(en)),ed=tn=>as(tn,"__esModule",{value:!0});var Cn=(tn,en)=>()=>(en||tn((en={exports:{}}).exports,en),en.exports),p_=(tn,en)=>{ed(tn);for(var nn in en)as(tn,nn,{get:en[nn],enumerable:!0})},m_=(tn,en,nn)=>{if(en&&typeof en=="object"||typeof en=="function")for(let rn of f_(en))!Zf.call(tn,rn)&&rn!=="default"&&as(tn,rn,{get:()=>en[rn],enumerable:!(nn=c_(en,rn))||nn.enumerable});return tn},Rr=tn=>m_(ed(as(tn!=null?a_(d_(tn)):{},"default",tn&&tn.__esModule&&"default"in tn?{get:()=>tn.default,enumerable:!0}:{value:tn,enumerable:!0})),tn);var ar=(tn,en,nn)=>(Xl(tn,typeof en!="symbol"?en+"":en,nn),nn);var Fr=(tn,en,nn)=>new Promise((rn,on)=>{var an=dn=>{try{cn(nn.next(dn))}catch(fn){on(fn)}},ln=dn=>{try{cn(nn.throw(dn))}catch(fn){on(fn)}},cn=dn=>dn.done?rn(dn.value):Promise.resolve(dn.value).then(an,ln);cn((nn=nn.apply(tn,en)).next())});var Nh=Cn((exports,module)=>{(function(tn,en){typeof define=="function"&&define.amd?define([],en):tn.htmx=en()})(typeof self!="undefined"?self:exports,function(){return function(){"use strict";var D={onLoad:t,process:rt,on:N,off:I,trigger:lt,ajax:$t,find:w,findAll:S,closest:O,values:function(tn,en){var nn=Ot(tn,en||"post");return nn.values},remove:E,addClass:C,removeClass:R,toggleClass:q,takeClass:L,defineExtension:Qt,removeExtension:er,logAll:b,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,attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:!1,scrollBehavior:"smooth"},parseInterval:h,_:e,createEventSource:function(tn){return new EventSource(tn,{withCredentials:!0})},createWebSocket:function(tn){return new WebSocket(tn,[])},version:"1.6.1"},r=["get","post","put","delete","patch"],n=r.map(function(tn){return"[hx-"+tn+"], [data-hx-"+tn+"]"}).join(", ");function h(tn){if(tn!=null)return tn.slice(-2)=="ms"?parseFloat(tn.slice(0,-2))||void 0:tn.slice(-1)=="s"?parseFloat(tn.slice(0,-1))*1e3||void 0:parseFloat(tn)||void 0}function c(tn,en){return tn.getAttribute&&tn.getAttribute(en)}function s(tn,en){return tn.hasAttribute&&(tn.hasAttribute(en)||tn.hasAttribute("data-"+en))}function F(tn,en){return c(tn,en)||c(tn,"data-"+en)}function l(tn){return tn.parentElement}function P(){return document}function d(tn,en){return en(tn)?tn:l(tn)?d(l(tn),en):null}function X(tn,en){var nn=null;if(d(tn,function(rn){return nn=F(rn,en)}),nn!=="unset")return nn}function v(tn,en){var nn=tn.matches||tn.matchesSelector||tn.msMatchesSelector||tn.mozMatchesSelector||tn.webkitMatchesSelector||tn.oMatchesSelector;return nn&&nn.call(tn,en)}function i(tn){var en=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,nn=en.exec(tn);return nn?nn[1].toLowerCase():""}function o(tn,en){for(var nn=new DOMParser,rn=nn.parseFromString(tn,"text/html"),on=rn.body;en>0;)en--,on=on.firstChild;return on==null&&(on=P().createDocumentFragment()),on}function u(tn){if(D.config.useTemplateFragments){var en=o("",0);return en.querySelector("template").content}else{var nn=i(tn);switch(nn){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return o(""+tn+"
    ",1);case"col":return o(""+tn+"
    ",2);case"tr":return o(""+tn+"
    ",2);case"td":case"th":return o(""+tn+"
    ",3);case"script":return o("
    "+tn+"
    ",1);default:return o(tn,0)}}}function U(tn){tn&&tn()}function a(tn,en){return Object.prototype.toString.call(tn)==="[object "+en+"]"}function f(tn){return a(tn,"Function")}function g(tn){return a(tn,"Object")}function j(tn){var en="htmx-internal-data",nn=tn[en];return nn||(nn=tn[en]={}),nn}function p(tn){var en=[];if(tn)for(var nn=0;nn=0}function z(tn){return P().body.contains(tn)}function y(tn){return tn.trim().split(/\s+/)}function V(tn,en){for(var nn in en)en.hasOwnProperty(nn)&&(tn[nn]=en[nn]);return tn}function x(tn){try{return JSON.parse(tn)}catch(en){return ut(en),null}}function e(e){return Ut(P().body,function(){return eval(e)})}function t(tn){var en=D.on("htmx:load",function(nn){tn(nn.detail.elt)});return en}function b(){D.logger=function(tn,en,nn){console&&console.log(en,tn,nn)}}function w(tn,en){return en?tn.querySelector(en):w(P(),tn)}function S(tn,en){return en?tn.querySelectorAll(en):S(P(),tn)}function E(tn,en){tn=H(tn),en?setTimeout(function(){E(tn)},en):tn.parentElement.removeChild(tn)}function C(tn,en,nn){tn=H(tn),nn?setTimeout(function(){C(tn,en)},nn):tn.classList&&tn.classList.add(en)}function R(tn,en,nn){tn=H(tn),nn?setTimeout(function(){R(tn,en)},nn):tn.classList&&(tn.classList.remove(en),tn.classList.length===0&&tn.removeAttribute("class"))}function q(tn,en){tn=H(tn),tn.classList.toggle(en)}function L(tn,en){tn=H(tn),B(tn.parentElement.children,function(nn){R(nn,en)}),C(tn,en)}function O(tn,en){if(tn=H(tn),tn.closest)return tn.closest(en);do if(tn==null||v(tn,en))return tn;while(tn=tn&&l(tn))}function T(tn,en){return en.indexOf("closest ")===0?[O(tn,en.substr(8))]:en.indexOf("find ")===0?[w(tn,en.substr(5))]:en==="document"?[document]:en==="window"?[window]:P().querySelectorAll(en)}function A(tn,en){return en?T(tn,en)[0]:T(P().body,tn)[0]}function H(tn){return a(tn,"String")?w(tn):tn}function k(tn,en,nn){return f(en)?{target:P().body,event:tn,listener:en}:{target:H(tn),event:en,listener:nn}}function N(tn,en,nn){rr(function(){var on=k(tn,en,nn);on.target.addEventListener(on.event,on.listener)});var rn=f(en);return rn?en:nn}function I(tn,en,nn){return rr(function(){var rn=k(tn,en,nn);rn.target.removeEventListener(rn.event,rn.listener)}),f(en)?en:nn}function _(tn){var en=d(tn,function(on){return F(on,"hx-target")!==null});if(en){var nn=F(en,"hx-target");return nn==="this"?en:A(tn,nn)}else{var rn=j(tn);return rn.boosted?P().body:tn}}function M(tn){for(var en=D.config.attributesToSettle,nn=0;nn0?(on=tn.substr(0,tn.indexOf(":")),rn=tn.substr(tn.indexOf(":")+1,tn.length)):on=tn);var an=P().querySelector(rn);if(an){var ln;ln=P().createDocumentFragment(),ln.appendChild(en),$(on,an)||(ln=en),le(on,an,an,ln,nn)}else en.parentNode.removeChild(en),ot(P().body,"htmx:oobErrorNoTarget",{content:en});return tn}function Z(tn,en){B(S(tn,"[hx-swap-oob], [data-hx-swap-oob]"),function(nn){var rn=F(nn,"hx-swap-oob");rn!=null&&J(rn,nn,en)})}function G(tn){B(S(tn,"[hx-preserve], [data-hx-preserve]"),function(en){var nn=F(en,"id"),rn=P().getElementById(nn);rn!=null&&en.parentNode.replaceChild(rn,en)})}function K(tn,en,nn){B(en.querySelectorAll("[id]"),function(rn){if(rn.id&&rn.id.length>0){var on=tn.querySelector(rn.tagName+"[id='"+rn.id+"']");if(on&&on!==tn){var an=rn.cloneNode();W(rn,on),nn.tasks.push(function(){W(rn,an)})}}})}function Y(tn){return function(){R(tn,D.config.addedClass),rt(tn),Ke(tn),Q(tn),lt(tn,"htmx:load")}}function Q(tn){var en="[autofocus]",nn=v(tn,en)?tn:tn.querySelector(en);nn!=null&&nn.focus()}function ee(tn,en,nn,rn){for(K(tn,nn,rn);nn.childNodes.length>0;){var on=nn.firstChild;C(on,D.config.addedClass),tn.insertBefore(on,en),on.nodeType!==Node.TEXT_NODE&&on.nodeType!==Node.COMMENT_NODE&&rn.tasks.push(Y(on))}}function te(tn){var en=j(tn);en.webSocket&&en.webSocket.close(),en.sseEventSource&&en.sseEventSource.close(),en.listenerInfos&&B(en.listenerInfos,function(nn){tn!==nn.on&&nn.on.removeEventListener(nn.trigger,nn.listener)}),tn.children&&B(tn.children,function(nn){te(nn)})}function re(tn,en,nn){if(tn.tagName==="BODY")return se(tn,en,nn);var rn=tn.previousSibling;if(ee(l(tn),tn,en,nn),rn==null)var on=l(tn).firstChild;else var on=rn.nextSibling;for(j(tn).replacedWith=on,nn.elts=[];on&&on!==tn;)on.nodeType===Node.ELEMENT_NODE&&nn.elts.push(on),on=on.nextElementSibling;te(tn),l(tn).removeChild(tn)}function ne(tn,en,nn){return ee(tn,tn.firstChild,en,nn)}function ie(tn,en,nn){return ee(l(tn),tn,en,nn)}function oe(tn,en,nn){return ee(tn,null,en,nn)}function ae(tn,en,nn){return ee(l(tn),tn.nextSibling,en,nn)}function se(tn,en,nn){var rn=tn.firstChild;if(ee(tn,rn,en,nn),rn){for(;rn.nextSibling;)te(rn.nextSibling),tn.removeChild(rn.nextSibling);te(rn),tn.removeChild(rn)}}function ue(tn,en){var nn=X(tn,"hx-select");if(nn){var rn=P().createDocumentFragment();B(en.querySelectorAll(nn),function(on){rn.appendChild(on)}),en=rn}return en}function le(tn,en,nn,rn,on){switch(tn){case"none":return;case"outerHTML":re(nn,rn,on);return;case"afterbegin":ne(nn,rn,on);return;case"beforebegin":ie(nn,rn,on);return;case"beforeend":oe(nn,rn,on);return;case"afterend":ae(nn,rn,on);return;default:for(var an=tr(en),ln=0;ln-1){var en=tn.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),nn=en.match(/]*>|>)([\s\S]*?)<\/title>/im);if(nn)return nn[2]}}function ce(tn,en,nn,rn,on){var an=fe(rn);if(an){var ln=w("title");ln?ln.innerHTML=an:window.document.title=an}var cn=u(rn);if(cn)return Z(cn,on),cn=ue(nn,cn),G(cn),le(tn,nn,en,cn,on)}function he(tn,en,nn){var rn=tn.getResponseHeader(en);if(rn.indexOf("{")===0){var on=x(rn);for(var an in on)if(on.hasOwnProperty(an)){var ln=on[an];g(ln)||(ln={value:ln}),lt(nn,an,ln)}}else lt(nn,rn,[])}var de=/\s/,ve=/[\s,]/,ge=/[_$a-zA-Z]/,pe=/[_$a-zA-Z0-9]/,me=['"',"'","/"],ye=/[^\s]/;function xe(tn){for(var en=[],nn=0;nn0;){var ln=en[0];if(ln==="]"){if(rn--,rn===0){an===null&&(on=on+"true"),en.shift(),on+=")})";try{var cn=Ut(tn,function(){return Function(on)()},function(){return!0});return cn.source=on,cn}catch(dn){return ot(P().body,"htmx:syntax:error",{error:dn,source:on}),null}}}else ln==="["&&rn++;be(ln,an,nn)?on+="(("+nn+"."+ln+") ? ("+nn+"."+ln+") : (window."+ln+"))":on=on+ln,an=en.shift()}}}function Se(tn,en){for(var nn="";tn.length>0&&!tn[0].match(en);)nn+=tn.shift();return nn}var Ee="input, textarea, select";function Ce(tn){var en=F(tn,"hx-trigger"),nn=[];if(en){var rn=xe(en);do{Se(rn,ye);var on=rn.length,an=Se(rn,/[,\[\s]/);if(an!=="")if(an==="every"){var ln={trigger:"every"};Se(rn,ye),ln.pollInterval=h(Se(rn,/[,\[\s]/)),Se(rn,ye);var cn=we(tn,rn,"event");cn&&(ln.eventFilter=cn),nn.push(ln)}else if(an.indexOf("sse:")===0)nn.push({trigger:"sse",sseEvent:an.substr(4)});else{var dn={trigger:an},cn=we(tn,rn,"event");for(cn&&(dn.eventFilter=cn);rn.length>0&&rn[0]!==",";){Se(rn,ye);var fn=rn.shift();if(fn==="changed")dn.changed=!0;else if(fn==="once")dn.once=!0;else if(fn==="consume")dn.consume=!0;else if(fn==="delay"&&rn[0]===":")rn.shift(),dn.delay=h(Se(rn,ve));else if(fn==="from"&&rn[0]===":"){rn.shift();let gn=Se(rn,ve);(gn==="closest"||gn==="find")&&(rn.shift(),gn+=" "+Se(rn,ve)),dn.from=gn}else fn==="target"&&rn[0]===":"?(rn.shift(),dn.target=Se(rn,ve)):fn==="throttle"&&rn[0]===":"?(rn.shift(),dn.throttle=h(Se(rn,ve))):fn==="queue"&&rn[0]===":"?(rn.shift(),dn.queue=Se(rn,ve)):(fn==="root"||fn==="threshold")&&rn[0]===":"?(rn.shift(),dn[fn]=Se(rn,ve)):ot(tn,"htmx:syntax:error",{token:rn.shift()})}nn.push(dn)}rn.length===on&&ot(tn,"htmx:syntax:error",{token:rn.shift()}),Se(rn,ye)}while(rn[0]===","&&rn.shift())}return nn.length>0?nn:v(tn,"form")?[{trigger:"submit"}]:v(tn,Ee)?[{trigger:"change"}]:[{trigger:"click"}]}function Re(tn){j(tn).cancelled=!0}function qe(tn,en,nn,rn){var on=j(tn);on.timeout=setTimeout(function(){z(tn)&&on.cancelled!==!0&&(He(rn,it("hx:poll:trigger",{triggerSpec:rn}))||Zt(en,nn,tn),qe(tn,en,F(tn,"hx-"+en),rn))},rn.pollInterval)}function Le(tn){return location.hostname===tn.hostname&&c(tn,"href")&&c(tn,"href").indexOf("#")!==0}function Oe(tn,en,nn){if(tn.tagName==="A"&&Le(tn)&&tn.target===""||tn.tagName==="FORM"){en.boosted=!0;var rn,on;if(tn.tagName==="A")rn="get",on=c(tn,"href"),en.pushURL=!0;else{var an=c(tn,"method");rn=an?an.toLowerCase():"get",rn==="get"&&(en.pushURL=!0),on=c(tn,"action")}nn.forEach(function(ln){ke(tn,rn,on,en,ln,!0)})}}function Te(tn,en){return!!((tn.type==="submit"||tn.type==="click")&&(en.tagName==="FORM"||v(en,'input[type="submit"], button')&&O(en,"form")!==null||en.tagName==="A"&&en.href&&(en.getAttribute("href")==="#"||en.getAttribute("href").indexOf("#")!==0)))}function Ae(tn,en){return j(tn).boosted&&tn.tagName==="A"&&en.type==="click"&&(en.ctrlKey||en.metaKey)}function He(tn,en){var nn=tn.eventFilter;if(nn)try{return nn(en)!==!0}catch(rn){return ot(P().body,"htmx:eventFilter:error",{error:rn,source:nn.source}),!0}return!1}function ke(tn,en,nn,rn,on,an){var ln;on.from?ln=T(tn,on.from):ln=[tn],B(ln,function(cn){var dn=function(fn){if(!z(tn)){cn.removeEventListener(on.trigger,dn);return}if(!Ae(tn,fn)&&((an||Te(fn,tn))&&fn.preventDefault(),!He(on,fn))){var un=j(fn);un.triggerSpec=on,un.handledFor==null&&(un.handledFor=[]);var gn=j(tn);if(un.handledFor.indexOf(tn)<0){if(un.handledFor.push(tn),on.consume&&fn.stopPropagation(),on.target&&fn.target&&!v(fn.target,on.target))return;if(on.once){if(gn.triggeredOnce)return;gn.triggeredOnce=!0}if(on.changed){if(gn.lastValue===tn.value)return;gn.lastValue=tn.value}if(gn.delayed&&clearTimeout(gn.delayed),gn.throttle)return;on.throttle?gn.throttle||(Zt(en,nn,tn,fn),gn.throttle=setTimeout(function(){gn.throttle=null},on.throttle)):on.delay?gn.delayed=setTimeout(function(){Zt(en,nn,tn,fn)},on.delay):Zt(en,nn,tn,fn)}}};rn.listenerInfos==null&&(rn.listenerInfos=[]),rn.listenerInfos.push({trigger:on.trigger,listener:dn,on:cn}),cn.addEventListener(on.trigger,dn)})}var Ne=!1,Ie=null;function Me(){Ie||(Ie=function(){Ne=!0},window.addEventListener("scroll",Ie),setInterval(function(){Ne&&(Ne=!1,B(P().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(tn){De(tn)}))},200))}function De(tn){if(!s(tn,"data-hx-revealed")&&m(tn)){tn.setAttribute("data-hx-revealed","true");var en=j(tn);en.initialized?Zt(en.verb,en.path,tn):tn.addEventListener("htmx:afterProcessNode",function(){Zt(en.verb,en.path,tn)},{once:!0})}}function Fe(tn,en,nn){for(var rn=y(nn),on=0;on=0){var ln=je(nn);setTimeout(function(){Pe(tn,en,nn+1)},ln)}},on.onopen=function(an){nn=0},j(tn).webSocket=on,on.addEventListener("message",function(an){if(!Xe(tn)){var ln=an.data;st(tn,function(hn){ln=hn.transformResponse(ln,null,tn)});for(var cn=Ft(tn),dn=u(ln),fn=p(dn.children),un=0;un0){lt(tn,"htmx:validation:halted",ln);return}rn.send(JSON.stringify(un)),Te(nn,tn)&&nn.preventDefault()}):ot(tn,"htmx:noWebSocketSourceError")}function je(tn){var en=D.config.wsReconnectDelay;if(typeof en=="function")return en(tn);if(en==="full-jitter"){var nn=Math.min(tn,6),rn=1e3*Math.pow(2,nn);return rn*Math.random()}ut('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function Be(tn,en,nn){for(var rn=y(nn),on=0;onD.config.historyCacheSize;)on.shift();for(;on.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(on));break}catch(ln){ot(P().body,"htmx:historyCacheError",{cause:ln,cache:on}),on.shift()}}function dt(tn){for(var en=x(localStorage.getItem("htmx-history-cache"))||[],nn=0;nn=200&&this.status<400){lt(P().body,"htmx:historyCacheMissLoad",nn);var rn=u(this.response);rn=rn.querySelector("[hx-history-elt],[data-hx-history-elt]")||rn;var on=ct(),an=Ft(on);se(on,rn,an),mt(an.tasks),ft=tn,lt(P().body,"htmx:historyRestore",{path:tn})}else ot(P().body,"htmx:historyCacheMissLoadError",nn)},en.send()}function xt(tn){gt(),tn=tn||location.pathname+location.search;var en=dt(tn);if(en){var nn=u(en.content),rn=ct(),on=Ft(rn);se(rn,nn,on),mt(on.tasks),document.title=en.title,window.scrollTo(0,en.scroll),ft=tn,lt(P().body,"htmx:historyRestore",{path:tn})}else D.config.refreshOnHistoryMiss?window.location.reload(!0):yt(tn)}function bt(tn){var en=X(tn,"hx-push-url");return en&&en!=="false"||j(tn).boosted&&j(tn).pushURL}function wt(tn){var en=X(tn,"hx-push-url");return en==="true"||en==="false"?null:en}function St(tn){var en=X(tn,"hx-indicator");if(en)var nn=T(tn,en);else nn=[tn];return B(nn,function(rn){rn.classList.add.call(rn.classList,D.config.requestClass)}),nn}function Et(tn){B(tn,function(en){en.classList.remove.call(en.classList,D.config.requestClass)})}function Ct(tn,en){for(var nn=0;nn=0}function Mt(tn){var en=X(tn,"hx-swap"),nn={swapStyle:j(tn).boosted?"innerHTML":D.config.defaultSwapStyle,swapDelay:D.config.defaultSwapDelay,settleDelay:D.config.defaultSettleDelay};if(j(tn).boosted&&!It(tn)&&(nn.show="top"),en){var rn=y(en);if(rn.length>0){nn.swapStyle=rn[0];for(var on=1;on0?cn.join(":"):null;nn.scroll=dn,nn.scrollTarget=fn}if(an.indexOf("show:")===0){var un=an.substr(5),cn=un.split(":"),gn=cn.pop(),fn=cn.length>0?cn.join(":"):null;nn.show=gn,nn.showTarget=fn}}}}return nn}function Dt(tn,en,nn){var rn=null;return st(en,function(on){rn==null&&(rn=on.encodeParameters(tn,nn,en))}),rn!=null?rn:X(en,"hx-encoding")==="multipart/form-data"||v(en,"form")&&c(en,"enctype")==="multipart/form-data"?Ht(nn):At(nn)}function Ft(tn){return{tasks:[],elts:[tn]}}function Pt(tn,en){var nn=tn[0],rn=tn[tn.length-1];if(en.scroll){var on=null;en.scrollTarget&&(on=A(nn,en.scrollTarget)),en.scroll==="top"&&(nn||on)&&(on=on||nn,on.scrollTop=0),en.scroll==="bottom"&&(rn||on)&&(on=on||rn,on.scrollTop=on.scrollHeight)}if(en.show){var on=null;if(en.showTarget){var an=en.showTarget;en.showTarget==="window"&&(an="body"),on=A(nn,an)}en.show==="top"&&(nn||on)&&(on=on||nn,on.scrollIntoView({block:"start",behavior:D.config.scrollBehavior})),en.show==="bottom"&&(rn||on)&&(on=on||rn,on.scrollIntoView({block:"end",behavior:D.config.scrollBehavior}))}}function Xt(tn,en,nn,rn){if(rn==null&&(rn={}),tn==null)return rn;var on=F(tn,en);if(on){var an=on.trim(),ln=nn;an.indexOf("javascript:")===0?(an=an.substr(11),ln=!0):an.indexOf("js:")===0&&(an=an.substr(3),ln=!0),an.indexOf("{")!==0&&(an="{"+an+"}");var cn;ln?cn=Ut(tn,function(){return Function("return ("+an+")")()},{}):cn=x(an);for(var dn in cn)cn.hasOwnProperty(dn)&&rn[dn]==null&&(rn[dn]=cn[dn])}return Xt(l(tn),en,nn,rn)}function Ut(tn,en,nn){return D.config.allowEval?en():(ot(tn,"htmx:evalDisallowedError"),nn)}function jt(tn,en){return Xt(tn,"hx-vars",!0,en)}function Bt(tn,en){return Xt(tn,"hx-vals",!1,en)}function zt(tn){return V(jt(tn),Bt(tn))}function Vt(tn,en,nn){if(nn!==null)try{tn.setRequestHeader(en,nn)}catch(rn){tn.setRequestHeader(en,encodeURIComponent(nn)),tn.setRequestHeader(en+"-URI-AutoEncoded","true")}}function _t(tn){if(tn.responseURL&&typeof URL!="undefined")try{var en=new URL(tn.responseURL);return en.pathname+en.search}catch(nn){ot(P().body,"htmx:badResponseUrl",{url:tn.responseURL})}}function Wt(tn,en){return tn.getAllResponseHeaders().match(en)}function $t(tn,en,nn){return tn=tn.toLowerCase(),nn?nn instanceof Element||a(nn,"String")?Zt(tn,en,null,null,{targetOverride:H(nn),returnPromise:!0}):Zt(tn,en,H(nn.source),nn.event,{handler:nn.handler,headers:nn.headers,values:nn.values,targetOverride:H(nn.target),returnPromise:!0}):Zt(tn,en,null,null,{returnPromise:!0})}function Jt(tn){for(var en=[];tn;)en.push(tn),tn=tn.parentElement;return en}function Zt(tn,en,nn,rn,on){var an=null,ln=null;if(on=on!=null?on:{},on.returnPromise&&typeof Promise!="undefined")var cn=new Promise(function(zn,Zn){an=zn,ln=Zn});nn==null&&(nn=P().body);var dn=on.handler||Gt;if(!!z(nn)){var fn=on.targetOverride||_(nn);if(fn==null){ot(nn,"htmx:targetError",{target:F(nn,"hx-target")});return}var un=j(nn);if(un.requestInFlight){var gn="last";if(rn){var hn=j(rn);hn&&hn.triggerSpec&&hn.triggerSpec.queue&&(gn=hn.triggerSpec.queue)}un.queuedRequests==null&&(un.queuedRequests=[]),gn==="first"&&un.queuedRequests.length===0?un.queuedRequests.push(function(){Zt(tn,en,nn,rn,on)}):gn==="all"?un.queuedRequests.push(function(){Zt(tn,en,nn,rn,on)}):gn==="last"&&(un.queuedRequests=[],un.queuedRequests.push(function(){Zt(tn,en,nn,rn,on)}));return}else un.requestInFlight=!0;var pn=function(){if(un.requestInFlight=!1,un.queuedRequests!=null&&un.queuedRequests.length>0){var zn=un.queuedRequests.shift();zn()}},vn=X(nn,"hx-prompt");if(vn){var yn=prompt(vn);if(yn===null||!lt(nn,"htmx:prompt",{prompt:yn,target:fn}))return U(an),pn(),cn}var mn=X(nn,"hx-confirm");if(mn&&!confirm(mn))return U(an),pn(),cn;var bn=new XMLHttpRequest,Sn=kt(nn,fn,yn);on.headers&&(Sn=V(Sn,on.headers));var An=Ot(nn,tn),Tn=An.errors,kn=An.values;on.values&&(kn=V(kn,on.values));var Dn=zt(nn),qn=V(kn,Dn),Fn=Nt(qn,nn);tn!=="get"&&X(nn,"hx-encoding")==null&&(Sn["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8"),(en==null||en==="")&&(en=P().location.href);var Un=Xt(nn,"hx-request"),Yn={parameters:Fn,unfilteredParameters:qn,headers:Sn,target:fn,verb:tn,errors:Tn,withCredentials:on.credentials||Un.credentials||D.config.withCredentials,timeout:on.timeout||Un.timeout||D.config.timeout,path:en,triggeringEvent:rn};if(!lt(nn,"htmx:configRequest",Yn))return U(an),pn(),cn;if(en=Yn.path,tn=Yn.verb,Sn=Yn.headers,Fn=Yn.parameters,Tn=Yn.errors,Tn&&Tn.length>0)return lt(nn,"htmx:validation:halted",Yn),U(an),pn(),cn;var Wn=en.split("#"),wn=Wn[0],On=Wn[1];if(tn==="get"){var sn=wn,Kn=Object.keys(Fn).length!==0;Kn&&(sn.indexOf("?")<0?sn+="?":sn+="&",sn+=At(Fn),On&&(sn+="#"+On)),bn.open("GET",sn,!0)}else bn.open(tn.toUpperCase(),en,!0);if(bn.overrideMimeType("text/html"),bn.withCredentials=Yn.withCredentials,bn.timeout=Yn.timeout,!Un.noHeaders){for(var Rn in Sn)if(Sn.hasOwnProperty(Rn)){var Ln=Sn[Rn];Vt(bn,Rn,Ln)}}var In={xhr:bn,target:fn,requestConfig:Yn,pathInfo:{path:en,finalPath:sn,anchor:On}};if(bn.onload=function(){try{var zn=Jt(nn);if(dn(nn,In),Et(Bn),lt(nn,"htmx:afterRequest",In),lt(nn,"htmx:afterOnLoad",In),!z(nn)){for(var Zn=null;zn.length>0&&Zn==null;){var Qn=zn.shift();z(Qn)&&(Zn=Qn)}Zn&&(lt(Zn,"htmx:afterRequest",In),lt(Zn,"htmx:afterOnLoad",In))}U(an),pn()}catch(_r){throw ot(nn,"htmx:onLoadError",V({error:_r},In)),_r}},bn.onerror=function(){Et(Bn),ot(nn,"htmx:afterRequest",In),ot(nn,"htmx:sendError",In),U(ln),pn()},bn.onabort=function(){Et(Bn),ot(nn,"htmx:afterRequest",In),ot(nn,"htmx:sendAbort",In),U(ln),pn()},bn.ontimeout=function(){Et(Bn),ot(nn,"htmx:afterRequest",In),ot(nn,"htmx:timeout",In),U(ln),pn()},!lt(nn,"htmx:beforeRequest",In))return U(an),pn(),cn;var Bn=St(nn);return B(["loadstart","loadend","progress","abort"],function(zn){B([bn,bn.upload],function(Zn){Zn.addEventListener(zn,function(Qn){lt(nn,"htmx:xhr:"+zn,{lengthComputable:Qn.lengthComputable,loaded:Qn.loaded,total:Qn.total})})})}),lt(nn,"htmx:beforeSend",In),bn.send(tn==="get"?null:Dt(bn,nn,Fn)),cn}}function Gt(tn,en){var nn=en.xhr,rn=en.target;if(!!lt(tn,"htmx:beforeOnLoad",en)){if(Wt(nn,/HX-Trigger:/i)&&he(nn,"HX-Trigger",tn),Wt(nn,/HX-Push:/i))var on=nn.getResponseHeader("HX-Push");if(Wt(nn,/HX-Redirect:/i)){window.location.href=nn.getResponseHeader("HX-Redirect");return}if(Wt(nn,/HX-Refresh:/i)&&nn.getResponseHeader("HX-Refresh")==="true"){location.reload();return}Wt(nn,/HX-Retarget:/i)&&(en.target=P().querySelector(nn.getResponseHeader("HX-Retarget")));var an=bt(tn)||on,ln=nn.status>=200&&nn.status<400&&nn.status!==204,cn=nn.response,dn=nn.status>=400,fn=V({shouldSwap:ln,serverResponse:cn,isError:dn},en);if(!!lt(rn,"htmx:beforeSwap",fn)){if(rn=fn.target,cn=fn.serverResponse,dn=fn.isError,en.failed=dn,en.successful=!dn,fn.shouldSwap){nn.status===286&&Re(tn),st(tn,function(hn){cn=hn.transformResponse(cn,nn,tn)}),an&>();var un=Mt(tn);rn.classList.add(D.config.swappingClass);var gn=function(){try{var hn=document.activeElement,pn={};try{pn={elt:hn,start:hn?hn.selectionStart:null,end:hn?hn.selectionEnd:null}}catch(Sn){}var vn=Ft(rn);if(ce(un.swapStyle,rn,tn,cn,vn),pn.elt&&!z(pn.elt)&&pn.elt.id){var yn=document.getElementById(pn.elt.id);yn&&(pn.start&&yn.setSelectionRange&&yn.setSelectionRange(pn.start,pn.end),yn.focus())}if(rn.classList.remove(D.config.swappingClass),B(vn.elts,function(Sn){Sn.classList&&Sn.classList.add(D.config.settlingClass),lt(Sn,"htmx:afterSwap",en)}),en.pathInfo.anchor&&(location.hash=en.pathInfo.anchor),Wt(nn,/HX-Trigger-After-Swap:/i)){var mn=tn;z(tn)||(mn=P().body),he(nn,"HX-Trigger-After-Swap",mn)}var bn=function(){if(B(vn.tasks,function(Tn){Tn.call()}),B(vn.elts,function(Tn){Tn.classList&&Tn.classList.remove(D.config.settlingClass),lt(Tn,"htmx:afterSettle",en)}),an){var Sn=on||wt(tn)||_t(nn)||en.pathInfo.finalPath||en.pathInfo.path;pt(Sn),lt(P().body,"htmx:pushedIntoHistory",{path:Sn})}if(Pt(vn.elts,un),Wt(nn,/HX-Trigger-After-Settle:/i)){var An=tn;z(tn)||(An=P().body),he(nn,"HX-Trigger-After-Settle",An)}};un.settleDelay>0?setTimeout(bn,un.settleDelay):bn()}catch(Sn){throw ot(tn,"htmx:swapError",en),Sn}};un.swapDelay>0?setTimeout(gn,un.swapDelay):gn()}dn&&ot(tn,"htmx:responseError",V({error:"Response Status Error Code "+nn.status+" from "+en.pathInfo.path},en))}}}var Kt={};function Yt(){return{onEvent:function(tn,en){return!0},transformResponse:function(tn,en,nn){return tn},isInlineSwap:function(tn){return!1},handleSwap:function(tn,en,nn,rn){return!1},encodeParameters:function(tn,en,nn){return null}}}function Qt(tn,en){Kt[tn]=V(Yt(),en)}function er(tn){delete Kt[tn]}function tr(tn,en,nn){if(tn==null)return en;en==null&&(en=[]),nn==null&&(nn=[]);var rn=F(tn,"hx-ext");return rn&&B(rn.split(","),function(on){if(on=on.replace(/ /g,""),on.slice(0,7)=="ignore:"){nn.push(on.slice(7));return}if(nn.indexOf(on)<0){var an=Kt[on];an&&en.indexOf(an)<0&&en.push(an)}}),tr(l(tn),en,nn)}function rr(tn){P().readyState!=="loading"?tn():P().addEventListener("DOMContentLoaded",tn)}function nr(){D.config.includeIndicatorStyles!==!1&&P().head.insertAdjacentHTML("beforeend","")}function ir(){var tn=P().querySelector('meta[name="htmx-config"]');return tn?x(tn.content):null}function or(){var tn=ir();tn&&(D.config=V(D.config,tn))}return rr(function(){or(),nr();var tn=P().body;rt(tn),window.onpopstate=function(en){en.state&&en.state.htmx&&xt()},setTimeout(function(){lt(tn,"htmx:load",{})},0)}),D}()})});var br=Cn((Cj,Rh)=>{var Pa=function(tn){return tn&&tn.Math==Math&&tn};Rh.exports=Pa(typeof globalThis=="object"&&globalThis)||Pa(typeof window=="object"&&window)||Pa(typeof self=="object"&&self)||Pa(typeof global=="object"&&global)||function(){return this}()||Function("return this")()});var Ar=Cn((Lj,jh)=>{jh.exports=function(tn){try{return!!tn()}catch(en){return!0}}});var zi=Cn((Dj,qh)=>{var pT=Ar();qh.exports=!pT(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})});var Mc=Cn(Fh=>{"use strict";var Hh={}.propertyIsEnumerable,Bh=Object.getOwnPropertyDescriptor,mT=Bh&&!Hh.call({1:2},1);Fh.f=mT?function(en){var nn=Bh(this,en);return!!nn&&nn.enumerable}:Hh});var ka=Cn((Ij,$h)=>{$h.exports=function(tn,en){return{enumerable:!(tn&1),configurable:!(tn&2),writable:!(tn&4),value:en}}});var $o=Cn((Pj,zh)=>{var gT={}.toString;zh.exports=function(tn){return gT.call(tn).slice(8,-1)}});var Ms=Cn((kj,Wh)=>{var vT=Ar(),bT=$o(),yT="".split;Wh.exports=vT(function(){return!Object("z").propertyIsEnumerable(0)})?function(tn){return bT(tn)=="String"?yT.call(tn,""):Object(tn)}:Object});var vo=Cn((Nj,Vh)=>{Vh.exports=function(tn){if(tn==null)throw TypeError("Can't call method on "+tn);return tn}});var zo=Cn((Rj,Uh)=>{var ET=Ms(),_T=vo();Uh.exports=function(tn){return ET(_T(tn))}});var Wr=Cn((jj,Yh)=>{Yh.exports=function(tn){return typeof tn=="object"?tn!==null:typeof tn=="function"}});var Is=Cn((qj,Kh)=>{var Ic=br(),ST=function(tn){return typeof tn=="function"?tn:void 0};Kh.exports=function(tn,en){return arguments.length<2?ST(Ic[tn]):Ic[tn]&&Ic[tn][en]}});var Xh=Cn((Hj,Gh)=>{var wT=Is();Gh.exports=wT("navigator","userAgent")||""});var Ra=Cn((Bj,np)=>{var Jh=br(),Pc=Xh(),Qh=Jh.process,Zh=Jh.Deno,ep=Qh&&Qh.versions||Zh&&Zh.version,tp=ep&&ep.v8,li,Na;tp?(li=tp.split("."),Na=li[0]<4?1:li[0]+li[1]):Pc&&(li=Pc.match(/Edge\/(\d+)/),(!li||li[1]>=74)&&(li=Pc.match(/Chrome\/(\d+)/),li&&(Na=li[1])));np.exports=Na&&+Na});var kc=Cn((Fj,ip)=>{var rp=Ra(),xT=Ar();ip.exports=!!Object.getOwnPropertySymbols&&!xT(function(){var tn=Symbol();return!String(tn)||!(Object(tn)instanceof Symbol)||!Symbol.sham&&rp&&rp<41})});var Nc=Cn(($j,op)=>{var TT=kc();op.exports=TT&&!Symbol.sham&&typeof Symbol.iterator=="symbol"});var ja=Cn((zj,sp)=>{var OT=Is(),AT=Nc();sp.exports=AT?function(tn){return typeof tn=="symbol"}:function(tn){var en=OT("Symbol");return typeof en=="function"&&Object(tn)instanceof en}});var lp=Cn((Wj,ap)=>{var Rc=Wr();ap.exports=function(tn,en){var nn,rn;if(en==="string"&&typeof(nn=tn.toString)=="function"&&!Rc(rn=nn.call(tn))||typeof(nn=tn.valueOf)=="function"&&!Rc(rn=nn.call(tn))||en!=="string"&&typeof(nn=tn.toString)=="function"&&!Rc(rn=nn.call(tn)))return rn;throw TypeError("Can't convert object to primitive value")}});var qa=Cn((Vj,cp)=>{cp.exports=!1});var Ha=Cn((Uj,fp)=>{var up=br();fp.exports=function(tn,en){try{Object.defineProperty(up,tn,{value:en,configurable:!0,writable:!0})}catch(nn){up[tn]=en}return en}});var Ba=Cn((Yj,hp)=>{var CT=br(),LT=Ha(),dp="__core-js_shared__",DT=CT[dp]||LT(dp,{});hp.exports=DT});var Fa=Cn((Kj,mp)=>{var MT=qa(),pp=Ba();(mp.exports=function(tn,en){return pp[tn]||(pp[tn]=en!==void 0?en:{})})("versions",[]).push({version:"3.16.4",mode:MT?"pure":"global",copyright:"\xA9 2021 Denis Pushkarev (zloirock.ru)"})});var bo=Cn((Gj,gp)=>{var IT=vo();gp.exports=function(tn){return Object(IT(tn))}});var Xr=Cn((Xj,vp)=>{var PT=bo(),kT={}.hasOwnProperty;vp.exports=Object.hasOwn||function(en,nn){return kT.call(PT(en),nn)}});var $a=Cn((Jj,bp)=>{var NT=0,RT=Math.random();bp.exports=function(tn){return"Symbol("+String(tn===void 0?"":tn)+")_"+(++NT+RT).toString(36)}});var Dr=Cn((Qj,_p)=>{var jT=br(),qT=Fa(),yp=Xr(),HT=$a(),Ep=kc(),BT=Nc(),Ps=qT("wks"),ks=jT.Symbol,FT=BT?ks:ks&&ks.withoutSetter||HT;_p.exports=function(tn){return(!yp(Ps,tn)||!(Ep||typeof Ps[tn]=="string"))&&(Ep&&yp(ks,tn)?Ps[tn]=ks[tn]:Ps[tn]=FT("Symbol."+tn)),Ps[tn]}});var Tp=Cn((Zj,xp)=>{var Sp=Wr(),wp=ja(),$T=lp(),zT=Dr(),WT=zT("toPrimitive");xp.exports=function(tn,en){if(!Sp(tn)||wp(tn))return tn;var nn=tn[WT],rn;if(nn!==void 0){if(en===void 0&&(en="default"),rn=nn.call(tn,en),!Sp(rn)||wp(rn))return rn;throw TypeError("Can't convert object to primitive value")}return en===void 0&&(en="number"),$T(tn,en)}});var jc=Cn((e1,Op)=>{var VT=Tp(),UT=ja();Op.exports=function(tn){var en=VT(tn,"string");return UT(en)?en:String(en)}});var Hc=Cn((t1,Cp)=>{var YT=br(),Ap=Wr(),qc=YT.document,KT=Ap(qc)&&Ap(qc.createElement);Cp.exports=function(tn){return KT?qc.createElement(tn):{}}});var Bc=Cn((n1,Lp)=>{var GT=zi(),XT=Ar(),JT=Hc();Lp.exports=!GT&&!XT(function(){return Object.defineProperty(JT("div"),"a",{get:function(){return 7}}).a!=7})});var Fc=Cn(Mp=>{var QT=zi(),ZT=Mc(),eO=ka(),tO=zo(),nO=jc(),rO=Xr(),iO=Bc(),Dp=Object.getOwnPropertyDescriptor;Mp.f=QT?Dp:function(en,nn){if(en=tO(en),nn=nO(nn),iO)try{return Dp(en,nn)}catch(rn){}if(rO(en,nn))return eO(!ZT.f.call(en,nn),en[nn])}});var Vr=Cn((i1,Ip)=>{var oO=Wr();Ip.exports=function(tn){if(!oO(tn))throw TypeError(String(tn)+" is not an object");return tn}});var Wi=Cn(Np=>{var sO=zi(),aO=Bc(),Pp=Vr(),lO=jc(),kp=Object.defineProperty;Np.f=sO?kp:function(en,nn,rn){if(Pp(en),nn=lO(nn),Pp(rn),aO)try{return kp(en,nn,rn)}catch(on){}if("get"in rn||"set"in rn)throw TypeError("Accessors not supported");return"value"in rn&&(en[nn]=rn.value),en}});var Li=Cn((s1,Rp)=>{var cO=zi(),uO=Wi(),fO=ka();Rp.exports=cO?function(tn,en,nn){return uO.f(tn,en,fO(1,nn))}:function(tn,en,nn){return tn[en]=nn,tn}});var zc=Cn((a1,jp)=>{var $c=Ba(),dO=Function.toString;typeof $c.inspectSource!="function"&&($c.inspectSource=function(tn){return dO.call(tn)});jp.exports=$c.inspectSource});var Wc=Cn((l1,Hp)=>{var hO=br(),pO=zc(),qp=hO.WeakMap;Hp.exports=typeof qp=="function"&&/native code/.test(pO(qp))});var za=Cn((c1,Fp)=>{var mO=Fa(),gO=$a(),Bp=mO("keys");Fp.exports=function(tn){return Bp[tn]||(Bp[tn]=gO(tn))}});var Ns=Cn((u1,$p)=>{$p.exports={}});var Eo=Cn((f1,Up)=>{var vO=Wc(),bO=br(),yO=Wr(),EO=Li(),Vc=Xr(),Uc=Ba(),_O=za(),SO=Ns(),zp="Object already initialized",wO=bO.WeakMap,Wa,Rs,Va,xO=function(tn){return Va(tn)?Rs(tn):Wa(tn,{})},TO=function(tn){return function(en){var nn;if(!yO(en)||(nn=Rs(en)).type!==tn)throw TypeError("Incompatible receiver, "+tn+" required");return nn}};vO||Uc.state?(Vi=Uc.state||(Uc.state=new wO),Wp=Vi.get,Yc=Vi.has,Vp=Vi.set,Wa=function(tn,en){if(Yc.call(Vi,tn))throw new TypeError(zp);return en.facade=tn,Vp.call(Vi,tn,en),en},Rs=function(tn){return Wp.call(Vi,tn)||{}},Va=function(tn){return Yc.call(Vi,tn)}):(yo=_O("state"),SO[yo]=!0,Wa=function(tn,en){if(Vc(tn,yo))throw new TypeError(zp);return en.facade=tn,EO(tn,yo,en),en},Rs=function(tn){return Vc(tn,yo)?tn[yo]:{}},Va=function(tn){return Vc(tn,yo)});var Vi,Wp,Yc,Vp,yo;Up.exports={set:Wa,get:Rs,has:Va,enforce:xO,getterFor:TO}});var _o=Cn((d1,Gp)=>{var OO=br(),Yp=Li(),AO=Xr(),CO=Ha(),LO=zc(),Kp=Eo(),DO=Kp.get,MO=Kp.enforce,IO=String(String).split("String");(Gp.exports=function(tn,en,nn,rn){var on=rn?!!rn.unsafe:!1,an=rn?!!rn.enumerable:!1,ln=rn?!!rn.noTargetGet:!1,cn;if(typeof nn=="function"&&(typeof en=="string"&&!AO(nn,"name")&&Yp(nn,"name",en),cn=MO(nn),cn.source||(cn.source=IO.join(typeof en=="string"?en:""))),tn===OO){an?tn[en]=nn:CO(en,nn);return}else on?!ln&&tn[en]&&(an=!0):delete tn[en];an?tn[en]=nn:Yp(tn,en,nn)})(Function.prototype,"toString",function(){return typeof this=="function"&&DO(this).source||LO(this)})});var js=Cn((h1,Xp)=>{var PO=Math.ceil,kO=Math.floor;Xp.exports=function(tn){return isNaN(tn=+tn)?0:(tn>0?kO:PO)(tn)}});var So=Cn((p1,Jp)=>{var NO=js(),RO=Math.min;Jp.exports=function(tn){return tn>0?RO(NO(tn),9007199254740991):0}});var Zp=Cn((m1,Qp)=>{var jO=js(),qO=Math.max,HO=Math.min;Qp.exports=function(tn,en){var nn=jO(tn);return nn<0?qO(nn+en,0):HO(nn,en)}});var nm=Cn((g1,tm)=>{var BO=zo(),FO=So(),$O=Zp(),em=function(tn){return function(en,nn,rn){var on=BO(en),an=FO(on.length),ln=$O(rn,an),cn;if(tn&&nn!=nn){for(;an>ln;)if(cn=on[ln++],cn!=cn)return!0}else for(;an>ln;ln++)if((tn||ln in on)&&on[ln]===nn)return tn||ln||0;return!tn&&-1}};tm.exports={includes:em(!0),indexOf:em(!1)}});var Gc=Cn((v1,rm)=>{var Kc=Xr(),zO=zo(),WO=nm().indexOf,VO=Ns();rm.exports=function(tn,en){var nn=zO(tn),rn=0,on=[],an;for(an in nn)!Kc(VO,an)&&Kc(nn,an)&&on.push(an);for(;en.length>rn;)Kc(nn,an=en[rn++])&&(~WO(on,an)||on.push(an));return on}});var Ua=Cn((b1,im)=>{im.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]});var Ya=Cn(om=>{var UO=Gc(),YO=Ua(),KO=YO.concat("length","prototype");om.f=Object.getOwnPropertyNames||function(en){return UO(en,KO)}});var Xc=Cn(sm=>{sm.f=Object.getOwnPropertySymbols});var lm=Cn((_1,am)=>{var GO=Is(),XO=Ya(),JO=Xc(),QO=Vr();am.exports=GO("Reflect","ownKeys")||function(en){var nn=XO.f(QO(en)),rn=JO.f;return rn?nn.concat(rn(en)):nn}});var um=Cn((S1,cm)=>{var ZO=Xr(),e0=lm(),t0=Fc(),n0=Wi();cm.exports=function(tn,en){for(var nn=e0(en),rn=n0.f,on=t0.f,an=0;an{var r0=Ar(),i0=/#|\.prototype\./,qs=function(tn,en){var nn=s0[o0(tn)];return nn==l0?!0:nn==a0?!1:typeof en=="function"?r0(en):!!en},o0=qs.normalize=function(tn){return String(tn).replace(i0,".").toLowerCase()},s0=qs.data={},a0=qs.NATIVE="N",l0=qs.POLYFILL="P";fm.exports=qs});var ci=Cn((x1,dm)=>{var Qc=br(),c0=Fc().f,u0=Li(),f0=_o(),d0=Ha(),h0=um(),p0=Jc();dm.exports=function(tn,en){var nn=tn.target,rn=tn.global,on=tn.stat,an,ln,cn,dn,fn,un;if(rn?ln=Qc:on?ln=Qc[nn]||d0(nn,{}):ln=(Qc[nn]||{}).prototype,ln)for(cn in en){if(fn=en[cn],tn.noTargetGet?(un=c0(ln,cn),dn=un&&un.value):dn=ln[cn],an=p0(rn?cn:nn+(on?".":"#")+cn,tn.forced),!an&&dn!==void 0){if(typeof fn==typeof dn)continue;h0(fn,dn)}(tn.sham||dn&&dn.sham)&&u0(fn,"sham",!0),f0(ln,cn,fn,tn)}}});var Zc=Cn((T1,hm)=>{hm.exports=function(tn){if(typeof tn!="function")throw TypeError(String(tn)+" is not a function");return tn}});var eu=Cn((O1,pm)=>{var m0=Zc();pm.exports=function(tn,en,nn){if(m0(tn),en===void 0)return tn;switch(nn){case 0:return function(){return tn.call(en)};case 1:return function(rn){return tn.call(en,rn)};case 2:return function(rn,on){return tn.call(en,rn,on)};case 3:return function(rn,on,an){return tn.call(en,rn,on,an)}}return function(){return tn.apply(en,arguments)}}});var gm=Cn((A1,mm)=>{var g0=$o();mm.exports=Array.isArray||function(en){return g0(en)=="Array"}});var ym=Cn((C1,bm)=>{var v0=Wr(),vm=gm(),b0=Dr(),y0=b0("species");bm.exports=function(tn){var en;return vm(tn)&&(en=tn.constructor,typeof en=="function"&&(en===Array||vm(en.prototype))?en=void 0:v0(en)&&(en=en[y0],en===null&&(en=void 0))),en===void 0?Array:en}});var _m=Cn((L1,Em)=>{var E0=ym();Em.exports=function(tn,en){return new(E0(tn))(en===0?0:en)}});var Ka=Cn((D1,wm)=>{var _0=eu(),S0=Ms(),w0=bo(),x0=So(),T0=_m(),Sm=[].push,Ui=function(tn){var en=tn==1,nn=tn==2,rn=tn==3,on=tn==4,an=tn==6,ln=tn==7,cn=tn==5||an;return function(dn,fn,un,gn){for(var hn=w0(dn),pn=S0(hn),vn=_0(fn,un,3),yn=x0(pn.length),mn=0,bn=gn||T0,Sn=en?bn(dn,yn):nn||ln?bn(dn,0):void 0,An,Tn;yn>mn;mn++)if((cn||mn in pn)&&(An=pn[mn],Tn=vn(An,mn,hn),tn))if(en)Sn[mn]=Tn;else if(Tn)switch(tn){case 3:return!0;case 5:return An;case 6:return mn;case 2:Sm.call(Sn,An)}else switch(tn){case 4:return!1;case 7:Sm.call(Sn,An)}return an?-1:rn||on?on:Sn}};wm.exports={forEach:Ui(0),map:Ui(1),filter:Ui(2),some:Ui(3),every:Ui(4),find:Ui(5),findIndex:Ui(6),filterReject:Ui(7)}});var tu=Cn((M1,xm)=>{"use strict";var O0=Ar();xm.exports=function(tn,en){var nn=[][tn];return!!nn&&O0(function(){nn.call(null,en||function(){throw 1},1)})}});var nu=Cn((I1,Tm)=>{"use strict";var A0=Ka().forEach,C0=tu(),L0=C0("forEach");Tm.exports=L0?[].forEach:function(en){return A0(this,en,arguments.length>1?arguments[1]:void 0)}});var ru=Cn((k1,Am)=>{Am.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}});var Dm=Cn((R1,Lm)=>{var k0=!!(typeof window!="undefined"&&window.document&&window.document.createElement);Lm.exports=k0});var Im=Cn((j1,Mm)=>{var N0=Ar(),R0=Dr(),j0=Ra(),q0=R0("species");Mm.exports=function(tn){return j0>=51||!N0(function(){var en=[],nn=en.constructor={};return nn[q0]=function(){return{foo:1}},en[tn](Boolean).foo!==1})}});var su=Cn((H1,Pm)=>{var z0=Gc(),W0=Ua();Pm.exports=Object.keys||function(en){return z0(en,W0)}});var Nm=Cn((B1,km)=>{var V0=zi(),U0=Wi(),Y0=Vr(),K0=su();km.exports=V0?Object.defineProperties:function(en,nn){Y0(en);for(var rn=K0(nn),on=rn.length,an=0,ln;on>an;)U0.f(en,ln=rn[an++],nn[ln]);return en}});var jm=Cn((F1,Rm)=>{var G0=Is();Rm.exports=G0("document","documentElement")});var Ja=Cn(($1,Wm)=>{var X0=Vr(),J0=Nm(),qm=Ua(),Q0=Ns(),Z0=jm(),eA=Hc(),tA=za(),Hm=">",Bm="<",au="prototype",lu="script",Fm=tA("IE_PROTO"),cu=function(){},$m=function(tn){return Bm+lu+Hm+tn+Bm+"/"+lu+Hm},zm=function(tn){tn.write($m("")),tn.close();var en=tn.parentWindow.Object;return tn=null,en},nA=function(){var tn=eA("iframe"),en="java"+lu+":",nn;return tn.style.display="none",Z0.appendChild(tn),tn.src=String(en),nn=tn.contentWindow.document,nn.open(),nn.write($m("document.F=Object")),nn.close(),nn.F},Ga,Xa=function(){try{Ga=new ActiveXObject("htmlfile")}catch(en){}Xa=typeof document!="undefined"?document.domain&&Ga?zm(Ga):nA():zm(Ga);for(var tn=qm.length;tn--;)delete Xa[au][qm[tn]];return Xa()};Q0[Fm]=!0;Wm.exports=Object.create||function(en,nn){var rn;return en!==null?(cu[au]=X0(en),rn=new cu,cu[au]=null,rn[Fm]=en):rn=Xa(),nn===void 0?rn:J0(rn,nn)}});var Um=Cn((z1,Vm)=>{var rA=Dr(),iA=Ja(),oA=Wi(),uu=rA("unscopables"),fu=Array.prototype;fu[uu]==null&&oA.f(fu,uu,{configurable:!0,value:iA(null)});Vm.exports=function(tn){fu[uu][tn]=!0}});var Wo=Cn((W1,Ym)=>{Ym.exports={}});var Gm=Cn((V1,Km)=>{var sA=Ar();Km.exports=!sA(function(){function tn(){}return tn.prototype.constructor=null,Object.getPrototypeOf(new tn)!==tn.prototype})});var du=Cn((U1,Jm)=>{var aA=Xr(),lA=bo(),cA=za(),uA=Gm(),Xm=cA("IE_PROTO"),fA=Object.prototype;Jm.exports=uA?Object.getPrototypeOf:function(tn){return tn=lA(tn),aA(tn,Xm)?tn[Xm]:typeof tn.constructor=="function"&&tn instanceof tn.constructor?tn.constructor.prototype:tn instanceof Object?fA:null}});var gu=Cn((Y1,tg)=>{"use strict";var dA=Ar(),Qm=du(),hA=Li(),pA=Xr(),mA=Dr(),gA=qa(),hu=mA("iterator"),Zm=!1,vA=function(){return this},wo,pu,mu;[].keys&&(mu=[].keys(),"next"in mu?(pu=Qm(Qm(mu)),pu!==Object.prototype&&(wo=pu)):Zm=!0);var eg=wo==null||dA(function(){var tn={};return wo[hu].call(tn)!==tn});eg&&(wo={});(!gA||eg)&&!pA(wo,hu)&&hA(wo,hu,vA);tg.exports={IteratorPrototype:wo,BUGGY_SAFARI_ITERATORS:Zm}});var Qa=Cn((K1,rg)=>{var bA=Wi().f,yA=Xr(),EA=Dr(),ng=EA("toStringTag");rg.exports=function(tn,en,nn){tn&&!yA(tn=nn?tn:tn.prototype,ng)&&bA(tn,ng,{configurable:!0,value:en})}});var og=Cn((G1,ig)=>{"use strict";var _A=gu().IteratorPrototype,SA=Ja(),wA=ka(),xA=Qa(),TA=Wo(),OA=function(){return this};ig.exports=function(tn,en,nn){var rn=en+" Iterator";return tn.prototype=SA(_A,{next:wA(1,nn)}),xA(tn,rn,!1,!0),TA[rn]=OA,tn}});var ag=Cn((X1,sg)=>{var AA=Wr();sg.exports=function(tn){if(!AA(tn)&&tn!==null)throw TypeError("Can't set "+String(tn)+" as a prototype");return tn}});var vu=Cn((J1,lg)=>{var CA=Vr(),LA=ag();lg.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var tn=!1,en={},nn;try{nn=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,nn.call(en,[]),tn=en instanceof Array}catch(rn){}return function(on,an){return CA(on),LA(an),tn?nn.call(on,an):on.__proto__=an,on}}():void 0)});var Eu=Cn((Q1,vg)=>{"use strict";var DA=ci(),MA=og(),cg=du(),ug=vu(),IA=Qa(),fg=Li(),PA=_o(),kA=Dr(),bu=qa(),dg=Wo(),hg=gu(),yu=hg.IteratorPrototype,Za=hg.BUGGY_SAFARI_ITERATORS,Bs=kA("iterator"),pg="keys",el="values",mg="entries",gg=function(){return this};vg.exports=function(tn,en,nn,rn,on,an,ln){MA(nn,en,rn);var cn=function(bn){if(bn===on&&hn)return hn;if(!Za&&bn in un)return un[bn];switch(bn){case pg:return function(){return new nn(this,bn)};case el:return function(){return new nn(this,bn)};case mg:return function(){return new nn(this,bn)}}return function(){return new nn(this)}},dn=en+" Iterator",fn=!1,un=tn.prototype,gn=un[Bs]||un["@@iterator"]||on&&un[on],hn=!Za&&gn||cn(on),pn=en=="Array"&&un.entries||gn,vn,yn,mn;if(pn&&(vn=cg(pn.call(new tn)),yu!==Object.prototype&&vn.next&&(!bu&&cg(vn)!==yu&&(ug?ug(vn,yu):typeof vn[Bs]!="function"&&fg(vn,Bs,gg)),IA(vn,dn,!0,!0),bu&&(dg[dn]=gg))),on==el&&gn&&gn.name!==el&&(fn=!0,hn=function(){return gn.call(this)}),(!bu||ln)&&un[Bs]!==hn&&fg(un,Bs,hn),dg[en]=hn,on)if(yn={values:cn(el),keys:an?hn:cn(pg),entries:cn(mg)},ln)for(mn in yn)(Za||fn||!(mn in un))&&PA(un,mn,yn[mn]);else DA({target:en,proto:!0,forced:Za||fn},yn);return yn}});var Su=Cn((Z1,_g)=>{"use strict";var NA=zo(),_u=Um(),bg=Wo(),yg=Eo(),RA=Eu(),Eg="Array Iterator",jA=yg.set,qA=yg.getterFor(Eg);_g.exports=RA(Array,"Array",function(tn,en){jA(this,{type:Eg,target:NA(tn),index:0,kind:en})},function(){var tn=qA(this),en=tn.target,nn=tn.kind,rn=tn.index++;return!en||rn>=en.length?(tn.target=void 0,{value:void 0,done:!0}):nn=="keys"?{value:rn,done:!1}:nn=="values"?{value:en[rn],done:!1}:{value:[rn,en[rn]],done:!1}},"values");bg.Arguments=bg.Array;_u("keys");_u("values");_u("entries")});var Tg=Cn((eq,xg)=>{"use strict";var Sg=zi(),HA=Ar(),wu=su(),BA=Xc(),FA=Mc(),$A=bo(),zA=Ms(),Vo=Object.assign,wg=Object.defineProperty;xg.exports=!Vo||HA(function(){if(Sg&&Vo({b:1},Vo(wg({},"a",{enumerable:!0,get:function(){wg(this,"b",{value:3,enumerable:!1})}}),{b:2})).b!==1)return!0;var tn={},en={},nn=Symbol(),rn="abcdefghijklmnopqrst";return tn[nn]=7,rn.split("").forEach(function(on){en[on]=on}),Vo({},tn)[nn]!=7||wu(Vo({},en)).join("")!=rn})?function(en,nn){for(var rn=$A(en),on=arguments.length,an=1,ln=BA.f,cn=FA.f;on>an;)for(var dn=zA(arguments[an++]),fn=ln?wu(dn).concat(ln(dn)):wu(dn),un=fn.length,gn=0,hn;un>gn;)hn=fn[gn++],(!Sg||cn.call(dn,hn))&&(rn[hn]=dn[hn]);return rn}:Vo});var tl=Cn((nq,Cg)=>{var VA=Dr(),UA=VA("toStringTag"),Ag={};Ag[UA]="z";Cg.exports=String(Ag)==="[object z]"});var xu=Cn((rq,Lg)=>{var YA=tl(),nl=$o(),KA=Dr(),GA=KA("toStringTag"),XA=nl(function(){return arguments}())=="Arguments",JA=function(tn,en){try{return tn[en]}catch(nn){}};Lg.exports=YA?nl:function(tn){var en,nn,rn;return tn===void 0?"Undefined":tn===null?"Null":typeof(nn=JA(en=Object(tn),GA))=="string"?nn:XA?nl(en):(rn=nl(en))=="Object"&&typeof en.callee=="function"?"Arguments":rn}});var Mg=Cn((iq,Dg)=>{"use strict";var QA=tl(),ZA=xu();Dg.exports=QA?{}.toString:function(){return"[object "+ZA(this)+"]"}});var Yi=Cn((sq,Ig)=>{var rC=ja();Ig.exports=function(tn){if(rC(tn))throw TypeError("Cannot convert a Symbol value to a string");return String(tn)}});var Tu=Cn((aq,Pg)=>{Pg.exports=` -\v\f\r \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF`});var Ng=Cn((lq,kg)=>{var iC=vo(),oC=Yi(),sC=Tu(),rl="["+sC+"]",aC=RegExp("^"+rl+rl+"*"),lC=RegExp(rl+rl+"*$"),Ou=function(tn){return function(en){var nn=oC(iC(en));return tn&1&&(nn=nn.replace(aC,"")),tn&2&&(nn=nn.replace(lC,"")),nn}};kg.exports={start:Ou(1),end:Ou(2),trim:Ou(3)}});var qg=Cn((cq,jg)=>{var cC=br(),uC=Yi(),fC=Ng().trim,Rg=Tu(),il=cC.parseInt,dC=/^[+-]?0[Xx]/,hC=il(Rg+"08")!==8||il(Rg+"0x16")!==22;jg.exports=hC?function(en,nn){var rn=fC(uC(en));return il(rn,nn>>>0||(dC.test(rn)?16:10))}:il});var Au=Cn((fq,Fg)=>{var mC=js(),gC=Yi(),vC=vo(),Bg=function(tn){return function(en,nn){var rn=gC(vC(en)),on=mC(nn),an=rn.length,ln,cn;return on<0||on>=an?tn?"":void 0:(ln=rn.charCodeAt(on),ln<55296||ln>56319||on+1===an||(cn=rn.charCodeAt(on+1))<56320||cn>57343?tn?rn.charAt(on):ln:tn?rn.slice(on,on+2):(ln-55296<<10)+(cn-56320)+65536)}};Fg.exports={codeAt:Bg(!1),charAt:Bg(!0)}});var Cu=Cn((hq,Wg)=>{var wC=_o();Wg.exports=function(tn,en,nn){for(var rn in en)wC(tn,rn,en[rn],nn);return tn}});var Kg=Cn((pq,Yg)=>{var xC=zo(),Vg=Ya().f,TC={}.toString,Ug=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],OC=function(tn){try{return Vg(tn)}catch(en){return Ug.slice()}};Yg.exports.f=function(en){return Ug&&TC.call(en)=="[object Window]"?OC(en):Vg(xC(en))}});var Xg=Cn((mq,Gg)=>{var AC=Ar();Gg.exports=!AC(function(){return Object.isExtensible(Object.preventExtensions({}))})});var ol=Cn((gq,Zg)=>{var CC=ci(),LC=Ns(),DC=Wr(),Lu=Xr(),MC=Wi().f,Jg=Ya(),IC=Kg(),PC=$a(),kC=Xg(),Qg=!1,Di=PC("meta"),NC=0,Du=Object.isExtensible||function(){return!0},Mu=function(tn){MC(tn,Di,{value:{objectID:"O"+NC++,weakData:{}}})},RC=function(tn,en){if(!DC(tn))return typeof tn=="symbol"?tn:(typeof tn=="string"?"S":"P")+tn;if(!Lu(tn,Di)){if(!Du(tn))return"F";if(!en)return"E";Mu(tn)}return tn[Di].objectID},jC=function(tn,en){if(!Lu(tn,Di)){if(!Du(tn))return!0;if(!en)return!1;Mu(tn)}return tn[Di].weakData},qC=function(tn){return kC&&Qg&&Du(tn)&&!Lu(tn,Di)&&Mu(tn),tn},HC=function(){BC.enable=function(){},Qg=!0;var tn=Jg.f,en=[].splice,nn={};nn[Di]=1,tn(nn).length&&(Jg.f=function(rn){for(var on=tn(rn),an=0,ln=on.length;an{var FC=Dr(),$C=Wo(),zC=FC("iterator"),WC=Array.prototype;ev.exports=function(tn){return tn!==void 0&&($C.Array===tn||WC[zC]===tn)}});var Iu=Cn((bq,nv)=>{var VC=xu(),UC=Wo(),YC=Dr(),KC=YC("iterator");nv.exports=function(tn){if(tn!=null)return tn[KC]||tn["@@iterator"]||UC[VC(tn)]}});var iv=Cn((yq,rv)=>{var GC=Vr(),XC=Iu();rv.exports=function(tn,en){var nn=arguments.length<2?XC(tn):en;if(typeof nn!="function")throw TypeError(String(tn)+" is not iterable");return GC(nn.call(tn))}});var av=Cn((Eq,sv)=>{var ov=Vr();sv.exports=function(tn,en,nn){var rn,on;ov(tn);try{if(rn=tn.return,rn===void 0){if(en==="throw")throw nn;return nn}rn=rn.call(tn)}catch(an){on=!0,rn=an}if(en==="throw")throw nn;if(on)throw rn;return ov(rn),nn}});var Pu=Cn((_q,cv)=>{var JC=Vr(),QC=tv(),ZC=So(),eL=eu(),tL=iv(),nL=Iu(),lv=av(),Fs=function(tn,en){this.stopped=tn,this.result=en};cv.exports=function(tn,en,nn){var rn=nn&&nn.that,on=!!(nn&&nn.AS_ENTRIES),an=!!(nn&&nn.IS_ITERATOR),ln=!!(nn&&nn.INTERRUPTED),cn=eL(en,rn,1+on+ln),dn,fn,un,gn,hn,pn,vn,yn=function(bn){return dn&&lv(dn,"return",bn),new Fs(!0,bn)},mn=function(bn){return on?(JC(bn),ln?cn(bn[0],bn[1],yn):cn(bn[0],bn[1])):ln?cn(bn,yn):cn(bn)};if(an)dn=tn;else{if(fn=nL(tn),typeof fn!="function")throw TypeError("Target is not iterable");if(QC(fn)){for(un=0,gn=ZC(tn.length);gn>un;un++)if(hn=mn(tn[un]),hn&&hn instanceof Fs)return hn;return new Fs(!1)}dn=tL(tn,fn)}for(pn=dn.next;!(vn=pn.call(dn)).done;){try{hn=mn(vn.value)}catch(bn){lv(dn,"throw",bn)}if(typeof hn=="object"&&hn&&hn instanceof Fs)return hn}return new Fs(!1)}});var ku=Cn((Sq,uv)=>{uv.exports=function(tn,en,nn){if(!(tn instanceof en))throw TypeError("Incorrect "+(nn?nn+" ":"")+"invocation");return tn}});var mv=Cn((wq,pv)=>{var rL=Dr(),fv=rL("iterator"),dv=!1;try{hv=0,Nu={next:function(){return{done:!!hv++}},return:function(){dv=!0}},Nu[fv]=function(){return this},Array.from(Nu,function(){throw 2})}catch(tn){}var hv,Nu;pv.exports=function(tn,en){if(!en&&!dv)return!1;var nn=!1;try{var rn={};rn[fv]=function(){return{next:function(){return{done:nn=!0}}}},tn(rn)}catch(on){}return nn}});var bv=Cn((xq,vv)=>{var iL=Wr(),gv=vu();vv.exports=function(tn,en,nn){var rn,on;return gv&&typeof(rn=en.constructor)=="function"&&rn!==nn&&iL(on=rn.prototype)&&on!==nn.prototype&&gv(tn,on),tn}});var _v=Cn((Tq,Ev)=>{"use strict";var oL=ci(),sL=br(),yv=Jc(),aL=_o(),lL=ol(),cL=Pu(),uL=ku(),Ru=Wr(),ju=Ar(),fL=mv(),dL=Qa(),hL=bv();Ev.exports=function(tn,en,nn){var rn=tn.indexOf("Map")!==-1,on=tn.indexOf("Weak")!==-1,an=rn?"set":"add",ln=sL[tn],cn=ln&&ln.prototype,dn=ln,fn={},un=function(bn){var Sn=cn[bn];aL(cn,bn,bn=="add"?function(Tn){return Sn.call(this,Tn===0?0:Tn),this}:bn=="delete"?function(An){return on&&!Ru(An)?!1:Sn.call(this,An===0?0:An)}:bn=="get"?function(Tn){return on&&!Ru(Tn)?void 0:Sn.call(this,Tn===0?0:Tn)}:bn=="has"?function(Tn){return on&&!Ru(Tn)?!1:Sn.call(this,Tn===0?0:Tn)}:function(Tn,kn){return Sn.call(this,Tn===0?0:Tn,kn),this})},gn=yv(tn,typeof ln!="function"||!(on||cn.forEach&&!ju(function(){new ln().entries().next()})));if(gn)dn=nn.getConstructor(en,tn,rn,an),lL.enable();else if(yv(tn,!0)){var hn=new dn,pn=hn[an](on?{}:-0,1)!=hn,vn=ju(function(){hn.has(1)}),yn=fL(function(bn){new ln(bn)}),mn=!on&&ju(function(){for(var bn=new ln,Sn=5;Sn--;)bn[an](Sn,Sn);return!bn.has(-0)});yn||(dn=en(function(bn,Sn){uL(bn,dn,tn);var An=hL(new ln,bn,dn);return Sn!=null&&cL(Sn,An[an],{that:An,AS_ENTRIES:rn}),An}),dn.prototype=cn,cn.constructor=dn),(vn||mn)&&(un("delete"),un("has"),rn&&un("get")),(mn||pn)&&un(an),on&&cn.clear&&delete cn.clear}return fn[tn]=dn,oL({global:!0,forced:dn!=ln},fn),dL(dn,tn),on||nn.setStrong(dn,tn,rn),dn}});var Cv=Cn((Oq,Av)=>{"use strict";var Sv=Cu(),sl=ol().getWeakData,pL=Vr(),qu=Wr(),mL=ku(),gL=Pu(),wv=Ka(),xv=Xr(),Tv=Eo(),vL=Tv.set,bL=Tv.getterFor,yL=wv.find,EL=wv.findIndex,_L=0,al=function(tn){return tn.frozen||(tn.frozen=new Ov)},Ov=function(){this.entries=[]},Hu=function(tn,en){return yL(tn.entries,function(nn){return nn[0]===en})};Ov.prototype={get:function(tn){var en=Hu(this,tn);if(en)return en[1]},has:function(tn){return!!Hu(this,tn)},set:function(tn,en){var nn=Hu(this,tn);nn?nn[1]=en:this.entries.push([tn,en])},delete:function(tn){var en=EL(this.entries,function(nn){return nn[0]===tn});return~en&&this.entries.splice(en,1),!!~en}};Av.exports={getConstructor:function(tn,en,nn,rn){var on=tn(function(cn,dn){mL(cn,on,en),vL(cn,{type:en,id:_L++,frozen:void 0}),dn!=null&&gL(dn,cn[rn],{that:cn,AS_ENTRIES:nn})}),an=bL(en),ln=function(cn,dn,fn){var un=an(cn),gn=sl(pL(dn),!0);return gn===!0?al(un).set(dn,fn):gn[un.id]=fn,cn};return Sv(on.prototype,{delete:function(cn){var dn=an(this);if(!qu(cn))return!1;var fn=sl(cn);return fn===!0?al(dn).delete(cn):fn&&xv(fn,dn.id)&&delete fn[dn.id]},has:function(dn){var fn=an(this);if(!qu(dn))return!1;var un=sl(dn);return un===!0?al(fn).has(dn):un&&xv(un,fn.id)}}),Sv(on.prototype,nn?{get:function(dn){var fn=an(this);if(qu(dn)){var un=sl(dn);return un===!0?al(fn).get(dn):un?un[fn.id]:void 0}},set:function(dn,fn){return ln(this,dn,fn)}}:{add:function(dn){return ln(this,dn,!0)}}),on}}});var Pv=Cn((Aq,Iv)=>{"use strict";var Lv=br(),SL=Cu(),wL=ol(),xL=_v(),Dv=Cv(),ll=Wr(),cl=Eo().enforce,TL=Wc(),OL=!Lv.ActiveXObject&&"ActiveXObject"in Lv,ul=Object.isExtensible,$s,Mv=function(tn){return function(){return tn(this,arguments.length?arguments[0]:void 0)}},AL=Iv.exports=xL("WeakMap",Mv,Dv);TL&&OL&&($s=Dv.getConstructor(Mv,"WeakMap",!0),wL.enable(),Uo=AL.prototype,Bu=Uo.delete,zs=Uo.has,Fu=Uo.get,$u=Uo.set,SL(Uo,{delete:function(tn){if(ll(tn)&&!ul(tn)){var en=cl(this);return en.frozen||(en.frozen=new $s),Bu.call(this,tn)||en.frozen.delete(tn)}return Bu.call(this,tn)},has:function(en){if(ll(en)&&!ul(en)){var nn=cl(this);return nn.frozen||(nn.frozen=new $s),zs.call(this,en)||nn.frozen.has(en)}return zs.call(this,en)},get:function(en){if(ll(en)&&!ul(en)){var nn=cl(this);return nn.frozen||(nn.frozen=new $s),zs.call(this,en)?Fu.call(this,en):nn.frozen.get(en)}return Fu.call(this,en)},set:function(en,nn){if(ll(en)&&!ul(en)){var rn=cl(this);rn.frozen||(rn.frozen=new $s),zs.call(this,en)?$u.call(this,en,nn):rn.frozen.set(en,nn)}else $u.call(this,en,nn);return this}}));var Uo,Bu,zs,Fu,$u});var Fv=Cn((Lq,Bv)=>{var jv="Expected a function",qv=0/0,LL="[object Symbol]",DL=/^\s+|\s+$/g,ML=/^[-+]0x[0-9a-f]+$/i,IL=/^0b[01]+$/i,PL=/^0o[0-7]+$/i,kL=parseInt,NL=typeof global=="object"&&global&&global.Object===Object&&global,RL=typeof self=="object"&&self&&self.Object===Object&&self,jL=NL||RL||Function("return this")(),qL=Object.prototype,HL=qL.toString,BL=Math.max,FL=Math.min,Yu=function(){return jL.Date.now()};function $L(tn,en,nn){var rn,on,an,ln,cn,dn,fn=0,un=!1,gn=!1,hn=!0;if(typeof tn!="function")throw new TypeError(jv);en=Hv(en)||0,dl(nn)&&(un=!!nn.leading,gn="maxWait"in nn,an=gn?BL(Hv(nn.maxWait)||0,en):an,hn="trailing"in nn?!!nn.trailing:hn);function pn(Dn){var qn=rn,Fn=on;return rn=on=void 0,fn=Dn,ln=tn.apply(Fn,qn),ln}function vn(Dn){return fn=Dn,cn=setTimeout(bn,en),un?pn(Dn):ln}function yn(Dn){var qn=Dn-dn,Fn=Dn-fn,Un=en-qn;return gn?FL(Un,an-Fn):Un}function mn(Dn){var qn=Dn-dn,Fn=Dn-fn;return dn===void 0||qn>=en||qn<0||gn&&Fn>=an}function bn(){var Dn=Yu();if(mn(Dn))return Sn(Dn);cn=setTimeout(bn,yn(Dn))}function Sn(Dn){return cn=void 0,hn&&rn?pn(Dn):(rn=on=void 0,ln)}function An(){cn!==void 0&&clearTimeout(cn),fn=0,rn=dn=on=cn=void 0}function Tn(){return cn===void 0?ln:Sn(Yu())}function kn(){var Dn=Yu(),qn=mn(Dn);if(rn=arguments,on=this,dn=Dn,qn){if(cn===void 0)return vn(dn);if(gn)return cn=setTimeout(bn,en),pn(dn)}return cn===void 0&&(cn=setTimeout(bn,en)),ln}return kn.cancel=An,kn.flush=Tn,kn}function zL(tn,en,nn){var rn=!0,on=!0;if(typeof tn!="function")throw new TypeError(jv);return dl(nn)&&(rn="leading"in nn?!!nn.leading:rn,on="trailing"in nn?!!nn.trailing:on),$L(tn,en,{leading:rn,maxWait:en,trailing:on})}function dl(tn){var en=typeof tn;return!!tn&&(en=="object"||en=="function")}function WL(tn){return!!tn&&typeof tn=="object"}function VL(tn){return typeof tn=="symbol"||WL(tn)&&HL.call(tn)==LL}function Hv(tn){if(typeof tn=="number")return tn;if(VL(tn))return qv;if(dl(tn)){var en=typeof tn.valueOf=="function"?tn.valueOf():tn;tn=dl(en)?en+"":en}if(typeof tn!="string")return tn===0?tn:+tn;tn=tn.replace(DL,"");var nn=IL.test(tn);return nn||PL.test(tn)?kL(tn.slice(2),nn?2:8):ML.test(tn)?qv:+tn}Bv.exports=zL});var Vv=Cn((Dq,Wv)=>{var UL="Expected a function",$v=0/0,YL="[object Symbol]",KL=/^\s+|\s+$/g,GL=/^[-+]0x[0-9a-f]+$/i,XL=/^0b[01]+$/i,JL=/^0o[0-7]+$/i,QL=parseInt,ZL=typeof global=="object"&&global&&global.Object===Object&&global,eD=typeof self=="object"&&self&&self.Object===Object&&self,tD=ZL||eD||Function("return this")(),nD=Object.prototype,rD=nD.toString,iD=Math.max,oD=Math.min,Ku=function(){return tD.Date.now()};function sD(tn,en,nn){var rn,on,an,ln,cn,dn,fn=0,un=!1,gn=!1,hn=!0;if(typeof tn!="function")throw new TypeError(UL);en=zv(en)||0,Gu(nn)&&(un=!!nn.leading,gn="maxWait"in nn,an=gn?iD(zv(nn.maxWait)||0,en):an,hn="trailing"in nn?!!nn.trailing:hn);function pn(Dn){var qn=rn,Fn=on;return rn=on=void 0,fn=Dn,ln=tn.apply(Fn,qn),ln}function vn(Dn){return fn=Dn,cn=setTimeout(bn,en),un?pn(Dn):ln}function yn(Dn){var qn=Dn-dn,Fn=Dn-fn,Un=en-qn;return gn?oD(Un,an-Fn):Un}function mn(Dn){var qn=Dn-dn,Fn=Dn-fn;return dn===void 0||qn>=en||qn<0||gn&&Fn>=an}function bn(){var Dn=Ku();if(mn(Dn))return Sn(Dn);cn=setTimeout(bn,yn(Dn))}function Sn(Dn){return cn=void 0,hn&&rn?pn(Dn):(rn=on=void 0,ln)}function An(){cn!==void 0&&clearTimeout(cn),fn=0,rn=dn=on=cn=void 0}function Tn(){return cn===void 0?ln:Sn(Ku())}function kn(){var Dn=Ku(),qn=mn(Dn);if(rn=arguments,on=this,dn=Dn,qn){if(cn===void 0)return vn(dn);if(gn)return cn=setTimeout(bn,en),pn(dn)}return cn===void 0&&(cn=setTimeout(bn,en)),ln}return kn.cancel=An,kn.flush=Tn,kn}function Gu(tn){var en=typeof tn;return!!tn&&(en=="object"||en=="function")}function aD(tn){return!!tn&&typeof tn=="object"}function lD(tn){return typeof tn=="symbol"||aD(tn)&&rD.call(tn)==YL}function zv(tn){if(typeof tn=="number")return tn;if(lD(tn))return $v;if(Gu(tn)){var en=typeof tn.valueOf=="function"?tn.valueOf():tn;tn=Gu(en)?en+"":en}if(typeof tn!="string")return tn===0?tn:+tn;tn=tn.replace(KL,"");var nn=XL.test(tn);return nn||JL.test(tn)?QL(tn.slice(2),nn?2:8):GL.test(tn)?$v:+tn}Wv.exports=sD});var eb=Cn((Mq,Zv)=>{var cD="Expected a function",Uv="__lodash_hash_undefined__",uD="[object Function]",fD="[object GeneratorFunction]",dD=/[\\^$.*+?()[\]{}|]/g,hD=/^\[object .+?Constructor\]$/,pD=typeof global=="object"&&global&&global.Object===Object&&global,mD=typeof self=="object"&&self&&self.Object===Object&&self,Yv=pD||mD||Function("return this")();function gD(tn,en){return tn==null?void 0:tn[en]}function vD(tn){var en=!1;if(tn!=null&&typeof tn.toString!="function")try{en=!!(tn+"")}catch(nn){}return en}var bD=Array.prototype,yD=Function.prototype,Kv=Object.prototype,Xu=Yv["__core-js_shared__"],Gv=function(){var tn=/[^.]+$/.exec(Xu&&Xu.keys&&Xu.keys.IE_PROTO||"");return tn?"Symbol(src)_1."+tn:""}(),Xv=yD.toString,Ju=Kv.hasOwnProperty,ED=Kv.toString,_D=RegExp("^"+Xv.call(Ju).replace(dD,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),SD=bD.splice,wD=Jv(Yv,"Map"),Vs=Jv(Object,"create");function To(tn){var en=-1,nn=tn?tn.length:0;for(this.clear();++en-1}function PD(tn,en){var nn=this.__data__,rn=hl(nn,tn);return rn<0?nn.push([tn,en]):nn[rn][1]=en,this}Yo.prototype.clear=LD;Yo.prototype.delete=DD;Yo.prototype.get=MD;Yo.prototype.has=ID;Yo.prototype.set=PD;function Oo(tn){var en=-1,nn=tn?tn.length:0;for(this.clear();++en{var ZD=Zc(),eM=bo(),tM=Ms(),nM=So(),bb=function(tn){return function(en,nn,rn,on){ZD(nn);var an=eM(en),ln=tM(an),cn=nM(an.length),dn=tn?cn-1:0,fn=tn?-1:1;if(rn<2)for(;;){if(dn in ln){on=ln[dn],dn+=fn;break}if(dn+=fn,tn?dn<0:cn<=dn)throw TypeError("Reduce of empty array with no initial value")}for(;tn?dn>=0:cn>dn;dn+=fn)dn in ln&&(on=nn(on,ln[dn],dn,an));return on}};yb.exports={left:bb(!1),right:bb(!0)}});var Sb=Cn((zH,_b)=>{var rM=$o(),iM=br();_b.exports=rM(iM.process)=="process"});var Ob=Cn((UH,Tb)=>{"use strict";var mM=Vr();Tb.exports=function(){var tn=mM(this),en="";return tn.global&&(en+="g"),tn.ignoreCase&&(en+="i"),tn.multiline&&(en+="m"),tn.dotAll&&(en+="s"),tn.unicode&&(en+="u"),tn.sticky&&(en+="y"),en}});var Lb=Cn(ff=>{var Ab=Ar(),gM=br(),Cb=gM.RegExp;ff.UNSUPPORTED_Y=Ab(function(){var tn=Cb("a","y");return tn.lastIndex=2,tn.exec("abcd")!=null});ff.BROKEN_CARET=Ab(function(){var tn=Cb("^r","gy");return tn.lastIndex=2,tn.exec("str")!=null})});var Mb=Cn((KH,Db)=>{var vM=Ar(),bM=br(),yM=bM.RegExp;Db.exports=vM(function(){var tn=yM(".","s");return!(tn.dotAll&&tn.exec(` -`)&&tn.flags==="s")})});var Pb=Cn((GH,Ib)=>{var EM=Ar(),_M=br(),SM=_M.RegExp;Ib.exports=EM(function(){var tn=SM("(?b)","g");return tn.exec("b").groups.a!=="b"||"b".replace(tn,"$c")!=="bc"})});var wl=Cn((XH,Rb)=>{"use strict";var wM=Yi(),xM=Ob(),kb=Lb(),TM=Fa(),OM=Ja(),AM=Eo().get,CM=Mb(),LM=Pb(),Sl=RegExp.prototype.exec,DM=TM("native-string-replace",String.prototype.replace),df=Sl,hf=function(){var tn=/a/,en=/b*/g;return Sl.call(tn,"a"),Sl.call(en,"a"),tn.lastIndex!==0||en.lastIndex!==0}(),Nb=kb.UNSUPPORTED_Y||kb.BROKEN_CARET,pf=/()??/.exec("")[1]!==void 0,MM=hf||pf||Nb||CM||LM;MM&&(df=function(en){var nn=this,rn=AM(nn),on=wM(en),an=rn.raw,ln,cn,dn,fn,un,gn,hn;if(an)return an.lastIndex=nn.lastIndex,ln=df.call(an,on),nn.lastIndex=an.lastIndex,ln;var pn=rn.groups,vn=Nb&&nn.sticky,yn=xM.call(nn),mn=nn.source,bn=0,Sn=on;if(vn&&(yn=yn.replace("y",""),yn.indexOf("g")===-1&&(yn+="g"),Sn=on.slice(nn.lastIndex),nn.lastIndex>0&&(!nn.multiline||nn.multiline&&on.charAt(nn.lastIndex-1)!==` -`)&&(mn="(?: "+mn+")",Sn=" "+Sn,bn++),cn=new RegExp("^(?:"+mn+")",yn)),pf&&(cn=new RegExp("^"+mn+"$(?!\\s)",yn)),hf&&(dn=nn.lastIndex),fn=Sl.call(vn?cn:nn,Sn),vn?fn?(fn.input=fn.input.slice(bn),fn[0]=fn[0].slice(bn),fn.index=nn.lastIndex,nn.lastIndex+=fn[0].length):nn.lastIndex=0:hf&&fn&&(nn.lastIndex=nn.global?fn.index+fn[0].length:dn),pf&&fn&&fn.length>1&&DM.call(fn[0],cn,function(){for(un=1;un{"use strict";var IM=ci(),jb=wl();IM({target:"RegExp",proto:!0,forced:/./.exec!==jb},{exec:jb})});var vf=Cn((ZH,Fb)=>{"use strict";mf();var qb=_o(),PM=wl(),Hb=Ar(),Bb=Dr(),kM=Li(),NM=Bb("species"),gf=RegExp.prototype;Fb.exports=function(tn,en,nn,rn){var on=Bb(tn),an=!Hb(function(){var fn={};return fn[on]=function(){return 7},""[tn](fn)!=7}),ln=an&&!Hb(function(){var fn=!1,un=/a/;return tn==="split"&&(un={},un.constructor={},un.constructor[NM]=function(){return un},un.flags="",un[on]=/./[on]),un.exec=function(){return fn=!0,null},un[on](""),!fn});if(!an||!ln||nn){var cn=/./[on],dn=en(on,""[tn],function(fn,un,gn,hn,pn){var vn=un.exec;return vn===PM||vn===gf.exec?an&&!pn?{done:!0,value:cn.call(un,gn,hn)}:{done:!0,value:fn.call(gn,un,hn)}:{done:!1}});qb(String.prototype,tn,dn[0]),qb(gf,on,dn[1])}rn&&kM(gf[on],"sham",!0)}});var bf=Cn((eB,$b)=>{"use strict";var RM=Au().charAt;$b.exports=function(tn,en,nn){return en+(nn?RM(tn,en).length:1)}});var yf=Cn((tB,zb)=>{var jM=$o(),qM=wl();zb.exports=function(tn,en){var nn=tn.exec;if(typeof nn=="function"){var rn=nn.call(tn,en);if(typeof rn!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return rn}if(jM(tn)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return qM.call(tn,en)}});var Ub=Cn((rB,Vb)=>{var WM=bo(),VM=Math.floor,UM="".replace,YM=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,KM=/\$([$&'`]|\d{1,2})/g;Vb.exports=function(tn,en,nn,rn,on,an){var ln=nn+tn.length,cn=rn.length,dn=KM;return on!==void 0&&(on=WM(on),dn=YM),UM.call(an,dn,function(fn,un){var gn;switch(un.charAt(0)){case"$":return"$";case"&":return tn;case"`":return en.slice(0,nn);case"'":return en.slice(ln);case"<":gn=on[un.slice(1,-1)];break;default:var hn=+un;if(hn===0)return fn;if(hn>cn){var pn=VM(hn/10);return pn===0?fn:pn<=cn?rn[pn-1]===void 0?un.charAt(1):rn[pn-1]+un.charAt(1):fn}gn=rn[hn-1]}return gn===void 0?"":gn})}});var Jb=Cn(xf=>{"use strict";xf.parse=hI;xf.serialize=pI;var uI=decodeURIComponent,fI=encodeURIComponent,dI=/; */,Al=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;function hI(tn,en){if(typeof tn!="string")throw new TypeError("argument str must be a string");for(var nn={},rn=en||{},on=tn.split(dI),an=rn.decode||uI,ln=0;ln{(function(tn,en){typeof define=="function"&&define.amd?define(en):typeof Ll=="object"&&Ll.exports?Ll.exports=en():tn.EvEmitter=en()})(typeof window!="undefined"?window:hy,function(){"use strict";function tn(){}var en=tn.prototype;return en.on=function(nn,rn){if(!(!nn||!rn)){var on=this._events=this._events||{},an=on[nn]=on[nn]||[];return an.indexOf(rn)==-1&&an.push(rn),this}},en.once=function(nn,rn){if(!(!nn||!rn)){this.on(nn,rn);var on=this._onceEvents=this._onceEvents||{},an=on[nn]=on[nn]||{};return an[rn]=!0,this}},en.off=function(nn,rn){var on=this._events&&this._events[nn];if(!(!on||!on.length)){var an=on.indexOf(rn);return an!=-1&&on.splice(an,1),this}},en.emitEvent=function(nn,rn){var on=this._events&&this._events[nn];if(!(!on||!on.length)){on=on.slice(0),rn=rn||[];for(var an=this._onceEvents&&this._onceEvents[nn],ln=0;ln{(function(tn,en){typeof define=="function"&&define.amd?define(en):typeof Dl=="object"&&Dl.exports?Dl.exports=en():tn.getSize=en()})(window,function(){"use strict";function en(hn){var pn=parseFloat(hn),vn=hn.indexOf("%")==-1&&!isNaN(pn);return vn&&pn}function nn(){}var rn=typeof console=="undefined"?nn:function(hn){console.error(hn)},on=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],an=on.length;function ln(){for(var hn={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},pn=0;pnb)","g");return tn.exec("b").groups.a!=="b"||"b".replace(tn,"$c")!=="bc"})});var wl=Cn((KH,Rb)=>{"use strict";var SM=Ui(),wM=Ob(),kb=Lb(),xM=Fa(),TM=Ja(),OM=Eo().get,AM=Mb(),CM=Pb(),Sl=RegExp.prototype.exec,LM=xM("native-string-replace",String.prototype.replace),df=Sl,hf=function(){var tn=/a/,en=/b*/g;return Sl.call(tn,"a"),Sl.call(en,"a"),tn.lastIndex!==0||en.lastIndex!==0}(),Nb=kb.UNSUPPORTED_Y||kb.BROKEN_CARET,pf=/()??/.exec("")[1]!==void 0,DM=hf||pf||Nb||AM||CM;DM&&(df=function(en){var nn=this,rn=OM(nn),on=SM(en),an=rn.raw,ln,cn,dn,fn,un,gn,hn;if(an)return an.lastIndex=nn.lastIndex,ln=df.call(an,on),nn.lastIndex=an.lastIndex,ln;var pn=rn.groups,vn=Nb&&nn.sticky,yn=wM.call(nn),mn=nn.source,bn=0,Sn=on;if(vn&&(yn=yn.replace("y",""),yn.indexOf("g")===-1&&(yn+="g"),Sn=on.slice(nn.lastIndex),nn.lastIndex>0&&(!nn.multiline||nn.multiline&&on.charAt(nn.lastIndex-1)!==` +`)&&(mn="(?: "+mn+")",Sn=" "+Sn,bn++),cn=new RegExp("^(?:"+mn+")",yn)),pf&&(cn=new RegExp("^"+mn+"$(?!\\s)",yn)),hf&&(dn=nn.lastIndex),fn=Sl.call(vn?cn:nn,Sn),vn?fn?(fn.input=fn.input.slice(bn),fn[0]=fn[0].slice(bn),fn.index=nn.lastIndex,nn.lastIndex+=fn[0].length):nn.lastIndex=0:hf&&fn&&(nn.lastIndex=nn.global?fn.index+fn[0].length:dn),pf&&fn&&fn.length>1&&LM.call(fn[0],cn,function(){for(un=1;un{"use strict";var MM=li(),jb=wl();MM({target:"RegExp",proto:!0,forced:/./.exec!==jb},{exec:jb})});var vf=Cn((JH,Fb)=>{"use strict";mf();var qb=_o(),IM=wl(),Hb=Ar(),Bb=Dr(),PM=Ci(),kM=Bb("species"),gf=RegExp.prototype;Fb.exports=function(tn,en,nn,rn){var on=Bb(tn),an=!Hb(function(){var fn={};return fn[on]=function(){return 7},""[tn](fn)!=7}),ln=an&&!Hb(function(){var fn=!1,un=/a/;return tn==="split"&&(un={},un.constructor={},un.constructor[kM]=function(){return un},un.flags="",un[on]=/./[on]),un.exec=function(){return fn=!0,null},un[on](""),!fn});if(!an||!ln||nn){var cn=/./[on],dn=en(on,""[tn],function(fn,un,gn,hn,pn){var vn=un.exec;return vn===IM||vn===gf.exec?an&&!pn?{done:!0,value:cn.call(un,gn,hn)}:{done:!0,value:fn.call(gn,un,hn)}:{done:!1}});qb(String.prototype,tn,dn[0]),qb(gf,on,dn[1])}rn&&PM(gf[on],"sham",!0)}});var bf=Cn((QH,$b)=>{"use strict";var NM=Au().charAt;$b.exports=function(tn,en,nn){return en+(nn?NM(tn,en).length:1)}});var yf=Cn((ZH,zb)=>{var RM=$o(),jM=wl();zb.exports=function(tn,en){var nn=tn.exec;if(typeof nn=="function"){var rn=nn.call(tn,en);if(typeof rn!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return rn}if(RM(tn)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return jM.call(tn,en)}});var Ub=Cn((tB,Vb)=>{var zM=bo(),WM=Math.floor,VM="".replace,UM=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,YM=/\$([$&'`]|\d{1,2})/g;Vb.exports=function(tn,en,nn,rn,on,an){var ln=nn+tn.length,cn=rn.length,dn=YM;return on!==void 0&&(on=zM(on),dn=UM),VM.call(an,dn,function(fn,un){var gn;switch(un.charAt(0)){case"$":return"$";case"&":return tn;case"`":return en.slice(0,nn);case"'":return en.slice(ln);case"<":gn=on[un.slice(1,-1)];break;default:var hn=+un;if(hn===0)return fn;if(hn>cn){var pn=WM(hn/10);return pn===0?fn:pn<=cn?rn[pn-1]===void 0?un.charAt(1):rn[pn-1]+un.charAt(1):fn}gn=rn[hn-1]}return gn===void 0?"":gn})}});var Jb=Cn(xf=>{"use strict";xf.parse=dI;xf.serialize=hI;var cI=decodeURIComponent,uI=encodeURIComponent,fI=/; */,Al=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;function dI(tn,en){if(typeof tn!="string")throw new TypeError("argument str must be a string");for(var nn={},rn=en||{},on=tn.split(fI),an=rn.decode||cI,ln=0;ln{(function(tn,en){typeof define=="function"&&define.amd?define(en):typeof Ll=="object"&&Ll.exports?Ll.exports=en():tn.EvEmitter=en()})(typeof window!="undefined"?window:hy,function(){"use strict";function tn(){}var en=tn.prototype;return en.on=function(nn,rn){if(!(!nn||!rn)){var on=this._events=this._events||{},an=on[nn]=on[nn]||[];return an.indexOf(rn)==-1&&an.push(rn),this}},en.once=function(nn,rn){if(!(!nn||!rn)){this.on(nn,rn);var on=this._onceEvents=this._onceEvents||{},an=on[nn]=on[nn]||{};return an[rn]=!0,this}},en.off=function(nn,rn){var on=this._events&&this._events[nn];if(!(!on||!on.length)){var an=on.indexOf(rn);return an!=-1&&on.splice(an,1),this}},en.emitEvent=function(nn,rn){var on=this._events&&this._events[nn];if(!(!on||!on.length)){on=on.slice(0),rn=rn||[];for(var an=this._onceEvents&&this._onceEvents[nn],ln=0;ln{(function(tn,en){typeof define=="function"&&define.amd?define(en):typeof Dl=="object"&&Dl.exports?Dl.exports=en():tn.getSize=en()})(window,function(){"use strict";function en(hn){var pn=parseFloat(hn),vn=hn.indexOf("%")==-1&&!isNaN(pn);return vn&&pn}function nn(){}var rn=typeof console=="undefined"?nn:function(hn){console.error(hn)},on=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],an=on.length;function ln(){for(var hn={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},pn=0;pn")!=="7"});GM("replace",function(tn,en,nn){var rn=Yb?"$":"$0";return[function(an,ln){var cn=eI(this),dn=an==null?void 0:an[_f];return dn!==void 0?dn.call(an,cn,ln):en.call(Go(cn),an,ln)},function(on,an){var ln=JM(this),cn=Go(on);if(typeof an=="string"&&an.indexOf(rn)===-1&&an.indexOf("$<")===-1){var dn=nn(en,ln,cn,an);if(dn.done)return dn.value}var fn=typeof an=="function";fn||(an=Go(an));var un=ln.global;if(un){var gn=ln.unicode;ln.lastIndex=0}for(var hn=[];;){var pn=rI(ln,cn);if(pn===null||(hn.push(pn),!un))break;var vn=Go(pn[0]);vn===""&&(ln.lastIndex=tI(cn,ZM(ln.lastIndex),gn))}for(var yn="",mn=0,bn=0;bn=mn&&(yn+=cn.slice(mn,An)+Fn,mn=An+Sn.length)}return yn+cn.slice(mn)}]},!cI||!lI||Yb);var Tl=function(en){var nn=Array.prototype.reduce.call(en,function(rn,on){var an=on.name.match(/data-simplebar-(.+)/);if(an){var ln=an[1].replace(/\W+(.)/g,function(cn,dn){return dn.toUpperCase()});switch(on.value){case"true":rn[ln]=!0;break;case"false":rn[ln]=!1;break;case void 0:rn[ln]=!0;break;default:rn[ln]=on.value}}return rn},{});return nn};function Ki(tn){return!tn||!tn.ownerDocument||!tn.ownerDocument.defaultView?window:tn.ownerDocument.defaultView}function Ol(tn){return!tn||!tn.ownerDocument?document:tn.ownerDocument}var Xo=null,Gb=null;xl.default&&window.addEventListener("resize",function(){Gb!==window.devicePixelRatio&&(Gb=window.devicePixelRatio,Xo=null)});function Xb(tn){if(Xo===null){var en=Ol(tn);if(typeof en=="undefined")return Xo=0,Xo;var nn=en.body,rn=en.createElement("div");rn.classList.add("simplebar-hide-scrollbar"),nn.appendChild(rn);var on=rn.getBoundingClientRect().right;nn.removeChild(rn),Xo=on}return Xo}var Er=function(){function tn(nn,rn){var on=this;this.onScroll=function(){var an=Ki(on.el);on.scrollXTicking||(an.requestAnimationFrame(on.scrollX),on.scrollXTicking=!0),on.scrollYTicking||(an.requestAnimationFrame(on.scrollY),on.scrollYTicking=!0)},this.scrollX=function(){on.axis.x.isOverflowing&&(on.showScrollbar("x"),on.positionScrollbar("x")),on.scrollXTicking=!1},this.scrollY=function(){on.axis.y.isOverflowing&&(on.showScrollbar("y"),on.positionScrollbar("y")),on.scrollYTicking=!1},this.onMouseEnter=function(){on.showScrollbar("x"),on.showScrollbar("y")},this.onMouseMove=function(an){on.mouseX=an.clientX,on.mouseY=an.clientY,(on.axis.x.isOverflowing||on.axis.x.forceVisible)&&on.onMouseMoveForAxis("x"),(on.axis.y.isOverflowing||on.axis.y.forceVisible)&&on.onMouseMoveForAxis("y")},this.onMouseLeave=function(){on.onMouseMove.cancel(),(on.axis.x.isOverflowing||on.axis.x.forceVisible)&&on.onMouseLeaveForAxis("x"),(on.axis.y.isOverflowing||on.axis.y.forceVisible)&&on.onMouseLeaveForAxis("y"),on.mouseX=-1,on.mouseY=-1},this.onWindowResize=function(){on.scrollbarWidth=on.getScrollbarWidth(),on.hideNativeScrollbar()},this.hideScrollbars=function(){on.axis.x.track.rect=on.axis.x.track.el.getBoundingClientRect(),on.axis.y.track.rect=on.axis.y.track.el.getBoundingClientRect(),on.isWithinBounds(on.axis.y.track.rect)||(on.axis.y.scrollbar.el.classList.remove(on.classNames.visible),on.axis.y.isVisible=!1),on.isWithinBounds(on.axis.x.track.rect)||(on.axis.x.scrollbar.el.classList.remove(on.classNames.visible),on.axis.x.isVisible=!1)},this.onPointerEvent=function(an){var ln,cn;on.axis.x.track.rect=on.axis.x.track.el.getBoundingClientRect(),on.axis.y.track.rect=on.axis.y.track.el.getBoundingClientRect(),(on.axis.x.isOverflowing||on.axis.x.forceVisible)&&(ln=on.isWithinBounds(on.axis.x.track.rect)),(on.axis.y.isOverflowing||on.axis.y.forceVisible)&&(cn=on.isWithinBounds(on.axis.y.track.rect)),(ln||cn)&&(an.preventDefault(),an.stopPropagation(),an.type==="mousedown"&&(ln&&(on.axis.x.scrollbar.rect=on.axis.x.scrollbar.el.getBoundingClientRect(),on.isWithinBounds(on.axis.x.scrollbar.rect)?on.onDragStart(an,"x"):on.onTrackClick(an,"x")),cn&&(on.axis.y.scrollbar.rect=on.axis.y.scrollbar.el.getBoundingClientRect(),on.isWithinBounds(on.axis.y.scrollbar.rect)?on.onDragStart(an,"y"):on.onTrackClick(an,"y"))))},this.drag=function(an){var ln,cn=on.axis[on.draggedAxis].track,dn=cn.rect[on.axis[on.draggedAxis].sizeAttr],fn=on.axis[on.draggedAxis].scrollbar,un=on.contentWrapperEl[on.axis[on.draggedAxis].scrollSizeAttr],gn=parseInt(on.elStyles[on.axis[on.draggedAxis].sizeAttr],10);an.preventDefault(),an.stopPropagation(),on.draggedAxis==="y"?ln=an.pageY:ln=an.pageX;var hn=ln-cn.rect[on.axis[on.draggedAxis].offsetAttr]-on.axis[on.draggedAxis].dragOffset,pn=hn/(dn-fn.size),vn=pn*(un-gn);on.draggedAxis==="x"&&(vn=on.isRtl&&tn.getRtlHelpers().isRtlScrollbarInverted?vn-(dn+fn.size):vn,vn=on.isRtl&&tn.getRtlHelpers().isRtlScrollingInverted?-vn:vn),on.contentWrapperEl[on.axis[on.draggedAxis].scrollOffsetAttr]=vn},this.onEndDrag=function(an){var ln=Ol(on.el),cn=Ki(on.el);an.preventDefault(),an.stopPropagation(),on.el.classList.remove(on.classNames.dragging),ln.removeEventListener("mousemove",on.drag,!0),ln.removeEventListener("mouseup",on.onEndDrag,!0),on.removePreventClickId=cn.setTimeout(function(){ln.removeEventListener("click",on.preventClick,!0),ln.removeEventListener("dblclick",on.preventClick,!0),on.removePreventClickId=null})},this.preventClick=function(an){an.preventDefault(),an.stopPropagation()},this.el=nn,this.minScrollbarWidth=20,this.options=Object.assign({},tn.defaultOptions,{},rn),this.classNames=Object.assign({},tn.defaultOptions.classNames,{},this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,!tn.instances.has(this.el)&&(this.recalculate=(0,Sf.default)(this.recalculate.bind(this),64),this.onMouseMove=(0,Sf.default)(this.onMouseMove.bind(this),64),this.hideScrollbars=(0,wf.default)(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=(0,wf.default)(this.onWindowResize.bind(this),64,{leading:!0}),tn.getRtlHelpers=(0,Kb.default)(tn.getRtlHelpers),this.init())}tn.getRtlHelpers=function(){var rn=document.createElement("div");rn.innerHTML='
    ';var on=rn.firstElementChild;document.body.appendChild(on);var an=on.firstElementChild;on.scrollLeft=0;var ln=tn.getOffset(on),cn=tn.getOffset(an);on.scrollLeft=999;var dn=tn.getOffset(an);return{isRtlScrollingInverted:ln.left!==cn.left&&cn.left-dn.left!=0,isRtlScrollbarInverted:ln.left!==cn.left}},tn.getOffset=function(rn){var on=rn.getBoundingClientRect(),an=Ol(rn),ln=Ki(rn);return{top:on.top+(ln.pageYOffset||an.documentElement.scrollTop),left:on.left+(ln.pageXOffset||an.documentElement.scrollLeft)}};var en=tn.prototype;return en.init=function(){tn.instances.set(this.el,this),xl.default&&(this.initDOM(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},en.initDOM=function(){var rn=this;if(Array.prototype.filter.call(this.el.children,function(ln){return ln.classList.contains(rn.classNames.wrapper)}).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var on=document.createElement("div"),an=document.createElement("div");on.classList.add(this.classNames.track),an.classList.add(this.classNames.scrollbar),on.appendChild(an),this.axis.x.track.el=on.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=on.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},en.initListeners=function(){var rn=this,on=Ki(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach(function(cn){rn.el.addEventListener(cn,rn.onPointerEvent,!0)}),["touchstart","touchend","touchmove"].forEach(function(cn){rn.el.addEventListener(cn,rn.onPointerEvent,{capture:!0,passive:!0})}),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),on.addEventListener("resize",this.onWindowResize);var an=!1,ln=on.ResizeObserver||cf;this.resizeObserver=new ln(function(){!an||rn.recalculate()}),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),on.requestAnimationFrame(function(){an=!0}),this.mutationObserver=new on.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},en.recalculate=function(){var rn=Ki(this.el);this.elStyles=rn.getComputedStyle(this.el),this.isRtl=this.elStyles.direction==="rtl";var on=this.heightAutoObserverEl.offsetHeight<=1,an=this.heightAutoObserverEl.offsetWidth<=1,ln=this.contentEl.offsetWidth,cn=this.contentWrapperEl.offsetWidth,dn=this.elStyles.overflowX,fn=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var un=this.contentEl.scrollHeight,gn=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=on?"auto":"100%",this.placeholderEl.style.width=an?ln+"px":"auto",this.placeholderEl.style.height=un+"px";var hn=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=gn>ln,this.axis.y.isOverflowing=un>hn,this.axis.x.isOverflowing=dn==="hidden"?!1:this.axis.x.isOverflowing,this.axis.y.isOverflowing=fn==="hidden"?!1:this.axis.y.isOverflowing,this.axis.x.forceVisible=this.options.forceVisible==="x"||this.options.forceVisible===!0,this.axis.y.forceVisible=this.options.forceVisible==="y"||this.options.forceVisible===!0,this.hideNativeScrollbar();var pn=this.axis.x.isOverflowing?this.scrollbarWidth:0,vn=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&gn>cn-vn,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&un>hn-pn,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},en.getScrollbarSize=function(rn){if(rn===void 0&&(rn="y"),!this.axis[rn].isOverflowing)return 0;var on=this.contentEl[this.axis[rn].scrollSizeAttr],an=this.axis[rn].track.el[this.axis[rn].offsetSizeAttr],ln,cn=an/on;return ln=Math.max(~~(cn*an),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(ln=Math.min(ln,this.options.scrollbarMaxSize)),ln},en.positionScrollbar=function(rn){if(rn===void 0&&(rn="y"),!!this.axis[rn].isOverflowing){var on=this.contentWrapperEl[this.axis[rn].scrollSizeAttr],an=this.axis[rn].track.el[this.axis[rn].offsetSizeAttr],ln=parseInt(this.elStyles[this.axis[rn].sizeAttr],10),cn=this.axis[rn].scrollbar,dn=this.contentWrapperEl[this.axis[rn].scrollOffsetAttr];dn=rn==="x"&&this.isRtl&&tn.getRtlHelpers().isRtlScrollingInverted?-dn:dn;var fn=dn/(on-ln),un=~~((an-cn.size)*fn);un=rn==="x"&&this.isRtl&&tn.getRtlHelpers().isRtlScrollbarInverted?un+(an-cn.size):un,cn.el.style.transform=rn==="x"?"translate3d("+un+"px, 0, 0)":"translate3d(0, "+un+"px, 0)"}},en.toggleTrackVisibility=function(rn){rn===void 0&&(rn="y");var on=this.axis[rn].track.el,an=this.axis[rn].scrollbar.el;this.axis[rn].isOverflowing||this.axis[rn].forceVisible?(on.style.visibility="visible",this.contentWrapperEl.style[this.axis[rn].overflowAttr]="scroll"):(on.style.visibility="hidden",this.contentWrapperEl.style[this.axis[rn].overflowAttr]="hidden"),this.axis[rn].isOverflowing?an.style.display="block":an.style.display="none"},en.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},en.onMouseMoveForAxis=function(rn){rn===void 0&&(rn="y"),this.axis[rn].track.rect=this.axis[rn].track.el.getBoundingClientRect(),this.axis[rn].scrollbar.rect=this.axis[rn].scrollbar.el.getBoundingClientRect();var on=this.isWithinBounds(this.axis[rn].scrollbar.rect);on?this.axis[rn].scrollbar.el.classList.add(this.classNames.hover):this.axis[rn].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[rn].track.rect)?(this.showScrollbar(rn),this.axis[rn].track.el.classList.add(this.classNames.hover)):this.axis[rn].track.el.classList.remove(this.classNames.hover)},en.onMouseLeaveForAxis=function(rn){rn===void 0&&(rn="y"),this.axis[rn].track.el.classList.remove(this.classNames.hover),this.axis[rn].scrollbar.el.classList.remove(this.classNames.hover)},en.showScrollbar=function(rn){rn===void 0&&(rn="y");var on=this.axis[rn].scrollbar.el;this.axis[rn].isVisible||(on.classList.add(this.classNames.visible),this.axis[rn].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},en.onDragStart=function(rn,on){on===void 0&&(on="y");var an=Ol(this.el),ln=Ki(this.el),cn=this.axis[on].scrollbar,dn=on==="y"?rn.pageY:rn.pageX;this.axis[on].dragOffset=dn-cn.rect[this.axis[on].offsetAttr],this.draggedAxis=on,this.el.classList.add(this.classNames.dragging),an.addEventListener("mousemove",this.drag,!0),an.addEventListener("mouseup",this.onEndDrag,!0),this.removePreventClickId===null?(an.addEventListener("click",this.preventClick,!0),an.addEventListener("dblclick",this.preventClick,!0)):(ln.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},en.onTrackClick=function(rn,on){var an=this;if(on===void 0&&(on="y"),!!this.options.clickOnTrack){var ln=Ki(this.el);this.axis[on].scrollbar.rect=this.axis[on].scrollbar.el.getBoundingClientRect();var cn=this.axis[on].scrollbar,dn=cn.rect[this.axis[on].offsetAttr],fn=parseInt(this.elStyles[this.axis[on].sizeAttr],10),un=this.contentWrapperEl[this.axis[on].scrollOffsetAttr],gn=on==="y"?this.mouseY-dn:this.mouseX-dn,hn=gn<0?-1:1,pn=hn===-1?un-fn:un+fn,vn=function yn(){if(hn===-1){if(un>pn){var mn;un-=an.options.clickOnTrackSpeed,an.contentWrapperEl.scrollTo((mn={},mn[an.axis[on].offsetAttr]=un,mn)),ln.requestAnimationFrame(yn)}}else if(un=rn.left&&this.mouseX<=rn.left+rn.width&&this.mouseY>=rn.top&&this.mouseY<=rn.top+rn.height},en.findChild=function(rn,on){var an=rn.matches||rn.webkitMatchesSelector||rn.mozMatchesSelector||rn.msMatchesSelector;return Array.prototype.filter.call(rn.children,function(ln){return an.call(ln,on)})[0]},tn}();Er.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3};Er.instances=new WeakMap;Er.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),function(tn){tn.getAttribute("data-simplebar")!=="init"&&!Er.instances.has(tn)&&new Er(tn,Tl(tn.attributes))})};Er.removeObserver=function(){this.globalObserver.disconnect()};Er.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),typeof MutationObserver!="undefined"&&(this.globalObserver=new MutationObserver(Er.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),document.readyState==="complete"||document.readyState!=="loading"&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))};Er.handleMutations=function(tn){tn.forEach(function(en){Array.prototype.forEach.call(en.addedNodes,function(nn){nn.nodeType===1&&(nn.hasAttribute("data-simplebar")?!Er.instances.has(nn)&&document.documentElement.contains(nn)&&new Er(nn,Tl(nn.attributes)):Array.prototype.forEach.call(nn.querySelectorAll("[data-simplebar]"),function(rn){rn.getAttribute("data-simplebar")!=="init"&&!Er.instances.has(rn)&&document.documentElement.contains(rn)&&new Er(rn,Tl(rn.attributes))}))}),Array.prototype.forEach.call(en.removedNodes,function(nn){nn.nodeType===1&&(nn.getAttribute("data-simplebar")==="init"?Er.instances.has(nn)&&!document.documentElement.contains(nn)&&Er.instances.get(nn).unMount():Array.prototype.forEach.call(nn.querySelectorAll('[data-simplebar="init"]'),function(rn){Er.instances.has(rn)&&!document.documentElement.contains(rn)&&Er.instances.get(rn).unMount()}))})})};Er.getOptions=Tl;xl.default&&Er.initHtmlApi();var Qb=Rr(Jb());function Zb(tn){return"error"in tn&&"exception"in tn}function Jo(tn){return"error"in tn}function ey(tn){return typeof tn.next=="string"}function ur(tn){let en=["","null","undefined"];return Array.isArray(tn)?tn.length>0:typeof tn=="string"&&!en.includes(tn)||typeof tn=="number"||typeof tn=="boolean"?!0:typeof tn=="object"&&tn!==null}function Ks(tn){return tn.every(en=>typeof en!="undefined"&&en!==null)}function Gs(tn){for(let en of tn.options)en.selected&&(en.selected=!1);tn.value=""}function Tf(tn){return typeof tn!==null&&typeof tn!="undefined"}function gI(){let{csrftoken:tn}=Qb.default.parse(document.cookie);if(typeof tn=="undefined")throw new Error("Invalid or missing CSRF token");return tn}function ty(tn,en,nn){return Fr(this,null,function*(){let rn=gI(),on=new Headers({"X-CSRFToken":rn}),an;typeof nn!="undefined"&&(an=JSON.stringify(nn),on.set("content-type","application/json"));let ln=yield fetch(tn,{method:en,body:an,headers:on,credentials:"same-origin"}),cn=ln.headers.get("Content-Type");if(typeof cn=="string"&&cn.includes("text"))return{error:yield ln.text()};let dn=yield ln.json();return!ln.ok&&Array.isArray(dn)?{error:dn.join(` -`)}:!ln.ok&&"detail"in dn?{error:dn.detail}:dn})}function Cl(tn,en){return Fr(this,null,function*(){return yield ty(tn,"PATCH",en)})}function vI(tn){return Fr(this,null,function*(){return yield ty(tn,"GET")})}function ny(tn){return Fr(this,null,function*(){return yield vI(tn)})}function*Hn(...tn){for(let en of tn)for(let nn of document.querySelectorAll(en))nn!==null&&(yield nn)}function pr(tn){return document.getElementById(tn)}function ry(tn,en=0){let nn=en,rn=document.getElementById("content-title");rn!==null&&(nn+=rn.getBoundingClientRect().bottom);let on=tn.getBoundingClientRect().top+window.pageYOffset+nn;window.scrollTo({top:on,behavior:"smooth"})}function iy(tn){let en=[];for(let nn of tn.querySelectorAll("select"))if(nn!==null){let rn={name:nn.name,options:[]};for(let on of nn.options)on.selected&&rn.options.push(on.value);en=[...en,rn]}return en}function Xs(tn,en){tn!==null&&(typeof en=="undefined"?window.getComputedStyle(tn).display==="none"?tn.style.display="":tn.style.display="none":en==="show"?tn.style.display="":tn.style.display="none")}function di(tn,en,nn){function rn(an){return!!(typeof nn=="string"&&an!==null&&an.matches(nn))}function on(an){if(an!==null&&an.parentElement!==null&&!rn(an)){for(let ln of an.parentElement.querySelectorAll(en))if(ln!==null)return ln;return on(an.parentElement.parentElement)}return null}return on(tn)}function Qo(tn,en,nn=null,rn=[]){let on=document.createElement(tn);if(en!==null)for(let an of Object.keys(en)){let ln=an,cn=en[ln];ln in on&&(on[ln]=cn)}nn!==null&&nn.length>0&&on.classList.add(...nn);for(let an of rn)on.appendChild(an);return on}function oy(tn,en){let nn=new Map;for(let rn of tn){let on=rn[en];nn.has(on)||nn.set(on,rn)}return Array.from(nn.values())}function bI(tn){let en=tn.target;if(en.tagName==="BUTTON"){let nn=en,rn=nn.getAttribute("return-url"),on=nn.form;on!==null&&ur(rn)&&(on.action=rn,on.submit())}}function yI(tn,en){let nn=new Set;for(let rn of en.querySelectorAll("*[name]"))rn.validity.valid?(rn.classList.contains("is-invalid")&&rn.classList.remove("is-invalid"),rn.classList.contains("is-valid")||rn.classList.add("is-valid")):(nn.add(rn.name),rn.classList.contains("is-valid")&&rn.classList.remove("is-valid"),rn.classList.contains("is-invalid")||rn.classList.add("is-invalid"));if(nn.size!==0){let rn=en.elements.namedItem(Array.from(nn)[0]);ry(rn),tn.preventDefault()}}function EI(){for(let tn of Hn("button[return-url]"))tn.addEventListener("click",bI)}function sy(){for(let tn of Hn("form")){let en=tn.querySelectorAll("button[type=submit]");for(let nn of en)nn.addEventListener("click",rn=>yI(rn,tn))}EI()}function ay(){for(let tn of Hn("a.set_speed"))if(tn!==null){let en=function(nn){nn.preventDefault();let rn=tn.getAttribute("data"),on=document.getElementById(tn.target);on!==null&&rn!==null&&(on.value=rn)};tn.addEventListener("click",en)}}var Of={vlangroup_edit:{region:{hide:["id_sitegroup","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:["id_region"]},"site group":{hide:["id_region","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:["id_sitegroup"]},site:{hide:["id_location","id_rack","id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site"]},location:{hide:["id_rack","id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site","id_location"]},rack:{hide:["id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site","id_location","id_rack"]},"cluster group":{hide:["id_region","id_sitegroup","id_site","id_location","id_rack","id_cluster"],show:["id_clustergroup"]},cluster:{hide:["id_region","id_sitegroup","id_site","id_location","id_rack"],show:["id_clustergroup","id_cluster"]},default:{hide:["id_region","id_sitegroup","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:[]}}};function Af(tn,en){var nn;for(let rn of Hn(tn)){let on=(nn=rn.parentElement)==null?void 0:nn.parentElement;on!==null&&(en==="show"?Xs(on,"show"):Xs(on,"hide"))}}function ly(tn,en){let nn=en.options[en.selectedIndex].innerText.toLowerCase();for(let[rn,on]of Object.entries(Of[tn]))if(nn.endsWith(rn)){for(let an of on.hide)Af(`#${an}`,"hide");for(let an of on.show)Af(`#${an}`,"show");break}else for(let an of Of[tn].default.hide)Af(`#${an}`,"hide")}function cy(){for(let tn of Object.keys(Of))for(let en of Hn(`html[data-netbox-url-name="${tn}"] #id_scope_type`))ly(tn,en),en.addEventListener("change",()=>ly(tn,en))}function _I(tn){var nn,rn;let en=(rn=(nn=tn==null?void 0:tn.parentElement)==null?void 0:nn.parentElement)!=null?rn:null;return en!==null&&en.classList.contains("row")?en:null}function hi(tn,en){let nn=_I(tn);if(tn!==null&&nn!==null){Xs(nn,en);let rn=new Event(`netbox.select.disabled.${tn.name}`);switch(en){case"hide":tn.disabled=!0,tn.dispatchEvent(rn);break;case"show":tn.disabled=!1,tn.dispatchEvent(rn)}}}function SI(){let tn=[pr("id_tagged_vlans"),pr("id_untagged_vlan"),pr("id_vlan_group")];if(Ks(tn)){let[en,nn]=tn;Gs(nn),Gs(en);for(let rn of tn)hi(rn,"hide")}}function wI(){let tn=[pr("id_tagged_vlans"),pr("id_untagged_vlan"),pr("id_vlan_group")];if(Ks(tn)){let[en,nn,rn]=tn;Gs(en),hi(rn,"show"),hi(nn,"show"),hi(en,"hide")}}function xI(){let tn=[pr("id_tagged_vlans"),pr("id_untagged_vlan"),pr("id_vlan_group")];if(Ks(tn)){let[en,nn,rn]=tn;hi(en,"show"),hi(rn,"show"),hi(nn,"show")}}function TI(){let tn=[pr("id_tagged_vlans"),pr("id_untagged_vlan"),pr("id_vlan_group")];if(Ks(tn)){let[en,nn,rn]=tn;Gs(en),hi(rn,"show"),hi(nn,"show"),hi(en,"hide")}}function uy(tn){switch(tn.value){case"access":wI();break;case"tagged":xI();break;case"tagged-all":TI();break;case"":SI();break}}function fy(){let tn=pr("id_mode");tn!==null&&(tn.addEventListener("change",()=>uy(tn)),uy(tn))}function dy(){for(let tn of[sy,ay,cy,fy])tn()}var yy=Rr(by());window.Collapse=qr;window.Modal=$i;window.Popover=po;window.Toast=Ci;window.Tooltip=si;function OI(){for(let tn of Hn(".masonry"))new yy.default(tn,{itemSelector:".masonry-item",percentPosition:!0})}function AI(){for(let tn of Hn('[data-bs-toggle="tooltip"]'))new si(tn,{container:"body"})}function CI(){for(let tn of Hn('[data-bs-toggle="modal"]'))new $i(tn)}function Lo(tn,en,nn,rn){let on="mdi-alert";switch(tn){case"warning":on="mdi-alert";break;case"success":on="mdi-check-circle";break;case"info":on="mdi-information";break;case"danger":on="mdi-alert";break}let an=document.createElement("div");an.setAttribute("class","toast-container position-fixed bottom-0 end-0 m-3");let ln=document.createElement("div");ln.setAttribute("class",`toast bg-${tn}`),ln.setAttribute("role","alert"),ln.setAttribute("aria-live","assertive"),ln.setAttribute("aria-atomic","true");let cn=document.createElement("div");cn.setAttribute("class",`toast-header bg-${tn} text-body`);let dn=document.createElement("i");dn.setAttribute("class",`mdi ${on}`);let fn=document.createElement("strong");fn.setAttribute("class","me-auto ms-1"),fn.innerText=en;let un=document.createElement("button");un.setAttribute("type","button"),un.setAttribute("class","btn-close"),un.setAttribute("data-bs-dismiss","toast"),un.setAttribute("aria-label","Close");let gn=document.createElement("div");if(gn.setAttribute("class","toast-body"),cn.appendChild(dn),cn.appendChild(fn),typeof rn!="undefined"){let pn=document.createElement("small");pn.setAttribute("class","text-muted"),cn.appendChild(pn)}return cn.appendChild(un),gn.innerText=nn.trim(),ln.appendChild(cn),ln.appendChild(gn),an.appendChild(ln),document.body.appendChild(an),new Ci(ln)}function LI(){let{hash:tn}=location;if(tn&&tn.match(/^#tab_.+$/)){let en=tn.replace("tab_","");for(let nn of Hn(`ul.nav.nav-tabs .nav-link[data-bs-target="${en}"]`))new go(nn).show()}}function DI(){let tn=document.querySelectorAll(".sidebar .accordion-item");function en(nn){for(let rn of tn)rn!==nn?rn.classList.remove("is-open"):rn.classList.toggle("is-open")}for(let nn of tn)for(let rn of nn.querySelectorAll(".accordion-button"))rn.addEventListener("click",()=>{en(nn)})}function MI(){for(let tn of Hn("a.image-preview")){let en=`${Math.round(window.innerWidth/4)}px`,nn=Qo("img",{src:tn.href});nn.style.maxWidth=en;let rn=Qo("div",null,null,[nn]);new po(tn,{customClass:"image-preview-popover",trigger:"hover",html:!0,content:rn})}}function Ey(){for(let tn of[AI,CI,OI,LI,MI,DI])tn()}function II(tn,en){var cn;let nn=tn.currentTarget,rn=di(nn,"span.search-obj-selected"),on=di(nn,"input.search-obj-type"),an=nn.getAttribute("data-search-value"),ln="";rn!==null&&on!==null&&(ur(an)&&ln!==an?(ln=an,rn.innerHTML=(cn=en.textContent)!=null?cn:"Error",on.value=an):(ln="",rn.innerHTML="All Objects",on.value=""))}function PI(){for(let tn of Hn(".search-obj-selector"))for(let en of tn.querySelectorAll("li > button.dropdown-item"))en.addEventListener("click",nn=>II(nn,en))}function _y(){for(let tn of[PI])tn()}function Sy(tn,en,nn){return Math.min(Math.max(tn,nn),en)}var Zo=class extends Error{constructor(en){super(`Failed to parse color: "${en}"`)}};function kI(tn){if(typeof tn!="string")throw new Zo(tn);if(tn.trim().toLowerCase()==="transparent")return[0,0,0,0];let en=tn.trim();en=BI.test(tn)?function(ln){let cn=ln.toLowerCase().trim(),dn=NI[function(fn){let un=5381,gn=fn.length;for(;gn;)un=33*un^fn.charCodeAt(--gn);return(un>>>0)%2341}(cn)];if(!dn)throw new Zo(ln);return`#${dn}`}(tn):tn;let nn=RI.exec(en);if(nn){let ln=Array.from(nn).slice(1);return[...ln.slice(0,3).map(cn=>parseInt(Js(cn,2),16)),parseInt(Js(ln[3]||"f",2),16)/255]}let rn=jI.exec(en);if(rn){let ln=Array.from(rn).slice(1);return[...ln.slice(0,3).map(cn=>parseInt(cn,16)),parseInt(ln[3]||"ff",16)/255]}let on=qI.exec(en);if(on){let ln=Array.from(on).slice(1);return[...ln.slice(0,3).map(cn=>parseInt(cn,10)),parseFloat(ln[3]||"1")]}let an=HI.exec(en);if(an){let[ln,cn,dn,fn]=Array.from(an).slice(1).map(parseFloat);if(Sy(0,100,cn)!==cn)throw new Zo(tn);if(Sy(0,100,dn)!==dn)throw new Zo(tn);return[...FI(ln,cn,dn),fn||1]}throw new Zo(tn)}var wy=tn=>parseInt(tn.replace(/_/g,""),36),NI="1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm".split(" ").reduce((tn,en)=>{let nn=wy(en.substring(0,3)),rn=wy(en.substring(3)).toString(16),on="";for(let an=0;an<6-rn.length;an++)on+="0";return tn[nn]=`${on}${rn}`,tn},{}),Js=(tn,en)=>Array.from(Array(en)).map(()=>tn).join(""),RI=new RegExp(`^#${Js("([a-f0-9])",3)}([a-f0-9])?$`,"i"),jI=new RegExp(`^#${Js("([a-f0-9]{2})",3)}([a-f0-9]{2})?$`,"i"),qI=new RegExp(`^rgba?\\(\\s*(\\d+)\\s*${Js(",\\s*(\\d+)\\s*",2)}(?:,\\s*([\\d.]+))?\\s*\\)$`,"i"),HI=/^hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%(?:\s*,\s*([\d.]+))?\s*\)$/i,BI=/^[a-z]+$/i,xy=tn=>Math.round(255*tn),FI=(tn,en,nn)=>{let rn=nn/100;if(en===0)return[rn,rn,rn].map(xy);let on=(tn%360+360)%360/60,an=(1-Math.abs(2*rn-1))*(en/100),ln=an*(1-Math.abs(on%2-1)),cn=0,dn=0,fn=0;on>=0&&on<1?(cn=an,dn=ln):on>=1&&on<2?(cn=ln,dn=an):on>=2&&on<3?(dn=an,fn=ln):on>=3&&on<4?(dn=ln,fn=an):on>=4&&on<5?(cn=ln,fn=an):on>=5&&on<6&&(cn=an,fn=ln);let un=rn-an/2;return[cn+un,dn+un,fn+un].map(xy)};function $I(tn){if(tn==="transparent")return 0;function en(an){let ln=an/255;return ln<=.03928?ln/12.92:Math.pow((ln+.055)/1.055,2.4)}let[nn,rn,on]=kI(tn);return .2126*en(nn)+.7152*en(rn)+.0722*en(on)}function zI(tn){return $I(tn)>.179}function Qs(tn){return zI(tn)?"#000":"#fff"}var Qy=Rr(Oy()),Mf=Rr(Vy());var jl={};(function(tn,en){typeof jl=="object"&&typeof module=="object"?module.exports=en():typeof define=="function"&&define.amd?define([],en):typeof jl=="object"?jl.SlimSelect=en():tn.SlimSelect=en()})(window,function(){return nn={},tn.m=en=[function(rn,on,an){"use strict";function ln(dn,fn){fn=fn||{bubbles:!1,cancelable:!1,detail:void 0};var un=document.createEvent("CustomEvent");return un.initCustomEvent(dn,fn.bubbles,fn.cancelable,fn.detail),un}var cn;on.__esModule=!0,on.hasClassInTree=function(dn,fn){function un(gn,hn){return hn&&gn&&gn.classList&&gn.classList.contains(hn)?gn:null}return un(dn,fn)||function gn(hn,pn){return hn&&hn!==document?un(hn,pn)?hn:gn(hn.parentNode,pn):null}(dn,fn)},on.ensureElementInView=function(dn,fn){var un=dn.scrollTop+dn.offsetTop,gn=un+dn.clientHeight,hn=fn.offsetTop,pn=hn+fn.clientHeight;hn=window.innerHeight?"above":un?fn:"below"},on.debounce=function(dn,fn,un){var gn;return fn===void 0&&(fn=100),un===void 0&&(un=!1),function(){for(var hn=[],pn=0;pn[^<>]*'+yn+"")},on.kebabCase=function(dn){var fn=dn.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,function(un){return"-"+un.toLowerCase()});return dn[0]===dn[0].toUpperCase()?fn.substring(1):fn},typeof(cn=window).CustomEvent!="function"&&(ln.prototype=cn.Event.prototype,cn.CustomEvent=ln)},function(rn,on,an){"use strict";on.__esModule=!0;var ln=(cn.prototype.newOption=function(fn){return{id:fn.id?fn.id:String(Math.floor(1e8*Math.random())),value:fn.value?fn.value:"",text:fn.text?fn.text:"",innerHTML:fn.innerHTML?fn.innerHTML:"",selected:!!fn.selected&&fn.selected,display:fn.display===void 0||fn.display,disabled:!!fn.disabled&&fn.disabled,placeholder:!!fn.placeholder&&fn.placeholder,class:fn.class?fn.class:void 0,data:fn.data?fn.data:{},mandatory:!!fn.mandatory&&fn.mandatory}},cn.prototype.add=function(fn){this.data.push({id:String(Math.floor(1e8*Math.random())),value:fn.value,text:fn.text,innerHTML:"",selected:!1,display:!0,disabled:!1,placeholder:!1,class:void 0,mandatory:fn.mandatory,data:{}})},cn.prototype.parseSelectData=function(){this.data=[];for(var fn=0,un=this.main.select.element.childNodes;fn',placeholder:this.placeholder,searchPlaceholder:"Filter",onChange:()=>this.handleSlimChange()}),this.getStaticParams(),this.getDynamicParams(),this.getPathKeys();for(let[ln,cn]of this.staticParams.entries())this.queryParams.set(ln,cn);for(let ln of this.dynamicParams.keys())this.updateQueryParams(ln);for(let ln of this.pathValues.keys())this.updatePathValues(ln);this.queryParams.set("brief",[!0]),this.updateQueryUrl(),this.resetClasses(),this.setSlimStyles(),this.initResetButton(),this.initRefreshButton(),this.addEventListeners();let on=this.base.getAttribute("data-fetch-trigger"),an=this.base.closest(".content-container .collapse");switch(Ky(on)?this.trigger=on:an!==null?this.trigger="collapse":this.trigger="load",this.trigger){case"collapse":an!==null&&(an.addEventListener("show.bs.collapse",()=>this.loadData()),an.addEventListener("hide.bs.collapse",()=>this.resetOptions()));break;case"open":this.slim.beforeOpen=()=>this.loadData();break;case"load":Promise.all([this.loadData()]);break}}get options(){return this.slim.data.data.filter(Jy)}set options(en){let nn=en;this.nullOption!==null&&(nn=[this.nullOption,...nn]);let rn=oy(nn,"value"),on=typeof rn.find(ln=>ln.value==="")!="undefined",an=rn.findIndex(ln=>ln.value==="");on&&an>=0?rn[an]=this.emptyOption:rn.unshift(this.emptyOption),this.slim.setData(rn)}resetOptions(){this.options=[this.emptyOption]}disable(){this.slim.slim.singleSelected!==null?this.slim.slim.singleSelected.container.hasAttribute("disabled")||this.slim.slim.singleSelected.container.setAttribute("disabled",""):this.slim.slim.multiSelected!==null&&(this.slim.slim.multiSelected.container.hasAttribute("disabled")||this.slim.slim.multiSelected.container.setAttribute("disabled","")),this.slim.disable()}enable(){this.slim.slim.singleSelected!==null?this.slim.slim.singleSelected.container.hasAttribute("disabled")&&this.slim.slim.singleSelected.container.removeAttribute("disabled"):this.slim.slim.multiSelected!==null&&this.slim.slim.multiSelected.container.hasAttribute("disabled")&&this.slim.slim.multiSelected.container.removeAttribute("disabled"),this.slim.enable()}addEventListeners(){let en=(0,Qy.default)(rn=>this.handleSearch(rn),300,!1);this.slim.slim.search.input.addEventListener("keyup",rn=>{if(!rn.key.match(/^(Arrow|Enter|Tab).*/))return en(rn)}),this.slim.slim.search.input.addEventListener("paste",rn=>en(rn)),this.slim.slim.list.addEventListener("scroll",()=>this.handleScroll()),this.base.addEventListener(`netbox.select.atbottom.${this.name}`,()=>this.fetchOptions(this.more,"merge")),this.base.addEventListener(`netbox.select.disabled.${this.name}`,rn=>this.handleDisableEnable(rn));let nn=new Set([...this.dynamicParams.keys(),...this.pathValues.keys()]);for(let rn of nn){let on=document.querySelector(`[name="${rn}"]`);on!==null&&on.addEventListener("change",an=>this.handleEvent(an)),this.base.addEventListener(`netbox.select.onload.${rn}`,an=>this.handleEvent(an))}}loadData(){return Fr(this,null,function*(){try{this.disable(),yield this.getOptions("replace")}catch(en){console.error(en)}finally{this.setOptionStyles(),this.enable(),this.base.dispatchEvent(this.loadEvent)}})}getPreselectedOptions(){return Array.from(this.base.options).filter(en=>en.selected).filter(en=>!(en.value==="---------"||en.innerText==="---------"))}processOptions(en,nn="merge"){return Fr(this,null,function*(){let rn=this.getPreselectedOptions(),on=rn.map(cn=>cn.getAttribute("value")).filter(ur),an=rn.map(cn=>({value:cn.value,text:cn.innerText,selected:!0,disabled:!1})),ln=[];for(let cn of en.results){let dn=cn.display;typeof cn._depth=="number"&&cn._depth>0&&(dn=`${"\u2500".repeat(cn._depth)} ${dn}`);let fn={},un=cn.id.toString(),gn,hn,pn;for(let[yn,mn]of Object.entries(cn)){if(!["id","slug"].includes(yn)&&["string","number","boolean"].includes(typeof mn)){let bn=yn.replaceAll("_","-");fn[bn]=String(mn)}this.disabledAttributes.some(bn=>bn.toLowerCase()===yn.toLowerCase())&&(typeof mn=="string"&&mn.toLowerCase()!=="false"||typeof mn=="boolean"&&mn===!0||typeof mn=="number"&&mn>0)&&(pn=!0)}on.some(yn=>this.disabledOptions.includes(yn))&&(pn=!0),on.includes(un)&&(hn=!0,pn=!1);let vn={value:un,text:dn,data:fn,style:gn,selected:hn,disabled:pn};ln=[...ln,vn]}switch(nn){case"merge":this.options=[...this.options,...ln];break;case"replace":this.options=[...an,...ln];break}ey(en)?this.more=en.next:this.more=null})}fetchOptions(en,nn="merge"){return Fr(this,null,function*(){if(typeof en=="string"){let rn=yield ny(en);if(Jo(rn))return Zb(rn)?this.handleError(rn.exception,rn.error):this.handleError(`Error Fetching Options for field '${this.name}'`,rn.error);yield this.processOptions(rn,nn)}})}getOptions(en="merge"){return Fr(this,null,function*(){if(this.queryUrl.includes("{{")){this.resetOptions();return}yield this.fetchOptions(this.queryUrl,en)})}handleSearch(en){return Fr(this,null,function*(){let{value:nn}=en.target,rn=Mf.default.stringifyUrl({url:this.queryUrl,query:{q:nn}});yield this.fetchOptions(rn,"merge"),this.slim.data.search(nn),this.slim.render()})}handleScroll(){let en=this.slim.slim.list.scrollTop+this.slim.slim.list.offsetHeight===this.slim.slim.list.scrollHeight;this.atBottom&&!en?(this.atBottom=!1,this.base.dispatchEvent(this.bottomEvent)):!this.atBottom&&en&&(this.atBottom=!0,this.base.dispatchEvent(this.bottomEvent))}handleEvent(en){let nn=en.target;this.updateQueryParams(nn.name),this.updatePathValues(nn.name),this.updateQueryUrl(),Promise.all([this.loadData()])}handleDisableEnable(en){let nn=en.target;nn.disabled===!0?this.disable():nn.disabled===!1&&this.enable()}handleError(en,nn){Lo("danger",en,nn).show(),this.resetOptions()}handleSlimChange(){let en=this.slim.slim;en&&(en.container.classList.contains("is-invalid")||this.base.classList.contains("is-invalid"))&&(en.container.classList.remove("is-invalid"),this.base.classList.remove("is-invalid")),this.base.dispatchEvent(this.loadEvent)}updateQueryUrl(){let en={};for(let[on,an]of this.queryParams.entries())en[on]=an;let nn=this.url;for(let[on,an]of this.pathValues.entries())for(let ln of this.url.matchAll(new RegExp(`({{${on}}})`,"g")))ur(an)&&(nn=nn.replaceAll(ln[1],an.toString()));let rn=Mf.default.stringifyUrl({url:nn,query:en});this.queryUrl!==rn&&(this.queryUrl=rn,this.base.setAttribute("data-url",rn))}updateQueryParams(en){let nn=document.querySelector(`[name="${en}"]`);if(nn!==null){let rn=[];if(nn.multiple?rn=Array.from(nn.options).filter(on=>on.selected).map(on=>on.value):nn.value!==""&&(rn=[nn.value]),rn.length>0){this.dynamicParams.updateValue(en,rn);let on=this.dynamicParams.get(en);if(typeof on!="undefined"){let{queryParam:an,queryValue:ln}=on,cn=[];if(this.staticParams.has(an)){let dn=this.staticParams.get(an);typeof dn!="undefined"&&(cn=[...dn,...ln])}else cn=ln;cn.length>0?this.queryParams.set(an,cn):this.queryParams.delete(an)}}else{let on=this.dynamicParams.queryParam(en);on!==null&&this.queryParams.delete(on)}}}updatePathValues(en){let nn=en.replaceAll(/^id_/gi,""),rn=pr(`id_${nn}`);rn!==null&&this.url.includes("{{")&&Boolean(this.url.match(new RegExp(`({{(${en})}})`,"g")))&&(ur(rn.value)?this.pathValues.set(en,rn.value):this.pathValues.set(en,""))}getPlaceholder(){let en=this.name;if(this.base.id){let nn=document.querySelector(`label[for="${this.base.id}"]`);nn!==null&&(en=`Select ${nn.innerText.trim()}`)}return en}getDisabledOptions(){var nn;let en=[];if(Yy(this.base))try{let rn=JSON.parse((nn=this.base.getAttribute("data-query-param-exclude"))!=null?nn:"[]");en=[...en,...rn]}catch(rn){console.group(`Unable to parse data-query-param-exclude value on select element '${this.name}'`),console.warn(rn),console.groupEnd()}return en}getDisabledAttributes(){let en=[...Zy],nn=this.base.getAttribute("disabled-indicator");return ur(nn)&&(en=[...en,nn]),en}getPathKeys(){for(let en of this.url.matchAll(new RegExp("{{(.+)}}","g")))this.pathValues.set(en[1],"")}getDynamicParams(){let en=this.base.getAttribute("data-dynamic-params");try{this.dynamicParams.addFromJson(en)}catch(nn){console.group(`Unable to determine dynamic query parameters for select field '${this.name}'`),console.warn(nn),console.groupEnd()}}getStaticParams(){let en=this.base.getAttribute("data-static-params");try{if(ur(en)){let nn=JSON.parse(en);if(Xy(nn))for(let{queryParam:rn,queryValue:on}of nn)Array.isArray(on)?this.staticParams.set(rn,on):this.staticParams.set(rn,[on])}}catch(nn){console.group(`Unable to determine static query parameters for select field '${this.name}'`),console.warn(nn),console.groupEnd()}}setSlimStyles(){let{width:en,height:nn}=this.slim.slim.container.getBoundingClientRect();this.base.style.opacity="0",this.base.style.width=`${en}px`,this.base.style.height=`${nn}px`,this.base.style.display="block",this.base.style.position="absolute",this.base.style.pointerEvents="none"}setOptionStyles(){for(let en of this.options)if("data"in en&&"id"in en&&typeof en.data!="undefined"&&typeof en.id!="undefined"&&"color"in en.data){let nn=en.id,rn=en.data,on=document.createElement("style"),an=`#${rn.color}`,ln=Qs(an);on.setAttribute("data-netbox",nn),on.innerHTML=` + `}}function BE(){sn.calendarContainer.classList.add("hasWeeks");var En=fn("div","flatpickr-weekwrapper");En.appendChild(fn("span","flatpickr-weekday",sn.l10n.weekAbbreviation));var _n=fn("div","flatpickr-weeks");return En.appendChild(_n),{weekWrapper:En,weekNumbers:_n}}function $l(En,_n){_n===void 0&&(_n=!0);var xn=_n?En:En-sn.currentMonth;xn<0&&sn._hidePrevMonthArrow===!0||xn>0&&sn._hideNextMonthArrow===!0||(sn.currentMonth+=xn,(sn.currentMonth<0||sn.currentMonth>11)&&(sn.currentYear+=sn.currentMonth>11?1:-1,sn.currentMonth=(sn.currentMonth+12)%12,fr("onYearChange"),ns()),ta(),fr("onMonthChange"),oa())}function FE(En,_n){En===void 0&&(En=!0),_n===void 0&&(_n=!0),sn.input.value="",sn.altInput!==void 0&&(sn.altInput.value=""),sn.mobileInput!==void 0&&(sn.mobileInput.value=""),sn.selectedDates=[],sn.latestSelectedDateObj=void 0,_n===!0&&(sn.currentYear=sn._initialDate.getFullYear(),sn.currentMonth=sn._initialDate.getMonth()),sn.showTimeInput=!1,sn.config.enableTime===!0&&Mr(),sn.redraw(),En&&fr("onChange")}function $E(){sn.isOpen=!1,sn.isMobile||(sn.calendarContainer!==void 0&&sn.calendarContainer.classList.remove("open"),sn._input!==void 0&&sn._input.classList.remove("active")),fr("onClose")}function zE(){sn.config!==void 0&&fr("onDestroy");for(var En=sn._handlers.length;En--;){var _n=sn._handlers[En];_n.element.removeEventListener(_n.event,_n.handler,_n.options)}if(sn._handlers=[],sn.mobileInput)sn.mobileInput.parentNode&&sn.mobileInput.parentNode.removeChild(sn.mobileInput),sn.mobileInput=void 0;else if(sn.calendarContainer&&sn.calendarContainer.parentNode)if(sn.config.static&&sn.calendarContainer.parentNode){var xn=sn.calendarContainer.parentNode;if(xn.lastChild&&xn.removeChild(xn.lastChild),xn.parentNode){for(;xn.firstChild;)xn.parentNode.insertBefore(xn.firstChild,xn);xn.parentNode.removeChild(xn)}}else sn.calendarContainer.parentNode.removeChild(sn.calendarContainer);sn.altInput&&(sn.input.type="text",sn.altInput.parentNode&&sn.altInput.parentNode.removeChild(sn.altInput),delete sn.altInput),sn.input&&(sn.input.type=sn.input._type,sn.input.classList.remove("flatpickr-input"),sn.input.removeAttribute("readonly"),sn.input.value=""),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach(function(Pn){try{delete sn[Pn]}catch(jn){}})}function rs(En){return sn.config.appendTo&&sn.config.appendTo.contains(En)?!0:sn.calendarContainer.contains(En)}function zl(En){if(sn.isOpen&&!sn.config.inline){var _n=pn(En),xn=rs(_n),Pn=_n===sn.input||_n===sn.altInput||sn.element.contains(_n)||En.path&&En.path.indexOf&&(~En.path.indexOf(sn.input)||~En.path.indexOf(sn.altInput)),jn=En.type==="blur"?Pn&&En.relatedTarget&&!rs(En.relatedTarget):!Pn&&!xn&&!rs(En.relatedTarget),Nn=!sn.config.ignoredFocusElements.some(function($n){return $n.contains(_n)});jn&&Nn&&(sn.timeContainer!==void 0&&sn.minuteElement!==void 0&&sn.hourElement!==void 0&&Bn(),sn.close(),sn.config.mode==="range"&&sn.selectedDates.length===1&&(sn.clear(!1),sn.redraw()))}}function na(En){if(!(!En||sn.config.minDate&&Ensn.config.maxDate.getFullYear())){var _n=En,xn=sn.currentYear!==_n;sn.currentYear=_n||sn.currentYear,sn.config.maxDate&&sn.currentYear===sn.config.maxDate.getFullYear()?sn.currentMonth=Math.min(sn.config.maxDate.getMonth(),sn.currentMonth):sn.config.minDate&&sn.currentYear===sn.config.minDate.getFullYear()&&(sn.currentMonth=Math.max(sn.config.minDate.getMonth(),sn.currentMonth)),xn&&(sn.redraw(),fr("onYearChange"),ns())}}function Xi(En,_n){_n===void 0&&(_n=!0);var xn=sn.parseDate(En,void 0,_n);if(sn.config.minDate&&xn&&kn(xn,sn.config.minDate,_n!==void 0?_n:!sn.minDateHasTime)<0||sn.config.maxDate&&xn&&kn(xn,sn.config.maxDate,_n!==void 0?_n:!sn.maxDateHasTime)>0)return!1;if(sn.config.enable.length===0&&sn.config.disable.length===0)return!0;if(xn===void 0)return!1;for(var Pn=sn.config.enable.length>0,jn=Pn?sn.config.enable:sn.config.disable,Nn=0,$n=void 0;Nn=$n.from.getTime()&&xn.getTime()<=$n.to.getTime())return Pn}return!Pn}function ra(En){return sn.daysContainer!==void 0?En.className.indexOf("hidden")===-1&&sn.daysContainer.contains(En):!1}function WE(En){var _n=En.target===sn._input,xn=sn.config.allowInput,Pn=sn.isOpen&&(!xn||!_n),jn=sn.config.inline&&_n&&!xn;if(En.keyCode===13&&_n){if(xn)return sn.setDate(sn._input.value,!0,En.target===sn.altInput?sn.config.altFormat:sn.config.dateFormat),En.target.blur();sn.open()}else if(rs(En.target)||Pn||jn){var Nn=!!sn.timeContainer&&sn.timeContainer.contains(En.target);switch(En.keyCode){case 13:Nn?(En.preventDefault(),Bn(),Vl()):Kf(En);break;case 27:En.preventDefault(),Vl();break;case 8:case 46:_n&&!sn.config.allowInput&&(En.preventDefault(),sn.clear());break;case 37:case 39:if(!Nn&&!_n){if(En.preventDefault(),sn.daysContainer!==void 0&&(xn===!1||document.activeElement&&ra(document.activeElement))){var $n=En.keyCode===39?1:-1;En.ctrlKey?(En.stopPropagation(),$l($n),Pi(mi(1),0)):Pi(void 0,$n)}}else sn.hourElement&&sn.hourElement.focus();break;case 38:case 40:En.preventDefault();var Gn=En.keyCode===40?1:-1;sn.daysContainer&&En.target.$i!==void 0||En.target===sn.input||En.target===sn.altInput?En.ctrlKey?(En.stopPropagation(),na(sn.currentYear-Gn),Pi(mi(1),0)):Nn||Pi(void 0,Gn*7):En.target===sn.currentYearElement?na(sn.currentYear-Gn):sn.config.enableTime&&(!Nn&&sn.hourElement&&sn.hourElement.focus(),Bn(En),sn._debouncedChange());break;case 9:if(Nn){var Xn=[sn.hourElement,sn.minuteElement,sn.secondElement,sn.amPM].concat(sn.pluginElements).filter(function(Ir){return Ir}),sr=Xn.indexOf(En.target);if(sr!==-1){var lr=Xn[sr+(En.shiftKey?-1:1)];En.preventDefault(),(lr||sn._input).focus()}}else!sn.config.noCalendar&&sn.daysContainer&&sn.daysContainer.contains(En.target)&&En.shiftKey&&(En.preventDefault(),sn._input.focus());break;default:break}}if(sn.amPM!==void 0&&En.target===sn.amPM)switch(En.key){case sn.l10n.amPM[0].charAt(0):case sn.l10n.amPM[0].charAt(0).toLowerCase():sn.amPM.textContent=sn.l10n.amPM[0],Qn(),gi();break;case sn.l10n.amPM[1].charAt(0):case sn.l10n.amPM[1].charAt(0).toLowerCase():sn.amPM.textContent=sn.l10n.amPM[1],Qn(),gi();break}(_n||rs(En.target))&&fr("onKeyDown",En)}function Wl(En){if(!(sn.selectedDates.length!==1||En&&(!En.classList.contains("flatpickr-day")||En.classList.contains("flatpickr-disabled")))){for(var _n=En?En.dateObj.getTime():sn.days.firstElementChild.dateObj.getTime(),xn=sn.parseDate(sn.selectedDates[0],void 0,!0).getTime(),Pn=Math.min(_n,sn.selectedDates[0].getTime()),jn=Math.max(_n,sn.selectedDates[0].getTime()),Nn=!1,$n=0,Gn=0,Xn=Pn;XnPn&&Xn$n)?$n=Xn:Xn>xn&&(!Gn||Xn0&&yi<$n||Gn>0&&yi>Gn;if(aa)return bi.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach(function(ss){bi.classList.remove(ss)}),"continue";if(Nn&&!aa)return"continue";["startRange","inRange","endRange","notAllowed"].forEach(function(ss){bi.classList.remove(ss)}),En!==void 0&&(En.classList.add(_n<=sn.selectedDates[0].getTime()?"startRange":"endRange"),xn<_n&&yi===xn?bi.classList.add("startRange"):xn>_n&&yi===xn&&bi.classList.add("endRange"),yi>=$n&&(Gn===0||yi<=Gn)&&Dn(yi,xn,_n)&&bi.classList.add("inRange"))},vi=0,os=lr.children.length;vi0||xn.getMinutes()>0||xn.getSeconds()>0),sn.selectedDates&&(sn.selectedDates=sn.selectedDates.filter(function(jn){return Xi(jn)}),!sn.selectedDates.length&&En==="min"&&_r(xn),gi()),sn.daysContainer&&(Yf(),xn!==void 0?sn.currentYearElement[En]=xn.getFullYear().toString():sn.currentYearElement.removeAttribute(En),sn.currentYearElement.disabled=!!Pn&&xn!==void 0&&Pn.getFullYear()===xn.getFullYear())}}function YE(){var En=["wrap","weekNumbers","allowInput","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],_n=tn({},On,JSON.parse(JSON.stringify(wn.dataset||{}))),xn={};sn.config.parseDate=_n.parseDate,sn.config.formatDate=_n.formatDate,Object.defineProperty(sn.config,"enable",{get:function(){return sn.config._enable},set:function(lr){sn.config._enable=Xf(lr)}}),Object.defineProperty(sn.config,"disable",{get:function(){return sn.config._disable},set:function(lr){sn.config._disable=Xf(lr)}});var Pn=_n.mode==="time";if(!_n.dateFormat&&(_n.enableTime||Pn)){var jn=Wn.defaultConfig.dateFormat||nn.dateFormat;xn.dateFormat=_n.noCalendar||Pn?"H:i"+(_n.enableSeconds?":S":""):jn+" H:i"+(_n.enableSeconds?":S":"")}if(_n.altInput&&(_n.enableTime||Pn)&&!_n.altFormat){var Nn=Wn.defaultConfig.altFormat||nn.altFormat;xn.altFormat=_n.noCalendar||Pn?"h:i"+(_n.enableSeconds?":S K":" K"):Nn+(" h:i"+(_n.enableSeconds?":S":"")+" K")}_n.altInputClass||(sn.config.altInputClass=sn.input.className+" "+sn.config.altInputClass),Object.defineProperty(sn.config,"minDate",{get:function(){return sn.config._minDate},set:Vf("min")}),Object.defineProperty(sn.config,"maxDate",{get:function(){return sn.config._maxDate},set:Vf("max")});var $n=function(lr){return function(Ir){sn.config[lr==="min"?"_minTime":"_maxTime"]=sn.parseDate(Ir,"H:i:S")}};Object.defineProperty(sn.config,"minTime",{get:function(){return sn.config._minTime},set:$n("min")}),Object.defineProperty(sn.config,"maxTime",{get:function(){return sn.config._maxTime},set:$n("max")}),_n.mode==="time"&&(sn.config.noCalendar=!0,sn.config.enableTime=!0),Object.assign(sn.config,xn,_n);for(var Gn=0;Gn-1?sn.config[sr]=cn(Xn[sr]).map(Ln).concat(sn.config[sr]):typeof _n[sr]=="undefined"&&(sn.config[sr]=Xn[sr])}fr("onParseConfig")}function Uf(){typeof sn.config.locale!="object"&&typeof Wn.l10ns[sn.config.locale]=="undefined"&&sn.config.errorHandler(new Error("flatpickr: invalid locale "+sn.config.locale)),sn.l10n=tn({},Wn.l10ns.default,typeof sn.config.locale=="object"?sn.config.locale:sn.config.locale!=="default"?Wn.l10ns[sn.config.locale]:void 0),bn.K="("+sn.l10n.amPM[0]+"|"+sn.l10n.amPM[1]+"|"+sn.l10n.amPM[0].toLowerCase()+"|"+sn.l10n.amPM[1].toLowerCase()+")";var En=tn({},On,JSON.parse(JSON.stringify(wn.dataset||{})));En.time_24hr===void 0&&Wn.defaultConfig.time_24hr===void 0&&(sn.config.time_24hr=sn.l10n.time_24hr),sn.formatDate=An(sn),sn.parseDate=Tn({config:sn.config,l10n:sn.l10n})}function is(En){if(sn.calendarContainer!==void 0){fr("onPreCalendarPosition");var _n=En||sn._positionElement,xn=Array.prototype.reduce.call(sn.calendarContainer.children,function(i_,o_){return i_+o_.offsetHeight},0),Pn=sn.calendarContainer.offsetWidth,jn=sn.config.position.split(" "),Nn=jn[0],$n=jn.length>1?jn[1]:null,Gn=_n.getBoundingClientRect(),Xn=window.innerHeight-Gn.bottom,sr=Nn==="above"||Nn!=="below"&&Xnxn,lr=window.pageYOffset+Gn.top+(sr?-xn-2:_n.offsetHeight+2);if(dn(sn.calendarContainer,"arrowTop",!sr),dn(sn.calendarContainer,"arrowBottom",sr),!sn.config.inline){var Ir=window.pageXOffset+Gn.left-($n!=null&&$n==="center"?(Pn-Gn.width)/2:0),vi=window.document.body.offsetWidth-(window.pageXOffset+Gn.right),os=Ir+Pn>window.document.body.offsetWidth,Kl=vi+Pn>window.document.body.offsetWidth;if(dn(sn.calendarContainer,"rightMost",os),!sn.config.static)if(sn.calendarContainer.style.top=lr+"px",!os)sn.calendarContainer.style.left=Ir+"px",sn.calendarContainer.style.right="auto";else if(!Kl)sn.calendarContainer.style.left="auto",sn.calendarContainer.style.right=vi+"px";else{var sa=document.styleSheets[0];if(sa===void 0)return;var bi=window.document.body.offsetWidth,Gl=Math.max(0,bi/2-Pn/2),yi=".flatpickr-calendar.centerMost:before",aa=".flatpickr-calendar.centerMost:after",ss=sa.cssRules.length,r_="{left:"+Gn.left+"px;right:auto;}";dn(sn.calendarContainer,"rightMost",!1),dn(sn.calendarContainer,"centerMost",!0),sa.insertRule(yi+","+aa+r_,ss),sn.calendarContainer.style.left=Gl+"px",sn.calendarContainer.style.right="auto"}}}}function Yf(){sn.config.noCalendar||sn.isMobile||(oa(),ta())}function Vl(){sn._input.focus(),window.navigator.userAgent.indexOf("MSIE")!==-1||navigator.msMaxTouchPoints!==void 0?setTimeout(sn.close,0):sn.close()}function Kf(En){En.preventDefault(),En.stopPropagation();var _n=function(lr){return lr.classList&&lr.classList.contains("flatpickr-day")&&!lr.classList.contains("flatpickr-disabled")&&!lr.classList.contains("notAllowed")},xn=gn(En.target,_n);if(xn!==void 0){var Pn=xn,jn=sn.latestSelectedDateObj=new Date(Pn.dateObj.getTime()),Nn=(jn.getMonth()sn.currentMonth+sn.config.showMonths-1)&&sn.config.mode!=="range";if(sn.selectedDateElem=Pn,sn.config.mode==="single")sn.selectedDates=[jn];else if(sn.config.mode==="multiple"){var $n=Yl(jn);$n?sn.selectedDates.splice(parseInt($n),1):sn.selectedDates.push(jn)}else sn.config.mode==="range"&&(sn.selectedDates.length===2&&sn.clear(!1,!1),sn.latestSelectedDateObj=jn,sn.selectedDates.push(jn),kn(jn,sn.selectedDates[0],!0)!==0&&sn.selectedDates.sort(function(lr,Ir){return lr.getTime()-Ir.getTime()}));if(Qn(),Nn){var Gn=sn.currentYear!==jn.getFullYear();sn.currentYear=jn.getFullYear(),sn.currentMonth=jn.getMonth(),Gn&&(fr("onYearChange"),ns()),fr("onMonthChange")}if(oa(),ta(),gi(),sn.config.enableTime&&setTimeout(function(){return sn.showTimeInput=!0},50),!Nn&&sn.config.mode!=="range"&&sn.config.showMonths===1?ei(Pn):sn.selectedDateElem!==void 0&&sn.hourElement===void 0&&sn.selectedDateElem&&sn.selectedDateElem.focus(),sn.hourElement!==void 0&&sn.hourElement!==void 0&&sn.hourElement.focus(),sn.config.closeOnSelect){var Xn=sn.config.mode==="single"&&!sn.config.enableTime,sr=sn.config.mode==="range"&&sn.selectedDates.length===2&&!sn.config.enableTime;(Xn||sr)&&Vl()}pi()}}var ia={locale:[Uf,zf],showMonths:[Ff,In,$f],minDate:[Br],maxDate:[Br]};function KE(En,_n){if(En!==null&&typeof En=="object"){Object.assign(sn.config,En);for(var xn in En)ia[xn]!==void 0&&ia[xn].forEach(function(Pn){return Pn()})}else sn.config[En]=_n,ia[En]!==void 0?ia[En].forEach(function(Pn){return Pn()}):en.indexOf(En)>-1&&(sn.config[En]=cn(_n));sn.redraw(),gi(!1)}function Gf(En,_n){var xn=[];if(En instanceof Array)xn=En.map(function(Pn){return sn.parseDate(Pn,_n)});else if(En instanceof Date||typeof En=="number")xn=[sn.parseDate(En,_n)];else if(typeof En=="string")switch(sn.config.mode){case"single":case"time":xn=[sn.parseDate(En,_n)];break;case"multiple":xn=En.split(sn.config.conjunction).map(function(Pn){return sn.parseDate(Pn,_n)});break;case"range":xn=En.split(sn.l10n.rangeSeparator).map(function(Pn){return sn.parseDate(Pn,_n)});break;default:break}else sn.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(En)));sn.selectedDates=xn.filter(function(Pn){return Pn instanceof Date&&Xi(Pn,!1)}),sn.config.mode==="range"&&sn.selectedDates.sort(function(Pn,jn){return Pn.getTime()-jn.getTime()})}function GE(En,_n,xn){if(_n===void 0&&(_n=!1),xn===void 0&&(xn=sn.config.dateFormat),En!==0&&!En||En instanceof Array&&En.length===0)return sn.clear(_n);Gf(En,xn),sn.showTimeInput=sn.selectedDates.length>0,sn.latestSelectedDateObj=sn.selectedDates[sn.selectedDates.length-1],sn.redraw(),Br(),_r(),sn.selectedDates.length===0&&sn.clear(!1),gi(_n),_n&&fr("onChange")}function Xf(En){return En.slice().map(function(_n){return typeof _n=="string"||typeof _n=="number"||_n instanceof Date?sn.parseDate(_n,void 0,!0):_n&&typeof _n=="object"&&_n.from&&_n.to?{from:sn.parseDate(_n.from,void 0),to:sn.parseDate(_n.to,void 0)}:_n}).filter(function(_n){return _n})}function XE(){sn.selectedDates=[],sn.now=sn.parseDate(sn.config.now)||new Date;var En=sn.config.defaultDate||((sn.input.nodeName==="INPUT"||sn.input.nodeName==="TEXTAREA")&&sn.input.placeholder&&sn.input.value===sn.input.placeholder?null:sn.input.value);En&&Gf(En,sn.config.dateFormat),sn._initialDate=sn.selectedDates.length>0?sn.selectedDates[0]:sn.config.minDate&&sn.config.minDate.getTime()>sn.now.getTime()?sn.config.minDate:sn.config.maxDate&&sn.config.maxDate.getTime()0&&(sn.latestSelectedDateObj=sn.selectedDates[0]),sn.config.minTime!==void 0&&(sn.config.minTime=sn.parseDate(sn.config.minTime,"H:i")),sn.config.maxTime!==void 0&&(sn.config.maxTime=sn.parseDate(sn.config.maxTime,"H:i")),sn.minDateHasTime=!!sn.config.minDate&&(sn.config.minDate.getHours()>0||sn.config.minDate.getMinutes()>0||sn.config.minDate.getSeconds()>0),sn.maxDateHasTime=!!sn.config.maxDate&&(sn.config.maxDate.getHours()>0||sn.config.maxDate.getMinutes()>0||sn.config.maxDate.getSeconds()>0),Object.defineProperty(sn,"showTimeInput",{get:function(){return sn._showTimeInput},set:function(_n){sn._showTimeInput=_n,sn.calendarContainer&&dn(sn.calendarContainer,"showTimeInput",_n),sn.isOpen&&is()}})}function JE(){if(sn.input=sn.config.wrap?wn.querySelector("[data-input]"):wn,!sn.input){sn.config.errorHandler(new Error("Invalid input element specified"));return}sn.input._type=sn.input.type,sn.input.type="text",sn.input.classList.add("flatpickr-input"),sn._input=sn.input,sn.config.altInput&&(sn.altInput=fn(sn.input.nodeName,sn.config.altInputClass),sn._input=sn.altInput,sn.altInput.placeholder=sn.input.placeholder,sn.altInput.disabled=sn.input.disabled,sn.altInput.required=sn.input.required,sn.altInput.tabIndex=sn.input.tabIndex,sn.altInput.type="text",sn.input.setAttribute("type","hidden"),!sn.config.static&&sn.input.parentNode&&sn.input.parentNode.insertBefore(sn.altInput,sn.input.nextSibling)),sn.config.allowInput||sn._input.setAttribute("readonly","readonly"),sn._positionElement=sn.config.positionElement||sn._input}function QE(){var En=sn.config.enableTime?sn.config.noCalendar?"time":"datetime-local":"date";sn.mobileInput=fn("input",sn.input.className+" flatpickr-mobile"),sn.mobileInput.step=sn.input.getAttribute("step")||"any",sn.mobileInput.tabIndex=1,sn.mobileInput.type=En,sn.mobileInput.disabled=sn.input.disabled,sn.mobileInput.required=sn.input.required,sn.mobileInput.placeholder=sn.input.placeholder,sn.mobileFormatStr=En==="datetime-local"?"Y-m-d\\TH:i:S":En==="date"?"Y-m-d":"H:i:S",sn.selectedDates.length>0&&(sn.mobileInput.defaultValue=sn.mobileInput.value=sn.formatDate(sn.selectedDates[0],sn.mobileFormatStr)),sn.config.minDate&&(sn.mobileInput.min=sn.formatDate(sn.config.minDate,"Y-m-d")),sn.config.maxDate&&(sn.mobileInput.max=sn.formatDate(sn.config.maxDate,"Y-m-d")),sn.input.type="hidden",sn.altInput!==void 0&&(sn.altInput.type="hidden");try{sn.input.parentNode&&sn.input.parentNode.insertBefore(sn.mobileInput,sn.input.nextSibling)}catch(_n){}cr(sn.mobileInput,"change",function(_n){sn.setDate(_n.target.value,!1,sn.mobileFormatStr),fr("onChange"),fr("onClose")})}function ZE(En){if(sn.isOpen===!0)return sn.close();sn.open(En)}function fr(En,_n){if(sn.config!==void 0){var xn=sn.config[En];if(xn!==void 0&&xn.length>0)for(var Pn=0;xn[Pn]&&Pn=0&&kn(En,sn.selectedDates[1])<=0}function oa(){sn.config.noCalendar||sn.isMobile||!sn.monthNav||(sn.yearElements.forEach(function(En,_n){var xn=new Date(sn.currentYear,sn.currentMonth,1);xn.setMonth(sn.currentMonth+_n),sn.config.showMonths>1||sn.config.monthSelectorType==="static"?sn.monthElements[_n].textContent=yn(xn.getMonth(),sn.config.shorthandCurrentMonth,sn.l10n)+" ":sn.monthsDropdownContainer.value=xn.getMonth().toString(),En.value=xn.getFullYear().toString()}),sn._hidePrevMonthArrow=sn.config.minDate!==void 0&&(sn.currentYear===sn.config.minDate.getFullYear()?sn.currentMonth<=sn.config.minDate.getMonth():sn.currentYearsn.config.maxDate.getMonth():sn.currentYear>sn.config.maxDate.getFullYear()))}function Jf(En){return sn.selectedDates.map(function(_n){return sn.formatDate(_n,En)}).filter(function(_n,xn,Pn){return sn.config.mode!=="range"||sn.config.enableTime||Pn.indexOf(_n)===xn}).join(sn.config.mode!=="range"?sn.config.conjunction:sn.l10n.rangeSeparator)}function gi(En){En===void 0&&(En=!0),sn.mobileInput!==void 0&&sn.mobileFormatStr&&(sn.mobileInput.value=sn.latestSelectedDateObj!==void 0?sn.formatDate(sn.latestSelectedDateObj,sn.mobileFormatStr):""),sn.input.value=Jf(sn.config.dateFormat),sn.altInput!==void 0&&(sn.altInput.value=Jf(sn.config.altFormat)),En!==!1&&fr("onValueUpdate")}function t_(En){var _n=sn.prevMonthNav.contains(En.target),xn=sn.nextMonthNav.contains(En.target);_n||xn?$l(_n?-1:1):sn.yearElements.indexOf(En.target)>=0?En.target.select():En.target.classList.contains("arrowUp")?sn.changeYear(sn.currentYear+1):En.target.classList.contains("arrowDown")&&sn.changeYear(sn.currentYear-1)}function n_(En){En.preventDefault();var _n=En.type==="keydown",xn=En.target;sn.amPM!==void 0&&En.target===sn.amPM&&(sn.amPM.textContent=sn.l10n.amPM[an(sn.amPM.textContent===sn.l10n.amPM[0])]);var Pn=parseFloat(xn.getAttribute("min")),jn=parseFloat(xn.getAttribute("max")),Nn=parseFloat(xn.getAttribute("step")),$n=parseInt(xn.value,10),Gn=En.delta||(_n?En.which===38?1:-1:0),Xn=$n+Nn*Gn;if(typeof xn.value!="undefined"&&xn.value.length===2){var sr=xn===sn.hourElement,lr=xn===sn.minuteElement;Xnjn&&(Xn=xn===sn.hourElement?Xn-jn-an(!sn.amPM):Pn,lr&&Mi(void 0,1,sn.hourElement)),sn.amPM&&sr&&(Nn===1?Xn+$n===23:Math.abs(Xn-$n)>Nn)&&(sn.amPM.textContent=sn.l10n.amPM[an(sn.amPM.textContent===sn.l10n.amPM[0])]),xn.value=on(Xn)}}return Rn(),sn}function Yn(wn,On){for(var sn=Array.prototype.slice.call(wn).filter(function(In){return In instanceof HTMLElement}),Kn=[],Rn=0;Rnsd,afterRead:()=>rd,afterWrite:()=>cd,applyStyles:()=>Io,arrow:()=>fa,auto:()=>ls,basePlacements:()=>Ei,beforeMain:()=>id,beforeRead:()=>td,beforeWrite:()=>ad,bottom:()=>br,clippingParents:()=>Jl,computeStyles:()=>Po,createPopper:()=>ya,createPopperBase:()=>vd,createPopperLite:()=>bd,detectOverflow:()=>kr,end:()=>cs,eventListeners:()=>ko,flip:()=>ma,hide:()=>ga,left:()=>mr,main:()=>od,modifierPhases:()=>Zl,offset:()=>va,placements:()=>fs,popper:()=>Ji,popperGenerator:()=>io,popperOffsets:()=>jo,preventOverflow:()=>ba,read:()=>nd,reference:()=>Ql,right:()=>pr,start:()=>ti,top:()=>dr,variationPlacements:()=>ca,viewport:()=>us,write:()=>ld});var dr="top",br="bottom",pr="right",mr="left",ls="auto",Ei=[dr,br,pr,mr],ti="start",cs="end",Jl="clippingParents",us="viewport",Ji="popper",Ql="reference",ca=Ei.reduce(function(tn,en){return tn.concat([en+"-"+ti,en+"-"+cs])},[]),fs=[].concat(Ei,[ls]).reduce(function(tn,en){return tn.concat([en,en+"-"+ti,en+"-"+cs])},[]),td="beforeRead",nd="read",rd="afterRead",id="beforeMain",od="main",sd="afterMain",ad="beforeWrite",ld="write",cd="afterWrite",Zl=[td,nd,rd,id,od,sd,ad,ld,cd];function xr(tn){return tn?(tn.nodeName||"").toLowerCase():null}function hr(tn){if(tn==null)return window;if(tn.toString()!=="[object Window]"){var en=tn.ownerDocument;return en&&en.defaultView||window}return tn}function _i(tn){var en=hr(tn).Element;return tn instanceof en||tn instanceof Element}function gr(tn){var en=hr(tn).HTMLElement;return tn instanceof en||tn instanceof HTMLElement}function ua(tn){if(typeof ShadowRoot=="undefined")return!1;var en=hr(tn).ShadowRoot;return tn instanceof en||tn instanceof ShadowRoot}function m_(tn){var en=tn.state;Object.keys(en.elements).forEach(function(nn){var rn=en.styles[nn]||{},on=en.attributes[nn]||{},an=en.elements[nn];!gr(an)||!xr(an)||(Object.assign(an.style,rn),Object.keys(on).forEach(function(ln){var cn=on[ln];cn===!1?an.removeAttribute(ln):an.setAttribute(ln,cn===!0?"":cn)}))})}function g_(tn){var en=tn.state,nn={popper:{position:en.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(en.elements.popper.style,nn.popper),en.styles=nn,en.elements.arrow&&Object.assign(en.elements.arrow.style,nn.arrow),function(){Object.keys(en.elements).forEach(function(rn){var on=en.elements[rn],an=en.attributes[rn]||{},ln=Object.keys(en.styles.hasOwnProperty(rn)?en.styles[rn]:nn[rn]),cn=ln.reduce(function(dn,fn){return dn[fn]="",dn},{});!gr(on)||!xr(on)||(Object.assign(on.style,cn),Object.keys(an).forEach(function(dn){on.removeAttribute(dn)}))})}}var Io={name:"applyStyles",enabled:!0,phase:"write",fn:m_,effect:g_,requires:["computeStyles"]};function Tr(tn){return tn.split("-")[0]}var ki=Math.round;function Ur(tn,en){en===void 0&&(en=!1);var nn=tn.getBoundingClientRect(),rn=1,on=1;return gr(tn)&&en&&(rn=nn.width/tn.offsetWidth||1,on=nn.height/tn.offsetHeight||1),{width:ki(nn.width/rn),height:ki(nn.height/on),top:ki(nn.top/on),right:ki(nn.right/rn),bottom:ki(nn.bottom/on),left:ki(nn.left/rn),x:ki(nn.left/rn),y:ki(nn.top/on)}}function Qi(tn){var en=Ur(tn),nn=tn.offsetWidth,rn=tn.offsetHeight;return Math.abs(en.width-nn)<=1&&(nn=en.width),Math.abs(en.height-rn)<=1&&(rn=en.height),{x:tn.offsetLeft,y:tn.offsetTop,width:nn,height:rn}}function ds(tn,en){var nn=en.getRootNode&&en.getRootNode();if(tn.contains(en))return!0;if(nn&&ua(nn)){var rn=en;do{if(rn&&tn.isSameNode(rn))return!0;rn=rn.parentNode||rn.host}while(rn)}return!1}function Pr(tn){return hr(tn).getComputedStyle(tn)}function ec(tn){return["table","td","th"].indexOf(xr(tn))>=0}function Cr(tn){return((_i(tn)?tn.ownerDocument:tn.document)||window.document).documentElement}function Si(tn){return xr(tn)==="html"?tn:tn.assignedSlot||tn.parentNode||(ua(tn)?tn.host:null)||Cr(tn)}function ud(tn){return!gr(tn)||Pr(tn).position==="fixed"?null:tn.offsetParent}function v_(tn){var en=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,nn=navigator.userAgent.indexOf("Trident")!==-1;if(nn&&gr(tn)){var rn=Pr(tn);if(rn.position==="fixed")return null}for(var on=Si(tn);gr(on)&&["html","body"].indexOf(xr(on))<0;){var an=Pr(on);if(an.transform!=="none"||an.perspective!=="none"||an.contain==="paint"||["transform","perspective"].indexOf(an.willChange)!==-1||en&&an.willChange==="filter"||en&&an.filter&&an.filter!=="none")return on;on=on.parentNode}return null}function Qr(tn){for(var en=hr(tn),nn=ud(tn);nn&&ec(nn)&&Pr(nn).position==="static";)nn=ud(nn);return nn&&(xr(nn)==="html"||xr(nn)==="body"&&Pr(nn).position==="static")?en:nn||v_(tn)||en}function Zi(tn){return["top","bottom"].indexOf(tn)>=0?"x":"y"}var Yr=Math.max,Ni=Math.min,hs=Math.round;function eo(tn,en,nn){return Yr(tn,Ni(en,nn))}function ps(){return{top:0,right:0,bottom:0,left:0}}function ms(tn){return Object.assign({},ps(),tn)}function gs(tn,en){return en.reduce(function(nn,rn){return nn[rn]=tn,nn},{})}var b_=function(en,nn){return en=typeof en=="function"?en(Object.assign({},nn.rects,{placement:nn.placement})):en,ms(typeof en!="number"?en:gs(en,Ei))};function y_(tn){var en,nn=tn.state,rn=tn.name,on=tn.options,an=nn.elements.arrow,ln=nn.modifiersData.popperOffsets,cn=Tr(nn.placement),dn=Zi(cn),fn=[mr,pr].indexOf(cn)>=0,un=fn?"height":"width";if(!(!an||!ln)){var gn=b_(on.padding,nn),hn=Qi(an),pn=dn==="y"?dr:mr,vn=dn==="y"?br:pr,yn=nn.rects.reference[un]+nn.rects.reference[dn]-ln[dn]-nn.rects.popper[un],mn=ln[dn]-nn.rects.reference[dn],bn=Qr(an),Sn=bn?dn==="y"?bn.clientHeight||0:bn.clientWidth||0:0,An=yn/2-mn/2,Tn=gn[pn],kn=Sn-hn[un]-gn[vn],Dn=Sn/2-hn[un]/2+An,qn=eo(Tn,Dn,kn),Fn=dn;nn.modifiersData[rn]=(en={},en[Fn]=qn,en.centerOffset=qn-Dn,en)}}function E_(tn){var en=tn.state,nn=tn.options,rn=nn.element,on=rn===void 0?"[data-popper-arrow]":rn;on!=null&&(typeof on=="string"&&(on=en.elements.popper.querySelector(on),!on)||!ds(en.elements.popper,on)||(en.elements.arrow=on))}var fa={name:"arrow",enabled:!0,phase:"main",fn:y_,effect:E_,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};var __={top:"auto",right:"auto",bottom:"auto",left:"auto"};function S_(tn){var en=tn.x,nn=tn.y,rn=window,on=rn.devicePixelRatio||1;return{x:hs(hs(en*on)/on)||0,y:hs(hs(nn*on)/on)||0}}function fd(tn){var en,nn=tn.popper,rn=tn.popperRect,on=tn.placement,an=tn.offsets,ln=tn.position,cn=tn.gpuAcceleration,dn=tn.adaptive,fn=tn.roundOffsets,un=fn===!0?S_(an):typeof fn=="function"?fn(an):an,gn=un.x,hn=gn===void 0?0:gn,pn=un.y,vn=pn===void 0?0:pn,yn=an.hasOwnProperty("x"),mn=an.hasOwnProperty("y"),bn=mr,Sn=dr,An=window;if(dn){var Tn=Qr(nn),kn="clientHeight",Dn="clientWidth";Tn===hr(nn)&&(Tn=Cr(nn),Pr(Tn).position!=="static"&&(kn="scrollHeight",Dn="scrollWidth")),Tn=Tn,on===dr&&(Sn=br,vn-=Tn[kn]-rn.height,vn*=cn?1:-1),on===mr&&(bn=pr,hn-=Tn[Dn]-rn.width,hn*=cn?1:-1)}var qn=Object.assign({position:ln},dn&&__);if(cn){var Fn;return Object.assign({},qn,(Fn={},Fn[Sn]=mn?"0":"",Fn[bn]=yn?"0":"",Fn.transform=(An.devicePixelRatio||1)<2?"translate("+hn+"px, "+vn+"px)":"translate3d("+hn+"px, "+vn+"px, 0)",Fn))}return Object.assign({},qn,(en={},en[Sn]=mn?vn+"px":"",en[bn]=yn?hn+"px":"",en.transform="",en))}function w_(tn){var en=tn.state,nn=tn.options,rn=nn.gpuAcceleration,on=rn===void 0?!0:rn,an=nn.adaptive,ln=an===void 0?!0:an,cn=nn.roundOffsets,dn=cn===void 0?!0:cn;if(!1)var fn;var un={placement:Tr(en.placement),popper:en.elements.popper,popperRect:en.rects.popper,gpuAcceleration:on};en.modifiersData.popperOffsets!=null&&(en.styles.popper=Object.assign({},en.styles.popper,fd(Object.assign({},un,{offsets:en.modifiersData.popperOffsets,position:en.options.strategy,adaptive:ln,roundOffsets:dn})))),en.modifiersData.arrow!=null&&(en.styles.arrow=Object.assign({},en.styles.arrow,fd(Object.assign({},un,{offsets:en.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:dn})))),en.attributes.popper=Object.assign({},en.attributes.popper,{"data-popper-placement":en.placement})}var Po={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:w_,data:{}};var da={passive:!0};function x_(tn){var en=tn.state,nn=tn.instance,rn=tn.options,on=rn.scroll,an=on===void 0?!0:on,ln=rn.resize,cn=ln===void 0?!0:ln,dn=hr(en.elements.popper),fn=[].concat(en.scrollParents.reference,en.scrollParents.popper);return an&&fn.forEach(function(un){un.addEventListener("scroll",nn.update,da)}),cn&&dn.addEventListener("resize",nn.update,da),function(){an&&fn.forEach(function(un){un.removeEventListener("scroll",nn.update,da)}),cn&&dn.removeEventListener("resize",nn.update,da)}}var ko={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:x_,data:{}};var T_={left:"right",right:"left",bottom:"top",top:"bottom"};function No(tn){return tn.replace(/left|right|bottom|top/g,function(en){return T_[en]})}var O_={start:"end",end:"start"};function ha(tn){return tn.replace(/start|end/g,function(en){return O_[en]})}function to(tn){var en=hr(tn),nn=en.pageXOffset,rn=en.pageYOffset;return{scrollLeft:nn,scrollTop:rn}}function no(tn){return Ur(Cr(tn)).left+to(tn).scrollLeft}function tc(tn){var en=hr(tn),nn=Cr(tn),rn=en.visualViewport,on=nn.clientWidth,an=nn.clientHeight,ln=0,cn=0;return rn&&(on=rn.width,an=rn.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(ln=rn.offsetLeft,cn=rn.offsetTop)),{width:on,height:an,x:ln+no(tn),y:cn}}function nc(tn){var en,nn=Cr(tn),rn=to(tn),on=(en=tn.ownerDocument)==null?void 0:en.body,an=Yr(nn.scrollWidth,nn.clientWidth,on?on.scrollWidth:0,on?on.clientWidth:0),ln=Yr(nn.scrollHeight,nn.clientHeight,on?on.scrollHeight:0,on?on.clientHeight:0),cn=-rn.scrollLeft+no(tn),dn=-rn.scrollTop;return Pr(on||nn).direction==="rtl"&&(cn+=Yr(nn.clientWidth,on?on.clientWidth:0)-an),{width:an,height:ln,x:cn,y:dn}}function ro(tn){var en=Pr(tn),nn=en.overflow,rn=en.overflowX,on=en.overflowY;return/auto|scroll|overlay|hidden/.test(nn+on+rn)}function pa(tn){return["html","body","#document"].indexOf(xr(tn))>=0?tn.ownerDocument.body:gr(tn)&&ro(tn)?tn:pa(Si(tn))}function Ri(tn,en){var nn;en===void 0&&(en=[]);var rn=pa(tn),on=rn===((nn=tn.ownerDocument)==null?void 0:nn.body),an=hr(rn),ln=on?[an].concat(an.visualViewport||[],ro(rn)?rn:[]):rn,cn=en.concat(ln);return on?cn:cn.concat(Ri(Si(ln)))}function Ro(tn){return Object.assign({},tn,{left:tn.x,top:tn.y,right:tn.x+tn.width,bottom:tn.y+tn.height})}function A_(tn){var en=Ur(tn);return en.top=en.top+tn.clientTop,en.left=en.left+tn.clientLeft,en.bottom=en.top+tn.clientHeight,en.right=en.left+tn.clientWidth,en.width=tn.clientWidth,en.height=tn.clientHeight,en.x=en.left,en.y=en.top,en}function dd(tn,en){return en===us?Ro(tc(tn)):gr(en)?A_(en):Ro(nc(Cr(tn)))}function C_(tn){var en=Ri(Si(tn)),nn=["absolute","fixed"].indexOf(Pr(tn).position)>=0,rn=nn&&gr(tn)?Qr(tn):tn;return _i(rn)?en.filter(function(on){return _i(on)&&ds(on,rn)&&xr(on)!=="body"}):[]}function rc(tn,en,nn){var rn=en==="clippingParents"?C_(tn):[].concat(en),on=[].concat(rn,[nn]),an=on[0],ln=on.reduce(function(cn,dn){var fn=dd(tn,dn);return cn.top=Yr(fn.top,cn.top),cn.right=Ni(fn.right,cn.right),cn.bottom=Ni(fn.bottom,cn.bottom),cn.left=Yr(fn.left,cn.left),cn},dd(tn,an));return ln.width=ln.right-ln.left,ln.height=ln.bottom-ln.top,ln.x=ln.left,ln.y=ln.top,ln}function ni(tn){return tn.split("-")[1]}function vs(tn){var en=tn.reference,nn=tn.element,rn=tn.placement,on=rn?Tr(rn):null,an=rn?ni(rn):null,ln=en.x+en.width/2-nn.width/2,cn=en.y+en.height/2-nn.height/2,dn;switch(on){case dr:dn={x:ln,y:en.y-nn.height};break;case br:dn={x:ln,y:en.y+en.height};break;case pr:dn={x:en.x+en.width,y:cn};break;case mr:dn={x:en.x-nn.width,y:cn};break;default:dn={x:en.x,y:en.y}}var fn=on?Zi(on):null;if(fn!=null){var un=fn==="y"?"height":"width";switch(an){case ti:dn[fn]=dn[fn]-(en[un]/2-nn[un]/2);break;case cs:dn[fn]=dn[fn]+(en[un]/2-nn[un]/2);break;default:}}return dn}function kr(tn,en){en===void 0&&(en={});var nn=en,rn=nn.placement,on=rn===void 0?tn.placement:rn,an=nn.boundary,ln=an===void 0?Jl:an,cn=nn.rootBoundary,dn=cn===void 0?us:cn,fn=nn.elementContext,un=fn===void 0?Ji:fn,gn=nn.altBoundary,hn=gn===void 0?!1:gn,pn=nn.padding,vn=pn===void 0?0:pn,yn=ms(typeof vn!="number"?vn:gs(vn,Ei)),mn=un===Ji?Ql:Ji,bn=tn.elements.reference,Sn=tn.rects.popper,An=tn.elements[hn?mn:un],Tn=rc(_i(An)?An:An.contextElement||Cr(tn.elements.popper),ln,dn),kn=Ur(bn),Dn=vs({reference:kn,element:Sn,strategy:"absolute",placement:on}),qn=Ro(Object.assign({},Sn,Dn)),Fn=un===Ji?qn:kn,Un={top:Tn.top-Fn.top+yn.top,bottom:Fn.bottom-Tn.bottom+yn.bottom,left:Tn.left-Fn.left+yn.left,right:Fn.right-Tn.right+yn.right},Yn=tn.modifiersData.offset;if(un===Ji&&Yn){var Wn=Yn[on];Object.keys(Un).forEach(function(wn){var On=[pr,br].indexOf(wn)>=0?1:-1,sn=[dr,br].indexOf(wn)>=0?"y":"x";Un[wn]+=Wn[sn]*On})}return Un}function ic(tn,en){en===void 0&&(en={});var nn=en,rn=nn.placement,on=nn.boundary,an=nn.rootBoundary,ln=nn.padding,cn=nn.flipVariations,dn=nn.allowedAutoPlacements,fn=dn===void 0?fs:dn,un=ni(rn),gn=un?cn?ca:ca.filter(function(vn){return ni(vn)===un}):Ei,hn=gn.filter(function(vn){return fn.indexOf(vn)>=0});hn.length===0&&(hn=gn);var pn=hn.reduce(function(vn,yn){return vn[yn]=kr(tn,{placement:yn,boundary:on,rootBoundary:an,padding:ln})[Tr(yn)],vn},{});return Object.keys(pn).sort(function(vn,yn){return pn[vn]-pn[yn]})}function L_(tn){if(Tr(tn)===ls)return[];var en=No(tn);return[ha(tn),en,ha(en)]}function D_(tn){var en=tn.state,nn=tn.options,rn=tn.name;if(!en.modifiersData[rn]._skip){for(var on=nn.mainAxis,an=on===void 0?!0:on,ln=nn.altAxis,cn=ln===void 0?!0:ln,dn=nn.fallbackPlacements,fn=nn.padding,un=nn.boundary,gn=nn.rootBoundary,hn=nn.altBoundary,pn=nn.flipVariations,vn=pn===void 0?!0:pn,yn=nn.allowedAutoPlacements,mn=en.options.placement,bn=Tr(mn),Sn=bn===mn,An=dn||(Sn||!vn?[No(mn)]:L_(mn)),Tn=[mn].concat(An).reduce(function(Mr,Sr){return Mr.concat(Tr(Sr)===ls?ic(en,{placement:Sr,boundary:un,rootBoundary:gn,padding:fn,flipVariations:vn,allowedAutoPlacements:yn}):Sr)},[]),kn=en.rects.reference,Dn=en.rects.popper,qn=new Map,Fn=!0,Un=Tn[0],Yn=0;Yn=0,Kn=sn?"width":"height",Rn=kr(en,{placement:Wn,boundary:un,rootBoundary:gn,altBoundary:hn,padding:fn}),Ln=sn?On?pr:mr:On?br:dr;kn[Kn]>Dn[Kn]&&(Ln=No(Ln));var In=No(Ln),Bn=[];if(an&&Bn.push(Rn[wn]<=0),cn&&Bn.push(Rn[Ln]<=0,Rn[In]<=0),Bn.every(function(Mr){return Mr})){Un=Wn,Fn=!1;break}qn.set(Wn,Bn)}if(Fn)for(var zn=vn?3:1,Zn=function(Sr){var hi=Tn.find(function(cr){var wr=qn.get(cr);if(wr)return wr.slice(0,Sr).every(function(pi){return pi})});if(hi)return Un=hi,"break"},Qn=zn;Qn>0;Qn--){var _r=Zn(Qn);if(_r==="break")break}en.placement!==Un&&(en.modifiersData[rn]._skip=!0,en.placement=Un,en.reset=!0)}}var ma={name:"flip",enabled:!0,phase:"main",fn:D_,requiresIfExists:["offset"],data:{_skip:!1}};function hd(tn,en,nn){return nn===void 0&&(nn={x:0,y:0}),{top:tn.top-en.height-nn.y,right:tn.right-en.width+nn.x,bottom:tn.bottom-en.height+nn.y,left:tn.left-en.width-nn.x}}function pd(tn){return[dr,pr,br,mr].some(function(en){return tn[en]>=0})}function M_(tn){var en=tn.state,nn=tn.name,rn=en.rects.reference,on=en.rects.popper,an=en.modifiersData.preventOverflow,ln=kr(en,{elementContext:"reference"}),cn=kr(en,{altBoundary:!0}),dn=hd(ln,rn),fn=hd(cn,on,an),un=pd(dn),gn=pd(fn);en.modifiersData[nn]={referenceClippingOffsets:dn,popperEscapeOffsets:fn,isReferenceHidden:un,hasPopperEscaped:gn},en.attributes.popper=Object.assign({},en.attributes.popper,{"data-popper-reference-hidden":un,"data-popper-escaped":gn})}var ga={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:M_};function I_(tn,en,nn){var rn=Tr(tn),on=[mr,dr].indexOf(rn)>=0?-1:1,an=typeof nn=="function"?nn(Object.assign({},en,{placement:tn})):nn,ln=an[0],cn=an[1];return ln=ln||0,cn=(cn||0)*on,[mr,pr].indexOf(rn)>=0?{x:cn,y:ln}:{x:ln,y:cn}}function P_(tn){var en=tn.state,nn=tn.options,rn=tn.name,on=nn.offset,an=on===void 0?[0,0]:on,ln=fs.reduce(function(un,gn){return un[gn]=I_(gn,en.rects,an),un},{}),cn=ln[en.placement],dn=cn.x,fn=cn.y;en.modifiersData.popperOffsets!=null&&(en.modifiersData.popperOffsets.x+=dn,en.modifiersData.popperOffsets.y+=fn),en.modifiersData[rn]=ln}var va={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:P_};function k_(tn){var en=tn.state,nn=tn.name;en.modifiersData[nn]=vs({reference:en.rects.reference,element:en.rects.popper,strategy:"absolute",placement:en.placement})}var jo={name:"popperOffsets",enabled:!0,phase:"read",fn:k_,data:{}};function oc(tn){return tn==="x"?"y":"x"}function N_(tn){var en=tn.state,nn=tn.options,rn=tn.name,on=nn.mainAxis,an=on===void 0?!0:on,ln=nn.altAxis,cn=ln===void 0?!1:ln,dn=nn.boundary,fn=nn.rootBoundary,un=nn.altBoundary,gn=nn.padding,hn=nn.tether,pn=hn===void 0?!0:hn,vn=nn.tetherOffset,yn=vn===void 0?0:vn,mn=kr(en,{boundary:dn,rootBoundary:fn,padding:gn,altBoundary:un}),bn=Tr(en.placement),Sn=ni(en.placement),An=!Sn,Tn=Zi(bn),kn=oc(Tn),Dn=en.modifiersData.popperOffsets,qn=en.rects.reference,Fn=en.rects.popper,Un=typeof yn=="function"?yn(Object.assign({},en.rects,{placement:en.placement})):yn,Yn={x:0,y:0};if(!!Dn){if(an||cn){var Wn=Tn==="y"?dr:mr,wn=Tn==="y"?br:pr,On=Tn==="y"?"height":"width",sn=Dn[Tn],Kn=Dn[Tn]+mn[Wn],Rn=Dn[Tn]-mn[wn],Ln=pn?-Fn[On]/2:0,In=Sn===ti?qn[On]:Fn[On],Bn=Sn===ti?-Fn[On]:-qn[On],zn=en.elements.arrow,Zn=pn&&zn?Qi(zn):{width:0,height:0},Qn=en.modifiersData["arrow#persistent"]?en.modifiersData["arrow#persistent"].padding:ps(),_r=Qn[Wn],Mr=Qn[wn],Sr=eo(0,qn[On],Zn[On]),hi=An?qn[On]/2-Ln-Sr-_r-Un:In-Sr-_r-Un,cr=An?-qn[On]/2+Ln+Sr+Mr+Un:Bn+Sr+Mr+Un,wr=en.elements.arrow&&Qr(en.elements.arrow),pi=wr?Tn==="y"?wr.clientTop||0:wr.clientLeft||0:0,Di=en.modifiersData.offset?en.modifiersData.offset[en.placement][Tn]:0,Br=Dn[Tn]+hi-Di-pi,Gi=Dn[Tn]+cr-Di;if(an){var Mi=eo(pn?Ni(Kn,Br):Kn,sn,pn?Yr(Rn,Gi):Rn);Dn[Tn]=Mi,Yn[Tn]=Mi-sn}if(cn){var Mo=Tn==="x"?dr:mr,Ii=Tn==="x"?br:pr,ei=Dn[kn],mi=ei+mn[Mo],ea=ei-mn[Ii],Pi=eo(pn?Ni(mi,Br):mi,ei,pn?Yr(ea,Gi):ea);Dn[kn]=Pi,Yn[kn]=Pi-ei}}en.modifiersData[rn]=Yn}}var ba={name:"preventOverflow",enabled:!0,phase:"main",fn:N_,requiresIfExists:["offset"]};function sc(tn){return{scrollLeft:tn.scrollLeft,scrollTop:tn.scrollTop}}function ac(tn){return tn===hr(tn)||!gr(tn)?to(tn):sc(tn)}function R_(tn){var en=tn.getBoundingClientRect(),nn=en.width/tn.offsetWidth||1,rn=en.height/tn.offsetHeight||1;return nn!==1||rn!==1}function lc(tn,en,nn){nn===void 0&&(nn=!1);var rn=gr(en),on=gr(en)&&R_(en),an=Cr(en),ln=Ur(tn,on),cn={scrollLeft:0,scrollTop:0},dn={x:0,y:0};return(rn||!rn&&!nn)&&((xr(en)!=="body"||ro(an))&&(cn=ac(en)),gr(en)?(dn=Ur(en,!0),dn.x+=en.clientLeft,dn.y+=en.clientTop):an&&(dn.x=no(an))),{x:ln.left+cn.scrollLeft-dn.x,y:ln.top+cn.scrollTop-dn.y,width:ln.width,height:ln.height}}function j_(tn){var en=new Map,nn=new Set,rn=[];tn.forEach(function(an){en.set(an.name,an)});function on(an){nn.add(an.name);var ln=[].concat(an.requires||[],an.requiresIfExists||[]);ln.forEach(function(cn){if(!nn.has(cn)){var dn=en.get(cn);dn&&on(dn)}}),rn.push(an)}return tn.forEach(function(an){nn.has(an.name)||on(an)}),rn}function cc(tn){var en=j_(tn);return Zl.reduce(function(nn,rn){return nn.concat(en.filter(function(on){return on.phase===rn}))},[])}function uc(tn){var en;return function(){return en||(en=new Promise(function(nn){Promise.resolve().then(function(){en=void 0,nn(tn())})})),en}}function fc(tn){var en=tn.reduce(function(nn,rn){var on=nn[rn.name];return nn[rn.name]=on?Object.assign({},on,rn,{options:Object.assign({},on.options,rn.options),data:Object.assign({},on.data,rn.data)}):rn,nn},{});return Object.keys(en).map(function(nn){return en[nn]})}var md={placement:"bottom",modifiers:[],strategy:"absolute"};function gd(){for(var tn=arguments.length,en=new Array(tn),nn=0;nnnn.matches(en))},parents(tn,en){let nn=[],rn=tn.parentNode;for(;rn&&rn.nodeType===Node.ELEMENT_NODE&&rn.nodeType!==B_;)rn.matches(en)&&nn.push(rn),rn=rn.parentNode;return nn},prev(tn,en){let nn=tn.previousElementSibling;for(;nn;){if(nn.matches(en))return[nn];nn=nn.previousElementSibling}return[]},next(tn,en){let nn=tn.nextElementSibling;for(;nn;){if(nn.matches(en))return[nn];nn=nn.nextElementSibling}return[]}},F_=1e6,$_=1e3,dc="transitionend",z_=tn=>tn==null?`${tn}`:{}.toString.call(tn).match(/\s([a-z]+)/i)[1].toLowerCase(),yd=tn=>{do tn+=Math.floor(Math.random()*F_);while(document.getElementById(tn));return tn},Ed=tn=>{let en=tn.getAttribute("data-bs-target");if(!en||en==="#"){let nn=tn.getAttribute("href");if(!nn||!nn.includes("#")&&!nn.startsWith("."))return null;nn.includes("#")&&!nn.startsWith("#")&&(nn=`#${nn.split("#")[1]}`),en=nn&&nn!=="#"?nn.trim():null}return en},hc=tn=>{let en=Ed(tn);return en&&document.querySelector(en)?en:null},ji=tn=>{let en=Ed(tn);return en?document.querySelector(en):null},W_=tn=>{if(!tn)return 0;let{transitionDuration:en,transitionDelay:nn}=window.getComputedStyle(tn),rn=Number.parseFloat(en),on=Number.parseFloat(nn);return!rn&&!on?0:(en=en.split(",")[0],nn=nn.split(",")[0],(Number.parseFloat(en)+Number.parseFloat(nn))*$_)},_d=tn=>{tn.dispatchEvent(new Event(dc))},qi=tn=>!tn||typeof tn!="object"?!1:(typeof tn.jquery!="undefined"&&(tn=tn[0]),typeof tn.nodeType!="undefined"),qo=tn=>qi(tn)?tn.jquery?tn[0]:tn:typeof tn=="string"&&tn.length>0?Vn.findOne(tn):null,wi=(tn,en,nn)=>{Object.keys(nn).forEach(rn=>{let on=nn[rn],an=en[rn],ln=an&&qi(an)?"element":z_(an);if(!new RegExp(on).test(ln))throw new TypeError(`${tn.toUpperCase()}: Option "${rn}" provided type "${ln}" but expected type "${on}".`)})},_a=tn=>!qi(tn)||tn.getClientRects().length===0?!1:getComputedStyle(tn).getPropertyValue("visibility")==="visible",Ho=tn=>!tn||tn.nodeType!==Node.ELEMENT_NODE||tn.classList.contains("disabled")?!0:typeof tn.disabled!="undefined"?tn.disabled:tn.hasAttribute("disabled")&&tn.getAttribute("disabled")!=="false",Sd=tn=>{if(!document.documentElement.attachShadow)return null;if(typeof tn.getRootNode=="function"){let en=tn.getRootNode();return en instanceof ShadowRoot?en:null}return tn instanceof ShadowRoot?tn:tn.parentNode?Sd(tn.parentNode):null},Sa=()=>{},Bo=tn=>tn.offsetHeight,wd=()=>{let{jQuery:tn}=window;return tn&&!document.body.hasAttribute("data-bs-no-jquery")?tn:null},pc=[],V_=tn=>{document.readyState==="loading"?(pc.length||document.addEventListener("DOMContentLoaded",()=>{pc.forEach(en=>en())}),pc.push(tn)):tn()},jr=()=>document.documentElement.dir==="rtl",Kr=tn=>{V_(()=>{let en=wd();if(en){let nn=tn.NAME,rn=en.fn[nn];en.fn[nn]=tn.jQueryInterface,en.fn[nn].Constructor=tn,en.fn[nn].noConflict=()=>(en.fn[nn]=rn,tn.jQueryInterface)}})},oo=tn=>{typeof tn=="function"&&tn()},xd=(tn,en,nn=!0)=>{if(!nn){oo(tn);return}let rn=5,on=W_(en)+rn,an=!1,ln=({target:cn})=>{cn===en&&(an=!0,en.removeEventListener(dc,ln),oo(tn))};en.addEventListener(dc,ln),setTimeout(()=>{an||_d(en)},on)},Td=(tn,en,nn,rn)=>{let on=tn.indexOf(en);if(on===-1)return tn[!nn&&rn?tn.length-1:0];let an=tn.length;return on+=nn?1:-1,rn&&(on=(on+an)%an),tn[Math.max(0,Math.min(on,an-1))]},U_=/[^.]*(?=\..*)\.|.*/,Y_=/\..*/,K_=/::\d+$/,mc={},Od=1,G_={mouseenter:"mouseover",mouseleave:"mouseout"},X_=/^(mouseenter|mouseleave)/i,Ad=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 Cd(tn,en){return en&&`${en}::${Od++}`||tn.uidEvent||Od++}function Ld(tn){let en=Cd(tn);return tn.uidEvent=en,mc[en]=mc[en]||{},mc[en]}function J_(tn,en){return function nn(rn){return rn.delegateTarget=tn,nn.oneOff&&Mn.off(tn,rn.type,en),en.apply(tn,[rn])}}function Q_(tn,en,nn){return function rn(on){let an=tn.querySelectorAll(en);for(let{target:ln}=on;ln&&ln!==this;ln=ln.parentNode)for(let cn=an.length;cn--;)if(an[cn]===ln)return on.delegateTarget=ln,rn.oneOff&&Mn.off(tn,on.type,en,nn),nn.apply(ln,[on]);return null}}function Dd(tn,en,nn=null){let rn=Object.keys(tn);for(let on=0,an=rn.length;onfunction(yn){if(!yn.relatedTarget||yn.relatedTarget!==yn.delegateTarget&&!yn.delegateTarget.contains(yn.relatedTarget))return vn.call(this,yn)};rn?rn=pn(rn):nn=pn(nn)}let[an,ln,cn]=Md(en,nn,rn),dn=Ld(tn),fn=dn[cn]||(dn[cn]={}),un=Dd(fn,ln,an?nn:null);if(un){un.oneOff=un.oneOff&&on;return}let gn=Cd(ln,en.replace(U_,"")),hn=an?Q_(tn,nn,rn):J_(tn,nn);hn.delegationSelector=an?nn:null,hn.originalHandler=ln,hn.oneOff=on,hn.uidEvent=gn,fn[gn]=hn,tn.addEventListener(cn,hn,an)}function gc(tn,en,nn,rn,on){let an=Dd(en[nn],rn,on);!an||(tn.removeEventListener(nn,an,Boolean(on)),delete en[nn][an.uidEvent])}function Z_(tn,en,nn,rn){let on=en[nn]||{};Object.keys(on).forEach(an=>{if(an.includes(rn)){let ln=on[an];gc(tn,en,nn,ln.originalHandler,ln.delegationSelector)}})}function Pd(tn){return tn=tn.replace(Y_,""),G_[tn]||tn}var Mn={on(tn,en,nn,rn){Id(tn,en,nn,rn,!1)},one(tn,en,nn,rn){Id(tn,en,nn,rn,!0)},off(tn,en,nn,rn){if(typeof en!="string"||!tn)return;let[on,an,ln]=Md(en,nn,rn),cn=ln!==en,dn=Ld(tn),fn=en.startsWith(".");if(typeof an!="undefined"){if(!dn||!dn[ln])return;gc(tn,dn,ln,an,on?nn:null);return}fn&&Object.keys(dn).forEach(gn=>{Z_(tn,dn,gn,en.slice(1))});let un=dn[ln]||{};Object.keys(un).forEach(gn=>{let hn=gn.replace(K_,"");if(!cn||en.includes(hn)){let pn=un[gn];gc(tn,dn,ln,pn.originalHandler,pn.delegationSelector)}})},trigger(tn,en,nn){if(typeof en!="string"||!tn)return null;let rn=wd(),on=Pd(en),an=en!==on,ln=Ad.has(on),cn,dn=!0,fn=!0,un=!1,gn=null;return an&&rn&&(cn=rn.Event(en,nn),rn(tn).trigger(cn),dn=!cn.isPropagationStopped(),fn=!cn.isImmediatePropagationStopped(),un=cn.isDefaultPrevented()),ln?(gn=document.createEvent("HTMLEvents"),gn.initEvent(on,dn,!0)):gn=new CustomEvent(en,{bubbles:dn,cancelable:!0}),typeof nn!="undefined"&&Object.keys(nn).forEach(hn=>{Object.defineProperty(gn,hn,{get(){return nn[hn]}})}),un&&gn.preventDefault(),fn&&tn.dispatchEvent(gn),gn.defaultPrevented&&typeof cn!="undefined"&&cn.preventDefault(),gn}},Hi=new Map,so={set(tn,en,nn){Hi.has(tn)||Hi.set(tn,new Map);let rn=Hi.get(tn);if(!rn.has(en)&&rn.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(rn.keys())[0]}.`);return}rn.set(en,nn)},get(tn,en){return Hi.has(tn)&&Hi.get(tn).get(en)||null},remove(tn,en){if(!Hi.has(tn))return;let nn=Hi.get(tn);nn.delete(en),nn.size===0&&Hi.delete(tn)}},eS="5.0.2",Gr=class{constructor(en){en=qo(en),!!en&&(this._element=en,so.set(this._element,this.constructor.DATA_KEY,this))}dispose(){so.remove(this._element,this.constructor.DATA_KEY),Mn.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(en=>{this[en]=null})}_queueCallback(en,nn,rn=!0){xd(en,nn,rn)}static getInstance(en){return so.get(en,this.DATA_KEY)}static getOrCreateInstance(en,nn={}){return this.getInstance(en)||new this(en,typeof nn=="object"?nn:null)}static get VERSION(){return eS}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}},tS="alert",nS="bs.alert",vc=`.${nS}`,rS=".data-api",iS='[data-bs-dismiss="alert"]',oS=`close${vc}`,sS=`closed${vc}`,aS=`click${vc}${rS}`,lS="alert",cS="fade",uS="show",Fo=class extends Gr{static get NAME(){return tS}close(en){let nn=en?this._getRootElement(en):this._element,rn=this._triggerCloseEvent(nn);rn===null||rn.defaultPrevented||this._removeElement(nn)}_getRootElement(en){return ji(en)||en.closest(`.${lS}`)}_triggerCloseEvent(en){return Mn.trigger(en,oS)}_removeElement(en){en.classList.remove(uS);let nn=en.classList.contains(cS);this._queueCallback(()=>this._destroyElement(en),en,nn)}_destroyElement(en){en.remove(),Mn.trigger(en,sS)}static jQueryInterface(en){return this.each(function(){let nn=Fo.getOrCreateInstance(this);en==="close"&&nn[en](this)})}static handleDismiss(en){return function(nn){nn&&nn.preventDefault(),en.close(this)}}};Mn.on(document,aS,iS,Fo.handleDismiss(new Fo));Kr(Fo);var fS="button",dS="bs.button",hS=`.${dS}`,pS=".data-api",mS="active",kd='[data-bs-toggle="button"]',gS=`click${hS}${pS}`,bs=class extends Gr{static get NAME(){return fS}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(mS))}static jQueryInterface(en){return this.each(function(){let nn=bs.getOrCreateInstance(this);en==="toggle"&&nn[en]()})}};Mn.on(document,gS,kd,tn=>{tn.preventDefault();let en=tn.target.closest(kd);bs.getOrCreateInstance(en).toggle()});Kr(bs);function Nd(tn){return tn==="true"?!0:tn==="false"?!1:tn===Number(tn).toString()?Number(tn):tn===""||tn==="null"?null:tn}function bc(tn){return tn.replace(/[A-Z]/g,en=>`-${en.toLowerCase()}`)}var Or={setDataAttribute(tn,en,nn){tn.setAttribute(`data-bs-${bc(en)}`,nn)},removeDataAttribute(tn,en){tn.removeAttribute(`data-bs-${bc(en)}`)},getDataAttributes(tn){if(!tn)return{};let en={};return Object.keys(tn.dataset).filter(nn=>nn.startsWith("bs")).forEach(nn=>{let rn=nn.replace(/^bs/,"");rn=rn.charAt(0).toLowerCase()+rn.slice(1,rn.length),en[rn]=Nd(tn.dataset[nn])}),en},getDataAttribute(tn,en){return Nd(tn.getAttribute(`data-bs-${bc(en)}`))},offset(tn){let en=tn.getBoundingClientRect();return{top:en.top+document.body.scrollTop,left:en.left+document.body.scrollLeft}},position(tn){return{top:tn.offsetTop,left:tn.offsetLeft}}},Rd="carousel",vS="bs.carousel",$r=`.${vS}`,jd=".data-api",bS="ArrowLeft",yS="ArrowRight",ES=500,_S=40,qd={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},SS={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},ao="next",lo="prev",co="left",ys="right",wS={[bS]:ys,[yS]:co},xS=`slide${$r}`,Hd=`slid${$r}`,TS=`keydown${$r}`,OS=`mouseenter${$r}`,AS=`mouseleave${$r}`,CS=`touchstart${$r}`,LS=`touchmove${$r}`,DS=`touchend${$r}`,MS=`pointerdown${$r}`,IS=`pointerup${$r}`,PS=`dragstart${$r}`,kS=`load${$r}${jd}`,NS=`click${$r}${jd}`,RS="carousel",uo="active",jS="slide",qS="carousel-item-end",HS="carousel-item-start",BS="carousel-item-next",FS="carousel-item-prev",$S="pointer-event",zS=".active",wa=".active.carousel-item",WS=".carousel-item",VS=".carousel-item img",US=".carousel-item-next, .carousel-item-prev",YS=".carousel-indicators",KS="[data-bs-target]",GS="[data-bs-slide], [data-bs-slide-to]",XS='[data-bs-ride="carousel"]',Bd="touch",Fd="pen",ri=class extends Gr{constructor(en,nn){super(en);this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(nn),this._indicatorsElement=Vn.findOne(YS,this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return qd}static get NAME(){return Rd}next(){this._slide(ao)}nextWhenVisible(){!document.hidden&&_a(this._element)&&this.next()}prev(){this._slide(lo)}pause(en){en||(this._isPaused=!0),Vn.findOne(US,this._element)&&(_d(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(en){en||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(en){this._activeElement=Vn.findOne(wa,this._element);let nn=this._getItemIndex(this._activeElement);if(en>this._items.length-1||en<0)return;if(this._isSliding){Mn.one(this._element,Hd,()=>this.to(en));return}if(nn===en){this.pause(),this.cycle();return}let rn=en>nn?ao:lo;this._slide(rn,this._items[en])}_getConfig(en){return en=Jn(Jn(Jn({},qd),Or.getDataAttributes(this._element)),typeof en=="object"?en:{}),wi(Rd,en,SS),en}_handleSwipe(){let en=Math.abs(this.touchDeltaX);if(en<=_S)return;let nn=en/this.touchDeltaX;this.touchDeltaX=0,!!nn&&this._slide(nn>0?ys:co)}_addEventListeners(){this._config.keyboard&&Mn.on(this._element,TS,en=>this._keydown(en)),this._config.pause==="hover"&&(Mn.on(this._element,OS,en=>this.pause(en)),Mn.on(this._element,AS,en=>this.cycle(en))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){let en=on=>{this._pointerEvent&&(on.pointerType===Fd||on.pointerType===Bd)?this.touchStartX=on.clientX:this._pointerEvent||(this.touchStartX=on.touches[0].clientX)},nn=on=>{this.touchDeltaX=on.touches&&on.touches.length>1?0:on.touches[0].clientX-this.touchStartX},rn=on=>{this._pointerEvent&&(on.pointerType===Fd||on.pointerType===Bd)&&(this.touchDeltaX=on.clientX-this.touchStartX),this._handleSwipe(),this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(an=>this.cycle(an),ES+this._config.interval))};Vn.find(VS,this._element).forEach(on=>{Mn.on(on,PS,an=>an.preventDefault())}),this._pointerEvent?(Mn.on(this._element,MS,on=>en(on)),Mn.on(this._element,IS,on=>rn(on)),this._element.classList.add($S)):(Mn.on(this._element,CS,on=>en(on)),Mn.on(this._element,LS,on=>nn(on)),Mn.on(this._element,DS,on=>rn(on)))}_keydown(en){if(/input|textarea/i.test(en.target.tagName))return;let nn=wS[en.key];nn&&(en.preventDefault(),this._slide(nn))}_getItemIndex(en){return this._items=en&&en.parentNode?Vn.find(WS,en.parentNode):[],this._items.indexOf(en)}_getItemByOrder(en,nn){let rn=en===ao;return Td(this._items,nn,rn,this._config.wrap)}_triggerSlideEvent(en,nn){let rn=this._getItemIndex(en),on=this._getItemIndex(Vn.findOne(wa,this._element));return Mn.trigger(this._element,xS,{relatedTarget:en,direction:nn,from:on,to:rn})}_setActiveIndicatorElement(en){if(this._indicatorsElement){let nn=Vn.findOne(zS,this._indicatorsElement);nn.classList.remove(uo),nn.removeAttribute("aria-current");let rn=Vn.find(KS,this._indicatorsElement);for(let on=0;on{Mn.trigger(this._element,Hd,{relatedTarget:ln,direction:hn,from:an,to:cn})};if(this._element.classList.contains(jS)){ln.classList.add(gn),Bo(ln),on.classList.add(un),ln.classList.add(un);let yn=()=>{ln.classList.remove(un,gn),ln.classList.add(uo),on.classList.remove(uo,gn,un),this._isSliding=!1,setTimeout(vn,0)};this._queueCallback(yn,on,!0)}else on.classList.remove(uo),ln.classList.add(uo),this._isSliding=!1,vn();dn&&this.cycle()}_directionToOrder(en){return[ys,co].includes(en)?jr()?en===co?lo:ao:en===co?ao:lo:en}_orderToDirection(en){return[ao,lo].includes(en)?jr()?en===lo?co:ys:en===lo?ys:co:en}static carouselInterface(en,nn){let rn=ri.getOrCreateInstance(en,nn),{_config:on}=rn;typeof nn=="object"&&(on=Jn(Jn({},on),nn));let an=typeof nn=="string"?nn:on.slide;if(typeof nn=="number")rn.to(nn);else if(typeof an=="string"){if(typeof rn[an]=="undefined")throw new TypeError(`No method named "${an}"`);rn[an]()}else on.interval&&on.ride&&(rn.pause(),rn.cycle())}static jQueryInterface(en){return this.each(function(){ri.carouselInterface(this,en)})}static dataApiClickHandler(en){let nn=ji(this);if(!nn||!nn.classList.contains(RS))return;let rn=Jn(Jn({},Or.getDataAttributes(nn)),Or.getDataAttributes(this)),on=this.getAttribute("data-bs-slide-to");on&&(rn.interval=!1),ri.carouselInterface(nn,rn),on&&ri.getInstance(nn).to(on),en.preventDefault()}};Mn.on(document,NS,GS,ri.dataApiClickHandler);Mn.on(window,kS,()=>{let tn=Vn.find(XS);for(let en=0,nn=tn.length;enfn===this._element);cn!==null&&dn.length&&(this._selector=cn,this._triggerArray.push(ln))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return yc}static get NAME(){return $d}toggle(){this._element.classList.contains(fo)?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains(fo))return;let en,nn;this._parent&&(en=Vn.find(ow,this._parent).filter(fn=>typeof this._config.parent=="string"?fn.getAttribute("data-bs-parent")===this._config.parent:fn.classList.contains(_s)),en.length===0&&(en=null));let rn=Vn.findOne(this._selector);if(en){let fn=en.find(un=>rn!==un);if(nn=fn?qr.getInstance(fn):null,nn&&nn._isTransitioning)return}if(Mn.trigger(this._element,ZS).defaultPrevented)return;en&&en.forEach(fn=>{rn!==fn&&qr.collapseInterface(fn,"hide"),nn||so.set(fn,zd,null)});let an=this._getDimension();this._element.classList.remove(_s),this._element.classList.add(xa),this._element.style[an]=0,this._triggerArray.length&&this._triggerArray.forEach(fn=>{fn.classList.remove(Ta),fn.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);let ln=()=>{this._element.classList.remove(xa),this._element.classList.add(_s,fo),this._element.style[an]="",this.setTransitioning(!1),Mn.trigger(this._element,ew)},dn=`scroll${an[0].toUpperCase()+an.slice(1)}`;this._queueCallback(ln,this._element,!0),this._element.style[an]=`${this._element[dn]}px`}hide(){if(this._isTransitioning||!this._element.classList.contains(fo)||Mn.trigger(this._element,tw).defaultPrevented)return;let nn=this._getDimension();this._element.style[nn]=`${this._element.getBoundingClientRect()[nn]}px`,Bo(this._element),this._element.classList.add(xa),this._element.classList.remove(_s,fo);let rn=this._triggerArray.length;if(rn>0)for(let an=0;an{this.setTransitioning(!1),this._element.classList.remove(xa),this._element.classList.add(_s),Mn.trigger(this._element,nw)};this._element.style[nn]="",this._queueCallback(on,this._element,!0)}setTransitioning(en){this._isTransitioning=en}_getConfig(en){return en=Jn(Jn({},yc),en),en.toggle=Boolean(en.toggle),wi($d,en,QS),en}_getDimension(){return this._element.classList.contains(Wd)?Wd:iw}_getParent(){let{parent:en}=this._config;en=qo(en);let nn=`${Ss}[data-bs-parent="${en}"]`;return Vn.find(nn,en).forEach(rn=>{let on=ji(rn);this._addAriaAndCollapsedClass(on,[rn])}),en}_addAriaAndCollapsedClass(en,nn){if(!en||!nn.length)return;let rn=en.classList.contains(fo);nn.forEach(on=>{rn?on.classList.remove(Ta):on.classList.add(Ta),on.setAttribute("aria-expanded",rn)})}static collapseInterface(en,nn){let rn=qr.getInstance(en),on=Jn(Jn(Jn({},yc),Or.getDataAttributes(en)),typeof nn=="object"&&nn?nn:{});if(!rn&&on.toggle&&typeof nn=="string"&&/show|hide/.test(nn)&&(on.toggle=!1),rn||(rn=new qr(en,on)),typeof nn=="string"){if(typeof rn[nn]=="undefined")throw new TypeError(`No method named "${nn}"`);rn[nn]()}}static jQueryInterface(en){return this.each(function(){qr.collapseInterface(this,en)})}};Mn.on(document,rw,Ss,function(tn){(tn.target.tagName==="A"||tn.delegateTarget&&tn.delegateTarget.tagName==="A")&&tn.preventDefault();let en=Or.getDataAttributes(this),nn=hc(this);Vn.find(nn).forEach(on=>{let an=qr.getInstance(on),ln;an?(an._parent===null&&typeof en.parent=="string"&&(an._config.parent=en.parent,an._parent=an._getParent()),ln="toggle"):ln=en,qr.collapseInterface(on,ln)})});Kr(qr);var Ec="dropdown",sw="bs.dropdown",Bi=`.${sw}`,_c=".data-api",Oa="Escape",Vd="Space",Ud="Tab",Sc="ArrowUp",Aa="ArrowDown",aw=2,lw=new RegExp(`${Sc}|${Aa}|${Oa}`),cw=`hide${Bi}`,uw=`hidden${Bi}`,fw=`show${Bi}`,dw=`shown${Bi}`,hw=`click${Bi}`,Yd=`click${Bi}${_c}`,Kd=`keydown${Bi}${_c}`,pw=`keyup${Bi}${_c}`,xi="show",mw="dropup",gw="dropend",vw="dropstart",bw="navbar",ws='[data-bs-toggle="dropdown"]',wc=".dropdown-menu",yw=".navbar-nav",Ew=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",_w=jr()?"top-end":"top-start",Sw=jr()?"top-start":"top-end",ww=jr()?"bottom-end":"bottom-start",xw=jr()?"bottom-start":"bottom-end",Tw=jr()?"left-start":"right-start",Ow=jr()?"right-start":"left-start",Aw={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},Cw={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"},Nr=class extends Gr{constructor(en,nn){super(en);this._popper=null,this._config=this._getConfig(nn),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return Aw}static get DefaultType(){return Cw}static get NAME(){return Ec}toggle(){if(Ho(this._element))return;if(this._element.classList.contains(xi)){this.hide();return}this.show()}show(){if(Ho(this._element)||this._menu.classList.contains(xi))return;let en=Nr.getParentFromElement(this._element),nn={relatedTarget:this._element};if(!Mn.trigger(this._element,fw,nn).defaultPrevented){if(this._inNavbar)Or.setDataAttribute(this._menu,"popper","none");else{if(typeof Ea=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let on=this._element;this._config.reference==="parent"?on=en:qi(this._config.reference)?on=qo(this._config.reference):typeof this._config.reference=="object"&&(on=this._config.reference);let an=this._getPopperConfig(),ln=an.modifiers.find(cn=>cn.name==="applyStyles"&&cn.enabled===!1);this._popper=ya(on,this._menu,an),ln&&Or.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!en.closest(yw)&&[].concat(...document.body.children).forEach(on=>Mn.on(on,"mouseover",Sa)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle(xi),this._element.classList.toggle(xi),Mn.trigger(this._element,dw,nn)}}hide(){if(Ho(this._element)||!this._menu.classList.contains(xi))return;let en={relatedTarget:this._element};this._completeHide(en)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){Mn.on(this._element,hw,en=>{en.preventDefault(),this.toggle()})}_completeHide(en){Mn.trigger(this._element,cw,en).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(rn=>Mn.off(rn,"mouseover",Sa)),this._popper&&this._popper.destroy(),this._menu.classList.remove(xi),this._element.classList.remove(xi),this._element.setAttribute("aria-expanded","false"),Or.removeDataAttribute(this._menu,"popper"),Mn.trigger(this._element,uw,en))}_getConfig(en){if(en=Jn(Jn(Jn({},this.constructor.Default),Or.getDataAttributes(this._element)),en),wi(Ec,en,this.constructor.DefaultType),typeof en.reference=="object"&&!qi(en.reference)&&typeof en.reference.getBoundingClientRect!="function")throw new TypeError(`${Ec.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return en}_getMenuElement(){return Vn.next(this._element,wc)[0]}_getPlacement(){let en=this._element.parentNode;if(en.classList.contains(gw))return Tw;if(en.classList.contains(vw))return Ow;let nn=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return en.classList.contains(mw)?nn?Sw:_w:nn?xw:ww}_detectNavbar(){return this._element.closest(`.${bw}`)!==null}_getOffset(){let{offset:en}=this._config;return typeof en=="string"?en.split(",").map(nn=>Number.parseInt(nn,10)):typeof en=="function"?nn=>en(nn,this._element):en}_getPopperConfig(){let en={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return this._config.display==="static"&&(en.modifiers=[{name:"applyStyles",enabled:!1}]),Jn(Jn({},en),typeof this._config.popperConfig=="function"?this._config.popperConfig(en):this._config.popperConfig)}_selectMenuItem({key:en,target:nn}){let rn=Vn.find(Ew,this._menu).filter(_a);!rn.length||Td(rn,nn,en===Aa,!rn.includes(nn)).focus()}static dropdownInterface(en,nn){let rn=Nr.getOrCreateInstance(en,nn);if(typeof nn=="string"){if(typeof rn[nn]=="undefined")throw new TypeError(`No method named "${nn}"`);rn[nn]()}}static jQueryInterface(en){return this.each(function(){Nr.dropdownInterface(this,en)})}static clearMenus(en){if(en&&(en.button===aw||en.type==="keyup"&&en.key!==Ud))return;let nn=Vn.find(ws);for(let rn=0,on=nn.length;rnthis.matches(ws)?this:Vn.prev(this,ws)[0];if(en.key===Oa){rn().focus(),Nr.clearMenus();return}if(en.key===Sc||en.key===Aa){nn||rn().click(),Nr.getInstance(rn())._selectMenuItem(en);return}(!nn||en.key===Vd)&&Nr.clearMenus()}};Mn.on(document,Kd,ws,Nr.dataApiKeydownHandler);Mn.on(document,Kd,wc,Nr.dataApiKeydownHandler);Mn.on(document,Yd,Nr.clearMenus);Mn.on(document,pw,Nr.clearMenus);Mn.on(document,Yd,ws,function(tn){tn.preventDefault(),Nr.dropdownInterface(this)});Kr(Nr);var Gd=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Xd=".sticky-top",Ca=class{constructor(){this._element=document.body}getWidth(){let en=document.documentElement.clientWidth;return Math.abs(window.innerWidth-en)}hide(){let en=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",nn=>nn+en),this._setElementAttributes(Gd,"paddingRight",nn=>nn+en),this._setElementAttributes(Xd,"marginRight",nn=>nn-en)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(en,nn,rn){let on=this.getWidth(),an=ln=>{if(ln!==this._element&&window.innerWidth>ln.clientWidth+on)return;this._saveInitialAttribute(ln,nn);let cn=window.getComputedStyle(ln)[nn];ln.style[nn]=`${rn(Number.parseFloat(cn))}px`};this._applyManipulationCallback(en,an)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(Gd,"paddingRight"),this._resetElementAttributes(Xd,"marginRight")}_saveInitialAttribute(en,nn){let rn=en.style[nn];rn&&Or.setDataAttribute(en,nn,rn)}_resetElementAttributes(en,nn){let rn=on=>{let an=Or.getDataAttribute(on,nn);typeof an=="undefined"?on.style.removeProperty(nn):(Or.removeDataAttribute(on,nn),on.style[nn]=an)};this._applyManipulationCallback(en,rn)}_applyManipulationCallback(en,nn){qi(en)?nn(en):Vn.find(en,this._element).forEach(nn)}isOverflowing(){return this.getWidth()>0}},Lw={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},Dw={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},Jd="backdrop",Mw="modal-backdrop",Iw="fade",Qd="show",Zd=`mousedown.bs.${Jd}`,xc=class{constructor(en){this._config=this._getConfig(en),this._isAppended=!1,this._element=null}show(en){if(!this._config.isVisible){oo(en);return}this._append(),this._config.isAnimated&&Bo(this._getElement()),this._getElement().classList.add(Qd),this._emulateAnimation(()=>{oo(en)})}hide(en){if(!this._config.isVisible){oo(en);return}this._getElement().classList.remove(Qd),this._emulateAnimation(()=>{this.dispose(),oo(en)})}_getElement(){if(!this._element){let en=document.createElement("div");en.className=Mw,this._config.isAnimated&&en.classList.add(Iw),this._element=en}return this._element}_getConfig(en){return en=Jn(Jn({},Lw),typeof en=="object"?en:{}),en.rootElement=qo(en.rootElement),wi(Jd,en,Dw),en}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),Mn.on(this._getElement(),Zd,()=>{oo(this._config.clickCallback)}),this._isAppended=!0)}dispose(){!this._isAppended||(Mn.off(this._element,Zd),this._element.remove(),this._isAppended=!1)}_emulateAnimation(en){xd(en,this._getElement(),this._config.isAnimated)}},eh="modal",Pw="bs.modal",zr=`.${Pw}`,kw=".data-api",th="Escape",nh={backdrop:!0,keyboard:!0,focus:!0},Nw={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},Rw=`hide${zr}`,jw=`hidePrevented${zr}`,rh=`hidden${zr}`,ih=`show${zr}`,qw=`shown${zr}`,La=`focusin${zr}`,oh=`resize${zr}`,Tc=`click.dismiss${zr}`,sh=`keydown.dismiss${zr}`,Hw=`mouseup.dismiss${zr}`,ah=`mousedown.dismiss${zr}`,Bw=`click${zr}${kw}`,lh="modal-open",Fw="fade",ch="show",Oc="modal-static",$w=".modal-dialog",zw=".modal-body",Ww='[data-bs-toggle="modal"]',Vw='[data-bs-dismiss="modal"]',Fi=class extends Gr{constructor(en,nn){super(en);this._config=this._getConfig(nn),this._dialog=Vn.findOne($w,this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new Ca}static get Default(){return nh}static get NAME(){return eh}toggle(en){return this._isShown?this.hide():this.show(en)}show(en){this._isShown||this._isTransitioning||Mn.trigger(this._element,ih,{relatedTarget:en}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(lh),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),Mn.on(this._element,Tc,Vw,rn=>this.hide(rn)),Mn.on(this._dialog,ah,()=>{Mn.one(this._element,Hw,rn=>{rn.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(en)))}hide(en){if(en&&["A","AREA"].includes(en.target.tagName)&&en.preventDefault(),!this._isShown||this._isTransitioning||Mn.trigger(this._element,Rw).defaultPrevented)return;this._isShown=!1;let rn=this._isAnimated();rn&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),Mn.off(document,La),this._element.classList.remove(ch),Mn.off(this._element,Tc),Mn.off(this._dialog,ah),this._queueCallback(()=>this._hideModal(),this._element,rn)}dispose(){[window,this._dialog].forEach(en=>Mn.off(en,zr)),this._backdrop.dispose(),super.dispose(),Mn.off(document,La)}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new xc({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(en){return en=Jn(Jn(Jn({},nh),Or.getDataAttributes(this._element)),typeof en=="object"?en:{}),wi(eh,en,Nw),en}_showElement(en){let nn=this._isAnimated(),rn=Vn.findOne(zw,this._dialog);(!this._element.parentNode||this._element.parentNode.nodeType!==Node.ELEMENT_NODE)&&document.body.appendChild(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,rn&&(rn.scrollTop=0),nn&&Bo(this._element),this._element.classList.add(ch),this._config.focus&&this._enforceFocus();let on=()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,Mn.trigger(this._element,qw,{relatedTarget:en})};this._queueCallback(on,this._dialog,nn)}_enforceFocus(){Mn.off(document,La),Mn.on(document,La,en=>{document!==en.target&&this._element!==en.target&&!this._element.contains(en.target)&&this._element.focus()})}_setEscapeEvent(){this._isShown?Mn.on(this._element,sh,en=>{this._config.keyboard&&en.key===th?(en.preventDefault(),this.hide()):!this._config.keyboard&&en.key===th&&this._triggerBackdropTransition()}):Mn.off(this._element,sh)}_setResizeEvent(){this._isShown?Mn.on(window,oh,()=>this._adjustDialog()):Mn.off(window,oh)}_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(lh),this._resetAdjustments(),this._scrollBar.reset(),Mn.trigger(this._element,rh)})}_showBackdrop(en){Mn.on(this._element,Tc,nn=>{if(this._ignoreBackdropClick){this._ignoreBackdropClick=!1;return}nn.target===nn.currentTarget&&(this._config.backdrop===!0?this.hide():this._config.backdrop==="static"&&this._triggerBackdropTransition())}),this._backdrop.show(en)}_isAnimated(){return this._element.classList.contains(Fw)}_triggerBackdropTransition(){if(Mn.trigger(this._element,jw).defaultPrevented)return;let{classList:nn,scrollHeight:rn,style:on}=this._element,an=rn>document.documentElement.clientHeight;!an&&on.overflowY==="hidden"||nn.contains(Oc)||(an||(on.overflowY="hidden"),nn.add(Oc),this._queueCallback(()=>{nn.remove(Oc),an||this._queueCallback(()=>{on.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let en=this._element.scrollHeight>document.documentElement.clientHeight,nn=this._scrollBar.getWidth(),rn=nn>0;(!rn&&en&&!jr()||rn&&!en&&jr())&&(this._element.style.paddingLeft=`${nn}px`),(rn&&!en&&!jr()||!rn&&en&&jr())&&(this._element.style.paddingRight=`${nn}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(en,nn){return this.each(function(){let rn=Fi.getOrCreateInstance(this,en);if(typeof en=="string"){if(typeof rn[en]=="undefined")throw new TypeError(`No method named "${en}"`);rn[en](nn)}})}};Mn.on(document,Bw,Ww,function(tn){let en=ji(this);["A","AREA"].includes(this.tagName)&&tn.preventDefault(),Mn.one(en,ih,rn=>{rn.defaultPrevented||Mn.one(en,rh,()=>{_a(this)&&this.focus()})}),Fi.getOrCreateInstance(en).toggle(this)});Kr(Fi);var uh="offcanvas",Uw="bs.offcanvas",Ti=`.${Uw}`,fh=".data-api",Yw=`load${Ti}${fh}`,Kw="Escape",dh={backdrop:!0,keyboard:!0,scroll:!1},Gw={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},hh="show",ph=".offcanvas.show",Xw=`show${Ti}`,Jw=`shown${Ti}`,Qw=`hide${Ti}`,mh=`hidden${Ti}`,Da=`focusin${Ti}`,Zw=`click${Ti}${fh}`,ex=`click.dismiss${Ti}`,tx=`keydown.dismiss${Ti}`,nx='[data-bs-dismiss="offcanvas"]',rx='[data-bs-toggle="offcanvas"]',ho=class extends Gr{constructor(en,nn){super(en);this._config=this._getConfig(nn),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return uh}static get Default(){return dh}toggle(en){return this._isShown?this.hide():this.show(en)}show(en){if(this._isShown||Mn.trigger(this._element,Xw,{relatedTarget:en}).defaultPrevented)return;this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new Ca().hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(hh);let rn=()=>{Mn.trigger(this._element,Jw,{relatedTarget:en})};this._queueCallback(rn,this._element,!0)}hide(){if(!this._isShown||Mn.trigger(this._element,Qw).defaultPrevented)return;Mn.off(document,Da),this._element.blur(),this._isShown=!1,this._element.classList.remove(hh),this._backdrop.hide();let nn=()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||new Ca().reset(),Mn.trigger(this._element,mh)};this._queueCallback(nn,this._element,!0)}dispose(){this._backdrop.dispose(),super.dispose(),Mn.off(document,Da)}_getConfig(en){return en=Jn(Jn(Jn({},dh),Or.getDataAttributes(this._element)),typeof en=="object"?en:{}),wi(uh,en,Gw),en}_initializeBackDrop(){return new xc({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(en){Mn.off(document,Da),Mn.on(document,Da,nn=>{document!==nn.target&&en!==nn.target&&!en.contains(nn.target)&&en.focus()}),en.focus()}_addEventListeners(){Mn.on(this._element,ex,nx,()=>this.hide()),Mn.on(this._element,tx,en=>{this._config.keyboard&&en.key===Kw&&this.hide()})}static jQueryInterface(en){return this.each(function(){let nn=ho.getOrCreateInstance(this,en);if(typeof en=="string"){if(nn[en]===void 0||en.startsWith("_")||en==="constructor")throw new TypeError(`No method named "${en}"`);nn[en](this)}})}};Mn.on(document,Zw,rx,function(tn){let en=ji(this);if(["A","AREA"].includes(this.tagName)&&tn.preventDefault(),Ho(this))return;Mn.one(en,mh,()=>{_a(this)&&this.focus()});let nn=Vn.findOne(ph);nn&&nn!==en&&ho.getInstance(nn).hide(),ho.getOrCreateInstance(en).toggle(this)});Mn.on(window,Yw,()=>Vn.find(ph).forEach(tn=>ho.getOrCreateInstance(tn).show()));Kr(ho);var ix=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),ox=/^aria-[\w-]*$/i,sx=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,ax=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,lx=(tn,en)=>{let nn=tn.nodeName.toLowerCase();if(en.includes(nn))return ix.has(nn)?Boolean(sx.test(tn.nodeValue)||ax.test(tn.nodeValue)):!0;let rn=en.filter(on=>on instanceof RegExp);for(let on=0,an=rn.length;on{lx(pn,hn)||fn.removeAttribute(pn.nodeName)})}return on.body.innerHTML}var vh="tooltip",ux="bs.tooltip",ii=`.${ux}`,bh="bs-tooltip",fx=new RegExp(`(^|\\s)${bh}\\S+`,"g"),dx=new Set(["sanitize","allowList","sanitizeFn"]),hx={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},px={AUTO:"auto",TOP:"top",RIGHT:jr()?"left":"right",BOTTOM:"bottom",LEFT:jr()?"right":"left"},mx={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:cx,popperConfig:null},gx={HIDE:`hide${ii}`,HIDDEN:`hidden${ii}`,SHOW:`show${ii}`,SHOWN:`shown${ii}`,INSERTED:`inserted${ii}`,CLICK:`click${ii}`,FOCUSIN:`focusin${ii}`,FOCUSOUT:`focusout${ii}`,MOUSEENTER:`mouseenter${ii}`,MOUSELEAVE:`mouseleave${ii}`},Ma="fade",yh="modal",xs="show",Ts="show",Ac="out",vx=".tooltip-inner",Os="hover",Cc="focus",bx="click",yx="manual",oi=class extends Gr{constructor(en,nn){if(typeof Ea=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(en);this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(nn),this.tip=null,this._setListeners()}static get Default(){return mx}static get NAME(){return vh}static get Event(){return gx}static get DefaultType(){return hx}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(en){if(!!this._isEnabled)if(en){let nn=this._initializeOnDelegatedTarget(en);nn._activeTrigger.click=!nn._activeTrigger.click,nn._isWithActiveTrigger()?nn._enter(null,nn):nn._leave(null,nn)}else{if(this.getTipElement().classList.contains(xs)){this._leave(null,this);return}this._enter(null,this)}}dispose(){clearTimeout(this._timeout),Mn.off(this._element.closest(`.${yh}`),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),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 en=Mn.trigger(this._element,this.constructor.Event.SHOW),nn=Sd(this._element),rn=nn===null?this._element.ownerDocument.documentElement.contains(this._element):nn.contains(this._element);if(en.defaultPrevented||!rn)return;let on=this.getTipElement(),an=yd(this.constructor.NAME);on.setAttribute("id",an),this._element.setAttribute("aria-describedby",an),this.setContent(),this._config.animation&&on.classList.add(Ma);let ln=typeof this._config.placement=="function"?this._config.placement.call(this,on,this._element):this._config.placement,cn=this._getAttachment(ln);this._addAttachmentClass(cn);let{container:dn}=this._config;so.set(on,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(dn.appendChild(on),Mn.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=ya(this._element,on,this._getPopperConfig(cn)),on.classList.add(xs);let fn=typeof this._config.customClass=="function"?this._config.customClass():this._config.customClass;fn&&on.classList.add(...fn.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(hn=>{Mn.on(hn,"mouseover",Sa)});let un=()=>{let hn=this._hoverState;this._hoverState=null,Mn.trigger(this._element,this.constructor.Event.SHOWN),hn===Ac&&this._leave(null,this)},gn=this.tip.classList.contains(Ma);this._queueCallback(un,this.tip,gn)}hide(){if(!this._popper)return;let en=this.getTipElement(),nn=()=>{this._isWithActiveTrigger()||(this._hoverState!==Ts&&en.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),Mn.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))};if(Mn.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;en.classList.remove(xs),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(an=>Mn.off(an,"mouseover",Sa)),this._activeTrigger[bx]=!1,this._activeTrigger[Cc]=!1,this._activeTrigger[Os]=!1;let on=this.tip.classList.contains(Ma);this._queueCallback(nn,this.tip,on),this._hoverState=""}update(){this._popper!==null&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;let en=document.createElement("div");return en.innerHTML=this._config.template,this.tip=en.children[0],this.tip}setContent(){let en=this.getTipElement();this.setElementContent(Vn.findOne(vx,en),this.getTitle()),en.classList.remove(Ma,xs)}setElementContent(en,nn){if(en!==null){if(qi(nn)){nn=qo(nn),this._config.html?nn.parentNode!==en&&(en.innerHTML="",en.appendChild(nn)):en.textContent=nn.textContent;return}this._config.html?(this._config.sanitize&&(nn=gh(nn,this._config.allowList,this._config.sanitizeFn)),en.innerHTML=nn):en.textContent=nn}}getTitle(){let en=this._element.getAttribute("data-bs-original-title");return en||(en=typeof this._config.title=="function"?this._config.title.call(this._element):this._config.title),en}updateAttachment(en){return en==="right"?"end":en==="left"?"start":en}_initializeOnDelegatedTarget(en,nn){let rn=this.constructor.DATA_KEY;return nn=nn||so.get(en.delegateTarget,rn),nn||(nn=new this.constructor(en.delegateTarget,this._getDelegateConfig()),so.set(en.delegateTarget,rn,nn)),nn}_getOffset(){let{offset:en}=this._config;return typeof en=="string"?en.split(",").map(nn=>Number.parseInt(nn,10)):typeof en=="function"?nn=>en(nn,this._element):en}_getPopperConfig(en){let nn={placement:en,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:"onChange",enabled:!0,phase:"afterWrite",fn:rn=>this._handlePopperPlacementChange(rn)}],onFirstUpdate:rn=>{rn.options.placement!==rn.placement&&this._handlePopperPlacementChange(rn)}};return Jn(Jn({},nn),typeof this._config.popperConfig=="function"?this._config.popperConfig(nn):this._config.popperConfig)}_addAttachmentClass(en){this.getTipElement().classList.add(`${bh}-${this.updateAttachment(en)}`)}_getAttachment(en){return px[en.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(nn=>{if(nn==="click")Mn.on(this._element,this.constructor.Event.CLICK,this._config.selector,rn=>this.toggle(rn));else if(nn!==yx){let rn=nn===Os?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,on=nn===Os?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;Mn.on(this._element,rn,this._config.selector,an=>this._enter(an)),Mn.on(this._element,on,this._config.selector,an=>this._leave(an))}}),this._hideModalHandler=()=>{this._element&&this.hide()},Mn.on(this._element.closest(`.${yh}`),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config=la(Jn({},this._config),{trigger:"manual",selector:""}):this._fixTitle()}_fixTitle(){let en=this._element.getAttribute("title"),nn=typeof this._element.getAttribute("data-bs-original-title");(en||nn!=="string")&&(this._element.setAttribute("data-bs-original-title",en||""),en&&!this._element.getAttribute("aria-label")&&!this._element.textContent&&this._element.setAttribute("aria-label",en),this._element.setAttribute("title",""))}_enter(en,nn){if(nn=this._initializeOnDelegatedTarget(en,nn),en&&(nn._activeTrigger[en.type==="focusin"?Cc:Os]=!0),nn.getTipElement().classList.contains(xs)||nn._hoverState===Ts){nn._hoverState=Ts;return}if(clearTimeout(nn._timeout),nn._hoverState=Ts,!nn._config.delay||!nn._config.delay.show){nn.show();return}nn._timeout=setTimeout(()=>{nn._hoverState===Ts&&nn.show()},nn._config.delay.show)}_leave(en,nn){if(nn=this._initializeOnDelegatedTarget(en,nn),en&&(nn._activeTrigger[en.type==="focusout"?Cc:Os]=nn._element.contains(en.relatedTarget)),!nn._isWithActiveTrigger()){if(clearTimeout(nn._timeout),nn._hoverState=Ac,!nn._config.delay||!nn._config.delay.hide){nn.hide();return}nn._timeout=setTimeout(()=>{nn._hoverState===Ac&&nn.hide()},nn._config.delay.hide)}}_isWithActiveTrigger(){for(let en in this._activeTrigger)if(this._activeTrigger[en])return!0;return!1}_getConfig(en){let nn=Or.getDataAttributes(this._element);return Object.keys(nn).forEach(rn=>{dx.has(rn)&&delete nn[rn]}),en=Jn(Jn(Jn({},this.constructor.Default),nn),typeof en=="object"&&en?en:{}),en.container=en.container===!1?document.body:qo(en.container),typeof en.delay=="number"&&(en.delay={show:en.delay,hide:en.delay}),typeof en.title=="number"&&(en.title=en.title.toString()),typeof en.content=="number"&&(en.content=en.content.toString()),wi(vh,en,this.constructor.DefaultType),en.sanitize&&(en.template=gh(en.template,en.allowList,en.sanitizeFn)),en}_getDelegateConfig(){let en={};if(this._config)for(let nn in this._config)this.constructor.Default[nn]!==this._config[nn]&&(en[nn]=this._config[nn]);return en}_cleanTipClass(){let en=this.getTipElement(),nn=en.getAttribute("class").match(fx);nn!==null&&nn.length>0&&nn.map(rn=>rn.trim()).forEach(rn=>en.classList.remove(rn))}_handlePopperPlacementChange(en){let{state:nn}=en;!nn||(this.tip=nn.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(nn.placement)))}static jQueryInterface(en){return this.each(function(){let nn=oi.getOrCreateInstance(this,en);if(typeof en=="string"){if(typeof nn[en]=="undefined")throw new TypeError(`No method named "${en}"`);nn[en]()}})}};Kr(oi);var Ex="popover",_x="bs.popover",si=`.${_x}`,Eh="bs-popover",Sx=new RegExp(`(^|\\s)${Eh}\\S+`,"g"),wx=la(Jn({},oi.Default),{placement:"right",offset:[0,8],trigger:"click",content:"",template:''}),xx=la(Jn({},oi.DefaultType),{content:"(string|element|function)"}),Tx={HIDE:`hide${si}`,HIDDEN:`hidden${si}`,SHOW:`show${si}`,SHOWN:`shown${si}`,INSERTED:`inserted${si}`,CLICK:`click${si}`,FOCUSIN:`focusin${si}`,FOCUSOUT:`focusout${si}`,MOUSEENTER:`mouseenter${si}`,MOUSELEAVE:`mouseleave${si}`},Ox="fade",Ax="show",_h=".popover-header",Sh=".popover-body",po=class extends oi{static get Default(){return wx}static get NAME(){return Ex}static get Event(){return Tx}static get DefaultType(){return xx}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip?this.tip:(this.tip=super.getTipElement(),this.getTitle()||Vn.findOne(_h,this.tip).remove(),this._getContent()||Vn.findOne(Sh,this.tip).remove(),this.tip)}setContent(){let en=this.getTipElement();this.setElementContent(Vn.findOne(_h,en),this.getTitle());let nn=this._getContent();typeof nn=="function"&&(nn=nn.call(this._element)),this.setElementContent(Vn.findOne(Sh,en),nn),en.classList.remove(Ox,Ax)}_addAttachmentClass(en){this.getTipElement().classList.add(`${Eh}-${this.updateAttachment(en)}`)}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){let en=this.getTipElement(),nn=en.getAttribute("class").match(Sx);nn!==null&&nn.length>0&&nn.map(rn=>rn.trim()).forEach(rn=>en.classList.remove(rn))}static jQueryInterface(en){return this.each(function(){let nn=po.getOrCreateInstance(this,en);if(typeof en=="string"){if(typeof nn[en]=="undefined")throw new TypeError(`No method named "${en}"`);nn[en]()}})}};Kr(po);var Lc="scrollspy",Cx="bs.scrollspy",Ia=`.${Cx}`,Lx=".data-api",wh={offset:10,method:"auto",target:""},Dx={offset:"number",method:"string",target:"(string|element)"},Mx=`activate${Ia}`,Ix=`scroll${Ia}`,Px=`load${Ia}${Lx}`,xh="dropdown-item",mo="active",kx='[data-bs-spy="scroll"]',Nx=".nav, .list-group",Dc=".nav-link",Rx=".nav-item",Th=".list-group-item",jx=".dropdown",qx=".dropdown-toggle",Hx="offset",Oh="position",As=class extends Gr{constructor(en,nn){super(en);this._scrollElement=this._element.tagName==="BODY"?window:this._element,this._config=this._getConfig(nn),this._selector=`${this._config.target} ${Dc}, ${this._config.target} ${Th}, ${this._config.target} .${xh}`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,Mn.on(this._scrollElement,Ix,()=>this._process()),this.refresh(),this._process()}static get Default(){return wh}static get NAME(){return Lc}refresh(){let en=this._scrollElement===this._scrollElement.window?Hx:Oh,nn=this._config.method==="auto"?en:this._config.method,rn=nn===Oh?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),Vn.find(this._selector).map(an=>{let ln=hc(an),cn=ln?Vn.findOne(ln):null;if(cn){let dn=cn.getBoundingClientRect();if(dn.width||dn.height)return[Or[nn](cn).top+rn,ln]}return null}).filter(an=>an).sort((an,ln)=>an[0]-ln[0]).forEach(an=>{this._offsets.push(an[0]),this._targets.push(an[1])})}dispose(){Mn.off(this._scrollElement,Ia),super.dispose()}_getConfig(en){if(en=Jn(Jn(Jn({},wh),Or.getDataAttributes(this._element)),typeof en=="object"&&en?en:{}),typeof en.target!="string"&&qi(en.target)){let{id:nn}=en.target;nn||(nn=yd(Lc),en.target.id=nn),en.target=`#${nn}`}return wi(Lc,en,Dx),en}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){let en=this._getScrollTop()+this._config.offset,nn=this._getScrollHeight(),rn=this._config.offset+nn-this._getOffsetHeight();if(this._scrollHeight!==nn&&this.refresh(),en>=rn){let on=this._targets[this._targets.length-1];this._activeTarget!==on&&this._activate(on);return}if(this._activeTarget&&en0){this._activeTarget=null,this._clear();return}for(let on=this._offsets.length;on--;)this._activeTarget!==this._targets[on]&&en>=this._offsets[on]&&(typeof this._offsets[on+1]=="undefined"||en`${on}[data-bs-target="${en}"],${on}[href="${en}"]`),rn=Vn.findOne(nn.join(","));rn.classList.contains(xh)?(Vn.findOne(qx,rn.closest(jx)).classList.add(mo),rn.classList.add(mo)):(rn.classList.add(mo),Vn.parents(rn,Nx).forEach(on=>{Vn.prev(on,`${Dc}, ${Th}`).forEach(an=>an.classList.add(mo)),Vn.prev(on,Rx).forEach(an=>{Vn.children(an,Dc).forEach(ln=>ln.classList.add(mo))})})),Mn.trigger(this._scrollElement,Mx,{relatedTarget:en})}_clear(){Vn.find(this._selector).filter(en=>en.classList.contains(mo)).forEach(en=>en.classList.remove(mo))}static jQueryInterface(en){return this.each(function(){let nn=As.getOrCreateInstance(this,en);if(typeof en=="string"){if(typeof nn[en]=="undefined")throw new TypeError(`No method named "${en}"`);nn[en]()}})}};Mn.on(window,Px,()=>{Vn.find(kx).forEach(tn=>new As(tn))});Kr(As);var Bx="tab",Fx="bs.tab",Cs=`.${Fx}`,$x=".data-api",zx=`hide${Cs}`,Wx=`hidden${Cs}`,Vx=`show${Cs}`,Ux=`shown${Cs}`,Yx=`click${Cs}${$x}`,Kx="dropdown-menu",Ls="active",Ah="fade",Ch="show",Gx=".dropdown",Xx=".nav, .list-group",Lh=".active",Dh=":scope > li > .active",Jx='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Qx=".dropdown-toggle",Zx=":scope > .dropdown-menu .active",go=class extends Gr{static get NAME(){return Bx}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Ls))return;let en,nn=ji(this._element),rn=this._element.closest(Xx);if(rn){let cn=rn.nodeName==="UL"||rn.nodeName==="OL"?Dh:Lh;en=Vn.find(cn,rn),en=en[en.length-1]}let on=en?Mn.trigger(en,zx,{relatedTarget:this._element}):null;if(Mn.trigger(this._element,Vx,{relatedTarget:en}).defaultPrevented||on!==null&&on.defaultPrevented)return;this._activate(this._element,rn);let ln=()=>{Mn.trigger(en,Wx,{relatedTarget:this._element}),Mn.trigger(this._element,Ux,{relatedTarget:en})};nn?this._activate(nn,nn.parentNode,ln):ln()}_activate(en,nn,rn){let an=(nn&&(nn.nodeName==="UL"||nn.nodeName==="OL")?Vn.find(Dh,nn):Vn.children(nn,Lh))[0],ln=rn&&an&&an.classList.contains(Ah),cn=()=>this._transitionComplete(en,an,rn);an&&ln?(an.classList.remove(Ch),this._queueCallback(cn,en,!0)):cn()}_transitionComplete(en,nn,rn){if(nn){nn.classList.remove(Ls);let an=Vn.findOne(Zx,nn.parentNode);an&&an.classList.remove(Ls),nn.getAttribute("role")==="tab"&&nn.setAttribute("aria-selected",!1)}en.classList.add(Ls),en.getAttribute("role")==="tab"&&en.setAttribute("aria-selected",!0),Bo(en),en.classList.contains(Ah)&&en.classList.add(Ch);let on=en.parentNode;if(on&&on.nodeName==="LI"&&(on=on.parentNode),on&&on.classList.contains(Kx)){let an=en.closest(Gx);an&&Vn.find(Qx,an).forEach(ln=>ln.classList.add(Ls)),en.setAttribute("aria-expanded",!0)}rn&&rn()}static jQueryInterface(en){return this.each(function(){let nn=go.getOrCreateInstance(this);if(typeof en=="string"){if(typeof nn[en]=="undefined")throw new TypeError(`No method named "${en}"`);nn[en]()}})}};Mn.on(document,Yx,Jx,function(tn){if(["A","AREA"].includes(this.tagName)&&tn.preventDefault(),Ho(this))return;go.getOrCreateInstance(this).show()});Kr(go);var Mh="toast",eT="bs.toast",Oi=`.${eT}`,tT=`click.dismiss${Oi}`,nT=`mouseover${Oi}`,rT=`mouseout${Oi}`,iT=`focusin${Oi}`,oT=`focusout${Oi}`,sT=`hide${Oi}`,aT=`hidden${Oi}`,lT=`show${Oi}`,cT=`shown${Oi}`,uT="fade",Ih="hide",Ds="show",Ph="showing",fT={animation:"boolean",autohide:"boolean",delay:"number"},kh={animation:!0,autohide:!0,delay:5e3},dT='[data-bs-dismiss="toast"]',Ai=class extends Gr{constructor(en,nn){super(en);this._config=this._getConfig(nn),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return fT}static get Default(){return kh}static get NAME(){return Mh}show(){if(Mn.trigger(this._element,lT).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(uT);let nn=()=>{this._element.classList.remove(Ph),this._element.classList.add(Ds),Mn.trigger(this._element,cT),this._maybeScheduleHide()};this._element.classList.remove(Ih),Bo(this._element),this._element.classList.add(Ph),this._queueCallback(nn,this._element,this._config.animation)}hide(){if(!this._element.classList.contains(Ds)||Mn.trigger(this._element,sT).defaultPrevented)return;let nn=()=>{this._element.classList.add(Ih),Mn.trigger(this._element,aT)};this._element.classList.remove(Ds),this._queueCallback(nn,this._element,this._config.animation)}dispose(){this._clearTimeout(),this._element.classList.contains(Ds)&&this._element.classList.remove(Ds),super.dispose()}_getConfig(en){return en=Jn(Jn(Jn({},kh),Or.getDataAttributes(this._element)),typeof en=="object"&&en?en:{}),wi(Mh,en,this.constructor.DefaultType),en}_maybeScheduleHide(){!this._config.autohide||this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay))}_onInteraction(en,nn){switch(en.type){case"mouseover":case"mouseout":this._hasMouseInteraction=nn;break;case"focusin":case"focusout":this._hasKeyboardInteraction=nn;break}if(nn){this._clearTimeout();return}let rn=en.relatedTarget;this._element===rn||this._element.contains(rn)||this._maybeScheduleHide()}_setListeners(){Mn.on(this._element,tT,dT,()=>this.hide()),Mn.on(this._element,nT,en=>this._onInteraction(en,!0)),Mn.on(this._element,rT,en=>this._onInteraction(en,!1)),Mn.on(this._element,iT,en=>this._onInteraction(en,!0)),Mn.on(this._element,oT,en=>this._onInteraction(en,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(en){return this.each(function(){let nn=Ai.getOrCreateInstance(this,en);if(typeof en=="string"){if(typeof nn[en]=="undefined")throw new TypeError(`No method named "${en}"`);nn[en](this)}})}};Kr(Ai);var q$=Rr(Nh());"use strict";var L0=li(),Om=nu();L0({target:"Array",proto:!0,forced:[].forEach!=Om},{forEach:Om});var D0=vr(),M0=ru(),iu=nu(),I0=Ci();for(Cm in M0)if(ou=D0[Cm],Hs=ou&&ou.prototype,Hs&&Hs.forEach!==iu)try{I0(Hs,"forEach",iu)}catch(tn){Hs.forEach=iu}var ou,Hs,Cm;var xl=Rr(Dm());"use strict";var q0=li(),H0=Ka().filter,B0=Im(),F0=B0("filter");q0({target:"Array",proto:!0,forced:!F0},{filter:function(en){return H0(this,en,arguments.length>1?arguments[1]:void 0)}});var sB=Rr(Su());var zA=li(),Og=Tg();zA({target:"Object",stat:!0,forced:Object.assign!==Og},{assign:Og});var ZA=tl(),eC=_o(),tC=Mg();ZA||eC(Object.prototype,"toString",tC,{unsafe:!0});var hC=li(),Hg=qg();hC({global:!0,forced:parseInt!=Hg},{parseInt:Hg});"use strict";var vC=Au().charAt,bC=Ui(),$g=Eo(),yC=Eu(),zg="String Iterator",EC=$g.set,_C=$g.getterFor(zg);yC(String,"String",function(tn){EC(this,{type:zg,string:bC(tn),index:0})},function(){var en=_C(this),nn=en.string,rn=en.index,on;return rn>=nn.length?{value:void 0,done:!0}:(on=vC(nn,rn),en.index+=on.length,{value:on,done:!1})});var fB=Rr(Pv());var AL=vr(),kv=ru(),Ws=Su(),zu=Ci(),Nv=Dr(),Wu=Nv("iterator"),Rv=Nv("toStringTag"),Vu=Ws.values;for(fl in kv)if(Uu=AL[fl],ci=Uu&&Uu.prototype,ci){if(ci[Wu]!==Vu)try{zu(ci,Wu,Vu)}catch(tn){ci[Wu]=Vu}if(ci[Rv]||zu(ci,Rv,fl),kv[fl]){for(xo in Ws)if(ci[xo]!==Ws[xo])try{zu(ci,xo,Ws[xo])}catch(tn){ci[xo]=Ws[xo]}}}var Uu,ci,xo,fl;var Sf=Rr(Fv()),wf=Rr(Vv()),Kb=Rr(eb());var Jr=[];var tb=function(){return Jr.some(function(tn){return tn.activeTargets.length>0})};var nb=function(){return Jr.some(function(tn){return tn.skippedTargets.length>0})};var rb="ResizeObserver loop completed with undelivered notifications.",ib=function(){var tn;typeof ErrorEvent=="function"?tn=new ErrorEvent("error",{message:rb}):(tn=document.createEvent("Event"),tn.initEvent("error",!1,!1),tn.message=rb),window.dispatchEvent(tn)};var Ao;(function(tn){tn.BORDER_BOX="border-box",tn.CONTENT_BOX="content-box",tn.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box"})(Ao||(Ao={}));var Zr=function(tn){return Object.freeze(tn)};var Zu=function(){function tn(en,nn){this.inlineSize=en,this.blockSize=nn,Zr(this)}return tn}();var ef=function(){function tn(en,nn,rn,on){return this.x=en,this.y=nn,this.width=rn,this.height=on,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,Zr(this)}return tn.prototype.toJSON=function(){var en=this,nn=en.x,rn=en.y,on=en.top,an=en.right,ln=en.bottom,cn=en.left,dn=en.width,fn=en.height;return{x:nn,y:rn,top:on,right:an,bottom:ln,left:cn,width:dn,height:fn}},tn.fromRect=function(en){return new tn(en.x,en.y,en.width,en.height)},tn}();var Us=function(tn){return tn instanceof SVGElement&&"getBBox"in tn},ml=function(tn){if(Us(tn)){var en=tn.getBBox(),nn=en.width,rn=en.height;return!nn&&!rn}var on=tn,an=on.offsetWidth,ln=on.offsetHeight;return!(an||ln||tn.getClientRects().length)},tf=function(tn){var en,nn;if(tn instanceof Element)return!0;var rn=(nn=(en=tn)===null||en===void 0?void 0:en.ownerDocument)===null||nn===void 0?void 0:nn.defaultView;return!!(rn&&tn instanceof rn.Element)},ob=function(tn){switch(tn.tagName){case"INPUT":if(tn.type!=="image")break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1};var Co=typeof window!="undefined"?window:{};var gl=new WeakMap,sb=/auto|scroll/,WD=/^tb|vertical/,VD=/msie|trident/i.test(Co.navigator&&Co.navigator.userAgent),ui=function(tn){return parseFloat(tn||"0")},Ko=function(tn,en,nn){return tn===void 0&&(tn=0),en===void 0&&(en=0),nn===void 0&&(nn=!1),new Zu((nn?en:tn)||0,(nn?tn:en)||0)},ab=Zr({devicePixelContentBoxSize:Ko(),borderBoxSize:Ko(),contentBoxSize:Ko(),contentRect:new ef(0,0,0,0)}),nf=function(tn,en){if(en===void 0&&(en=!1),gl.has(tn)&&!en)return gl.get(tn);if(ml(tn))return gl.set(tn,ab),ab;var nn=getComputedStyle(tn),rn=Us(tn)&&tn.ownerSVGElement&&tn.getBBox(),on=!VD&&nn.boxSizing==="border-box",an=WD.test(nn.writingMode||""),ln=!rn&&sb.test(nn.overflowY||""),cn=!rn&&sb.test(nn.overflowX||""),dn=rn?0:ui(nn.paddingTop),fn=rn?0:ui(nn.paddingRight),un=rn?0:ui(nn.paddingBottom),gn=rn?0:ui(nn.paddingLeft),hn=rn?0:ui(nn.borderTopWidth),pn=rn?0:ui(nn.borderRightWidth),vn=rn?0:ui(nn.borderBottomWidth),yn=rn?0:ui(nn.borderLeftWidth),mn=gn+fn,bn=dn+un,Sn=yn+pn,An=hn+vn,Tn=cn?tn.offsetHeight-An-tn.clientHeight:0,kn=ln?tn.offsetWidth-Sn-tn.clientWidth:0,Dn=on?mn+Sn:0,qn=on?bn+An:0,Fn=rn?rn.width:ui(nn.width)-Dn-kn,Un=rn?rn.height:ui(nn.height)-qn-Tn,Yn=Fn+mn+kn+Sn,Wn=Un+bn+Tn+An,wn=Zr({devicePixelContentBoxSize:Ko(Math.round(Fn*devicePixelRatio),Math.round(Un*devicePixelRatio),an),borderBoxSize:Ko(Yn,Wn,an),contentBoxSize:Ko(Fn,Un,an),contentRect:new ef(gn,dn,Fn,Un)});return gl.set(tn,wn),wn},vl=function(tn,en,nn){var rn=nf(tn,nn),on=rn.borderBoxSize,an=rn.contentBoxSize,ln=rn.devicePixelContentBoxSize;switch(en){case Ao.DEVICE_PIXEL_CONTENT_BOX:return ln;case Ao.BORDER_BOX:return on;default:return an}};var rf=function(){function tn(en){var nn=nf(en);this.target=en,this.contentRect=nn.contentRect,this.borderBoxSize=Zr([nn.borderBoxSize]),this.contentBoxSize=Zr([nn.contentBoxSize]),this.devicePixelContentBoxSize=Zr([nn.devicePixelContentBoxSize])}return tn}();var bl=function(tn){if(ml(tn))return 1/0;for(var en=0,nn=tn.parentNode;nn;)en+=1,nn=nn.parentNode;return en};var lb=function(){var tn=1/0,en=[];Jr.forEach(function(ln){if(ln.activeTargets.length!==0){var cn=[];ln.activeTargets.forEach(function(fn){var un=new rf(fn.target),gn=bl(fn.target);cn.push(un),fn.lastReportedSize=vl(fn.target,fn.observedBox),gntn?nn.activeTargets.push(on):nn.skippedTargets.push(on))})})};var cb=function(){var tn=0;for(of(tn);tb();)tn=lb(),of(tn);return nb()&&ib(),tn>0};var sf,ub=[],UD=function(){return ub.splice(0).forEach(function(tn){return tn()})},fb=function(tn){if(!sf){var en=0,nn=document.createTextNode(""),rn={characterData:!0};new MutationObserver(function(){return UD()}).observe(nn,rn),sf=function(){nn.textContent=""+(en?en--:en++)}}ub.push(tn),sf()};var db=function(tn){fb(function(){requestAnimationFrame(tn)})};var yl=0,YD=function(){return!!yl},KD=250,GD={attributes:!0,characterData:!0,childList:!0,subtree:!0},hb=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],pb=function(tn){return tn===void 0&&(tn=0),Date.now()+tn},af=!1,XD=function(){function tn(){var en=this;this.stopped=!0,this.listener=function(){return en.schedule()}}return tn.prototype.run=function(en){var nn=this;if(en===void 0&&(en=KD),!af){af=!0;var rn=pb(en);db(function(){var on=!1;try{on=cb()}finally{if(af=!1,en=rn-pb(),!YD())return;on?nn.run(1e3):en>0?nn.run(en):nn.start()}})}},tn.prototype.schedule=function(){this.stop(),this.run()},tn.prototype.observe=function(){var en=this,nn=function(){return en.observer&&en.observer.observe(document.body,GD)};document.body?nn():Co.addEventListener("DOMContentLoaded",nn)},tn.prototype.start=function(){var en=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),hb.forEach(function(nn){return Co.addEventListener(nn,en.listener,!0)}))},tn.prototype.stop=function(){var en=this;this.stopped||(this.observer&&this.observer.disconnect(),hb.forEach(function(nn){return Co.removeEventListener(nn,en.listener,!0)}),this.stopped=!0)},tn}(),El=new XD,lf=function(tn){!yl&&tn>0&&El.start(),yl+=tn,!yl&&El.stop()};var JD=function(tn){return!Us(tn)&&!ob(tn)&&getComputedStyle(tn).display==="inline"},mb=function(){function tn(en,nn){this.target=en,this.observedBox=nn||Ao.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return tn.prototype.isActive=function(){var en=vl(this.target,this.observedBox,!0);return JD(this.target)&&(this.lastReportedSize=en),this.lastReportedSize.inlineSize!==en.inlineSize||this.lastReportedSize.blockSize!==en.blockSize},tn}();var gb=function(){function tn(en,nn){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=en,this.callback=nn}return tn}();var _l=new WeakMap,vb=function(tn,en){for(var nn=0;nn=0&&(an&&Jr.splice(Jr.indexOf(rn),1),rn.observationTargets.splice(on,1),lf(-1))},tn.disconnect=function(en){var nn=this,rn=_l.get(en);rn.observationTargets.slice().forEach(function(on){return nn.unobserve(en,on.target)}),rn.activeTargets.splice(0,rn.activeTargets.length)},tn}();var cf=function(){function tn(en){if(arguments.length===0)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if(typeof en!="function")throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");Ys.connect(this,en)}return tn.prototype.observe=function(en,nn){if(arguments.length===0)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!tf(en))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");Ys.observe(this,en,nn)},tn.prototype.unobserve=function(en){if(arguments.length===0)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!tf(en))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");Ys.unobserve(this,en)},tn.prototype.disconnect=function(){Ys.disconnect(this)},tn.toString=function(){return"function ResizeObserver () { [polyfill code] }"},tn}();"use strict";var iM=li(),oM=Eb().left,sM=tu(),wb=Ra(),aM=Sb(),lM=sM("reduce"),cM=!aM&&wb>79&&wb<83;iM({target:"Array",proto:!0,forced:!lM||cM},{reduce:function(en){return oM(this,en,arguments.length,arguments.length>1?arguments[1]:void 0)}});var uM=$i(),fM=zi().f,uf=Function.prototype,dM=uf.toString,hM=/^\s*function ([^ (]*)/,xb="name";uM&&!(xb in uf)&&fM(uf,xb,{configurable:!0,get:function(){try{return dM.call(this).match(hM)[1]}catch(tn){return""}}});var gB=Rr(mf());"use strict";var qM=vf(),HM=Vr(),BM=So(),Ef=Ui(),FM=vo(),$M=bf(),Wb=yf();qM("match",function(tn,en,nn){return[function(on){var an=FM(this),ln=on==null?void 0:on[tn];return ln!==void 0?ln.call(on,an):new RegExp(on)[tn](Ef(an))},function(rn){var on=HM(this),an=Ef(rn),ln=nn(en,on,an);if(ln.done)return ln.value;if(!on.global)return Wb(on,an);var cn=on.unicode;on.lastIndex=0;for(var dn=[],fn=0,un;(un=Wb(on,an))!==null;){var gn=Ef(un[0]);dn[fn]=gn,gn===""&&(on.lastIndex=$M(an,BM(on.lastIndex),cn)),fn++}return fn===0?null:dn}]});"use strict";var KM=vf(),GM=Ar(),XM=Vr(),JM=js(),QM=So(),Go=Ui(),ZM=vo(),eI=bf(),tI=Ub(),nI=yf(),rI=Dr(),_f=rI("replace"),iI=Math.max,oI=Math.min,sI=function(tn){return tn===void 0?tn:String(tn)},aI=function(){return"a".replace(/./,"$0")==="$0"}(),Yb=function(){return/./[_f]?/./[_f]("a","$0")==="":!1}(),lI=!GM(function(){var tn=/./;return tn.exec=function(){var en=[];return en.groups={a:"7"},en},"".replace(tn,"$
    ")!=="7"});KM("replace",function(tn,en,nn){var rn=Yb?"$":"$0";return[function(an,ln){var cn=ZM(this),dn=an==null?void 0:an[_f];return dn!==void 0?dn.call(an,cn,ln):en.call(Go(cn),an,ln)},function(on,an){var ln=XM(this),cn=Go(on);if(typeof an=="string"&&an.indexOf(rn)===-1&&an.indexOf("$<")===-1){var dn=nn(en,ln,cn,an);if(dn.done)return dn.value}var fn=typeof an=="function";fn||(an=Go(an));var un=ln.global;if(un){var gn=ln.unicode;ln.lastIndex=0}for(var hn=[];;){var pn=nI(ln,cn);if(pn===null||(hn.push(pn),!un))break;var vn=Go(pn[0]);vn===""&&(ln.lastIndex=eI(cn,QM(ln.lastIndex),gn))}for(var yn="",mn=0,bn=0;bn=mn&&(yn+=cn.slice(mn,An)+Fn,mn=An+Sn.length)}return yn+cn.slice(mn)}]},!lI||!aI||Yb);var Tl=function(en){var nn=Array.prototype.reduce.call(en,function(rn,on){var an=on.name.match(/data-simplebar-(.+)/);if(an){var ln=an[1].replace(/\W+(.)/g,function(cn,dn){return dn.toUpperCase()});switch(on.value){case"true":rn[ln]=!0;break;case"false":rn[ln]=!1;break;case void 0:rn[ln]=!0;break;default:rn[ln]=on.value}}return rn},{});return nn};function Yi(tn){return!tn||!tn.ownerDocument||!tn.ownerDocument.defaultView?window:tn.ownerDocument.defaultView}function Ol(tn){return!tn||!tn.ownerDocument?document:tn.ownerDocument}var Xo=null,Gb=null;xl.default&&window.addEventListener("resize",function(){Gb!==window.devicePixelRatio&&(Gb=window.devicePixelRatio,Xo=null)});function Xb(tn){if(Xo===null){var en=Ol(tn);if(typeof en=="undefined")return Xo=0,Xo;var nn=en.body,rn=en.createElement("div");rn.classList.add("simplebar-hide-scrollbar"),nn.appendChild(rn);var on=rn.getBoundingClientRect().right;nn.removeChild(rn),Xo=on}return Xo}var yr=function(){function tn(nn,rn){var on=this;this.onScroll=function(){var an=Yi(on.el);on.scrollXTicking||(an.requestAnimationFrame(on.scrollX),on.scrollXTicking=!0),on.scrollYTicking||(an.requestAnimationFrame(on.scrollY),on.scrollYTicking=!0)},this.scrollX=function(){on.axis.x.isOverflowing&&(on.showScrollbar("x"),on.positionScrollbar("x")),on.scrollXTicking=!1},this.scrollY=function(){on.axis.y.isOverflowing&&(on.showScrollbar("y"),on.positionScrollbar("y")),on.scrollYTicking=!1},this.onMouseEnter=function(){on.showScrollbar("x"),on.showScrollbar("y")},this.onMouseMove=function(an){on.mouseX=an.clientX,on.mouseY=an.clientY,(on.axis.x.isOverflowing||on.axis.x.forceVisible)&&on.onMouseMoveForAxis("x"),(on.axis.y.isOverflowing||on.axis.y.forceVisible)&&on.onMouseMoveForAxis("y")},this.onMouseLeave=function(){on.onMouseMove.cancel(),(on.axis.x.isOverflowing||on.axis.x.forceVisible)&&on.onMouseLeaveForAxis("x"),(on.axis.y.isOverflowing||on.axis.y.forceVisible)&&on.onMouseLeaveForAxis("y"),on.mouseX=-1,on.mouseY=-1},this.onWindowResize=function(){on.scrollbarWidth=on.getScrollbarWidth(),on.hideNativeScrollbar()},this.hideScrollbars=function(){on.axis.x.track.rect=on.axis.x.track.el.getBoundingClientRect(),on.axis.y.track.rect=on.axis.y.track.el.getBoundingClientRect(),on.isWithinBounds(on.axis.y.track.rect)||(on.axis.y.scrollbar.el.classList.remove(on.classNames.visible),on.axis.y.isVisible=!1),on.isWithinBounds(on.axis.x.track.rect)||(on.axis.x.scrollbar.el.classList.remove(on.classNames.visible),on.axis.x.isVisible=!1)},this.onPointerEvent=function(an){var ln,cn;on.axis.x.track.rect=on.axis.x.track.el.getBoundingClientRect(),on.axis.y.track.rect=on.axis.y.track.el.getBoundingClientRect(),(on.axis.x.isOverflowing||on.axis.x.forceVisible)&&(ln=on.isWithinBounds(on.axis.x.track.rect)),(on.axis.y.isOverflowing||on.axis.y.forceVisible)&&(cn=on.isWithinBounds(on.axis.y.track.rect)),(ln||cn)&&(an.preventDefault(),an.stopPropagation(),an.type==="mousedown"&&(ln&&(on.axis.x.scrollbar.rect=on.axis.x.scrollbar.el.getBoundingClientRect(),on.isWithinBounds(on.axis.x.scrollbar.rect)?on.onDragStart(an,"x"):on.onTrackClick(an,"x")),cn&&(on.axis.y.scrollbar.rect=on.axis.y.scrollbar.el.getBoundingClientRect(),on.isWithinBounds(on.axis.y.scrollbar.rect)?on.onDragStart(an,"y"):on.onTrackClick(an,"y"))))},this.drag=function(an){var ln,cn=on.axis[on.draggedAxis].track,dn=cn.rect[on.axis[on.draggedAxis].sizeAttr],fn=on.axis[on.draggedAxis].scrollbar,un=on.contentWrapperEl[on.axis[on.draggedAxis].scrollSizeAttr],gn=parseInt(on.elStyles[on.axis[on.draggedAxis].sizeAttr],10);an.preventDefault(),an.stopPropagation(),on.draggedAxis==="y"?ln=an.pageY:ln=an.pageX;var hn=ln-cn.rect[on.axis[on.draggedAxis].offsetAttr]-on.axis[on.draggedAxis].dragOffset,pn=hn/(dn-fn.size),vn=pn*(un-gn);on.draggedAxis==="x"&&(vn=on.isRtl&&tn.getRtlHelpers().isRtlScrollbarInverted?vn-(dn+fn.size):vn,vn=on.isRtl&&tn.getRtlHelpers().isRtlScrollingInverted?-vn:vn),on.contentWrapperEl[on.axis[on.draggedAxis].scrollOffsetAttr]=vn},this.onEndDrag=function(an){var ln=Ol(on.el),cn=Yi(on.el);an.preventDefault(),an.stopPropagation(),on.el.classList.remove(on.classNames.dragging),ln.removeEventListener("mousemove",on.drag,!0),ln.removeEventListener("mouseup",on.onEndDrag,!0),on.removePreventClickId=cn.setTimeout(function(){ln.removeEventListener("click",on.preventClick,!0),ln.removeEventListener("dblclick",on.preventClick,!0),on.removePreventClickId=null})},this.preventClick=function(an){an.preventDefault(),an.stopPropagation()},this.el=nn,this.minScrollbarWidth=20,this.options=Object.assign({},tn.defaultOptions,{},rn),this.classNames=Object.assign({},tn.defaultOptions.classNames,{},this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,!tn.instances.has(this.el)&&(this.recalculate=(0,Sf.default)(this.recalculate.bind(this),64),this.onMouseMove=(0,Sf.default)(this.onMouseMove.bind(this),64),this.hideScrollbars=(0,wf.default)(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=(0,wf.default)(this.onWindowResize.bind(this),64,{leading:!0}),tn.getRtlHelpers=(0,Kb.default)(tn.getRtlHelpers),this.init())}tn.getRtlHelpers=function(){var rn=document.createElement("div");rn.innerHTML='
    ';var on=rn.firstElementChild;document.body.appendChild(on);var an=on.firstElementChild;on.scrollLeft=0;var ln=tn.getOffset(on),cn=tn.getOffset(an);on.scrollLeft=999;var dn=tn.getOffset(an);return{isRtlScrollingInverted:ln.left!==cn.left&&cn.left-dn.left!=0,isRtlScrollbarInverted:ln.left!==cn.left}},tn.getOffset=function(rn){var on=rn.getBoundingClientRect(),an=Ol(rn),ln=Yi(rn);return{top:on.top+(ln.pageYOffset||an.documentElement.scrollTop),left:on.left+(ln.pageXOffset||an.documentElement.scrollLeft)}};var en=tn.prototype;return en.init=function(){tn.instances.set(this.el,this),xl.default&&(this.initDOM(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},en.initDOM=function(){var rn=this;if(Array.prototype.filter.call(this.el.children,function(ln){return ln.classList.contains(rn.classNames.wrapper)}).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var on=document.createElement("div"),an=document.createElement("div");on.classList.add(this.classNames.track),an.classList.add(this.classNames.scrollbar),on.appendChild(an),this.axis.x.track.el=on.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=on.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},en.initListeners=function(){var rn=this,on=Yi(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach(function(cn){rn.el.addEventListener(cn,rn.onPointerEvent,!0)}),["touchstart","touchend","touchmove"].forEach(function(cn){rn.el.addEventListener(cn,rn.onPointerEvent,{capture:!0,passive:!0})}),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),on.addEventListener("resize",this.onWindowResize);var an=!1,ln=on.ResizeObserver||cf;this.resizeObserver=new ln(function(){!an||rn.recalculate()}),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),on.requestAnimationFrame(function(){an=!0}),this.mutationObserver=new on.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},en.recalculate=function(){var rn=Yi(this.el);this.elStyles=rn.getComputedStyle(this.el),this.isRtl=this.elStyles.direction==="rtl";var on=this.heightAutoObserverEl.offsetHeight<=1,an=this.heightAutoObserverEl.offsetWidth<=1,ln=this.contentEl.offsetWidth,cn=this.contentWrapperEl.offsetWidth,dn=this.elStyles.overflowX,fn=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var un=this.contentEl.scrollHeight,gn=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=on?"auto":"100%",this.placeholderEl.style.width=an?ln+"px":"auto",this.placeholderEl.style.height=un+"px";var hn=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=gn>ln,this.axis.y.isOverflowing=un>hn,this.axis.x.isOverflowing=dn==="hidden"?!1:this.axis.x.isOverflowing,this.axis.y.isOverflowing=fn==="hidden"?!1:this.axis.y.isOverflowing,this.axis.x.forceVisible=this.options.forceVisible==="x"||this.options.forceVisible===!0,this.axis.y.forceVisible=this.options.forceVisible==="y"||this.options.forceVisible===!0,this.hideNativeScrollbar();var pn=this.axis.x.isOverflowing?this.scrollbarWidth:0,vn=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&gn>cn-vn,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&un>hn-pn,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},en.getScrollbarSize=function(rn){if(rn===void 0&&(rn="y"),!this.axis[rn].isOverflowing)return 0;var on=this.contentEl[this.axis[rn].scrollSizeAttr],an=this.axis[rn].track.el[this.axis[rn].offsetSizeAttr],ln,cn=an/on;return ln=Math.max(~~(cn*an),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(ln=Math.min(ln,this.options.scrollbarMaxSize)),ln},en.positionScrollbar=function(rn){if(rn===void 0&&(rn="y"),!!this.axis[rn].isOverflowing){var on=this.contentWrapperEl[this.axis[rn].scrollSizeAttr],an=this.axis[rn].track.el[this.axis[rn].offsetSizeAttr],ln=parseInt(this.elStyles[this.axis[rn].sizeAttr],10),cn=this.axis[rn].scrollbar,dn=this.contentWrapperEl[this.axis[rn].scrollOffsetAttr];dn=rn==="x"&&this.isRtl&&tn.getRtlHelpers().isRtlScrollingInverted?-dn:dn;var fn=dn/(on-ln),un=~~((an-cn.size)*fn);un=rn==="x"&&this.isRtl&&tn.getRtlHelpers().isRtlScrollbarInverted?un+(an-cn.size):un,cn.el.style.transform=rn==="x"?"translate3d("+un+"px, 0, 0)":"translate3d(0, "+un+"px, 0)"}},en.toggleTrackVisibility=function(rn){rn===void 0&&(rn="y");var on=this.axis[rn].track.el,an=this.axis[rn].scrollbar.el;this.axis[rn].isOverflowing||this.axis[rn].forceVisible?(on.style.visibility="visible",this.contentWrapperEl.style[this.axis[rn].overflowAttr]="scroll"):(on.style.visibility="hidden",this.contentWrapperEl.style[this.axis[rn].overflowAttr]="hidden"),this.axis[rn].isOverflowing?an.style.display="block":an.style.display="none"},en.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},en.onMouseMoveForAxis=function(rn){rn===void 0&&(rn="y"),this.axis[rn].track.rect=this.axis[rn].track.el.getBoundingClientRect(),this.axis[rn].scrollbar.rect=this.axis[rn].scrollbar.el.getBoundingClientRect();var on=this.isWithinBounds(this.axis[rn].scrollbar.rect);on?this.axis[rn].scrollbar.el.classList.add(this.classNames.hover):this.axis[rn].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[rn].track.rect)?(this.showScrollbar(rn),this.axis[rn].track.el.classList.add(this.classNames.hover)):this.axis[rn].track.el.classList.remove(this.classNames.hover)},en.onMouseLeaveForAxis=function(rn){rn===void 0&&(rn="y"),this.axis[rn].track.el.classList.remove(this.classNames.hover),this.axis[rn].scrollbar.el.classList.remove(this.classNames.hover)},en.showScrollbar=function(rn){rn===void 0&&(rn="y");var on=this.axis[rn].scrollbar.el;this.axis[rn].isVisible||(on.classList.add(this.classNames.visible),this.axis[rn].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},en.onDragStart=function(rn,on){on===void 0&&(on="y");var an=Ol(this.el),ln=Yi(this.el),cn=this.axis[on].scrollbar,dn=on==="y"?rn.pageY:rn.pageX;this.axis[on].dragOffset=dn-cn.rect[this.axis[on].offsetAttr],this.draggedAxis=on,this.el.classList.add(this.classNames.dragging),an.addEventListener("mousemove",this.drag,!0),an.addEventListener("mouseup",this.onEndDrag,!0),this.removePreventClickId===null?(an.addEventListener("click",this.preventClick,!0),an.addEventListener("dblclick",this.preventClick,!0)):(ln.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},en.onTrackClick=function(rn,on){var an=this;if(on===void 0&&(on="y"),!!this.options.clickOnTrack){var ln=Yi(this.el);this.axis[on].scrollbar.rect=this.axis[on].scrollbar.el.getBoundingClientRect();var cn=this.axis[on].scrollbar,dn=cn.rect[this.axis[on].offsetAttr],fn=parseInt(this.elStyles[this.axis[on].sizeAttr],10),un=this.contentWrapperEl[this.axis[on].scrollOffsetAttr],gn=on==="y"?this.mouseY-dn:this.mouseX-dn,hn=gn<0?-1:1,pn=hn===-1?un-fn:un+fn,vn=function yn(){if(hn===-1){if(un>pn){var mn;un-=an.options.clickOnTrackSpeed,an.contentWrapperEl.scrollTo((mn={},mn[an.axis[on].offsetAttr]=un,mn)),ln.requestAnimationFrame(yn)}}else if(un=rn.left&&this.mouseX<=rn.left+rn.width&&this.mouseY>=rn.top&&this.mouseY<=rn.top+rn.height},en.findChild=function(rn,on){var an=rn.matches||rn.webkitMatchesSelector||rn.mozMatchesSelector||rn.msMatchesSelector;return Array.prototype.filter.call(rn.children,function(ln){return an.call(ln,on)})[0]},tn}();yr.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3};yr.instances=new WeakMap;yr.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),function(tn){tn.getAttribute("data-simplebar")!=="init"&&!yr.instances.has(tn)&&new yr(tn,Tl(tn.attributes))})};yr.removeObserver=function(){this.globalObserver.disconnect()};yr.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),typeof MutationObserver!="undefined"&&(this.globalObserver=new MutationObserver(yr.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),document.readyState==="complete"||document.readyState!=="loading"&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))};yr.handleMutations=function(tn){tn.forEach(function(en){Array.prototype.forEach.call(en.addedNodes,function(nn){nn.nodeType===1&&(nn.hasAttribute("data-simplebar")?!yr.instances.has(nn)&&document.documentElement.contains(nn)&&new yr(nn,Tl(nn.attributes)):Array.prototype.forEach.call(nn.querySelectorAll("[data-simplebar]"),function(rn){rn.getAttribute("data-simplebar")!=="init"&&!yr.instances.has(rn)&&document.documentElement.contains(rn)&&new yr(rn,Tl(rn.attributes))}))}),Array.prototype.forEach.call(en.removedNodes,function(nn){nn.nodeType===1&&(nn.getAttribute("data-simplebar")==="init"?yr.instances.has(nn)&&!document.documentElement.contains(nn)&&yr.instances.get(nn).unMount():Array.prototype.forEach.call(nn.querySelectorAll('[data-simplebar="init"]'),function(rn){yr.instances.has(rn)&&!document.documentElement.contains(rn)&&yr.instances.get(rn).unMount()}))})})};yr.getOptions=Tl;xl.default&&yr.initHtmlApi();var Qb=Rr(Jb());function Zb(tn){return"error"in tn&&"exception"in tn}function Jo(tn){return"error"in tn}function ey(tn){return typeof tn.next=="string"}function ur(tn){let en=["","null","undefined"];return Array.isArray(tn)?tn.length>0:typeof tn=="string"&&!en.includes(tn)||typeof tn=="number"||typeof tn=="boolean"?!0:typeof tn=="object"&&tn!==null}function Ks(tn){return tn.every(en=>typeof en!="undefined"&&en!==null)}function Gs(tn){for(let en of tn.options)en.selected&&(en.selected=!1);tn.value=""}function Tf(tn){return typeof tn!==null&&typeof tn!="undefined"}function mI(){let{csrftoken:tn}=Qb.default.parse(document.cookie);if(typeof tn=="undefined")throw new Error("Invalid or missing CSRF token");return tn}function ty(tn,en,nn){return Fr(this,null,function*(){let rn=mI(),on=new Headers({"X-CSRFToken":rn}),an;typeof nn!="undefined"&&(an=JSON.stringify(nn),on.set("content-type","application/json"));let ln=yield fetch(tn,{method:en,body:an,headers:on,credentials:"same-origin"}),cn=ln.headers.get("Content-Type");if(typeof cn=="string"&&cn.includes("text"))return{error:yield ln.text()};let dn=yield ln.json();return!ln.ok&&Array.isArray(dn)?{error:dn.join(` +`)}:!ln.ok&&"detail"in dn?{error:dn.detail}:dn})}function Cl(tn,en){return Fr(this,null,function*(){return yield ty(tn,"PATCH",en)})}function gI(tn){return Fr(this,null,function*(){return yield ty(tn,"GET")})}function ny(tn){return Fr(this,null,function*(){return yield gI(tn)})}function*Hn(...tn){for(let en of tn)for(let nn of document.querySelectorAll(en))nn!==null&&(yield nn)}function Er(tn){return document.getElementById(tn)}function ry(tn,en=0){let nn=en,rn=document.getElementById("content-title");rn!==null&&(nn+=rn.getBoundingClientRect().bottom);let on=tn.getBoundingClientRect().top+window.pageYOffset+nn;window.scrollTo({top:on,behavior:"smooth"})}function iy(tn){let en=[];for(let nn of tn.querySelectorAll("select"))if(nn!==null){let rn={name:nn.name,options:[]};for(let on of nn.options)on.selected&&rn.options.push(on.value);en=[...en,rn]}return en}function Xs(tn,en){tn!==null&&(typeof en=="undefined"?window.getComputedStyle(tn).display==="none"?tn.style.display="":tn.style.display="none":en==="show"?tn.style.display="":tn.style.display="none")}function fi(tn,en,nn){function rn(an){return!!(typeof nn=="string"&&an!==null&&an.matches(nn))}function on(an){if(an!==null&&an.parentElement!==null&&!rn(an)){for(let ln of an.parentElement.querySelectorAll(en))if(ln!==null)return ln;return on(an.parentElement.parentElement)}return null}return on(tn)}function Qo(tn,en,nn=null,rn=[]){let on=document.createElement(tn);if(en!==null)for(let an of Object.keys(en)){let ln=an,cn=en[ln];ln in on&&(on[ln]=cn)}nn!==null&&nn.length>0&&on.classList.add(...nn);for(let an of rn)on.appendChild(an);return on}function oy(tn,en){let nn=new Map;for(let rn of tn){let on=rn[en];nn.has(on)||nn.set(on,rn)}return Array.from(nn.values())}function vI(tn){let en=tn.target;if(en.tagName==="BUTTON"){let nn=en,rn=nn.getAttribute("return-url"),on=nn.form;on!==null&&ur(rn)&&(on.action=rn,on.submit())}}function bI(tn,en){let nn=new Set;for(let rn of en.querySelectorAll("*[name]"))rn.validity.valid?(rn.classList.contains("is-invalid")&&rn.classList.remove("is-invalid"),rn.classList.contains("is-valid")||rn.classList.add("is-valid")):(nn.add(rn.name),rn.classList.contains("is-valid")&&rn.classList.remove("is-valid"),rn.classList.contains("is-invalid")||rn.classList.add("is-invalid"));if(nn.size!==0){let rn=en.elements.namedItem(Array.from(nn)[0]);ry(rn),tn.preventDefault()}}function yI(){for(let tn of Hn("button[return-url]"))tn.addEventListener("click",vI)}function sy(){for(let tn of Hn("form")){let en=tn.querySelectorAll("button[type=submit]");for(let nn of en)nn.addEventListener("click",rn=>bI(rn,tn))}yI()}function ay(){for(let tn of Hn("a.set_speed"))if(tn!==null){let en=function(nn){nn.preventDefault();let rn=tn.getAttribute("data"),on=document.getElementById(tn.target);on!==null&&rn!==null&&(on.value=rn)};tn.addEventListener("click",en)}}var Of={vlangroup_edit:{region:{hide:["id_sitegroup","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:["id_region"]},"site group":{hide:["id_region","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:["id_sitegroup"]},site:{hide:["id_location","id_rack","id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site"]},location:{hide:["id_rack","id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site","id_location"]},rack:{hide:["id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site","id_location","id_rack"]},"cluster group":{hide:["id_region","id_sitegroup","id_site","id_location","id_rack","id_cluster"],show:["id_clustergroup"]},cluster:{hide:["id_region","id_sitegroup","id_site","id_location","id_rack"],show:["id_clustergroup","id_cluster"]},default:{hide:["id_region","id_sitegroup","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:[]}}};function Af(tn,en){var nn;for(let rn of Hn(tn)){let on=(nn=rn.parentElement)==null?void 0:nn.parentElement;on!==null&&(en==="show"?Xs(on,"show"):Xs(on,"hide"))}}function ly(tn,en){let nn=en.options[en.selectedIndex].innerText.toLowerCase();for(let[rn,on]of Object.entries(Of[tn]))if(nn.endsWith(rn)){for(let an of on.hide)Af(`#${an}`,"hide");for(let an of on.show)Af(`#${an}`,"show");break}else for(let an of Of[tn].default.hide)Af(`#${an}`,"hide")}function cy(){for(let tn of Object.keys(Of))for(let en of Hn(`html[data-netbox-url-name="${tn}"] #id_scope_type`))ly(tn,en),en.addEventListener("change",()=>ly(tn,en))}function EI(tn){var nn,rn;let en=(rn=(nn=tn==null?void 0:tn.parentElement)==null?void 0:nn.parentElement)!=null?rn:null;return en!==null&&en.classList.contains("row")?en:null}function di(tn,en){let nn=EI(tn);if(tn!==null&&nn!==null){Xs(nn,en);let rn=new Event(`netbox.select.disabled.${tn.name}`);switch(en){case"hide":tn.disabled=!0,tn.dispatchEvent(rn);break;case"show":tn.disabled=!1,tn.dispatchEvent(rn)}}}function _I(){let tn=[Er("id_tagged_vlans"),Er("id_untagged_vlan"),Er("id_vlan_group")];if(Ks(tn)){let[en,nn]=tn;Gs(nn),Gs(en);for(let rn of tn)di(rn,"hide")}}function SI(){let tn=[Er("id_tagged_vlans"),Er("id_untagged_vlan"),Er("id_vlan_group")];if(Ks(tn)){let[en,nn,rn]=tn;Gs(en),di(rn,"show"),di(nn,"show"),di(en,"hide")}}function wI(){let tn=[Er("id_tagged_vlans"),Er("id_untagged_vlan"),Er("id_vlan_group")];if(Ks(tn)){let[en,nn,rn]=tn;di(en,"show"),di(rn,"show"),di(nn,"show")}}function xI(){let tn=[Er("id_tagged_vlans"),Er("id_untagged_vlan"),Er("id_vlan_group")];if(Ks(tn)){let[en,nn,rn]=tn;Gs(en),di(rn,"show"),di(nn,"show"),di(en,"hide")}}function uy(tn){switch(tn.value){case"access":SI();break;case"tagged":wI();break;case"tagged-all":xI();break;case"":_I();break}}function fy(){let tn=Er("id_mode");tn!==null&&(tn.addEventListener("change",()=>uy(tn)),uy(tn))}function dy(){for(let tn of[sy,ay,cy,fy])tn()}var yy=Rr(by());window.Collapse=qr;window.Modal=Fi;window.Popover=po;window.Toast=Ai;window.Tooltip=oi;function TI(){for(let tn of Hn(".masonry"))new yy.default(tn,{itemSelector:".masonry-item",percentPosition:!0})}function OI(){for(let tn of Hn('[data-bs-toggle="tooltip"]'))new oi(tn,{container:"body"})}function AI(){for(let tn of Hn('[data-bs-toggle="modal"]'))new Fi(tn)}function Lo(tn,en,nn,rn){let on="mdi-alert";switch(tn){case"warning":on="mdi-alert";break;case"success":on="mdi-check-circle";break;case"info":on="mdi-information";break;case"danger":on="mdi-alert";break}let an=document.createElement("div");an.setAttribute("class","toast-container position-fixed bottom-0 end-0 m-3");let ln=document.createElement("div");ln.setAttribute("class",`toast bg-${tn}`),ln.setAttribute("role","alert"),ln.setAttribute("aria-live","assertive"),ln.setAttribute("aria-atomic","true");let cn=document.createElement("div");cn.setAttribute("class",`toast-header bg-${tn} text-body`);let dn=document.createElement("i");dn.setAttribute("class",`mdi ${on}`);let fn=document.createElement("strong");fn.setAttribute("class","me-auto ms-1"),fn.innerText=en;let un=document.createElement("button");un.setAttribute("type","button"),un.setAttribute("class","btn-close"),un.setAttribute("data-bs-dismiss","toast"),un.setAttribute("aria-label","Close");let gn=document.createElement("div");if(gn.setAttribute("class","toast-body"),cn.appendChild(dn),cn.appendChild(fn),typeof rn!="undefined"){let pn=document.createElement("small");pn.setAttribute("class","text-muted"),cn.appendChild(pn)}return cn.appendChild(un),gn.innerText=nn.trim(),ln.appendChild(cn),ln.appendChild(gn),an.appendChild(ln),document.body.appendChild(an),new Ai(ln)}function CI(){let{hash:tn}=location;if(tn&&tn.match(/^#tab_.+$/)){let en=tn.replace("tab_","");for(let nn of Hn(`ul.nav.nav-tabs .nav-link[data-bs-target="${en}"]`))new go(nn).show()}}function LI(){let tn=document.querySelectorAll(".sidebar .accordion-item");function en(nn){for(let rn of tn)rn!==nn?rn.classList.remove("is-open"):rn.classList.toggle("is-open")}for(let nn of tn)for(let rn of nn.querySelectorAll(".accordion-button"))rn.addEventListener("click",()=>{en(nn)})}function DI(){for(let tn of Hn("a.image-preview")){let en=`${Math.round(window.innerWidth/4)}px`,nn=Qo("img",{src:tn.href});nn.style.maxWidth=en;let rn=Qo("div",null,null,[nn]);new po(tn,{customClass:"image-preview-popover",trigger:"hover",html:!0,content:rn})}}function Ey(){for(let tn of[OI,AI,TI,CI,DI,LI])tn()}function MI(tn,en){var cn;let nn=tn.currentTarget,rn=fi(nn,"span.search-obj-selected"),on=fi(nn,"input.search-obj-type"),an=nn.getAttribute("data-search-value"),ln="";rn!==null&&on!==null&&(ur(an)&&ln!==an?(ln=an,rn.innerHTML=(cn=en.textContent)!=null?cn:"Error",on.value=an):(ln="",rn.innerHTML="All Objects",on.value=""))}function II(){for(let tn of Hn(".search-obj-selector"))for(let en of tn.querySelectorAll("li > button.dropdown-item"))en.addEventListener("click",nn=>MI(nn,en))}function _y(){for(let tn of[II])tn()}function Sy(tn,en,nn){return Math.min(Math.max(tn,nn),en)}var Zo=class extends Error{constructor(en){super(`Failed to parse color: "${en}"`)}};function PI(tn){if(typeof tn!="string")throw new Zo(tn);if(tn.trim().toLowerCase()==="transparent")return[0,0,0,0];let en=tn.trim();en=HI.test(tn)?function(ln){let cn=ln.toLowerCase().trim(),dn=kI[function(fn){let un=5381,gn=fn.length;for(;gn;)un=33*un^fn.charCodeAt(--gn);return(un>>>0)%2341}(cn)];if(!dn)throw new Zo(ln);return`#${dn}`}(tn):tn;let nn=NI.exec(en);if(nn){let ln=Array.from(nn).slice(1);return[...ln.slice(0,3).map(cn=>parseInt(Js(cn,2),16)),parseInt(Js(ln[3]||"f",2),16)/255]}let rn=RI.exec(en);if(rn){let ln=Array.from(rn).slice(1);return[...ln.slice(0,3).map(cn=>parseInt(cn,16)),parseInt(ln[3]||"ff",16)/255]}let on=jI.exec(en);if(on){let ln=Array.from(on).slice(1);return[...ln.slice(0,3).map(cn=>parseInt(cn,10)),parseFloat(ln[3]||"1")]}let an=qI.exec(en);if(an){let[ln,cn,dn,fn]=Array.from(an).slice(1).map(parseFloat);if(Sy(0,100,cn)!==cn)throw new Zo(tn);if(Sy(0,100,dn)!==dn)throw new Zo(tn);return[...BI(ln,cn,dn),fn||1]}throw new Zo(tn)}var wy=tn=>parseInt(tn.replace(/_/g,""),36),kI="1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm".split(" ").reduce((tn,en)=>{let nn=wy(en.substring(0,3)),rn=wy(en.substring(3)).toString(16),on="";for(let an=0;an<6-rn.length;an++)on+="0";return tn[nn]=`${on}${rn}`,tn},{}),Js=(tn,en)=>Array.from(Array(en)).map(()=>tn).join(""),NI=new RegExp(`^#${Js("([a-f0-9])",3)}([a-f0-9])?$`,"i"),RI=new RegExp(`^#${Js("([a-f0-9]{2})",3)}([a-f0-9]{2})?$`,"i"),jI=new RegExp(`^rgba?\\(\\s*(\\d+)\\s*${Js(",\\s*(\\d+)\\s*",2)}(?:,\\s*([\\d.]+))?\\s*\\)$`,"i"),qI=/^hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%(?:\s*,\s*([\d.]+))?\s*\)$/i,HI=/^[a-z]+$/i,xy=tn=>Math.round(255*tn),BI=(tn,en,nn)=>{let rn=nn/100;if(en===0)return[rn,rn,rn].map(xy);let on=(tn%360+360)%360/60,an=(1-Math.abs(2*rn-1))*(en/100),ln=an*(1-Math.abs(on%2-1)),cn=0,dn=0,fn=0;on>=0&&on<1?(cn=an,dn=ln):on>=1&&on<2?(cn=ln,dn=an):on>=2&&on<3?(dn=an,fn=ln):on>=3&&on<4?(dn=ln,fn=an):on>=4&&on<5?(cn=ln,fn=an):on>=5&&on<6&&(cn=an,fn=ln);let un=rn-an/2;return[cn+un,dn+un,fn+un].map(xy)};function FI(tn){if(tn==="transparent")return 0;function en(an){let ln=an/255;return ln<=.03928?ln/12.92:Math.pow((ln+.055)/1.055,2.4)}let[nn,rn,on]=PI(tn);return .2126*en(nn)+.7152*en(rn)+.0722*en(on)}function $I(tn){return FI(tn)>.179}function Qs(tn){return $I(tn)?"#000":"#fff"}var Qy=Rr(Oy()),Mf=Rr(Vy());var jl={};(function(tn,en){typeof jl=="object"&&typeof module=="object"?module.exports=en():typeof define=="function"&&define.amd?define([],en):typeof jl=="object"?jl.SlimSelect=en():tn.SlimSelect=en()})(window,function(){return nn={},tn.m=en=[function(rn,on,an){"use strict";function ln(dn,fn){fn=fn||{bubbles:!1,cancelable:!1,detail:void 0};var un=document.createEvent("CustomEvent");return un.initCustomEvent(dn,fn.bubbles,fn.cancelable,fn.detail),un}var cn;on.__esModule=!0,on.hasClassInTree=function(dn,fn){function un(gn,hn){return hn&&gn&&gn.classList&&gn.classList.contains(hn)?gn:null}return un(dn,fn)||function gn(hn,pn){return hn&&hn!==document?un(hn,pn)?hn:gn(hn.parentNode,pn):null}(dn,fn)},on.ensureElementInView=function(dn,fn){var un=dn.scrollTop+dn.offsetTop,gn=un+dn.clientHeight,hn=fn.offsetTop,pn=hn+fn.clientHeight;hn=window.innerHeight?"above":un?fn:"below"},on.debounce=function(dn,fn,un){var gn;return fn===void 0&&(fn=100),un===void 0&&(un=!1),function(){for(var hn=[],pn=0;pn[^<>]*'+yn+"")},on.kebabCase=function(dn){var fn=dn.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,function(un){return"-"+un.toLowerCase()});return dn[0]===dn[0].toUpperCase()?fn.substring(1):fn},typeof(cn=window).CustomEvent!="function"&&(ln.prototype=cn.Event.prototype,cn.CustomEvent=ln)},function(rn,on,an){"use strict";on.__esModule=!0;var ln=(cn.prototype.newOption=function(fn){return{id:fn.id?fn.id:String(Math.floor(1e8*Math.random())),value:fn.value?fn.value:"",text:fn.text?fn.text:"",innerHTML:fn.innerHTML?fn.innerHTML:"",selected:!!fn.selected&&fn.selected,display:fn.display===void 0||fn.display,disabled:!!fn.disabled&&fn.disabled,placeholder:!!fn.placeholder&&fn.placeholder,class:fn.class?fn.class:void 0,data:fn.data?fn.data:{},mandatory:!!fn.mandatory&&fn.mandatory}},cn.prototype.add=function(fn){this.data.push({id:String(Math.floor(1e8*Math.random())),value:fn.value,text:fn.text,innerHTML:"",selected:!1,display:!0,disabled:!1,placeholder:!1,class:void 0,mandatory:fn.mandatory,data:{}})},cn.prototype.parseSelectData=function(){this.data=[];for(var fn=0,un=this.main.select.element.childNodes;fn',placeholder:this.placeholder,searchPlaceholder:"Filter",onChange:()=>this.handleSlimChange()}),this.getStaticParams(),this.getDynamicParams(),this.getPathKeys();for(let[ln,cn]of this.staticParams.entries())this.queryParams.set(ln,cn);for(let ln of this.dynamicParams.keys())this.updateQueryParams(ln);for(let ln of this.pathValues.keys())this.updatePathValues(ln);this.queryParams.set("brief",[!0]),this.updateQueryUrl(),this.resetClasses(),this.setSlimStyles(),this.initResetButton(),this.initRefreshButton(),this.addEventListeners();let on=this.base.getAttribute("data-fetch-trigger"),an=this.base.closest(".content-container .collapse");switch(Ky(on)?this.trigger=on:an!==null?this.trigger="collapse":this.trigger="load",this.trigger){case"collapse":an!==null&&(an.addEventListener("show.bs.collapse",()=>this.loadData()),an.addEventListener("hide.bs.collapse",()=>this.resetOptions()));break;case"open":this.slim.beforeOpen=()=>this.loadData();break;case"load":Promise.all([this.loadData()]);break}}get options(){return this.slim.data.data.filter(Jy)}set options(en){let nn=en;this.nullOption!==null&&(nn=[this.nullOption,...nn]);let rn=oy(nn,"value"),on=typeof rn.find(ln=>ln.value==="")!="undefined",an=rn.findIndex(ln=>ln.value==="");on&&an>=0?rn[an]=this.emptyOption:rn.unshift(this.emptyOption),this.slim.setData(rn)}resetOptions(){this.options=[this.emptyOption]}disable(){this.slim.slim.singleSelected!==null?this.slim.slim.singleSelected.container.hasAttribute("disabled")||this.slim.slim.singleSelected.container.setAttribute("disabled",""):this.slim.slim.multiSelected!==null&&(this.slim.slim.multiSelected.container.hasAttribute("disabled")||this.slim.slim.multiSelected.container.setAttribute("disabled","")),this.slim.disable()}enable(){this.slim.slim.singleSelected!==null?this.slim.slim.singleSelected.container.hasAttribute("disabled")&&this.slim.slim.singleSelected.container.removeAttribute("disabled"):this.slim.slim.multiSelected!==null&&this.slim.slim.multiSelected.container.hasAttribute("disabled")&&this.slim.slim.multiSelected.container.removeAttribute("disabled"),this.slim.enable()}addEventListeners(){let en=(0,Qy.default)(rn=>this.handleSearch(rn),300,!1);this.slim.slim.search.input.addEventListener("keyup",rn=>{if(!rn.key.match(/^(Arrow|Enter|Tab).*/))return en(rn)}),this.slim.slim.search.input.addEventListener("paste",rn=>en(rn)),this.slim.slim.list.addEventListener("scroll",()=>this.handleScroll()),this.base.addEventListener(`netbox.select.atbottom.${this.name}`,()=>this.fetchOptions(this.more,"merge")),this.base.addEventListener(`netbox.select.disabled.${this.name}`,rn=>this.handleDisableEnable(rn));let nn=new Set([...this.dynamicParams.keys(),...this.pathValues.keys()]);for(let rn of nn){let on=document.querySelector(`[name="${rn}"]`);on!==null&&on.addEventListener("change",an=>this.handleEvent(an)),this.base.addEventListener(`netbox.select.onload.${rn}`,an=>this.handleEvent(an))}}loadData(){return Fr(this,null,function*(){try{this.disable(),yield this.getOptions("replace")}catch(en){console.error(en)}finally{this.setOptionStyles(),this.enable(),this.base.dispatchEvent(this.loadEvent)}})}getPreselectedOptions(){return Array.from(this.base.options).filter(en=>en.selected).filter(en=>!(en.value==="---------"||en.innerText==="---------"))}processOptions(en,nn="merge"){return Fr(this,null,function*(){let rn=this.getPreselectedOptions(),on=rn.map(cn=>cn.getAttribute("value")).filter(ur),an=rn.map(cn=>({value:cn.value,text:cn.innerText,selected:!0,disabled:!1})),ln=[];for(let cn of en.results){let dn=cn.display;typeof cn._depth=="number"&&cn._depth>0&&(dn=`${"\u2500".repeat(cn._depth)} ${dn}`);let fn={},un=cn.id.toString(),gn,hn,pn;for(let[yn,mn]of Object.entries(cn)){if(!["id","slug"].includes(yn)&&["string","number","boolean"].includes(typeof mn)){let bn=yn.replaceAll("_","-");fn[bn]=String(mn)}this.disabledAttributes.some(bn=>bn.toLowerCase()===yn.toLowerCase())&&(typeof mn=="string"&&mn.toLowerCase()!=="false"||typeof mn=="boolean"&&mn===!0||typeof mn=="number"&&mn>0)&&(pn=!0)}on.some(yn=>this.disabledOptions.includes(yn))&&(pn=!0),on.includes(un)&&(hn=!0,pn=!1);let vn={value:un,text:dn,data:fn,style:gn,selected:hn,disabled:pn};ln=[...ln,vn]}switch(nn){case"merge":this.options=[...this.options,...ln];break;case"replace":this.options=[...an,...ln];break}ey(en)?this.more=en.next:this.more=null})}fetchOptions(en,nn="merge"){return Fr(this,null,function*(){if(typeof en=="string"){let rn=yield ny(en);if(Jo(rn))return Zb(rn)?this.handleError(rn.exception,rn.error):this.handleError(`Error Fetching Options for field '${this.name}'`,rn.error);yield this.processOptions(rn,nn)}})}getOptions(en="merge"){return Fr(this,null,function*(){if(this.queryUrl.includes("{{")){this.resetOptions();return}yield this.fetchOptions(this.queryUrl,en)})}handleSearch(en){return Fr(this,null,function*(){let{value:nn}=en.target,rn=Mf.default.stringifyUrl({url:this.queryUrl,query:{q:nn}});yield this.fetchOptions(rn,"merge"),this.slim.data.search(nn),this.slim.render()})}handleScroll(){let en=this.slim.slim.list.scrollTop+this.slim.slim.list.offsetHeight===this.slim.slim.list.scrollHeight;this.atBottom&&!en?(this.atBottom=!1,this.base.dispatchEvent(this.bottomEvent)):!this.atBottom&&en&&(this.atBottom=!0,this.base.dispatchEvent(this.bottomEvent))}handleEvent(en){let nn=en.target;this.updateQueryParams(nn.name),this.updatePathValues(nn.name),this.updateQueryUrl(),Promise.all([this.loadData()])}handleDisableEnable(en){let nn=en.target;nn.disabled===!0?this.disable():nn.disabled===!1&&this.enable()}handleError(en,nn){Lo("danger",en,nn).show(),this.resetOptions()}handleSlimChange(){let en=this.slim.slim;en&&(en.container.classList.contains("is-invalid")||this.base.classList.contains("is-invalid"))&&(en.container.classList.remove("is-invalid"),this.base.classList.remove("is-invalid")),this.base.dispatchEvent(this.loadEvent)}updateQueryUrl(){let en={};for(let[on,an]of this.queryParams.entries())en[on]=an;let nn=this.url;for(let[on,an]of this.pathValues.entries())for(let ln of this.url.matchAll(new RegExp(`({{${on}}})`,"g")))ur(an)&&(nn=nn.replaceAll(ln[1],an.toString()));let rn=Mf.default.stringifyUrl({url:nn,query:en});this.queryUrl!==rn&&(this.queryUrl=rn,this.base.setAttribute("data-url",rn))}updateQueryParams(en){let nn=document.querySelector(`[name="${en}"]`);if(nn!==null){let rn=[];if(nn.multiple?rn=Array.from(nn.options).filter(on=>on.selected).map(on=>on.value):nn.value!==""&&(rn=[nn.value]),rn.length>0){this.dynamicParams.updateValue(en,rn);let on=this.dynamicParams.get(en);if(typeof on!="undefined"){let{queryParam:an,queryValue:ln}=on,cn=[];if(this.staticParams.has(an)){let dn=this.staticParams.get(an);typeof dn!="undefined"&&(cn=[...dn,...ln])}else cn=ln;cn.length>0?this.queryParams.set(an,cn):this.queryParams.delete(an)}}else{let on=this.dynamicParams.queryParam(en);on!==null&&this.queryParams.delete(on)}}}updatePathValues(en){let nn=en.replaceAll(/^id_/gi,""),rn=Er(`id_${nn}`);rn!==null&&this.url.includes("{{")&&Boolean(this.url.match(new RegExp(`({{(${en})}})`,"g")))&&(ur(rn.value)?this.pathValues.set(en,rn.value):this.pathValues.set(en,""))}getPlaceholder(){let en=this.name;if(this.base.id){let nn=document.querySelector(`label[for="${this.base.id}"]`);nn!==null&&(en=`Select ${nn.innerText.trim()}`)}return en}getDisabledOptions(){var nn;let en=[];if(Yy(this.base))try{let rn=JSON.parse((nn=this.base.getAttribute("data-query-param-exclude"))!=null?nn:"[]");en=[...en,...rn]}catch(rn){console.group(`Unable to parse data-query-param-exclude value on select element '${this.name}'`),console.warn(rn),console.groupEnd()}return en}getDisabledAttributes(){let en=[...Zy],nn=this.base.getAttribute("disabled-indicator");return ur(nn)&&(en=[...en,nn]),en}getPathKeys(){for(let en of this.url.matchAll(new RegExp("{{(.+)}}","g")))this.pathValues.set(en[1],"")}getDynamicParams(){let en=this.base.getAttribute("data-dynamic-params");try{this.dynamicParams.addFromJson(en)}catch(nn){console.group(`Unable to determine dynamic query parameters for select field '${this.name}'`),console.warn(nn),console.groupEnd()}}getStaticParams(){let en=this.base.getAttribute("data-static-params");try{if(ur(en)){let nn=JSON.parse(en);if(Xy(nn))for(let{queryParam:rn,queryValue:on}of nn)Array.isArray(on)?this.staticParams.set(rn,on):this.staticParams.set(rn,[on])}}catch(nn){console.group(`Unable to determine static query parameters for select field '${this.name}'`),console.warn(nn),console.groupEnd()}}setSlimStyles(){let{width:en,height:nn}=this.slim.slim.container.getBoundingClientRect();this.base.style.opacity="0",this.base.style.width=`${en}px`,this.base.style.height=`${nn}px`,this.base.style.display="block",this.base.style.position="absolute",this.base.style.pointerEvents="none"}setOptionStyles(){for(let en of this.options)if("data"in en&&"id"in en&&typeof en.data!="undefined"&&typeof en.id!="undefined"&&"color"in en.data){let nn=en.id,rn=en.data,on=document.createElement("style"),an=`#${rn.color}`,ln=Qs(an);on.setAttribute("data-netbox",nn),on.innerHTML=` div.ss-values div.ss-value[data-id="${nn}"], div.ss-list div.ss-option:not(.ss-disabled)[data-id="${nn}"] { @@ -14,7 +14,7 @@ color: ${ln} !important; } `.replaceAll(` -`,"").trim(),document.head.appendChild(on)}}resetClasses(){let en=this.slim.slim;if(en)for(let nn of this.base.classList)en.container.classList.remove(nn)}initResetButton(){let en=di(this.base,"button[data-reset-select]");en!==null&&en.addEventListener("click",()=>{window.location.assign(window.location.origin+window.location.pathname)})}initRefreshButton(){if(this.allowRefresh){let en=Qo("button",{type:"button"},["btn","btn-sm","btn-ghost-dark"],[Qo("i",null,["mdi","mdi-reload"])]);en.addEventListener("click",()=>this.loadData()),en.type="button",this.slim.slim.search.container.appendChild(en)}}};function eE(){for(let tn of Hn(".netbox-api-select"))new If(tn)}function tE(tn){return typeof tn.value=="string"&&tn.value!==""}function nE(tn,en){if(tn.slim.singleSelected!==null)if(tE(en)){let nn=`#${en.value}`,rn=Qs(nn);tn.slim.singleSelected.container.style.backgroundColor=nn,tn.slim.singleSelected.container.style.color=rn}else tn.slim.singleSelected.container.removeAttribute("style")}function rE(){for(let tn of Hn("select.netbox-color-select")){for(let nn of tn.options)if(tE(nn)){let rn=`#${nn.value}`,on=Qs(rn);nn.style.backgroundColor=rn,nn.style.color=on}let en=new es({select:tn,allowDeselect:!0,deselectLabel:''});for(let nn of en.data.data)if("selected"in nn&&nn.selected){nE(en,nn);break}for(let nn of tn.classList)en.slim.container.classList.remove(nn);en.onChange=nn=>nE(en,nn)}}function iE(){for(let tn of Hn(".netbox-static-select"))if(tn!==null){let en=document.querySelector(`label[for="${tn.id}"]`),nn;en!==null&&(nn=`Select ${en.innerText.trim()}`);let rn=new es({select:tn,allowDeselect:!0,deselectLabel:'',placeholder:nn});for(let on of tn.classList)rn.slim.container.classList.remove(on)}}function oE(){for(let tn of[eE,rE,iE])tn()}function tP(tn){let en=tn.getAttribute("data-url"),nn=tn.classList.contains("connected"),rn=nn?"planned":"connected";ur(en)&&Cl(en,{status:rn}).then(on=>{var an;if(Jo(on)){Lo("danger","Error",on.error).show();return}else{let ln=(an=tn.parentElement)==null?void 0:an.parentElement,cn=tn.querySelector("i.mdi, span.mdi");nn?(ln.classList.remove("success"),ln.classList.add("info"),tn.classList.remove("connected","btn-warning"),tn.classList.add("btn-info"),tn.title="Mark Installed",cn.classList.remove("mdi-lan-disconnect"),cn.classList.add("mdi-lan-connect")):(ln.classList.remove("info"),ln.classList.add("success"),tn.classList.remove("btn-success"),tn.classList.add("connected","btn-warning"),tn.title="Mark Installed",cn.classList.remove("mdi-lan-connect"),cn.classList.add("mdi-lan-disconnect"))}})}function sE(){for(let tn of Hn("button.cable-toggle"))tn.addEventListener("click",()=>tP(tn))}var aE=class{set(en,nn,rn){return en[nn]=rn,!0}get(en,nn){return en[nn]}has(en,nn){return nn in en}},ql=class{constructor(en,nn){ar(this,"handlers");ar(this,"proxy");ar(this,"options");ar(this,"key","");if(this.options=nn,typeof this.options.key=="string"?this.key=this.options.key:this.key=this.generateStateKey(en),this.options.persist){let rn=this.retrieve();rn!==null&&(en=Jn(Jn({},en),rn))}this.handlers=new aE,this.proxy=new Proxy(en,this.handlers),this.options.persist&&this.save()}generateStateKey(en){return`netbox-${window.btoa(Object.keys(en).join("---"))}`}get(en){return this.handlers.get(this.proxy,en)}set(en,nn){this.handlers.set(this.proxy,en,nn),this.options.persist&&this.save()}all(){return this.proxy}keys(){return Object.keys(this.proxy)}values(){return Object.values(this.proxy)}save(){let en=JSON.stringify(this.proxy);localStorage.setItem(this.key,en)}retrieve(){let en=localStorage.getItem(this.key);return en!==null?JSON.parse(en):null}};function Hl(tn,en={}){return new ql(tn,en)}var Pf=Hl({hidden:!1},{persist:!0,key:"netbox-object-depth"});var kf=Hl({view:"images-and-labels"},{persist:!0});function lE(tn,en){en.setAttribute("data-depth-indicators",tn?"hidden":"shown"),en.innerText=tn?"Show Depth Indicators":"Hide Depth Indicators"}function cE(){for(let tn of Hn(".record-depth"))tn.style.display=""}function uE(){for(let tn of Hn(".record-depth"))tn.style.display="none"}function nP(tn,en){let nn=tn.get("hidden");tn.set("hidden",!nn);let rn=tn.get("hidden");rn?uE():cE(),lE(rn,en)}function fE(){let tn=Pf.get("hidden");for(let en of Hn("button.toggle-depth"))lE(tn,en),en.addEventListener("click",nn=>{nP(Pf,nn.currentTarget)},!1);tn?uE():tn||cE()}function rP(tn){let en=Array.from(tn.options);for(let nn=1;nn=0;nn--){let rn=en[nn];if(rn.selected){let on=tn.options[nn+1];rn=tn.removeChild(rn),on=tn.replaceChild(rn,on),tn.insertBefore(on,rn)}}}function dE(){for(let tn of Hn("#move-option-up")){let en=tn.getAttribute("data-target");if(en!==null)for(let nn of Hn(`#${en}`))tn.addEventListener("click",()=>rP(nn))}for(let tn of Hn("#move-option-down")){let en=tn.getAttribute("data-target");if(en!==null)for(let nn of Hn(`#${en}`))tn.addEventListener("click",()=>iP(nn))}}var ts="netbox-color-mode",oP="Light Mode",sP="Dark Mode",hE="mdi-lightbulb-on",pE="mdi-lightbulb";function aP(tn){return tn==="dark"||tn==="light"}function lP(tn){return localStorage.setItem(ts,tn)}function cP(tn){var en,nn;document.documentElement.setAttribute(`data-${ts}`,tn);for(let rn of Hn("span.color-mode-text"))tn==="light"?rn.innerText=sP:tn==="dark"&&(rn.innerText=oP);for(let rn of Hn("i.color-mode-icon","span.color-mode-icon"))tn==="light"?(rn.classList.remove(hE),rn.classList.add(pE)):tn==="dark"&&(rn.classList.remove(pE),rn.classList.add(hE));for(let rn of Hn(".rack_elevation")){let on=(nn=(en=rn.contentDocument)==null?void 0:en.querySelector("svg"))!=null?nn:null;on!==null&&on.setAttribute(`data-${ts}`,tn)}}function ei(tn){for(let en of[lP,cP])en(tn)}function uP(){let tn=localStorage.getItem(ts);tn==="light"?ei("dark"):tn==="dark"?ei("light"):console.warn("Unable to determine the current color mode")}function fP(){let tn=localStorage.getItem(ts),en=document.documentElement.getAttribute(`data-${ts}`);if(ur(en)&&ur(tn))return ei(tn);let nn="none";for(let rn of["dark","light"])if(window.matchMedia(`(prefers-color-scheme: ${rn})`).matches){nn=rn;break}if(ur(tn)&&!ur(en)&&aP(tn))return ei(tn);switch(nn){case"dark":return ei("dark");case"light":return ei("light");case"none":return ei("light");default:return ei("light")}}function dP(){for(let tn of Hn("button.color-mode-toggle"))tn.addEventListener("click",uP)}function mE(){window.addEventListener("load",fP);for(let tn of[dP])tn()}function hP(tn){let en=tn.currentTarget,nn=new FormData(en);nn.get("ui.colormode")==="dark"?ei("dark"):nn.get("ui.colormode")==="light"&&ei("light")}function gE(){let tn=pr("preferences-update");tn!==null&&tn.addEventListener("submit",hP)}function vE(tn,en){return tn.replace(/[^\-.\w\s]/g,"").replace(/^[\s.]+|[\s.]+$/g,"").replace(/[-.\s]+/g,"-").toLowerCase().substring(0,en)}function bE(){let tn=document.getElementById("id_slug"),en=document.getElementById("reslug");if(tn===null||en===null)return;let nn=tn.getAttribute("slug-source"),rn=document.getElementById(`id_${nn}`);if(rn===null){console.error("Unable to find field for slug field.");return}let on=tn.getAttribute("maxlength"),an=50;on&&(an=Number(on)),rn.addEventListener("blur",()=>{tn.value=vE(rn.value,an)}),en.addEventListener("click",()=>{tn.value=vE(rn.value,an)})}function pP(tn){if(!tn.currentTarget.checked)for(let nn of Hn('input[type="checkbox"].toggle',"input#select-all"))nn.checked=!1}function mP(tn){let en=tn.currentTarget,nn=di(en,"table"),rn=document.getElementById("select-all-box"),on=document.getElementById("select-all");if(nn!==null){for(let an of nn.querySelectorAll('tr:not(.d-none) input[type="checkbox"][name="pk"]'))en.checked?an.checked=!0:an.checked=!1;rn!==null&&(en.checked?rn.classList.remove("d-none"):(rn.classList.add("d-none"),on!==null&&(on.checked=!1)))}}function gP(tn){let en=tn.currentTarget,nn=pr("select-all-box");if(nn!==null)for(let rn of nn.querySelectorAll('button[type="submit"]'))en.checked?rn.disabled=!1:rn.disabled=!0}function yE(){for(let en of Hn('table tr th > input[type="checkbox"].toggle'))en.addEventListener("change",mP);for(let en of Hn('input[type="checkbox"][name="pk"]'))en.addEventListener("change",pP);let tn=pr("select-all");tn!==null&&tn.addEventListener("change",gP)}function EE(){for(let tn of[fE,sE,bE,yE,gE,dE])tn()}function _E(){let tn=document.querySelectorAll("body > div#django-messages > div.django-message.toast");for(let en of tn)en!==null&&new Ci(en).show()}var wE=Rr(SE());function xE(){for(let tn of Hn("a.copy-token","button.copy-secret"))new wE.default(tn)}var Bl=Rr(TE());function OE(){(0,Bl.default)(".date-picker",{allowInput:!0}),(0,Bl.default)(".datetime-picker",{allowInput:!0,enableSeconds:!0,enableTime:!0,time_24hr:!0}),(0,Bl.default)(".time-picker",{allowInput:!0,enableSeconds:!0,enableTime:!0,noCalendar:!0,time_24hr:!0})}function vP(){for(let tn of Hn('select[name="columns"] option'))tn.selected=!0}function bP(){for(let tn of Hn('select[name="columns"]'))tn.value=""}function yP(tn){for(let en of Hn("#id_available_columns > option"))if(en.selected){for(let nn of Hn("#id_columns"))nn.appendChild(en.cloneNode(!0));en.remove()}tn.preventDefault()}function EP(tn){for(let en of Hn("#id_columns > option"))if(en.selected){for(let nn of Hn("#id_available_columns"))nn.appendChild(en.cloneNode(!0));en.remove()}tn.preventDefault()}function _P(tn,en){return Fr(this,null,function*(){return yield Cl(tn,en)})}function SP(tn){var cn,dn;tn.preventDefault();let en=tn.currentTarget,nn=en.getAttribute("data-url");if(nn==null){Lo("danger","Error Updating Table Configuration","No API path defined for configuration form.").show();return}let rn=iy(en),on=Object.assign({},...rn.map(fn=>({[fn.name]:fn.options}))),ln=((dn=(cn=en.getAttribute("data-config-root"))==null?void 0:cn.split("."))!=null?dn:[]).reduceRight((fn,un)=>({[un]:fn}),on);_P(nn,ln).then(fn=>{Jo(fn)?Lo("danger","Error Updating Table Configuration",fn.error).show():location.reload()})}function AE(){for(let tn of Hn("#save_tableconfig"))tn.addEventListener("click",vP);for(let tn of Hn("#reset_tableconfig"))tn.addEventListener("click",bP);for(let tn of Hn("#add_columns"))tn.addEventListener("click",yP);for(let tn of Hn("#remove_columns"))tn.addEventListener("click",EP);for(let tn of Hn("form.userconfigform"))tn.addEventListener("submit",SP)}function CE(tn){return typeof tn=="string"&&["show","hide"].includes(tn)}var Fl=class extends Error{constructor(en,nn){super(en);ar(this,"table");this.table=nn}},qf=class{constructor(en,nn){ar(this,"button");ar(this,"enabledRows");ar(this,"disabledRows");this.button=en,this.enabledRows=nn.querySelectorAll('tr[data-enabled="enabled"]'),this.disabledRows=nn.querySelectorAll('tr[data-enabled="disabled"]')}get directive(){if(this.button.classList.contains("toggle-disabled"))return"disabled";if(this.button.classList.contains("toggle-enabled"))return"enabled";throw console.warn(this.button),new Error("Toggle button does not contain expected class")}toggleEnabledRows(){for(let en of this.enabledRows)en.classList.toggle("d-none")}toggleDisabledRows(){for(let en of this.disabledRows)en.classList.toggle("d-none")}set buttonState(en){CE(en)&&this.button.setAttribute("data-state",en)}get buttonState(){let en=this.button.getAttribute("data-state");return CE(en)?en:null}toggleButton(){this.buttonState==="show"?this.button.innerText=this.button.innerText.replaceAll("Show","Hide"):this.buttonState==="hide"&&(this.button.innerText=this.button.innerText.replaceAll("Hide","Show"))}toggleRows(){this.directive==="enabled"?this.toggleEnabledRows():this.directive==="disabled"&&this.toggleDisabledRows()}toggleState(){this.buttonState==="show"?this.buttonState="hide":this.buttonState==="hide"&&(this.buttonState="show")}toggle(){this.toggleState(),this.toggleButton(),this.toggleRows()}handleClick(en){en.currentTarget.isEqualNode(this.button)&&this.toggle()}},LE=class{constructor(en){ar(this,"table");ar(this,"enabledButton");ar(this,"disabledButton");ar(this,"caption",null);this.table=en;try{let nn=di(this.table,"button.toggle-enabled"),rn=di(this.table,"button.toggle-disabled"),on=this.table.querySelector("caption");if(this.caption=on,nn===null)throw new Fl("Table is missing a 'toggle-enabled' button.",en);if(rn===null)throw new Fl("Table is missing a 'toggle-disabled' button.",en);nn.addEventListener("click",an=>this.handleClick(an,this)),rn.addEventListener("click",an=>this.handleClick(an,this)),this.enabledButton=new qf(nn,this.table),this.disabledButton=new qf(rn,this.table)}catch(nn){if(nn instanceof Fl){console.debug("Table does not contain enable/disable toggle buttons");return}else throw nn}}get captionText(){return this.caption!==null?this.caption.innerText:""}set captionText(en){this.caption!==null&&(this.caption.innerText=en)}toggleCaption(){let en=this.enabledButton.buttonState==="show",nn=this.disabledButton.buttonState==="show";en&&!nn?this.captionText="Showing Enabled Interfaces":en&&nn?this.captionText="Showing Enabled & Disabled Interfaces":!en&&nn?this.captionText="Showing Disabled Interfaces":!en&&!nn?this.captionText="Hiding Enabled & Disabled Interfaces":this.captionText=""}handleClick(en,nn){let rn=en.currentTarget,on=rn.isEqualNode(nn.enabledButton.button),an=rn.isEqualNode(nn.disabledButton.button);on?nn.enabledButton.handleClick(en):an&&nn.disabledButton.handleClick(en),nn.toggleCaption()}};function DE(){for(let tn of Hn("table"))new LE(tn)}var ME=class{constructor(en){ar(this,"base");ar(this,"state");ar(this,"activeLink",null);ar(this,"sections",[]);this.base=en,this.state=new ql({pinned:!0},{persist:!0,key:"netbox-sidenav"}),this.init(),this.initSectionLinks(),this.initLinks()}bodyHas(en){return document.body.hasAttribute(`data-sidenav-${en}`)}bodyRemove(...en){for(let nn of en)document.body.removeAttribute(`data-sidenav-${nn}`)}bodyAdd(...en){for(let nn of en)document.body.setAttribute(`data-sidenav-${nn}`,"")}init(){for(let en of this.base.querySelectorAll(".sidenav-toggle"))en.addEventListener("click",nn=>this.onToggle(nn));for(let en of Hn(".sidenav-toggle-mobile"))en.addEventListener("click",nn=>this.onMobileToggle(nn));window.innerWidth>1200&&(this.state.get("pinned")&&this.pin(),this.state.get("pinned")||this.unpin(),window.addEventListener("resize",()=>this.onResize())),window.innerWidth<1200&&(this.bodyRemove("hide"),this.bodyAdd("hidden"),window.addEventListener("resize",()=>this.onResize())),this.base.addEventListener("mouseenter",()=>this.onEnter()),this.base.addEventListener("mouseleave",()=>this.onLeave())}initLinks(){for(let en of this.getActiveLinks())this.bodyHas("show")?this.activateLink(en,"expand"):this.bodyHas("hidden")&&this.activateLink(en,"collapse")}show(){this.bodyAdd("show"),this.bodyRemove("hidden","hide")}hide(){this.bodyAdd("hidden"),this.bodyRemove("pinned","show");for(let en of this.base.querySelectorAll(".collapse"))en.classList.remove("show")}pin(){this.bodyAdd("show","pinned"),this.bodyRemove("hidden"),this.state.set("pinned",!0)}unpin(){this.bodyRemove("pinned","show"),this.bodyAdd("hidden");for(let en of this.base.querySelectorAll(".collapse"))en.classList.remove("show");this.state.set("pinned",!1)}handleSectionClick(en){en.preventDefault();let nn=en.target;this.activeLink=nn,this.closeInactiveSections()}closeInactiveSections(){for(let[en,nn]of this.sections)en!==this.activeLink&&(en.classList.add("collapsed"),en.setAttribute("aria-expanded","false"),nn.hide())}initSectionLinks(){for(let en of Hn(".navbar-nav .nav-item .nav-link[data-bs-toggle]"))if(en.parentElement!==null){let nn=en.parentElement.querySelector(".collapse");if(nn!==null){let rn=new qr(nn,{toggle:!1});this.sections.push([en,rn]),en.addEventListener("click",on=>this.handleSectionClick(on))}}}activateLink(en,nn){var on;let rn=en.closest(".collapse");if(Tf(rn)){let an=(on=rn.parentElement)==null?void 0:on.querySelector(".nav-link");if(Tf(an))switch(an.classList.add("active"),nn){case"expand":an.setAttribute("aria-expanded","true"),rn.classList.add("show"),en.classList.add("active");break;case"collapse":an.setAttribute("aria-expanded","false"),rn.classList.remove("show"),en.classList.remove("active");break}}}*getActiveLinks(){for(let en of this.base.querySelectorAll(".navbar-nav .nav .nav-item a.nav-link")){let nn=new RegExp(en.href,"gi");window.location.href.match(nn)&&(yield en)}}onEnter(){if(!this.bodyHas("pinned")){this.bodyRemove("hide","hidden"),this.bodyAdd("show");for(let en of this.getActiveLinks())this.activateLink(en,"expand")}}onLeave(){if(!this.bodyHas("pinned")){this.bodyRemove("show"),this.bodyAdd("hide");for(let en of this.getActiveLinks())this.activateLink(en,"collapse");this.bodyRemove("hide"),this.bodyAdd("hidden")}}onResize(){this.bodyHas("show")&&!this.bodyHas("pinned")&&(this.bodyRemove("show"),this.bodyAdd("hidden"))}onToggle(en){en.preventDefault(),this.state.get("pinned")?this.unpin():this.pin()}onMobileToggle(en){en.preventDefault(),this.bodyHas("hidden")?this.show():this.hide()}};function IE(){for(let tn of Hn(".sidenav"))new ME(tn)}function PE(tn,en){switch(tn){case"images-and-labels":{Hf("image.device-image",en),Hf("text.device-image-label",en);break}case"images-only":{Hf("image.device-image",en),Bf("text.device-image-label",en);break}case"labels-only":{Bf("image.device-image",en),Bf("text.device-image-label",en);break}}}function Hf(tn,en){var rn,on;let nn=(on=(rn=en.contentDocument)==null?void 0:rn.querySelectorAll(tn))!=null?on:[];for(let an of nn)an.classList.remove("hidden")}function Bf(tn,en){var rn,on;let nn=(on=(rn=en.contentDocument)==null?void 0:rn.querySelectorAll(tn))!=null?on:[];for(let an of nn)an.classList.add("hidden")}function wP(tn,en){en.set("view",tn);for(let nn of Hn(".rack_elevation"))PE(tn,nn)}function kE(){let tn=kf.get("view");for(let en of Hn("select.rack-view"))en.selectedIndex=[...en.options].findIndex(nn=>nn.value==tn),en.addEventListener("change",nn=>{wP(nn.currentTarget.value,kf)},!1);for(let en of Hn(".rack_elevation"))en.addEventListener("load",()=>{PE(tn,en)})}function NE(){for(let tn of Hn("*[data-href]")){let en=tn.getAttribute("data-href");ur(en)&&tn.addEventListener("click",()=>{window.location.assign(en)})}}function RE(){for(let tn of[Ey,mE,_E,dy,_y,oE,OE,EE,xE,AE,DE,IE,kE,NE])tn()}function xP(){let tn=document.querySelector(".content-container");tn!==null&&tn.focus()}window.addEventListener("load",xP);document.readyState!=="loading"?RE():document.addEventListener("DOMContentLoaded",RE);})(); +`,"").trim(),document.head.appendChild(on)}}resetClasses(){let en=this.slim.slim;if(en)for(let nn of this.base.classList)en.container.classList.remove(nn)}initResetButton(){let en=fi(this.base,"button[data-reset-select]");en!==null&&en.addEventListener("click",()=>{window.location.assign(window.location.origin+window.location.pathname)})}initRefreshButton(){if(this.allowRefresh){let en=Qo("button",{type:"button"},["btn","btn-sm","btn-ghost-dark"],[Qo("i",null,["mdi","mdi-reload"])]);en.addEventListener("click",()=>this.loadData()),en.type="button",this.slim.slim.search.container.appendChild(en)}}};function eE(){for(let tn of Hn(".netbox-api-select"))new If(tn)}function tE(tn){return typeof tn.value=="string"&&tn.value!==""}function nE(tn,en){if(tn.slim.singleSelected!==null)if(tE(en)){let nn=`#${en.value}`,rn=Qs(nn);tn.slim.singleSelected.container.style.backgroundColor=nn,tn.slim.singleSelected.container.style.color=rn}else tn.slim.singleSelected.container.removeAttribute("style")}function rE(){for(let tn of Hn("select.netbox-color-select")){for(let nn of tn.options)if(tE(nn)){let rn=`#${nn.value}`,on=Qs(rn);nn.style.backgroundColor=rn,nn.style.color=on}let en=new es({select:tn,allowDeselect:!0,deselectLabel:''});for(let nn of en.data.data)if("selected"in nn&&nn.selected){nE(en,nn);break}for(let nn of tn.classList)en.slim.container.classList.remove(nn);en.onChange=nn=>nE(en,nn)}}function iE(){for(let tn of Hn(".netbox-static-select"))if(tn!==null){let en=document.querySelector(`label[for="${tn.id}"]`),nn;en!==null&&(nn=`Select ${en.innerText.trim()}`);let rn=new es({select:tn,allowDeselect:!0,deselectLabel:'',placeholder:nn});for(let on of tn.classList)rn.slim.container.classList.remove(on)}}function oE(){for(let tn of[eE,rE,iE])tn()}function eP(tn){let en=tn.getAttribute("data-url"),nn=tn.classList.contains("connected"),rn=nn?"planned":"connected";ur(en)&&Cl(en,{status:rn}).then(on=>{var an;if(Jo(on)){Lo("danger","Error",on.error).show();return}else{let ln=(an=tn.parentElement)==null?void 0:an.parentElement,cn=tn.querySelector("i.mdi, span.mdi");nn?(ln.classList.remove("success"),ln.classList.add("info"),tn.classList.remove("connected","btn-warning"),tn.classList.add("btn-info"),tn.title="Mark Installed",cn.classList.remove("mdi-lan-disconnect"),cn.classList.add("mdi-lan-connect")):(ln.classList.remove("info"),ln.classList.add("success"),tn.classList.remove("btn-success"),tn.classList.add("connected","btn-warning"),tn.title="Mark Installed",cn.classList.remove("mdi-lan-connect"),cn.classList.add("mdi-lan-disconnect"))}})}function sE(){for(let tn of Hn("button.cable-toggle"))tn.addEventListener("click",()=>eP(tn))}var aE=class{set(en,nn,rn){return en[nn]=rn,!0}get(en,nn){return en[nn]}has(en,nn){return nn in en}},ql=class{constructor(en,nn){ar(this,"handlers");ar(this,"proxy");ar(this,"options");ar(this,"key","");if(this.options=nn,typeof this.options.key=="string"?this.key=this.options.key:this.key=this.generateStateKey(en),this.options.persist){let rn=this.retrieve();rn!==null&&(en=Jn(Jn({},en),rn))}this.handlers=new aE,this.proxy=new Proxy(en,this.handlers),this.options.persist&&this.save()}generateStateKey(en){return`netbox-${window.btoa(Object.keys(en).join("---"))}`}get(en){return this.handlers.get(this.proxy,en)}set(en,nn){this.handlers.set(this.proxy,en,nn),this.options.persist&&this.save()}all(){return this.proxy}keys(){return Object.keys(this.proxy)}values(){return Object.values(this.proxy)}save(){let en=JSON.stringify(this.proxy);localStorage.setItem(this.key,en)}retrieve(){let en=localStorage.getItem(this.key);return en!==null?JSON.parse(en):null}};function Hl(tn,en={}){return new ql(tn,en)}var Pf=Hl({hidden:!1},{persist:!0,key:"netbox-object-depth"});var kf=Hl({view:"images-and-labels"},{persist:!0});function lE(tn,en){en.setAttribute("data-depth-indicators",tn?"hidden":"shown"),en.innerText=tn?"Show Depth Indicators":"Hide Depth Indicators"}function cE(){for(let tn of Hn(".record-depth"))tn.style.display=""}function uE(){for(let tn of Hn(".record-depth"))tn.style.display="none"}function tP(tn,en){let nn=tn.get("hidden");tn.set("hidden",!nn);let rn=tn.get("hidden");rn?uE():cE(),lE(rn,en)}function fE(){let tn=Pf.get("hidden");for(let en of Hn("button.toggle-depth"))lE(tn,en),en.addEventListener("click",nn=>{tP(Pf,nn.currentTarget)},!1);tn?uE():tn||cE()}function nP(tn){let en=Array.from(tn.options);for(let nn=1;nn=0;nn--){let rn=en[nn];if(rn.selected){let on=tn.options[nn+1];rn=tn.removeChild(rn),on=tn.replaceChild(rn,on),tn.insertBefore(on,rn)}}}function dE(){for(let tn of Hn("#move-option-up")){let en=tn.getAttribute("data-target");if(en!==null)for(let nn of Hn(`#${en}`))tn.addEventListener("click",()=>nP(nn))}for(let tn of Hn("#move-option-down")){let en=tn.getAttribute("data-target");if(en!==null)for(let nn of Hn(`#${en}`))tn.addEventListener("click",()=>rP(nn))}}function hE(tn,en){return tn.replace(/[^\-.\w\s]/g,"").replace(/^[\s.]+|[\s.]+$/g,"").replace(/[-.\s]+/g,"-").toLowerCase().substring(0,en)}function pE(){let tn=document.getElementById("id_slug"),en=document.getElementById("reslug");if(tn===null||en===null)return;let nn=tn.getAttribute("slug-source"),rn=document.getElementById(`id_${nn}`);if(rn===null){console.error("Unable to find field for slug field.");return}let on=tn.getAttribute("maxlength"),an=50;on&&(an=Number(on)),rn.addEventListener("blur",()=>{tn.value=hE(rn.value,an)}),en.addEventListener("click",()=>{tn.value=hE(rn.value,an)})}function iP(tn){if(!tn.currentTarget.checked)for(let nn of Hn('input[type="checkbox"].toggle',"input#select-all"))nn.checked=!1}function oP(tn){let en=tn.currentTarget,nn=fi(en,"table"),rn=document.getElementById("select-all-box"),on=document.getElementById("select-all");if(nn!==null){for(let an of nn.querySelectorAll('tr:not(.d-none) input[type="checkbox"][name="pk"]'))en.checked?an.checked=!0:an.checked=!1;rn!==null&&(en.checked?rn.classList.remove("d-none"):(rn.classList.add("d-none"),on!==null&&(on.checked=!1)))}}function sP(tn){let en=tn.currentTarget,nn=Er("select-all-box");if(nn!==null)for(let rn of nn.querySelectorAll('button[type="submit"]'))en.checked?rn.disabled=!1:rn.disabled=!0}function mE(){for(let en of Hn('table tr th > input[type="checkbox"].toggle'))en.addEventListener("change",oP);for(let en of Hn('input[type="checkbox"][name="pk"]'))en.addEventListener("change",iP);let tn=Er("select-all");tn!==null&&tn.addEventListener("change",sP)}function gE(){for(let tn of[fE,sE,pE,mE,dE])tn()}var ts="netbox-color-mode",aP="Light Mode",lP="Dark Mode",vE="mdi-lightbulb-on",bE="mdi-lightbulb";function cP(tn){return tn==="dark"||tn==="light"}function uP(tn){return localStorage.setItem(ts,tn)}function fP(tn){var en,nn;document.documentElement.setAttribute(`data-${ts}`,tn);for(let rn of Hn("span.color-mode-text"))tn==="light"?rn.innerText=lP:tn==="dark"&&(rn.innerText=aP);for(let rn of Hn("i.color-mode-icon","span.color-mode-icon"))tn==="light"?(rn.classList.remove(vE),rn.classList.add(bE)):tn==="dark"&&(rn.classList.remove(bE),rn.classList.add(vE));for(let rn of Hn(".rack_elevation")){let on=(nn=(en=rn.contentDocument)==null?void 0:en.querySelector("svg"))!=null?nn:null;on!==null&&on.setAttribute(`data-${ts}`,tn)}}function Ki(tn){for(let en of[uP,fP])en(tn)}function dP(){let tn=localStorage.getItem(ts);tn==="light"?Ki("dark"):tn==="dark"?Ki("light"):console.warn("Unable to determine the current color mode")}function hP(){let tn=localStorage.getItem(ts),en=document.documentElement.getAttribute(`data-${ts}`);if(ur(en)&&ur(tn))return Ki(tn);let nn="none";for(let rn of["dark","light"])if(window.matchMedia(`(prefers-color-scheme: ${rn})`).matches){nn=rn;break}if(ur(tn)&&!ur(en)&&cP(tn))return Ki(tn);switch(nn){case"dark":return Ki("dark");case"light":return Ki("light");case"none":return Ki("light");default:return Ki("light")}}function pP(){for(let tn of Hn("button.color-mode-toggle"))tn.addEventListener("click",dP)}function yE(){window.addEventListener("load",hP);for(let tn of[pP])tn()}function EE(){let tn=document.querySelectorAll("body > div#django-messages > div.django-message.toast");for(let en of tn)en!==null&&new Ai(en).show()}var SE=Rr(_E());function wE(){for(let tn of Hn("a.copy-token","button.copy-secret"))new SE.default(tn)}var Bl=Rr(xE());function TE(){(0,Bl.default)(".date-picker",{allowInput:!0}),(0,Bl.default)(".datetime-picker",{allowInput:!0,enableSeconds:!0,enableTime:!0,time_24hr:!0}),(0,Bl.default)(".time-picker",{allowInput:!0,enableSeconds:!0,enableTime:!0,noCalendar:!0,time_24hr:!0})}function mP(){for(let tn of Hn('select[name="columns"] option'))tn.selected=!0}function gP(){for(let tn of Hn('select[name="columns"]'))tn.value=""}function vP(tn){for(let en of Hn("#id_available_columns > option"))if(en.selected){for(let nn of Hn("#id_columns"))nn.appendChild(en.cloneNode(!0));en.remove()}tn.preventDefault()}function bP(tn){for(let en of Hn("#id_columns > option"))if(en.selected){for(let nn of Hn("#id_available_columns"))nn.appendChild(en.cloneNode(!0));en.remove()}tn.preventDefault()}function yP(tn,en){return Fr(this,null,function*(){return yield Cl(tn,en)})}function EP(tn){var cn,dn;tn.preventDefault();let en=tn.currentTarget,nn=en.getAttribute("data-url");if(nn==null){Lo("danger","Error Updating Table Configuration","No API path defined for configuration form.").show();return}let rn=iy(en),on=Object.assign({},...rn.map(fn=>({[fn.name]:fn.options}))),ln=((dn=(cn=en.getAttribute("data-config-root"))==null?void 0:cn.split("."))!=null?dn:[]).reduceRight((fn,un)=>({[un]:fn}),on);yP(nn,ln).then(fn=>{Jo(fn)?Lo("danger","Error Updating Table Configuration",fn.error).show():location.reload()})}function OE(){for(let tn of Hn("#save_tableconfig"))tn.addEventListener("click",mP);for(let tn of Hn("#reset_tableconfig"))tn.addEventListener("click",gP);for(let tn of Hn("#add_columns"))tn.addEventListener("click",vP);for(let tn of Hn("#remove_columns"))tn.addEventListener("click",bP);for(let tn of Hn("form.userconfigform"))tn.addEventListener("submit",EP)}function AE(tn){return typeof tn=="string"&&["show","hide"].includes(tn)}var Fl=class extends Error{constructor(en,nn){super(en);ar(this,"table");this.table=nn}},qf=class{constructor(en,nn){ar(this,"button");ar(this,"enabledRows");ar(this,"disabledRows");this.button=en,this.enabledRows=nn.querySelectorAll('tr[data-enabled="enabled"]'),this.disabledRows=nn.querySelectorAll('tr[data-enabled="disabled"]')}get directive(){if(this.button.classList.contains("toggle-disabled"))return"disabled";if(this.button.classList.contains("toggle-enabled"))return"enabled";throw console.warn(this.button),new Error("Toggle button does not contain expected class")}toggleEnabledRows(){for(let en of this.enabledRows)en.classList.toggle("d-none")}toggleDisabledRows(){for(let en of this.disabledRows)en.classList.toggle("d-none")}set buttonState(en){AE(en)&&this.button.setAttribute("data-state",en)}get buttonState(){let en=this.button.getAttribute("data-state");return AE(en)?en:null}toggleButton(){this.buttonState==="show"?this.button.innerText=this.button.innerText.replaceAll("Show","Hide"):this.buttonState==="hide"&&(this.button.innerText=this.button.innerText.replaceAll("Hide","Show"))}toggleRows(){this.directive==="enabled"?this.toggleEnabledRows():this.directive==="disabled"&&this.toggleDisabledRows()}toggleState(){this.buttonState==="show"?this.buttonState="hide":this.buttonState==="hide"&&(this.buttonState="show")}toggle(){this.toggleState(),this.toggleButton(),this.toggleRows()}handleClick(en){en.currentTarget.isEqualNode(this.button)&&this.toggle()}},CE=class{constructor(en){ar(this,"table");ar(this,"enabledButton");ar(this,"disabledButton");ar(this,"caption",null);this.table=en;try{let nn=fi(this.table,"button.toggle-enabled"),rn=fi(this.table,"button.toggle-disabled"),on=this.table.querySelector("caption");if(this.caption=on,nn===null)throw new Fl("Table is missing a 'toggle-enabled' button.",en);if(rn===null)throw new Fl("Table is missing a 'toggle-disabled' button.",en);nn.addEventListener("click",an=>this.handleClick(an,this)),rn.addEventListener("click",an=>this.handleClick(an,this)),this.enabledButton=new qf(nn,this.table),this.disabledButton=new qf(rn,this.table)}catch(nn){if(nn instanceof Fl){console.debug("Table does not contain enable/disable toggle buttons");return}else throw nn}}get captionText(){return this.caption!==null?this.caption.innerText:""}set captionText(en){this.caption!==null&&(this.caption.innerText=en)}toggleCaption(){let en=this.enabledButton.buttonState==="show",nn=this.disabledButton.buttonState==="show";en&&!nn?this.captionText="Showing Enabled Interfaces":en&&nn?this.captionText="Showing Enabled & Disabled Interfaces":!en&&nn?this.captionText="Showing Disabled Interfaces":!en&&!nn?this.captionText="Hiding Enabled & Disabled Interfaces":this.captionText=""}handleClick(en,nn){let rn=en.currentTarget,on=rn.isEqualNode(nn.enabledButton.button),an=rn.isEqualNode(nn.disabledButton.button);on?nn.enabledButton.handleClick(en):an&&nn.disabledButton.handleClick(en),nn.toggleCaption()}};function LE(){for(let tn of Hn("table"))new CE(tn)}var DE=class{constructor(en){ar(this,"base");ar(this,"state");ar(this,"activeLink",null);ar(this,"sections",[]);this.base=en,this.state=new ql({pinned:!0},{persist:!0,key:"netbox-sidenav"}),this.init(),this.initSectionLinks(),this.initLinks()}bodyHas(en){return document.body.hasAttribute(`data-sidenav-${en}`)}bodyRemove(...en){for(let nn of en)document.body.removeAttribute(`data-sidenav-${nn}`)}bodyAdd(...en){for(let nn of en)document.body.setAttribute(`data-sidenav-${nn}`,"")}init(){for(let en of this.base.querySelectorAll(".sidenav-toggle"))en.addEventListener("click",nn=>this.onToggle(nn));for(let en of Hn(".sidenav-toggle-mobile"))en.addEventListener("click",nn=>this.onMobileToggle(nn));window.innerWidth>1200&&(this.state.get("pinned")&&this.pin(),this.state.get("pinned")||this.unpin(),window.addEventListener("resize",()=>this.onResize())),window.innerWidth<1200&&(this.bodyRemove("hide"),this.bodyAdd("hidden"),window.addEventListener("resize",()=>this.onResize())),this.base.addEventListener("mouseenter",()=>this.onEnter()),this.base.addEventListener("mouseleave",()=>this.onLeave())}initLinks(){for(let en of this.getActiveLinks())this.bodyHas("show")?this.activateLink(en,"expand"):this.bodyHas("hidden")&&this.activateLink(en,"collapse")}show(){this.bodyAdd("show"),this.bodyRemove("hidden","hide")}hide(){this.bodyAdd("hidden"),this.bodyRemove("pinned","show");for(let en of this.base.querySelectorAll(".collapse"))en.classList.remove("show")}pin(){this.bodyAdd("show","pinned"),this.bodyRemove("hidden"),this.state.set("pinned",!0)}unpin(){this.bodyRemove("pinned","show"),this.bodyAdd("hidden");for(let en of this.base.querySelectorAll(".collapse"))en.classList.remove("show");this.state.set("pinned",!1)}handleSectionClick(en){en.preventDefault();let nn=en.target;this.activeLink=nn,this.closeInactiveSections()}closeInactiveSections(){for(let[en,nn]of this.sections)en!==this.activeLink&&(en.classList.add("collapsed"),en.setAttribute("aria-expanded","false"),nn.hide())}initSectionLinks(){for(let en of Hn(".navbar-nav .nav-item .nav-link[data-bs-toggle]"))if(en.parentElement!==null){let nn=en.parentElement.querySelector(".collapse");if(nn!==null){let rn=new qr(nn,{toggle:!1});this.sections.push([en,rn]),en.addEventListener("click",on=>this.handleSectionClick(on))}}}activateLink(en,nn){var on;let rn=en.closest(".collapse");if(Tf(rn)){let an=(on=rn.parentElement)==null?void 0:on.querySelector(".nav-link");if(Tf(an))switch(an.classList.add("active"),nn){case"expand":an.setAttribute("aria-expanded","true"),rn.classList.add("show"),en.classList.add("active");break;case"collapse":an.setAttribute("aria-expanded","false"),rn.classList.remove("show"),en.classList.remove("active");break}}}*getActiveLinks(){for(let en of this.base.querySelectorAll(".navbar-nav .nav .nav-item a.nav-link")){let nn=new RegExp(en.href,"gi");window.location.href.match(nn)&&(yield en)}}onEnter(){if(!this.bodyHas("pinned")){this.bodyRemove("hide","hidden"),this.bodyAdd("show");for(let en of this.getActiveLinks())this.activateLink(en,"expand")}}onLeave(){if(!this.bodyHas("pinned")){this.bodyRemove("show"),this.bodyAdd("hide");for(let en of this.getActiveLinks())this.activateLink(en,"collapse");this.bodyRemove("hide"),this.bodyAdd("hidden")}}onResize(){this.bodyHas("show")&&!this.bodyHas("pinned")&&(this.bodyRemove("show"),this.bodyAdd("hidden"))}onToggle(en){en.preventDefault(),this.state.get("pinned")?this.unpin():this.pin()}onMobileToggle(en){en.preventDefault(),this.bodyHas("hidden")?this.show():this.hide()}};function ME(){for(let tn of Hn(".sidenav"))new DE(tn)}function IE(tn,en){switch(tn){case"images-and-labels":{Hf("image.device-image",en),Hf("text.device-image-label",en);break}case"images-only":{Hf("image.device-image",en),Bf("text.device-image-label",en);break}case"labels-only":{Bf("image.device-image",en),Bf("text.device-image-label",en);break}}}function Hf(tn,en){var rn,on;let nn=(on=(rn=en.contentDocument)==null?void 0:rn.querySelectorAll(tn))!=null?on:[];for(let an of nn)an.classList.remove("hidden")}function Bf(tn,en){var rn,on;let nn=(on=(rn=en.contentDocument)==null?void 0:rn.querySelectorAll(tn))!=null?on:[];for(let an of nn)an.classList.add("hidden")}function _P(tn,en){en.set("view",tn);for(let nn of Hn(".rack_elevation"))IE(tn,nn)}function PE(){let tn=kf.get("view");for(let en of Hn("select.rack-view"))en.selectedIndex=[...en.options].findIndex(nn=>nn.value==tn),en.addEventListener("change",nn=>{_P(nn.currentTarget.value,kf)},!1);for(let en of Hn(".rack_elevation"))en.addEventListener("load",()=>{IE(tn,en)})}function kE(){for(let tn of Hn("*[data-href]")){let en=tn.getAttribute("data-href");ur(en)&&tn.addEventListener("click",()=>{window.location.assign(en)})}}function NE(){for(let tn of[Ey,yE,EE,dy,_y,oE,TE,gE,wE,OE,LE,ME,PE,kE])tn()}function SP(){let tn=document.querySelector(".content-container");tn!==null&&tn.focus()}window.addEventListener("load",SP);document.readyState!=="loading"?NE():document.addEventListener("DOMContentLoaded",NE);})(); /* flatpickr v4.6.3, @license MIT */ /*! * Bootstrap v5.0.2 (https://getbootstrap.com/) diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 6fbe0874b10..116aad5e6e4 100644 --- a/netbox/project-static/dist/netbox.js.map +++ b/netbox/project-static/dist/netbox.js.map @@ -1,6 +1,6 @@ { "version": 3, - "sources": ["../node_modules/htmx.org/dist/htmx.min.js", "../node_modules/core-js/internals/global.js", "../node_modules/core-js/internals/fails.js", "../node_modules/core-js/internals/descriptors.js", "../node_modules/core-js/internals/object-property-is-enumerable.js", "../node_modules/core-js/internals/create-property-descriptor.js", "../node_modules/core-js/internals/classof-raw.js", "../node_modules/core-js/internals/indexed-object.js", "../node_modules/core-js/internals/require-object-coercible.js", "../node_modules/core-js/internals/to-indexed-object.js", "../node_modules/core-js/internals/is-object.js", "../node_modules/core-js/internals/get-built-in.js", "../node_modules/core-js/internals/engine-user-agent.js", "../node_modules/core-js/internals/engine-v8-version.js", "../node_modules/core-js/internals/native-symbol.js", "../node_modules/core-js/internals/use-symbol-as-uid.js", "../node_modules/core-js/internals/is-symbol.js", "../node_modules/core-js/internals/ordinary-to-primitive.js", "../node_modules/core-js/internals/is-pure.js", "../node_modules/core-js/internals/set-global.js", "../node_modules/core-js/internals/shared-store.js", "../node_modules/core-js/internals/shared.js", "../node_modules/core-js/internals/to-object.js", "../node_modules/core-js/internals/has.js", "../node_modules/core-js/internals/uid.js", "../node_modules/core-js/internals/well-known-symbol.js", "../node_modules/core-js/internals/to-primitive.js", "../node_modules/core-js/internals/to-property-key.js", "../node_modules/core-js/internals/document-create-element.js", "../node_modules/core-js/internals/ie8-dom-define.js", "../node_modules/core-js/internals/object-get-own-property-descriptor.js", "../node_modules/core-js/internals/an-object.js", "../node_modules/core-js/internals/object-define-property.js", "../node_modules/core-js/internals/create-non-enumerable-property.js", "../node_modules/core-js/internals/inspect-source.js", "../node_modules/core-js/internals/native-weak-map.js", "../node_modules/core-js/internals/shared-key.js", "../node_modules/core-js/internals/hidden-keys.js", "../node_modules/core-js/internals/internal-state.js", "../node_modules/core-js/internals/redefine.js", "../node_modules/core-js/internals/to-integer.js", "../node_modules/core-js/internals/to-length.js", "../node_modules/core-js/internals/to-absolute-index.js", "../node_modules/core-js/internals/array-includes.js", "../node_modules/core-js/internals/object-keys-internal.js", "../node_modules/core-js/internals/enum-bug-keys.js", "../node_modules/core-js/internals/object-get-own-property-names.js", "../node_modules/core-js/internals/object-get-own-property-symbols.js", "../node_modules/core-js/internals/own-keys.js", "../node_modules/core-js/internals/copy-constructor-properties.js", "../node_modules/core-js/internals/is-forced.js", "../node_modules/core-js/internals/export.js", "../node_modules/core-js/internals/a-function.js", "../node_modules/core-js/internals/function-bind-context.js", "../node_modules/core-js/internals/is-array.js", "../node_modules/core-js/internals/array-species-constructor.js", "../node_modules/core-js/internals/array-species-create.js", "../node_modules/core-js/internals/array-iteration.js", "../node_modules/core-js/internals/array-method-is-strict.js", "../node_modules/core-js/internals/array-for-each.js", "../node_modules/core-js/internals/dom-iterables.js", "../node_modules/can-use-dom/index.js", "../node_modules/core-js/internals/array-method-has-species-support.js", "../node_modules/core-js/internals/object-keys.js", "../node_modules/core-js/internals/object-define-properties.js", "../node_modules/core-js/internals/html.js", "../node_modules/core-js/internals/object-create.js", "../node_modules/core-js/internals/add-to-unscopables.js", "../node_modules/core-js/internals/iterators.js", "../node_modules/core-js/internals/correct-prototype-getter.js", "../node_modules/core-js/internals/object-get-prototype-of.js", "../node_modules/core-js/internals/iterators-core.js", "../node_modules/core-js/internals/set-to-string-tag.js", "../node_modules/core-js/internals/create-iterator-constructor.js", "../node_modules/core-js/internals/a-possible-prototype.js", "../node_modules/core-js/internals/object-set-prototype-of.js", "../node_modules/core-js/internals/define-iterator.js", "../node_modules/core-js/modules/es.array.iterator.js", "../node_modules/core-js/internals/object-assign.js", "../node_modules/core-js/internals/to-string-tag-support.js", "../node_modules/core-js/internals/classof.js", "../node_modules/core-js/internals/object-to-string.js", "../node_modules/core-js/internals/to-string.js", "../node_modules/core-js/internals/whitespaces.js", "../node_modules/core-js/internals/string-trim.js", "../node_modules/core-js/internals/number-parse-int.js", "../node_modules/core-js/internals/string-multibyte.js", "../node_modules/core-js/internals/redefine-all.js", "../node_modules/core-js/internals/object-get-own-property-names-external.js", "../node_modules/core-js/internals/freezing.js", "../node_modules/core-js/internals/internal-metadata.js", "../node_modules/core-js/internals/is-array-iterator-method.js", "../node_modules/core-js/internals/get-iterator-method.js", "../node_modules/core-js/internals/get-iterator.js", "../node_modules/core-js/internals/iterator-close.js", "../node_modules/core-js/internals/iterate.js", "../node_modules/core-js/internals/an-instance.js", "../node_modules/core-js/internals/check-correctness-of-iteration.js", "../node_modules/core-js/internals/inherit-if-required.js", "../node_modules/core-js/internals/collection.js", "../node_modules/core-js/internals/collection-weak.js", "../node_modules/core-js/modules/es.weak-map.js", "../node_modules/lodash.throttle/index.js", "../node_modules/lodash.debounce/index.js", "../node_modules/lodash.memoize/index.js", "../node_modules/core-js/internals/array-reduce.js", "../node_modules/core-js/internals/engine-is-node.js", "../node_modules/core-js/internals/regexp-flags.js", "../node_modules/core-js/internals/regexp-sticky-helpers.js", "../node_modules/core-js/internals/regexp-unsupported-dot-all.js", "../node_modules/core-js/internals/regexp-unsupported-ncg.js", "../node_modules/core-js/internals/regexp-exec.js", "../node_modules/core-js/modules/es.regexp.exec.js", "../node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js", "../node_modules/core-js/internals/advance-string-index.js", "../node_modules/core-js/internals/regexp-exec-abstract.js", "../node_modules/core-js/internals/get-substitution.js", "../node_modules/cookie/index.js", "../node_modules/ev-emitter/ev-emitter.js", "../node_modules/get-size/get-size.js", "../node_modules/desandro-matches-selector/matches-selector.js", "../node_modules/fizzy-ui-utils/utils.js", "../node_modules/outlayer/item.js", "../node_modules/outlayer/outlayer.js", "../node_modules/masonry-layout/masonry.js", "../node_modules/just-debounce-it/index.js", "../node_modules/strict-uri-encode/index.js", "../node_modules/decode-uri-component/index.js", "../node_modules/split-on-first/index.js", "../node_modules/filter-obj/index.js", "../node_modules/query-string/index.js", "../node_modules/clipboard/dist/clipboard.js", "../node_modules/flatpickr/dist/flatpickr.js", "../node_modules/@popperjs/core/lib/index.js", "../node_modules/@popperjs/core/lib/enums.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../node_modules/@popperjs/core/lib/dom-utils/contains.js", "../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../node_modules/@popperjs/core/lib/utils/math.js", "../node_modules/@popperjs/core/lib/utils/within.js", "../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../node_modules/@popperjs/core/lib/modifiers/arrow.js", "../node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../node_modules/@popperjs/core/lib/utils/getVariation.js", "../node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../node_modules/@popperjs/core/lib/modifiers/flip.js", "../node_modules/@popperjs/core/lib/modifiers/hide.js", "../node_modules/@popperjs/core/lib/modifiers/offset.js", "../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../node_modules/@popperjs/core/lib/utils/debounce.js", "../node_modules/@popperjs/core/lib/utils/mergeByName.js", "../node_modules/@popperjs/core/lib/createPopper.js", "../node_modules/@popperjs/core/lib/popper-lite.js", "../node_modules/@popperjs/core/lib/popper.js", "../node_modules/bootstrap/js/src/dom/selector-engine.js", "../node_modules/bootstrap/js/src/util/index.js", "../node_modules/bootstrap/js/src/dom/event-handler.js", "../node_modules/bootstrap/js/src/dom/data.js", "../node_modules/bootstrap/js/src/base-component.js", "../node_modules/bootstrap/js/src/alert.js", "../node_modules/bootstrap/js/src/button.js", "../node_modules/bootstrap/js/src/dom/manipulator.js", "../node_modules/bootstrap/js/src/carousel.js", "../node_modules/bootstrap/js/src/collapse.js", "../node_modules/bootstrap/js/src/dropdown.js", "../node_modules/bootstrap/js/src/util/scrollbar.js", "../node_modules/bootstrap/js/src/util/backdrop.js", "../node_modules/bootstrap/js/src/modal.js", "../node_modules/bootstrap/js/src/offcanvas.js", "../node_modules/bootstrap/js/src/util/sanitizer.js", "../node_modules/bootstrap/js/src/tooltip.js", "../node_modules/bootstrap/js/src/popover.js", "../node_modules/bootstrap/js/src/scrollspy.js", "../node_modules/bootstrap/js/src/tab.js", "../node_modules/bootstrap/js/src/toast.js", "../src/index.ts", "../node_modules/core-js/modules/es.array.for-each.js", "../node_modules/core-js/modules/web.dom-collections.for-each.js", "../node_modules/core-js/modules/es.array.filter.js", "../node_modules/core-js/modules/es.object.assign.js", "../node_modules/core-js/modules/es.object.to-string.js", "../node_modules/core-js/modules/es.parse-int.js", "../node_modules/core-js/modules/es.string.iterator.js", "../node_modules/core-js/modules/web.dom-collections.iterator.js", "../node_modules/@juggle/resize-observer/lib/utils/resizeObservers.js", "../node_modules/@juggle/resize-observer/lib/algorithms/hasActiveObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/hasSkippedObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/deliverResizeLoopError.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.js", "../node_modules/@juggle/resize-observer/lib/utils/freeze.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverSize.js", "../node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.js", "../node_modules/@juggle/resize-observer/lib/utils/element.js", "../node_modules/@juggle/resize-observer/lib/utils/global.js", "../node_modules/@juggle/resize-observer/lib/algorithms/calculateBoxSize.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.js", "../node_modules/@juggle/resize-observer/lib/algorithms/calculateDepthForNode.js", "../node_modules/@juggle/resize-observer/lib/algorithms/broadcastActiveObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/gatherActiveObservationsAtDepth.js", "../node_modules/@juggle/resize-observer/lib/utils/process.js", "../node_modules/@juggle/resize-observer/lib/utils/queueMicroTask.js", "../node_modules/@juggle/resize-observer/lib/utils/queueResizeObserver.js", "../node_modules/@juggle/resize-observer/lib/utils/scheduler.js", "../node_modules/@juggle/resize-observer/lib/ResizeObservation.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverDetail.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverController.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserver.js", "../node_modules/core-js/modules/es.array.reduce.js", "../node_modules/core-js/modules/es.function.name.js", "../node_modules/core-js/modules/es.string.match.js", "../node_modules/core-js/modules/es.string.replace.js", "../node_modules/simplebar/src/helpers.js", "../node_modules/simplebar/src/scrollbar-width.js", "../node_modules/simplebar/src/simplebar.js", "../node_modules/simplebar/src/index.js", "../src/util.ts", "../src/forms/elements.ts", "../src/forms/speedSelector.ts", "../src/forms/scopeSelector.ts", "../src/forms/vlanTags.ts", "../src/forms/index.ts", "../src/bs.ts", "../src/search.ts", "../node_modules/color2k/src/guard.ts", "../node_modules/color2k/src/ColorError.ts", "../node_modules/color2k/src/parseToRgba.ts", "../node_modules/color2k/src/parseToHsla.ts", "../node_modules/color2k/src/hsla.ts", "../node_modules/color2k/src/adjustHue.ts", "../node_modules/color2k/src/darken.ts", "../node_modules/color2k/src/desaturate.ts", "../node_modules/color2k/src/getLuminance.ts", "../node_modules/color2k/src/getContrast.ts", "../node_modules/color2k/src/rgba.ts", "../node_modules/color2k/src/mix.ts", "../node_modules/color2k/src/getScale.ts", "../node_modules/color2k/src/hasBadContrast.ts", "../node_modules/color2k/src/lighten.ts", "../node_modules/color2k/src/transparentize.ts", "../node_modules/color2k/src/opacify.ts", "../node_modules/color2k/src/readableColorIsBlack.ts", "../node_modules/color2k/src/readableColor.ts", "../node_modules/color2k/src/saturate.ts", "../node_modules/color2k/src/toHex.ts", "../node_modules/color2k/src/toRgba.ts", "../node_modules/color2k/src/toHsla.ts", "../src/select/api/apiSelect.ts", "../node_modules/slim-select/dist/slimselect.min.mjs", "../src/select/util.ts", "../src/select/api/types.ts", "../src/select/api/dynamicParams.ts", "../src/select/api/index.ts", "../src/select/color.ts", "../src/select/static.ts", "../src/select/index.ts", "../src/buttons/connectionToggle.ts", "../src/state/index.ts", "../src/stores/objectDepth.ts", "../src/stores/rackImages.ts", "../src/buttons/depthToggle.ts", "../src/buttons/moveOptions.ts", "../src/colorMode.ts", "../src/buttons/preferences.ts", "../src/buttons/reslug.ts", "../src/buttons/selectAll.ts", "../src/buttons/index.ts", "../src/messages.ts", "../src/clipboard.ts", "../src/dateSelector.ts", "../src/tableConfig.ts", "../src/tables/interfaceTable.ts", "../src/sidenav.ts", "../src/racks.ts", "../src/links.ts", "../src/netbox.ts"], - "mappings": "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", + "sources": ["../node_modules/htmx.org/dist/htmx.min.js", "../node_modules/core-js/internals/global.js", "../node_modules/core-js/internals/fails.js", "../node_modules/core-js/internals/descriptors.js", "../node_modules/core-js/internals/object-property-is-enumerable.js", "../node_modules/core-js/internals/create-property-descriptor.js", "../node_modules/core-js/internals/classof-raw.js", "../node_modules/core-js/internals/indexed-object.js", "../node_modules/core-js/internals/require-object-coercible.js", "../node_modules/core-js/internals/to-indexed-object.js", "../node_modules/core-js/internals/is-object.js", "../node_modules/core-js/internals/get-built-in.js", "../node_modules/core-js/internals/engine-user-agent.js", "../node_modules/core-js/internals/engine-v8-version.js", "../node_modules/core-js/internals/native-symbol.js", "../node_modules/core-js/internals/use-symbol-as-uid.js", "../node_modules/core-js/internals/is-symbol.js", "../node_modules/core-js/internals/ordinary-to-primitive.js", "../node_modules/core-js/internals/is-pure.js", "../node_modules/core-js/internals/set-global.js", "../node_modules/core-js/internals/shared-store.js", "../node_modules/core-js/internals/shared.js", "../node_modules/core-js/internals/to-object.js", "../node_modules/core-js/internals/has.js", "../node_modules/core-js/internals/uid.js", "../node_modules/core-js/internals/well-known-symbol.js", "../node_modules/core-js/internals/to-primitive.js", "../node_modules/core-js/internals/to-property-key.js", "../node_modules/core-js/internals/document-create-element.js", "../node_modules/core-js/internals/ie8-dom-define.js", "../node_modules/core-js/internals/object-get-own-property-descriptor.js", "../node_modules/core-js/internals/an-object.js", "../node_modules/core-js/internals/object-define-property.js", "../node_modules/core-js/internals/create-non-enumerable-property.js", "../node_modules/core-js/internals/inspect-source.js", "../node_modules/core-js/internals/native-weak-map.js", "../node_modules/core-js/internals/shared-key.js", "../node_modules/core-js/internals/hidden-keys.js", "../node_modules/core-js/internals/internal-state.js", "../node_modules/core-js/internals/redefine.js", "../node_modules/core-js/internals/to-integer.js", "../node_modules/core-js/internals/to-length.js", "../node_modules/core-js/internals/to-absolute-index.js", "../node_modules/core-js/internals/array-includes.js", "../node_modules/core-js/internals/object-keys-internal.js", "../node_modules/core-js/internals/enum-bug-keys.js", "../node_modules/core-js/internals/object-get-own-property-names.js", "../node_modules/core-js/internals/object-get-own-property-symbols.js", "../node_modules/core-js/internals/own-keys.js", "../node_modules/core-js/internals/copy-constructor-properties.js", "../node_modules/core-js/internals/is-forced.js", "../node_modules/core-js/internals/export.js", "../node_modules/core-js/internals/a-function.js", "../node_modules/core-js/internals/function-bind-context.js", "../node_modules/core-js/internals/is-array.js", "../node_modules/core-js/internals/array-species-constructor.js", "../node_modules/core-js/internals/array-species-create.js", "../node_modules/core-js/internals/array-iteration.js", "../node_modules/core-js/internals/array-method-is-strict.js", "../node_modules/core-js/internals/array-for-each.js", "../node_modules/core-js/internals/dom-iterables.js", "../node_modules/can-use-dom/index.js", "../node_modules/core-js/internals/array-method-has-species-support.js", "../node_modules/core-js/internals/object-keys.js", "../node_modules/core-js/internals/object-define-properties.js", "../node_modules/core-js/internals/html.js", "../node_modules/core-js/internals/object-create.js", "../node_modules/core-js/internals/add-to-unscopables.js", "../node_modules/core-js/internals/iterators.js", "../node_modules/core-js/internals/correct-prototype-getter.js", "../node_modules/core-js/internals/object-get-prototype-of.js", "../node_modules/core-js/internals/iterators-core.js", "../node_modules/core-js/internals/set-to-string-tag.js", "../node_modules/core-js/internals/create-iterator-constructor.js", "../node_modules/core-js/internals/a-possible-prototype.js", "../node_modules/core-js/internals/object-set-prototype-of.js", "../node_modules/core-js/internals/define-iterator.js", "../node_modules/core-js/modules/es.array.iterator.js", "../node_modules/core-js/internals/object-assign.js", "../node_modules/core-js/internals/to-string-tag-support.js", "../node_modules/core-js/internals/classof.js", "../node_modules/core-js/internals/object-to-string.js", "../node_modules/core-js/internals/to-string.js", "../node_modules/core-js/internals/whitespaces.js", "../node_modules/core-js/internals/string-trim.js", "../node_modules/core-js/internals/number-parse-int.js", "../node_modules/core-js/internals/string-multibyte.js", "../node_modules/core-js/internals/redefine-all.js", "../node_modules/core-js/internals/object-get-own-property-names-external.js", "../node_modules/core-js/internals/freezing.js", "../node_modules/core-js/internals/internal-metadata.js", "../node_modules/core-js/internals/is-array-iterator-method.js", "../node_modules/core-js/internals/get-iterator-method.js", "../node_modules/core-js/internals/get-iterator.js", "../node_modules/core-js/internals/iterator-close.js", "../node_modules/core-js/internals/iterate.js", "../node_modules/core-js/internals/an-instance.js", "../node_modules/core-js/internals/check-correctness-of-iteration.js", "../node_modules/core-js/internals/inherit-if-required.js", "../node_modules/core-js/internals/collection.js", "../node_modules/core-js/internals/collection-weak.js", "../node_modules/core-js/modules/es.weak-map.js", "../node_modules/lodash.throttle/index.js", "../node_modules/lodash.debounce/index.js", "../node_modules/lodash.memoize/index.js", "../node_modules/core-js/internals/array-reduce.js", "../node_modules/core-js/internals/engine-is-node.js", "../node_modules/core-js/internals/regexp-flags.js", "../node_modules/core-js/internals/regexp-sticky-helpers.js", "../node_modules/core-js/internals/regexp-unsupported-dot-all.js", "../node_modules/core-js/internals/regexp-unsupported-ncg.js", "../node_modules/core-js/internals/regexp-exec.js", "../node_modules/core-js/modules/es.regexp.exec.js", "../node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js", "../node_modules/core-js/internals/advance-string-index.js", "../node_modules/core-js/internals/regexp-exec-abstract.js", "../node_modules/core-js/internals/get-substitution.js", "../node_modules/cookie/index.js", "../node_modules/ev-emitter/ev-emitter.js", "../node_modules/get-size/get-size.js", "../node_modules/desandro-matches-selector/matches-selector.js", "../node_modules/fizzy-ui-utils/utils.js", "../node_modules/outlayer/item.js", "../node_modules/outlayer/outlayer.js", "../node_modules/masonry-layout/masonry.js", "../node_modules/just-debounce-it/index.js", "../node_modules/strict-uri-encode/index.js", "../node_modules/decode-uri-component/index.js", "../node_modules/split-on-first/index.js", "../node_modules/filter-obj/index.js", "../node_modules/query-string/index.js", "../node_modules/clipboard/dist/clipboard.js", "../node_modules/flatpickr/dist/flatpickr.js", "../node_modules/@popperjs/core/lib/index.js", "../node_modules/@popperjs/core/lib/enums.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../node_modules/@popperjs/core/lib/dom-utils/contains.js", "../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../node_modules/@popperjs/core/lib/utils/math.js", "../node_modules/@popperjs/core/lib/utils/within.js", "../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../node_modules/@popperjs/core/lib/modifiers/arrow.js", "../node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../node_modules/@popperjs/core/lib/utils/getVariation.js", "../node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../node_modules/@popperjs/core/lib/modifiers/flip.js", "../node_modules/@popperjs/core/lib/modifiers/hide.js", "../node_modules/@popperjs/core/lib/modifiers/offset.js", "../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../node_modules/@popperjs/core/lib/utils/debounce.js", "../node_modules/@popperjs/core/lib/utils/mergeByName.js", "../node_modules/@popperjs/core/lib/createPopper.js", "../node_modules/@popperjs/core/lib/popper-lite.js", "../node_modules/@popperjs/core/lib/popper.js", "../node_modules/bootstrap/js/src/dom/selector-engine.js", "../node_modules/bootstrap/js/src/util/index.js", "../node_modules/bootstrap/js/src/dom/event-handler.js", "../node_modules/bootstrap/js/src/dom/data.js", "../node_modules/bootstrap/js/src/base-component.js", "../node_modules/bootstrap/js/src/alert.js", "../node_modules/bootstrap/js/src/button.js", "../node_modules/bootstrap/js/src/dom/manipulator.js", "../node_modules/bootstrap/js/src/carousel.js", "../node_modules/bootstrap/js/src/collapse.js", "../node_modules/bootstrap/js/src/dropdown.js", "../node_modules/bootstrap/js/src/util/scrollbar.js", "../node_modules/bootstrap/js/src/util/backdrop.js", "../node_modules/bootstrap/js/src/modal.js", "../node_modules/bootstrap/js/src/offcanvas.js", "../node_modules/bootstrap/js/src/util/sanitizer.js", "../node_modules/bootstrap/js/src/tooltip.js", "../node_modules/bootstrap/js/src/popover.js", "../node_modules/bootstrap/js/src/scrollspy.js", "../node_modules/bootstrap/js/src/tab.js", "../node_modules/bootstrap/js/src/toast.js", "../src/index.ts", "../node_modules/core-js/modules/es.array.for-each.js", "../node_modules/core-js/modules/web.dom-collections.for-each.js", "../node_modules/core-js/modules/es.array.filter.js", "../node_modules/core-js/modules/es.object.assign.js", "../node_modules/core-js/modules/es.object.to-string.js", "../node_modules/core-js/modules/es.parse-int.js", "../node_modules/core-js/modules/es.string.iterator.js", "../node_modules/core-js/modules/web.dom-collections.iterator.js", "../node_modules/@juggle/resize-observer/lib/utils/resizeObservers.js", "../node_modules/@juggle/resize-observer/lib/algorithms/hasActiveObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/hasSkippedObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/deliverResizeLoopError.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.js", "../node_modules/@juggle/resize-observer/lib/utils/freeze.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverSize.js", "../node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.js", "../node_modules/@juggle/resize-observer/lib/utils/element.js", "../node_modules/@juggle/resize-observer/lib/utils/global.js", "../node_modules/@juggle/resize-observer/lib/algorithms/calculateBoxSize.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.js", "../node_modules/@juggle/resize-observer/lib/algorithms/calculateDepthForNode.js", "../node_modules/@juggle/resize-observer/lib/algorithms/broadcastActiveObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/gatherActiveObservationsAtDepth.js", "../node_modules/@juggle/resize-observer/lib/utils/process.js", "../node_modules/@juggle/resize-observer/lib/utils/queueMicroTask.js", "../node_modules/@juggle/resize-observer/lib/utils/queueResizeObserver.js", "../node_modules/@juggle/resize-observer/lib/utils/scheduler.js", "../node_modules/@juggle/resize-observer/lib/ResizeObservation.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverDetail.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverController.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserver.js", "../node_modules/core-js/modules/es.array.reduce.js", "../node_modules/core-js/modules/es.function.name.js", "../node_modules/core-js/modules/es.string.match.js", "../node_modules/core-js/modules/es.string.replace.js", "../node_modules/simplebar/src/helpers.js", "../node_modules/simplebar/src/scrollbar-width.js", "../node_modules/simplebar/src/simplebar.js", "../node_modules/simplebar/src/index.js", "../src/util.ts", "../src/forms/elements.ts", "../src/forms/speedSelector.ts", "../src/forms/scopeSelector.ts", "../src/forms/vlanTags.ts", "../src/forms/index.ts", "../src/bs.ts", "../src/search.ts", "../node_modules/color2k/src/guard.ts", "../node_modules/color2k/src/ColorError.ts", "../node_modules/color2k/src/parseToRgba.ts", "../node_modules/color2k/src/parseToHsla.ts", "../node_modules/color2k/src/hsla.ts", "../node_modules/color2k/src/adjustHue.ts", "../node_modules/color2k/src/darken.ts", "../node_modules/color2k/src/desaturate.ts", "../node_modules/color2k/src/getLuminance.ts", "../node_modules/color2k/src/getContrast.ts", "../node_modules/color2k/src/rgba.ts", "../node_modules/color2k/src/mix.ts", "../node_modules/color2k/src/getScale.ts", "../node_modules/color2k/src/hasBadContrast.ts", "../node_modules/color2k/src/lighten.ts", "../node_modules/color2k/src/transparentize.ts", "../node_modules/color2k/src/opacify.ts", "../node_modules/color2k/src/readableColorIsBlack.ts", "../node_modules/color2k/src/readableColor.ts", "../node_modules/color2k/src/saturate.ts", "../node_modules/color2k/src/toHex.ts", "../node_modules/color2k/src/toRgba.ts", "../node_modules/color2k/src/toHsla.ts", "../src/select/api/apiSelect.ts", "../node_modules/slim-select/dist/slimselect.min.mjs", "../src/select/util.ts", "../src/select/api/types.ts", "../src/select/api/dynamicParams.ts", "../src/select/api/index.ts", "../src/select/color.ts", "../src/select/static.ts", "../src/select/index.ts", "../src/buttons/connectionToggle.ts", "../src/state/index.ts", "../src/stores/objectDepth.ts", "../src/stores/rackImages.ts", "../src/buttons/depthToggle.ts", "../src/buttons/moveOptions.ts", "../src/buttons/reslug.ts", "../src/buttons/selectAll.ts", "../src/buttons/index.ts", "../src/colorMode.ts", "../src/messages.ts", "../src/clipboard.ts", "../src/dateSelector.ts", "../src/tableConfig.ts", "../src/tables/interfaceTable.ts", "../src/sidenav.ts", "../src/racks.ts", "../src/links.ts", "../src/netbox.ts"], + "mappings": "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", "names": [] } diff --git a/netbox/project-static/src/buttons/index.ts b/netbox/project-static/src/buttons/index.ts index 251e0feaf42..6a9001cd1c1 100644 --- a/netbox/project-static/src/buttons/index.ts +++ b/netbox/project-static/src/buttons/index.ts @@ -1,7 +1,6 @@ import { initConnectionToggle } from './connectionToggle'; import { initDepthToggle } from './depthToggle'; import { initMoveButtons } from './moveOptions'; -import { initPreferenceUpdate } from './preferences'; import { initReslug } from './reslug'; import { initSelectAll } from './selectAll'; @@ -11,7 +10,6 @@ export function initButtons(): void { initConnectionToggle, initReslug, initSelectAll, - initPreferenceUpdate, initMoveButtons, ]) { func(); diff --git a/netbox/project-static/src/buttons/preferences.ts b/netbox/project-static/src/buttons/preferences.ts deleted file mode 100644 index 6e8b21c02b5..00000000000 --- a/netbox/project-static/src/buttons/preferences.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { setColorMode } from '../colorMode'; -import { getElement } from '../util'; - -/** - * Perform actions in the UI based on the value of user profile updates. - * - * @param event Form Submit - */ -function handlePreferenceSave(event: Event): void { - // Create a FormData instance to access the form values. - const form = event.currentTarget as HTMLFormElement; - const formData = new FormData(form); - - // Update the UI color mode immediately when the user preference changes. - if (formData.get('ui.colormode') === 'dark') { - setColorMode('dark'); - } else if (formData.get('ui.colormode') === 'light') { - setColorMode('light'); - } -} - -/** - * Initialize handlers for user profile updates. - */ -export function initPreferenceUpdate(): void { - const form = getElement('preferences-update'); - if (form !== null) { - form.addEventListener('submit', handlePreferenceSave); - } -} diff --git a/netbox/templates/users/preferences.html b/netbox/templates/users/preferences.html index bbb92bde01d..254b5b8ffaf 100644 --- a/netbox/templates/users/preferences.html +++ b/netbox/templates/users/preferences.html @@ -1,57 +1,27 @@ {% extends 'users/base.html' %} {% load helpers %} +{% load form_helpers %} {% block title %}User Preferences{% endblock %} {% block content %}
    {% csrf_token %} -
    -
    Color Mode
    -

    Set preferred UI color mode

    - {% with color_mode=preferences|get_key:'ui.colormode'%} -
    - - + + {% for group, fields in form.Meta.fieldsets %} +
    +
    +
    {{ group }}
    +
    + {% for name in fields %} + {% render_field form|getfield:name %} + {% endfor %}
    -
    - - -
    - {% endwith %} + {% endfor %} + +
    + Cancel +
    -
    -
    - -
    -
    - {% if preferences %} -
    -
    Other Preferences
    - - - - - - - - - - {% for key, value in preferences.items %} - - - - - - {% endfor %} - -
    PreferenceValue
    {{ key }}{{ value }}
    - -
    - {% else %} -

    No preferences found

    - {% endif %} {% endblock %} diff --git a/netbox/users/forms.py b/netbox/users/forms.py index 8bd54cb66dc..7007ef958c8 100644 --- a/netbox/users/forms.py +++ b/netbox/users/forms.py @@ -2,7 +2,9 @@ from django import forms from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as DjangoPasswordChangeForm from utilities.forms import BootstrapMixin, DateTimePicker -from .models import Token +from utilities.paginator import EnhancedPaginator +from utilities.utils import flatten_dict +from .models import Token, UserConfig class LoginForm(BootstrapMixin, AuthenticationForm): @@ -13,6 +15,68 @@ class PasswordChangeForm(BootstrapMixin, DjangoPasswordChangeForm): pass +def get_page_lengths(): + return [ + (v, str(v)) for v in EnhancedPaginator.default_page_lengths + ] + + +class UserConfigForm(BootstrapMixin, forms.ModelForm): + pagination__per_page = forms.TypedChoiceField( + label='Page length', + coerce=lambda val: int(val), + choices=get_page_lengths, + required=False + ) + ui__colormode = forms.ChoiceField( + label='Color mode', + choices=( + ('light', 'Light'), + ('dark', 'Dark'), + ), + required=False + ) + extras__configcontext__format = forms.ChoiceField( + label='ConfigContext format', + choices=( + ('json', 'JSON'), + ('yaml', 'YAML'), + ), + required=False + ) + + class Meta: + model = UserConfig + fields = () + fieldsets = ( + ('User Interface', ( + 'pagination__per_page', + 'ui__colormode', + )), + ('Miscellaneous', ( + 'extras__configcontext__format', + )), + ) + + def __init__(self, *args, instance=None, **kwargs): + + # Get initial data from UserConfig instance + initial_data = flatten_dict(instance.data, separator='__') + kwargs['initial'] = initial_data + + super().__init__(*args, instance=instance, **kwargs) + + def save(self, *args, **kwargs): + + # Set UserConfig data + for field_name, value in self.cleaned_data.items(): + pref_name = field_name.replace('__', '.') + print(f'{pref_name}: {value}') + self.instance.set(pref_name, value, commit=False) + + return super().save(*args, **kwargs) + + class TokenForm(BootstrapMixin, forms.ModelForm): key = forms.CharField( required=False, diff --git a/netbox/users/views.py b/netbox/users/views.py index ecf3295b5a8..cd3c34aa9b5 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -19,7 +19,7 @@ from extras.models import ObjectChange from extras.tables import ObjectChangeTable from netbox.config import get_config from utilities.forms import ConfirmationForm -from .forms import LoginForm, PasswordChangeForm, TokenForm +from .forms import LoginForm, PasswordChangeForm, TokenForm, UserConfigForm from .models import Token @@ -137,32 +137,28 @@ class UserConfigView(LoginRequiredMixin, View): template_name = 'users/preferences.html' def get(self, request): + userconfig = request.user.config + form = UserConfigForm(instance=userconfig) return render(request, self.template_name, { - 'preferences': request.user.config.all(), + 'form': form, 'active_tab': 'preferences', }) def post(self, request): userconfig = request.user.config - data = userconfig.all() + form = UserConfigForm(request.POST, instance=userconfig) - # Delete selected preferences - if "_delete" in request.POST: - for key in request.POST.getlist('pk'): - if key in data: - userconfig.clear(key) - # Update specific values - elif "_update" in request.POST: - for key in request.POST: - if not key.startswith('_') and not key.startswith('csrf'): - for value in request.POST.getlist(key): - userconfig.set(key, value) + if form.is_valid(): + form.save() - userconfig.save() - messages.success(request, "Your preferences have been updated.") + messages.success(request, "Your preferences have been updated.") + return redirect('user:preferences') - return redirect('user:preferences') + return render(request, self.template_name, { + 'form': form, + 'active_tab': 'preferences', + }) class ChangePasswordView(LoginRequiredMixin, View): diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 3234135fbd7..3fc50ddc4ea 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -282,7 +282,7 @@ def flatten_dict(d, prefix='', separator='.'): for k, v in d.items(): key = separator.join([prefix, k]) if prefix else k if type(v) is dict: - ret.update(flatten_dict(v, prefix=key)) + ret.update(flatten_dict(v, prefix=key, separator=separator)) else: ret[key] = v return ret From 36d2422eefa25d2414b2141dca518e8111a55736 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 21 Dec 2021 17:05:06 -0500 Subject: [PATCH 027/271] Introduce UserPreference to define user preferences --- netbox/users/forms.py | 60 ++++++++++++++++--------------------- netbox/users/preferences.py | 46 ++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 35 deletions(-) create mode 100644 netbox/users/preferences.py diff --git a/netbox/users/forms.py b/netbox/users/forms.py index 7007ef958c8..c4e55c5bc9c 100644 --- a/netbox/users/forms.py +++ b/netbox/users/forms.py @@ -2,9 +2,9 @@ from django import forms from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as DjangoPasswordChangeForm from utilities.forms import BootstrapMixin, DateTimePicker -from utilities.paginator import EnhancedPaginator from utilities.utils import flatten_dict from .models import Token, UserConfig +from .preferences import PREFERENCES class LoginForm(BootstrapMixin, AuthenticationForm): @@ -15,53 +15,45 @@ class PasswordChangeForm(BootstrapMixin, DjangoPasswordChangeForm): pass -def get_page_lengths(): - return [ - (v, str(v)) for v in EnhancedPaginator.default_page_lengths - ] +class UserConfigFormMetaclass(forms.models.ModelFormMetaclass): + + def __new__(mcs, name, bases, attrs): + + # Emulate a declared field for each supported user preference + preference_fields = {} + for field_name, preference in PREFERENCES.items(): + field_kwargs = { + 'label': preference.label, + 'choices': preference.choices, + 'help_text': preference.description, + 'coerce': preference.coerce, + 'required': False, + } + preference_fields[field_name] = forms.TypedChoiceField(**field_kwargs) + attrs.update(preference_fields) + + return super().__new__(mcs, name, bases, attrs) -class UserConfigForm(BootstrapMixin, forms.ModelForm): - pagination__per_page = forms.TypedChoiceField( - label='Page length', - coerce=lambda val: int(val), - choices=get_page_lengths, - required=False - ) - ui__colormode = forms.ChoiceField( - label='Color mode', - choices=( - ('light', 'Light'), - ('dark', 'Dark'), - ), - required=False - ) - extras__configcontext__format = forms.ChoiceField( - label='ConfigContext format', - choices=( - ('json', 'JSON'), - ('yaml', 'YAML'), - ), - required=False - ) +class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass): class Meta: model = UserConfig fields = () fieldsets = ( ('User Interface', ( - 'pagination__per_page', - 'ui__colormode', + 'pagination.per_page', + 'ui.colormode', )), ('Miscellaneous', ( - 'extras__configcontext__format', + 'data_format', )), ) def __init__(self, *args, instance=None, **kwargs): # Get initial data from UserConfig instance - initial_data = flatten_dict(instance.data, separator='__') + initial_data = flatten_dict(instance.data) kwargs['initial'] = initial_data super().__init__(*args, instance=instance, **kwargs) @@ -69,9 +61,7 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm): def save(self, *args, **kwargs): # Set UserConfig data - for field_name, value in self.cleaned_data.items(): - pref_name = field_name.replace('__', '.') - print(f'{pref_name}: {value}') + for pref_name, value in self.cleaned_data.items(): self.instance.set(pref_name, value, commit=False) return super().save(*args, **kwargs) diff --git a/netbox/users/preferences.py b/netbox/users/preferences.py new file mode 100644 index 00000000000..18c3dbac0a3 --- /dev/null +++ b/netbox/users/preferences.py @@ -0,0 +1,46 @@ +from utilities.paginator import EnhancedPaginator + + +def get_page_lengths(): + return [ + (v, str(v)) for v in EnhancedPaginator.default_page_lengths + ] + + +class UserPreference: + + def __init__(self, label, choices, default=None, description='', coerce=lambda x: x): + self.label = label + self.choices = choices + self.default = default if default is not None else choices[0] + self.description = description + self.coerce = coerce + + +PREFERENCES = { + + # User interface + 'ui.colormode': UserPreference( + label='Color mode', + choices=( + ('light', 'Light'), + ('dark', 'Dark'), + ), + default='light', + ), + 'pagination.per_page': UserPreference( + label='Page length', + choices=get_page_lengths(), + coerce=lambda x: int(x) + ), + + # Miscellaneous + 'data_format': UserPreference( + label='Data format', + choices=( + ('json', 'JSON'), + ('yaml', 'YAML'), + ), + ), + +} From 2c01e178c7ea43fc04e0b811ffd540325670a681 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 21 Dec 2021 19:59:33 -0500 Subject: [PATCH 028/271] Update config context display to reference data_format preference --- docs/development/user-preferences.md | 11 ++++++----- netbox/extras/views.py | 8 ++++---- netbox/users/forms.py | 3 ++- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/development/user-preferences.md b/docs/development/user-preferences.md index 0595bc35821..a707eb6ad29 100644 --- a/docs/development/user-preferences.md +++ b/docs/development/user-preferences.md @@ -4,8 +4,9 @@ The `users.UserConfig` model holds individual preferences for each user in the f ## Available Preferences -| Name | Description | -| ---- | ----------- | -| extras.configcontext.format | Preferred format when rendering config context data (JSON or YAML) | -| pagination.per_page | The number of items to display per page of a paginated table | -| tables.TABLE_NAME.columns | The ordered list of columns to display when viewing the table | +| Name | Description | +|-------------------------|-------------| +| data_format | Preferred format when rendering raw data (JSON or YAML) | +| pagination.per_page | The number of items to display per page of a paginated table | +| tables.${table}.columns | The ordered list of columns to display when viewing the table | +| ui.colormode | Light or dark mode in the user interface | diff --git a/netbox/extras/views.py b/netbox/extras/views.py index a2bc92f88e0..256709c6a24 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -296,9 +296,9 @@ class ConfigContextView(generic.ObjectView): if request.GET.get('format') in ['json', 'yaml']: format = request.GET.get('format') if request.user.is_authenticated: - request.user.config.set('extras.configcontext.format', format, commit=True) + request.user.config.set('data_format', format, commit=True) elif request.user.is_authenticated: - format = request.user.config.get('extras.configcontext.format', 'json') + format = request.user.config.get('data_format', 'json') else: format = 'json' @@ -341,9 +341,9 @@ class ObjectConfigContextView(generic.ObjectView): if request.GET.get('format') in ['json', 'yaml']: format = request.GET.get('format') if request.user.is_authenticated: - request.user.config.set('extras.configcontext.format', format, commit=True) + request.user.config.set('data_format', format, commit=True) elif request.user.is_authenticated: - format = request.user.config.get('extras.configcontext.format', 'json') + format = request.user.config.get('data_format', 'json') else: format = 'json' diff --git a/netbox/users/forms.py b/netbox/users/forms.py index c4e55c5bc9c..5a4b1c2ffe8 100644 --- a/netbox/users/forms.py +++ b/netbox/users/forms.py @@ -1,7 +1,7 @@ from django import forms from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as DjangoPasswordChangeForm -from utilities.forms import BootstrapMixin, DateTimePicker +from utilities.forms import BootstrapMixin, DateTimePicker, StaticSelect from utilities.utils import flatten_dict from .models import Token, UserConfig from .preferences import PREFERENCES @@ -28,6 +28,7 @@ class UserConfigFormMetaclass(forms.models.ModelFormMetaclass): 'help_text': preference.description, 'coerce': preference.coerce, 'required': False, + 'widget': StaticSelect, } preference_fields[field_name] = forms.TypedChoiceField(**field_kwargs) attrs.update(preference_fields) From 1eeac7f4f45f63bad3b371b8a72d8575aea2693d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 21 Dec 2021 20:30:59 -0500 Subject: [PATCH 029/271] Introduce DEFAULT_USER_PREFERENCES dynamic config setting --- docs/configuration/dynamic-settings.md | 16 ++++++++++++++++ netbox/extras/admin.py | 3 +++ netbox/netbox/config/parameters.py | 9 +++++++++ netbox/users/forms.py | 5 ++++- netbox/users/models.py | 4 +++- netbox/users/preferences.py | 1 + 6 files changed, 36 insertions(+), 2 deletions(-) diff --git a/docs/configuration/dynamic-settings.md b/docs/configuration/dynamic-settings.md index a222272c298..5649eb9bed8 100644 --- a/docs/configuration/dynamic-settings.md +++ b/docs/configuration/dynamic-settings.md @@ -66,6 +66,22 @@ CUSTOM_VALIDATORS = { --- +## DEFAULT_USER_PREFERENCES + +This is a dictionary defining the default preferences to be set for newly-created user accounts. For example, to set the default page size for all users to 100, define the following: + +```python +DEFAULT_USER_PREFERENCES = { + "pagination": { + "per_page": 100 + } +} +``` + +For a complete list of available preferences, log into NetBox and navigate to `/user/preferences/`. A period in a preference name indicates a level of nesting in the JSON data. The example above maps to `pagination.per_page`. + +--- + ## ENFORCE_GLOBAL_UNIQUE Default: False diff --git a/netbox/extras/admin.py b/netbox/extras/admin.py index b6ee01db9a6..2c98d2a8175 100644 --- a/netbox/extras/admin.py +++ b/netbox/extras/admin.py @@ -33,6 +33,9 @@ class ConfigRevisionAdmin(admin.ModelAdmin): ('NAPALM', { 'fields': ('NAPALM_USERNAME', 'NAPALM_PASSWORD', 'NAPALM_TIMEOUT', 'NAPALM_ARGS'), }), + ('User Preferences', { + 'fields': ('DEFAULT_USER_PREFERENCES',), + }), ('Miscellaneous', { 'fields': ('MAINTENANCE_MODE', 'GRAPHQL_ENABLED', 'CHANGELOG_RETENTION', 'MAPS_URL'), }), diff --git a/netbox/netbox/config/parameters.py b/netbox/netbox/config/parameters.py index b4f16bf2828..d3ebc7bffa8 100644 --- a/netbox/netbox/config/parameters.py +++ b/netbox/netbox/config/parameters.py @@ -131,6 +131,15 @@ PARAMS = ( field=forms.JSONField ), + # User preferences + ConfigParam( + name='DEFAULT_USER_PREFERENCES', + label='Default preferences', + default={}, + description="Default preferences for new users", + field=forms.JSONField + ), + # Miscellaneous ConfigParam( name='MAINTENANCE_MODE', diff --git a/netbox/users/forms.py b/netbox/users/forms.py index 5a4b1c2ffe8..721c68e43db 100644 --- a/netbox/users/forms.py +++ b/netbox/users/forms.py @@ -1,5 +1,6 @@ from django import forms from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as DjangoPasswordChangeForm +from django.utils.html import mark_safe from utilities.forms import BootstrapMixin, DateTimePicker, StaticSelect from utilities.utils import flatten_dict @@ -22,10 +23,12 @@ class UserConfigFormMetaclass(forms.models.ModelFormMetaclass): # Emulate a declared field for each supported user preference preference_fields = {} for field_name, preference in PREFERENCES.items(): + description = f'{preference.description}
    ' if preference.description else '' + help_text = f'{description}{field_name}' field_kwargs = { 'label': preference.label, 'choices': preference.choices, - 'help_text': preference.description, + 'help_text': mark_safe(help_text), 'coerce': preference.coerce, 'required': False, 'widget': StaticSelect, diff --git a/netbox/users/models.py b/netbox/users/models.py index 64b6432a735..7b768b57f64 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -10,6 +10,7 @@ from django.db.models.signals import post_save from django.dispatch import receiver from django.utils import timezone +from netbox.config import get_config from netbox.models import BigIDModel from utilities.querysets import RestrictedQuerySet from utilities.utils import flatten_dict @@ -166,7 +167,8 @@ def create_userconfig(instance, created, **kwargs): Automatically create a new UserConfig when a new User is created. """ if created: - UserConfig(user=instance).save() + config = get_config() + UserConfig(user=instance, data=config.DEFAULT_USER_PREFERENCES).save() # diff --git a/netbox/users/preferences.py b/netbox/users/preferences.py index 18c3dbac0a3..63539391323 100644 --- a/netbox/users/preferences.py +++ b/netbox/users/preferences.py @@ -31,6 +31,7 @@ PREFERENCES = { 'pagination.per_page': UserPreference( label='Page length', choices=get_page_lengths(), + description='The number of objects to display per page', coerce=lambda x: int(x) ), From 1aafcf241fe537025f8a5860d468320c1d2202d5 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 22 Dec 2021 09:10:50 -0500 Subject: [PATCH 030/271] Enable plugins to define user preferences --- docs/plugins/development.md | 33 +++++++------ netbox/extras/plugins/__init__.py | 19 +++++++ .../extras/tests/dummy_plugin/preferences.py | 20 ++++++++ netbox/extras/tests/test_plugins.py | 9 ++++ netbox/netbox/preferences.py | 49 +++++++++++++++++++ netbox/templates/users/preferences.html | 4 ++ netbox/users/forms.py | 11 +---- netbox/users/preferences.py | 39 --------------- 8 files changed, 119 insertions(+), 65 deletions(-) create mode 100644 netbox/extras/tests/dummy_plugin/preferences.py create mode 100644 netbox/netbox/preferences.py diff --git a/docs/plugins/development.md b/docs/plugins/development.md index 89436a321ff..d20f73cb67b 100644 --- a/docs/plugins/development.md +++ b/docs/plugins/development.md @@ -99,22 +99,23 @@ NetBox looks for the `config` variable within a plugin's `__init__.py` to load i #### PluginConfig Attributes -| Name | Description | -| ---- | ----------- | -| `name` | Raw plugin name; same as the plugin's source directory | -| `verbose_name` | Human-friendly name for the plugin | -| `version` | Current release ([semantic versioning](https://semver.org/) is encouraged) | -| `description` | Brief description of the plugin's purpose | -| `author` | Name of plugin's author | -| `author_email` | Author's public email address | -| `base_url` | Base path to use for plugin URLs (optional). If not specified, the project's `name` will be used. | -| `required_settings` | A list of any configuration parameters that **must** be defined by the user | -| `default_settings` | A dictionary of configuration parameters and their default values | -| `min_version` | Minimum version of NetBox with which the plugin is compatible | -| `max_version` | Maximum version of NetBox with which the plugin is compatible | -| `middleware` | A list of middleware classes to append after NetBox's build-in middleware | -| `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) | -| `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) | +| Name | Description | +| ---- |---------------------------------------------------------------------------------------------------------------| +| `name` | Raw plugin name; same as the plugin's source directory | +| `verbose_name` | Human-friendly name for the plugin | +| `version` | Current release ([semantic versioning](https://semver.org/) is encouraged) | +| `description` | Brief description of the plugin's purpose | +| `author` | Name of plugin's author | +| `author_email` | Author's public email address | +| `base_url` | Base path to use for plugin URLs (optional). If not specified, the project's `name` will be used. | +| `required_settings` | A list of any configuration parameters that **must** be defined by the user | +| `default_settings` | A dictionary of configuration parameters and their default values | +| `min_version` | Minimum version of NetBox with which the plugin is compatible | +| `max_version` | Maximum version of NetBox with which the plugin is compatible | +| `middleware` | A list of middleware classes to append after NetBox's build-in middleware | +| `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) | +| `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) | +| `user_preferences` | The dotted path to the dictionary mapping of user preferences defined by the plugin (default: `preferences.preferences`) | All required settings must be configured by the user. If a configuration parameter is listed in both `required_settings` and `default_settings`, the default setting will be ignored. diff --git a/netbox/extras/plugins/__init__.py b/netbox/extras/plugins/__init__.py index f9a7856ea5b..5b02b5ab7e5 100644 --- a/netbox/extras/plugins/__init__.py +++ b/netbox/extras/plugins/__init__.py @@ -15,6 +15,7 @@ from extras.plugins.utils import import_object # Initialize plugin registry stores registry['plugin_template_extensions'] = collections.defaultdict(list) registry['plugin_menu_items'] = {} +registry['plugin_preferences'] = {} # @@ -54,6 +55,7 @@ class PluginConfig(AppConfig): # integrated components. template_extensions = 'template_content.template_extensions' menu_items = 'navigation.menu_items' + user_preferences = 'preferences.preferences' def ready(self): @@ -67,6 +69,12 @@ class PluginConfig(AppConfig): if menu_items is not None: register_menu_items(self.verbose_name, menu_items) + # Register user preferences + user_preferences = import_object(f"{self.__module__}.{self.user_preferences}") + if user_preferences is not None: + plugin_name = self.name.rsplit('.', 1)[1] + register_user_preferences(plugin_name, user_preferences) + @classmethod def validate(cls, user_config, netbox_version): @@ -242,3 +250,14 @@ def register_menu_items(section_name, class_list): raise TypeError(f"{button} must be an instance of extras.plugins.PluginMenuButton") registry['plugin_menu_items'][section_name] = class_list + + +# +# User preferences +# + +def register_user_preferences(plugin_name, preferences): + """ + Register a list of user preferences defined by a plugin. + """ + registry['plugin_preferences'][plugin_name] = preferences diff --git a/netbox/extras/tests/dummy_plugin/preferences.py b/netbox/extras/tests/dummy_plugin/preferences.py new file mode 100644 index 00000000000..f925ee6e04c --- /dev/null +++ b/netbox/extras/tests/dummy_plugin/preferences.py @@ -0,0 +1,20 @@ +from users.preferences import UserPreference + + +preferences = { + 'pref1': UserPreference( + label='First preference', + choices=( + ('foo', 'Foo'), + ('bar', 'Bar'), + ) + ), + 'pref2': UserPreference( + label='Second preference', + choices=( + ('a', 'A'), + ('b', 'B'), + ('c', 'C'), + ) + ), +} diff --git a/netbox/extras/tests/test_plugins.py b/netbox/extras/tests/test_plugins.py index 2508ffb836b..4bea9933e0a 100644 --- a/netbox/extras/tests/test_plugins.py +++ b/netbox/extras/tests/test_plugins.py @@ -74,6 +74,15 @@ class PluginTest(TestCase): self.assertIn(SiteContent, registry['plugin_template_extensions']['dcim.site']) + def test_user_preferences(self): + """ + Check that plugin UserPreferences are registered. + """ + self.assertIn('dummy_plugin', registry['plugin_preferences']) + user_preferences = registry['plugin_preferences']['dummy_plugin'] + self.assertEqual(type(user_preferences), dict) + self.assertEqual(list(user_preferences.keys()), ['pref1', 'pref2']) + def test_middleware(self): """ Check that plugin middleware is registered. diff --git a/netbox/netbox/preferences.py b/netbox/netbox/preferences.py new file mode 100644 index 00000000000..4cad8cf247b --- /dev/null +++ b/netbox/netbox/preferences.py @@ -0,0 +1,49 @@ +from extras.registry import registry +from users.preferences import UserPreference +from utilities.paginator import EnhancedPaginator + + +def get_page_lengths(): + return [ + (v, str(v)) for v in EnhancedPaginator.default_page_lengths + ] + + +PREFERENCES = { + + # User interface + 'ui.colormode': UserPreference( + label='Color mode', + choices=( + ('light', 'Light'), + ('dark', 'Dark'), + ), + default='light', + ), + 'pagination.per_page': UserPreference( + label='Page length', + choices=get_page_lengths(), + description='The number of objects to display per page', + coerce=lambda x: int(x) + ), + + # Miscellaneous + 'data_format': UserPreference( + label='Data format', + choices=( + ('json', 'JSON'), + ('yaml', 'YAML'), + ), + ), + +} + +# Register plugin preferences +if registry['plugin_preferences']: + plugin_preferences = {} + + for plugin_name, preferences in registry['plugin_preferences'].items(): + for name, userpreference in preferences.items(): + PREFERENCES[f'plugins.{plugin_name}.{name}'] = userpreference + + PREFERENCES.update(plugin_preferences) diff --git a/netbox/templates/users/preferences.html b/netbox/templates/users/preferences.html index 254b5b8ffaf..06a48b431ba 100644 --- a/netbox/templates/users/preferences.html +++ b/netbox/templates/users/preferences.html @@ -8,6 +8,7 @@
    {% csrf_token %} + {% comment %} {% for group, fields in form.Meta.fieldsets %}
    @@ -18,6 +19,9 @@ {% endfor %}
    {% endfor %} + {% endcomment %} + + {% render_form form %}
    Cancel diff --git a/netbox/users/forms.py b/netbox/users/forms.py index 721c68e43db..a6c606c4b0e 100644 --- a/netbox/users/forms.py +++ b/netbox/users/forms.py @@ -2,10 +2,10 @@ from django import forms from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as DjangoPasswordChangeForm from django.utils.html import mark_safe +from netbox.preferences import PREFERENCES from utilities.forms import BootstrapMixin, DateTimePicker, StaticSelect from utilities.utils import flatten_dict from .models import Token, UserConfig -from .preferences import PREFERENCES class LoginForm(BootstrapMixin, AuthenticationForm): @@ -44,15 +44,6 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMe class Meta: model = UserConfig fields = () - fieldsets = ( - ('User Interface', ( - 'pagination.per_page', - 'ui.colormode', - )), - ('Miscellaneous', ( - 'data_format', - )), - ) def __init__(self, *args, instance=None, **kwargs): diff --git a/netbox/users/preferences.py b/netbox/users/preferences.py index 63539391323..c66bc96c0e5 100644 --- a/netbox/users/preferences.py +++ b/netbox/users/preferences.py @@ -1,12 +1,3 @@ -from utilities.paginator import EnhancedPaginator - - -def get_page_lengths(): - return [ - (v, str(v)) for v in EnhancedPaginator.default_page_lengths - ] - - class UserPreference: def __init__(self, label, choices, default=None, description='', coerce=lambda x: x): @@ -15,33 +6,3 @@ class UserPreference: self.default = default if default is not None else choices[0] self.description = description self.coerce = coerce - - -PREFERENCES = { - - # User interface - 'ui.colormode': UserPreference( - label='Color mode', - choices=( - ('light', 'Light'), - ('dark', 'Dark'), - ), - default='light', - ), - 'pagination.per_page': UserPreference( - label='Page length', - choices=get_page_lengths(), - description='The number of objects to display per page', - coerce=lambda x: int(x) - ), - - # Miscellaneous - 'data_format': UserPreference( - label='Data format', - choices=( - ('json', 'JSON'), - ('yaml', 'YAML'), - ), - ), - -} From 7926225e9be8bfc64fd168ac63e92df19371de17 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 22 Dec 2021 09:35:29 -0500 Subject: [PATCH 031/271] Improve preferences form rendering --- netbox/templates/users/preferences.html | 17 +++++++++++++---- netbox/users/forms.py | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/netbox/templates/users/preferences.html b/netbox/templates/users/preferences.html index 06a48b431ba..2a34f1b3f3c 100644 --- a/netbox/templates/users/preferences.html +++ b/netbox/templates/users/preferences.html @@ -8,20 +8,29 @@ {% csrf_token %} - {% comment %} {% for group, fields in form.Meta.fieldsets %}
    {{ group }}
    {% for name in fields %} - {% render_field form|getfield:name %} + {% render_field form|getfield:name %} {% endfor %}
    {% endfor %} - {% endcomment %} - {% render_form form %} + {% with plugin_fields=form.plugin_fields %} + {% if plugin_fields %} +
    +
    +
    Plugins
    +
    + {% for name in plugin_fields %} + {% render_field form|getfield:name %} + {% endfor %} +
    + {% endif %} + {% endwith %}
    Cancel diff --git a/netbox/users/forms.py b/netbox/users/forms.py index a6c606c4b0e..70e300a8c42 100644 --- a/netbox/users/forms.py +++ b/netbox/users/forms.py @@ -44,6 +44,15 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMe class Meta: model = UserConfig fields = () + fieldsets = ( + ('User Interface', ( + 'pagination.per_page', + 'ui.colormode', + )), + ('Miscellaneous', ( + 'data_format', + )), + ) def __init__(self, *args, instance=None, **kwargs): @@ -61,6 +70,12 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMe return super().save(*args, **kwargs) + @property + def plugin_fields(self): + return [ + name for name in self.fields.keys() if name.startswith('plugins.') + ] + class TokenForm(BootstrapMixin, forms.ModelForm): key = forms.CharField( From 01997efcbe4c03617a8b4e2803786c546c921c2b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 22 Dec 2021 09:51:31 -0500 Subject: [PATCH 032/271] Add tests & cleanup --- netbox/users/preferences.py | 4 ++- netbox/users/tests/test_models.py | 2 -- netbox/users/tests/test_preferences.py | 39 ++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 netbox/users/tests/test_preferences.py diff --git a/netbox/users/preferences.py b/netbox/users/preferences.py index c66bc96c0e5..cff6a3c9b15 100644 --- a/netbox/users/preferences.py +++ b/netbox/users/preferences.py @@ -1,5 +1,7 @@ class UserPreference: - + """ + Represents a configurable user preference. + """ def __init__(self, label, choices, default=None, description='', coerce=lambda x: x): self.label = label self.choices = choices diff --git a/netbox/users/tests/test_models.py b/netbox/users/tests/test_models.py index 8047796c4b2..48d44027865 100644 --- a/netbox/users/tests/test_models.py +++ b/netbox/users/tests/test_models.py @@ -1,8 +1,6 @@ from django.contrib.auth.models import User from django.test import TestCase -from users.models import UserConfig - class UserConfigTest(TestCase): diff --git a/netbox/users/tests/test_preferences.py b/netbox/users/tests/test_preferences.py new file mode 100644 index 00000000000..23e94e8efe8 --- /dev/null +++ b/netbox/users/tests/test_preferences.py @@ -0,0 +1,39 @@ +from django.contrib.auth.models import User +from django.test import override_settings, TestCase + +from users.preferences import UserPreference + + +DEFAULT_USER_PREFERENCES = { + 'pagination': { + 'per_page': 250, + } +} + + +class UserPreferencesTest(TestCase): + + def test_userpreference(self): + CHOICES = ( + ('foo', 'Foo'), + ('bar', 'Bar'), + ) + kwargs = { + 'label': 'Test Preference', + 'choices': CHOICES, + 'default': CHOICES[0][0], + 'description': 'Description', + } + userpref = UserPreference(**kwargs) + + self.assertEqual(userpref.label, kwargs['label']) + self.assertEqual(userpref.choices, kwargs['choices']) + self.assertEqual(userpref.default, kwargs['default']) + self.assertEqual(userpref.description, kwargs['description']) + + @override_settings(DEFAULT_USER_PREFERENCES=DEFAULT_USER_PREFERENCES) + def test_default_preferences(self): + user = User.objects.create(username='User 1') + userconfig = user.config + + self.assertEqual(userconfig.data, DEFAULT_USER_PREFERENCES) From cb6342c87404264a5d46dac54c6cf2736321561e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 22 Dec 2021 10:13:08 -0500 Subject: [PATCH 033/271] Reference DEFAULT_USER_PREFERENCES for undefined preferences --- netbox/users/models.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/netbox/users/models.py b/netbox/users/models.py index 7b768b57f64..0afc7d374e0 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -80,13 +80,25 @@ class UserConfig(models.Model): keys = path.split('.') # Iterate down the hierarchy, returning the default value if any invalid key is encountered - for key in keys: - if type(d) is dict and key in d: + try: + for key in keys: d = d.get(key) - else: - return default + return d + except (AttributeError, KeyError): + pass - return d + # If the key is not found in the user's config, check for an application-wide default + config = get_config() + d = config.DEFAULT_USER_PREFERENCES + try: + for key in keys: + d = d.get(key) + return d + except (AttributeError, KeyError): + pass + + # Finally, return the specified default value (if any) + return default def all(self): """ From 7343ae73397089c6e8d45ec91d8f5df5bd65c754 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 22 Dec 2021 10:45:21 -0500 Subject: [PATCH 034/271] Fix invalid key retrieval --- netbox/users/models.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netbox/users/models.py b/netbox/users/models.py index 0afc7d374e0..0ce91363bb5 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -82,9 +82,9 @@ class UserConfig(models.Model): # Iterate down the hierarchy, returning the default value if any invalid key is encountered try: for key in keys: - d = d.get(key) + d = d[key] return d - except (AttributeError, KeyError): + except (TypeError, KeyError): pass # If the key is not found in the user's config, check for an application-wide default @@ -92,9 +92,9 @@ class UserConfig(models.Model): d = config.DEFAULT_USER_PREFERENCES try: for key in keys: - d = d.get(key) + d = d[key] return d - except (AttributeError, KeyError): + except (TypeError, KeyError): pass # Finally, return the specified default value (if any) From e0cfd5e49bda860353702affd435f62bf9322dd4 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 23 Dec 2021 10:14:28 -0500 Subject: [PATCH 035/271] Closes #2658: Avalable VLANs API endpoint for VLAN groups --- docs/release-notes/version-3.2.md | 4 ++ netbox/ipam/api/serializers.py | 34 ++++++++++++++ netbox/ipam/api/urls.py | 5 ++ netbox/ipam/api/views.py | 72 +++++++++++++++++++++++++++++ netbox/ipam/models/vlans.py | 10 ++++ netbox/ipam/tests/test_api.py | 76 +++++++++++++++++++++++++++++++ netbox/utilities/constants.py | 1 + 7 files changed, 202 insertions(+) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index ad8c4697a29..f03f1924f70 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -14,6 +14,10 @@ ### New Features +#### Automatic Provisioning of Next Available VLANs ([#2658](https://github.com/netbox-community/netbox/issues/2658)) + +A new REST API endpoint has been added at `/api/ipam/vlan-groups//available-vlans/`. A GET request to this endpoint will return a list of available VLANs within the group. A POST request can be made to this endpoint specifying the name(s) of one or more VLANs to create within the group, and their VLAN IDs will be assigned automatically. + #### Modules & Module Types ([#7844](https://github.com/netbox-community/netbox/issues/7844)) Several new models have been added to support field-replaceable device modules, such as those within a chassis-based switch or router. Similar to devices, each module is instantiated from a user-defined module type, and can have components associated with it. These components become available to the parent device once the module has been installed within a module bay. This makes it very convenient to replicate the addition and deletion of device components as modules are installed and removed. diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index aa1d2834a1b..14bad10b7b6 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -213,6 +213,40 @@ class VLANSerializer(PrimaryModelSerializer): ] +class AvailableVLANSerializer(serializers.Serializer): + """ + Representation of a VLAN which does not exist in the database. + """ + vid = serializers.IntegerField(read_only=True) + group = NestedVLANGroupSerializer(read_only=True) + + def to_representation(self, instance): + return OrderedDict([ + ('vid', instance), + ('group', NestedVLANGroupSerializer( + self.context['group'], + context={'request': self.context['request']} + ).data), + ]) + + +class CreateAvailableVLANSerializer(PrimaryModelSerializer): + site = NestedSiteSerializer(required=False, allow_null=True) + tenant = NestedTenantSerializer(required=False, allow_null=True) + status = ChoiceField(choices=VLANStatusChoices, required=False) + role = NestedRoleSerializer(required=False, allow_null=True) + + class Meta: + model = VLAN + fields = [ + 'name', 'site', 'tenant', 'status', 'role', 'description', 'tags', 'custom_fields', + ] + + def validate(self, data): + # Bypass model validation since we don't have a VID yet + return data + + # # Prefixes # diff --git a/netbox/ipam/api/urls.py b/netbox/ipam/api/urls.py index 26a36325f43..3d69e258e1f 100644 --- a/netbox/ipam/api/urls.py +++ b/netbox/ipam/api/urls.py @@ -62,6 +62,11 @@ urlpatterns = [ views.PrefixAvailableIPAddressesView.as_view(), name='prefix-available-ips' ), + path( + 'vlan-groups//available-vlans/', + views.AvailableVLANsView.as_view(), + name='vlangroup-available-vlans' + ), ] urlpatterns += router.urls diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 0d098db4bc7..de415cd8174 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -327,3 +327,75 @@ class IPRangeAvailableIPAddressesView(AvailableIPAddressesView): def get_parent(self, request, pk): return get_object_or_404(IPRange.objects.restrict(request.user), pk=pk) + + +class AvailableVLANsView(ObjectValidationMixin, APIView): + queryset = VLAN.objects.all() + + @swagger_auto_schema(responses={200: serializers.AvailableVLANSerializer(many=True)}) + def get(self, request, pk): + vlangroup = get_object_or_404(VLANGroup.objects.restrict(request.user), pk=pk) + available_vlans = vlangroup.get_available_vids() + + serializer = serializers.AvailableVLANSerializer(available_vlans, many=True, context={ + 'request': request, + 'group': vlangroup, + }) + + return Response(serializer.data) + + @swagger_auto_schema( + request_body=serializers.CreateAvailableVLANSerializer, + responses={201: serializers.VLANSerializer(many=True)} + ) + @advisory_lock(ADVISORY_LOCK_KEYS['available-vlans']) + def post(self, request, pk): + self.queryset = self.queryset.restrict(request.user, 'add') + vlangroup = get_object_or_404(VLANGroup.objects.restrict(request.user), pk=pk) + available_vlans = vlangroup.get_available_vids() + many = isinstance(request.data, list) + + # Validate requested VLANs + serializer = serializers.CreateAvailableVLANSerializer( + data=request.data if many else [request.data], + many=True, + context={ + 'request': request, + 'group': vlangroup, + } + ) + if not serializer.is_valid(): + return Response( + serializer.errors, + status=status.HTTP_400_BAD_REQUEST + ) + + requested_vlans = serializer.validated_data + + for i, requested_vlan in enumerate(requested_vlans): + try: + requested_vlan['vid'] = available_vlans.pop(0) + requested_vlan['group'] = vlangroup.pk + except IndexError: + return Response({ + "detail": "The requested number of VLANs is not available" + }, status=status.HTTP_409_CONFLICT) + + # Initialize the serializer with a list or a single object depending on what was requested + context = {'request': request} + if many: + serializer = serializers.VLANSerializer(data=requested_vlans, many=True, context=context) + else: + serializer = serializers.VLANSerializer(data=requested_vlans[0], context=context) + + # Create the new VLAN(s) + if serializer.is_valid(): + try: + with transaction.atomic(): + created = serializer.save() + self._validate_objects(created) + except ObjectDoesNotExist: + raise PermissionDenied() + return Response(serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 3a17257708a..c31bb49fd2c 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -75,6 +75,16 @@ class VLANGroup(OrganizationalModel): if self.scope_id and not self.scope_type: raise ValidationError("Cannot set scope_id without scope_type.") + def get_available_vids(self): + """ + Return all available VLANs within this group. + """ + available_vlans = {vid for vid in range(VLAN_VID_MIN, VLAN_VID_MAX + 1)} + available_vlans -= set(VLAN.objects.filter(group=self).values_list('vid', flat=True)) + + # TODO: Check ordering + return list(available_vlans) + def get_next_available_vid(self): """ Return the first available VLAN ID (1-4094) in the group. diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 478c7f29bb4..1806d3bec7c 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -695,6 +695,82 @@ class VLANGroupTest(APIViewTestCases.APIViewTestCase): ) VLANGroup.objects.bulk_create(vlan_groups) + def test_list_available_vlans(self): + """ + Test retrieval of all available VLANs within a group. + """ + self.add_permissions('ipam.view_vlan') + vlangroup = VLANGroup.objects.first() + + vlans = ( + VLAN(vid=10, name='VLAN 10', group=vlangroup), + VLAN(vid=20, name='VLAN 20', group=vlangroup), + VLAN(vid=30, name='VLAN 30', group=vlangroup), + ) + VLAN.objects.bulk_create(vlans) + + # Retrieve all available VLANs + url = reverse('ipam-api:vlangroup-available-vlans', kwargs={'pk': vlangroup.pk}) + response = self.client.get(url, **self.header) + + self.assertEqual(len(response.data), 4094 - len(vlans)) + available_vlans = {vlan['vid'] for vlan in response.data} + for vlan in vlans: + self.assertNotIn(vlan.vid, available_vlans) + + def test_create_single_available_vlan(self): + """ + Test the creation of a single available VLAN. + """ + self.add_permissions('ipam.view_vlan', 'ipam.add_vlan') + vlangroup = VLANGroup.objects.first() + VLAN.objects.create(vid=1, name='VLAN 1', group=vlangroup) + + data = { + "name": "First VLAN", + } + url = reverse('ipam-api:vlangroup-available-vlans', kwargs={'pk': vlangroup.pk}) + response = self.client.post(url, data, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_201_CREATED) + self.assertEqual(response.data['name'], data['name']) + self.assertEqual(response.data['group']['id'], vlangroup.pk) + self.assertEqual(response.data['vid'], 2) + + def test_create_multiple_available_vlans(self): + """ + Test the creation of multiple available VLANs. + """ + self.add_permissions('ipam.view_vlan', 'ipam.add_vlan') + vlangroup = VLANGroup.objects.first() + + vlans = ( + VLAN(vid=1, name='VLAN 1', group=vlangroup), + VLAN(vid=3, name='VLAN 3', group=vlangroup), + VLAN(vid=5, name='VLAN 5', group=vlangroup), + ) + VLAN.objects.bulk_create(vlans) + + data = ( + {"name": "First VLAN"}, + {"name": "Second VLAN"}, + {"name": "Third VLAN"}, + ) + url = reverse('ipam-api:vlangroup-available-vlans', kwargs={'pk': vlangroup.pk}) + response = self.client.post(url, data, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_201_CREATED) + self.assertEqual(len(response.data), 3) + self.assertEqual(response.data[0]['name'], data[0]['name']) + self.assertEqual(response.data[0]['group']['id'], vlangroup.pk) + self.assertEqual(response.data[0]['vid'], 2) + self.assertEqual(response.data[1]['name'], data[1]['name']) + self.assertEqual(response.data[1]['group']['id'], vlangroup.pk) + self.assertEqual(response.data[1]['vid'], 4) + self.assertEqual(response.data[2]['name'], data[2]['name']) + self.assertEqual(response.data[2]['group']['id'], vlangroup.pk) + self.assertEqual(response.data[2]['vid'], 6) + class VLANTest(APIViewTestCases.APIViewTestCase): model = VLAN diff --git a/netbox/utilities/constants.py b/netbox/utilities/constants.py index 08e9dd9cf70..9303e5f3ad8 100644 --- a/netbox/utilities/constants.py +++ b/netbox/utilities/constants.py @@ -42,6 +42,7 @@ FILTER_TREENODE_NEGATION_LOOKUP_MAP = dict( ADVISORY_LOCK_KEYS = { 'available-prefixes': 100100, 'available-ips': 100200, + 'available-vlans': 100300, } # From 083fda31723bac288d10342e841dc4699ac41345 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 23 Dec 2021 10:46:57 -0500 Subject: [PATCH 036/271] #2658: Fix test permissions --- netbox/ipam/tests/test_api.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 1806d3bec7c..dfbf1a97198 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -699,7 +699,7 @@ class VLANGroupTest(APIViewTestCases.APIViewTestCase): """ Test retrieval of all available VLANs within a group. """ - self.add_permissions('ipam.view_vlan') + self.add_permissions('ipam.view_vlangroup', 'ipam.view_vlan') vlangroup = VLANGroup.objects.first() vlans = ( @@ -722,7 +722,7 @@ class VLANGroupTest(APIViewTestCases.APIViewTestCase): """ Test the creation of a single available VLAN. """ - self.add_permissions('ipam.view_vlan', 'ipam.add_vlan') + self.add_permissions('ipam.view_vlangroup', 'ipam.view_vlan', 'ipam.add_vlan') vlangroup = VLANGroup.objects.first() VLAN.objects.create(vid=1, name='VLAN 1', group=vlangroup) @@ -741,7 +741,7 @@ class VLANGroupTest(APIViewTestCases.APIViewTestCase): """ Test the creation of multiple available VLANs. """ - self.add_permissions('ipam.view_vlan', 'ipam.add_vlan') + self.add_permissions('ipam.view_vlangroup', 'ipam.view_vlan', 'ipam.add_vlan') vlangroup = VLANGroup.objects.first() vlans = ( From 544d991e1e614b97f36fa1b58900189e0f41bbc9 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 23 Dec 2021 11:13:28 -0500 Subject: [PATCH 037/271] Closes #8168: Add min/max VID fields to VLANGroup --- docs/models/ipam/vlangroup.md | 2 + docs/release-notes/version-3.2.md | 4 ++ netbox/ipam/api/serializers.py | 4 +- netbox/ipam/filtersets.py | 2 +- netbox/ipam/forms/bulk_edit.py | 12 +++++ netbox/ipam/forms/bulk_import.py | 14 +++++- netbox/ipam/forms/filtersets.py | 11 ++++- netbox/ipam/forms/models.py | 3 +- .../migrations/0054_vlangroup_min_max_vids.py | 24 ++++++++++ netbox/ipam/models/vlans.py | 48 +++++++++++++++---- netbox/ipam/tables/vlans.py | 5 +- netbox/ipam/tests/test_models.py | 40 +++++++++++----- netbox/ipam/tests/test_views.py | 2 + netbox/templates/ipam/vlangroup.html | 8 ++-- 14 files changed, 148 insertions(+), 31 deletions(-) create mode 100644 netbox/ipam/migrations/0054_vlangroup_min_max_vids.py diff --git a/docs/models/ipam/vlangroup.md b/docs/models/ipam/vlangroup.md index 819d45982cf..2840fafedca 100644 --- a/docs/models/ipam/vlangroup.md +++ b/docs/models/ipam/vlangroup.md @@ -2,4 +2,6 @@ VLAN groups can be used to organize VLANs within NetBox. Each VLAN group can be scoped to a particular region, site group, site, location, rack, cluster group, or cluster. Member VLANs will be available for assignment to devices and/or virtual machines within the specified scope. +A minimum and maximum child VLAN ID must be set for each group. (These default to 1 and 4094 respectively.) VLANs created within a group must have a VID that falls between these values (inclusive). + Groups can also be used to enforce uniqueness: Each VLAN within a group must have a unique ID and name. VLANs which are not assigned to a group may have overlapping names and IDs (including VLANs which belong to a common site). For example, you can create two VLANs with ID 123, but they cannot both be assigned to the same group. diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index f03f1924f70..693335ae9db 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -41,6 +41,7 @@ FIELD_CHOICES = { ### Enhancements * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation +* [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group ### Other Changes @@ -53,3 +54,6 @@ FIELD_CHOICES = { * dcim.Site * Removed the `asn`, `contact_name`, `contact_phone`, and `contact_email` fields +* ipam.VLANGroup + * Added the `/availables-vlans/` endpoint + * Added the `min_vid` and `max_vid` fields diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 14bad10b7b6..c028a3d5d8b 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -182,8 +182,8 @@ class VLANGroupSerializer(PrimaryModelSerializer): class Meta: model = VLANGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'scope_type', 'scope_id', 'scope', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', 'vlan_count', + 'id', 'url', 'display', 'name', 'slug', 'scope_type', 'scope_id', 'scope', 'min_vid', 'max_vid', + 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'vlan_count', ] validators = [] diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index df6ee105571..8a10a7b2479 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -740,7 +740,7 @@ class VLANGroupFilterSet(OrganizationalModelFilterSet): class Meta: model = VLANGroup - fields = ['id', 'name', 'slug', 'description', 'scope_id'] + fields = ['id', 'name', 'slug', 'min_vid', 'max_vid', 'description', 'scope_id'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index edb14a25c14..971becaeda2 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -359,6 +359,18 @@ class VLANGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): queryset=Site.objects.all(), required=False ) + min_vid = forms.IntegerField( + min_value=VLAN_VID_MIN, + max_value=VLAN_VID_MAX, + required=False, + label='Minimum child VLAN VID' + ) + max_vid = forms.IntegerField( + min_value=VLAN_VID_MIN, + max_value=VLAN_VID_MAX, + required=False, + label='Maximum child VLAN VID' + ) description = forms.CharField( max_length=200, required=False diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index 65fc35c34c9..a4fdaa3ae5e 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -332,10 +332,22 @@ class VLANGroupCSVForm(CustomFieldModelCSVForm): required=False, label='Scope type (app & model)' ) + min_vid = forms.IntegerField( + min_value=VLAN_VID_MIN, + max_value=VLAN_VID_MAX, + required=False, + label=f'Minimum child VLAN VID (default: {VLAN_VID_MIN})' + ) + max_vid = forms.IntegerField( + min_value=VLAN_VID_MIN, + max_value=VLAN_VID_MAX, + required=False, + label=f'Maximum child VLAN VID (default: {VLAN_VID_MIN})' + ) class Meta: model = VLANGroup - fields = ('name', 'slug', 'scope_type', 'scope_id', 'description') + fields = ('name', 'slug', 'scope_type', 'scope_id', 'min_vid', 'max_vid', 'description') labels = { 'scope_id': 'Scope ID', } diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index b21dbd6cda1..a7732fe9a34 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -370,7 +370,8 @@ class FHRPGroupFilterForm(CustomFieldModelFilterForm): class VLANGroupFilterForm(CustomFieldModelFilterForm): field_groups = [ ['q', 'tag'], - ['region', 'sitegroup', 'site', 'location', 'rack'] + ['region', 'sitegroup', 'site', 'location', 'rack'], + ['min_vid', 'max_vid'], ] model = VLANGroup region = DynamicModelMultipleChoiceField( @@ -403,6 +404,14 @@ class VLANGroupFilterForm(CustomFieldModelFilterForm): label=_('Rack'), fetch_trigger='open' ) + min_vid = forms.IntegerField( + min_value=VLAN_VID_MIN, + max_value=VLAN_VID_MAX, + ) + max_vid = forms.IntegerField( + min_value=VLAN_VID_MIN, + max_value=VLAN_VID_MAX, + ) tag = TagFilterField(model) diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py index c5e3146e9f9..68eac54564a 100644 --- a/netbox/ipam/forms/models.py +++ b/netbox/ipam/forms/models.py @@ -700,10 +700,11 @@ class VLANGroupForm(CustomFieldModelForm): model = VLANGroup fields = [ 'name', 'slug', 'description', 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', - 'clustergroup', 'cluster', 'tags', + 'clustergroup', 'cluster', 'min_vid', 'max_vid', 'tags', ] fieldsets = ( ('VLAN Group', ('name', 'slug', 'description', 'tags')), + ('Child VLANs', ('min_vid', 'max_vid')), ('Scope', ('scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster')), ) widgets = { diff --git a/netbox/ipam/migrations/0054_vlangroup_min_max_vids.py b/netbox/ipam/migrations/0054_vlangroup_min_max_vids.py new file mode 100644 index 00000000000..adbe69f4c44 --- /dev/null +++ b/netbox/ipam/migrations/0054_vlangroup_min_max_vids.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.10 on 2021-12-23 15:24 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0053_asn_model'), + ] + + operations = [ + migrations.AddField( + model_name='vlangroup', + name='max_vid', + field=models.PositiveSmallIntegerField(default=4094, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(4094)]), + ), + migrations.AddField( + model_name='vlangroup', + name='min_vid', + field=models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(4094)]), + ), + ] diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index c31bb49fd2c..31c8da2b6e8 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -46,6 +46,24 @@ class VLANGroup(OrganizationalModel): ct_field='scope_type', fk_field='scope_id' ) + min_vid = models.PositiveSmallIntegerField( + verbose_name='Minimum VLAN ID', + default=VLAN_VID_MIN, + validators=( + MinValueValidator(VLAN_VID_MIN), + MaxValueValidator(VLAN_VID_MAX) + ), + help_text='Lowest permissible ID of a child VLAN' + ) + max_vid = models.PositiveSmallIntegerField( + verbose_name='Maximum VLAN ID', + default=VLAN_VID_MAX, + validators=( + MinValueValidator(VLAN_VID_MIN), + MaxValueValidator(VLAN_VID_MAX) + ), + help_text='Highest permissible ID of a child VLAN' + ) description = models.CharField( max_length=200, blank=True @@ -75,24 +93,28 @@ class VLANGroup(OrganizationalModel): if self.scope_id and not self.scope_type: raise ValidationError("Cannot set scope_id without scope_type.") + # Validate min/max child VID limits + if self.max_vid < self.min_vid: + raise ValidationError({ + 'max_vid': "Maximum child VID must be greater than or equal to minimum child VID" + }) + def get_available_vids(self): """ Return all available VLANs within this group. """ - available_vlans = {vid for vid in range(VLAN_VID_MIN, VLAN_VID_MAX + 1)} + available_vlans = {vid for vid in range(self.min_vid, self.max_vid + 1)} available_vlans -= set(VLAN.objects.filter(group=self).values_list('vid', flat=True)) - # TODO: Check ordering - return list(available_vlans) + return sorted(available_vlans) def get_next_available_vid(self): """ Return the first available VLAN ID (1-4094) in the group. """ - vlan_ids = VLAN.objects.filter(group=self).values_list('vid', flat=True) - for i in range(1, 4095): - if i not in vlan_ids: - return i + available_vids = self.get_available_vids() + if available_vids: + return available_vids[0] return None @@ -122,7 +144,10 @@ class VLAN(PrimaryModel): ) vid = models.PositiveSmallIntegerField( verbose_name='ID', - validators=[MinValueValidator(1), MaxValueValidator(4094)] + validators=( + MinValueValidator(VLAN_VID_MIN), + MaxValueValidator(VLAN_VID_MAX) + ) ) name = models.CharField( max_length=64 @@ -182,6 +207,13 @@ class VLAN(PrimaryModel): f"site {self.site}." }) + # Validate group min/max VIDs + if self.group and not self.group.min_vid <= self.vid <= self.group.max_vid: + raise ValidationError({ + 'vid': f"VID must be between {self.group.min_vid} and {self.group.max_vid} for VLANs in group " + f"{self.group}" + }) + def get_status_class(self): return VLANStatusChoices.colors.get(self.status, 'secondary') diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index 365c6119b31..ca8d22552e0 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -84,7 +84,10 @@ class VLANGroupTable(BaseTable): class Meta(BaseTable.Meta): model = VLANGroup - fields = ('pk', 'id', 'name', 'scope_type', 'scope', 'vlan_count', 'slug', 'description', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'scope_type', 'scope', 'min_vid', 'max_vid', 'vlan_count', 'slug', 'description', + 'tags', 'actions', + ) default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description', 'actions') diff --git a/netbox/ipam/tests/test_models.py b/netbox/ipam/tests/test_models.py index f6130f1c18b..06ac9b843c6 100644 --- a/netbox/ipam/tests/test_models.py +++ b/netbox/ipam/tests/test_models.py @@ -497,18 +497,32 @@ class TestIPAddress(TestCase): class TestVLANGroup(TestCase): + @classmethod + def setUpTestData(cls): + vlangroup = VLANGroup.objects.create( + name='VLAN Group 1', + slug='vlan-group-1', + min_vid=100, + max_vid=199 + ) + VLAN.objects.bulk_create(( + VLAN(name='VLAN 100', vid=100, group=vlangroup), + VLAN(name='VLAN 101', vid=101, group=vlangroup), + VLAN(name='VLAN 102', vid=102, group=vlangroup), + VLAN(name='VLAN 103', vid=103, group=vlangroup), + )) + + def test_get_available_vids(self): + vlangroup = VLANGroup.objects.first() + child_vids = VLAN.objects.filter(group=vlangroup).values_list('vid', flat=True) + self.assertEqual(len(child_vids), 4) + + available_vids = vlangroup.get_available_vids() + self.assertListEqual(available_vids, list(range(104, 200))) + def test_get_next_available_vid(self): + vlangroup = VLANGroup.objects.first() + self.assertEqual(vlangroup.get_next_available_vid(), 104) - vlangroup = VLANGroup.objects.create(name='VLAN Group 1', slug='vlan-group-1') - VLAN.objects.bulk_create(( - VLAN(name='VLAN 1', vid=1, group=vlangroup), - VLAN(name='VLAN 2', vid=2, group=vlangroup), - VLAN(name='VLAN 3', vid=3, group=vlangroup), - VLAN(name='VLAN 5', vid=5, group=vlangroup), - )) - self.assertEqual(vlangroup.get_next_available_vid(), 4) - - VLAN.objects.bulk_create(( - VLAN(name='VLAN 4', vid=4, group=vlangroup), - )) - self.assertEqual(vlangroup.get_next_available_vid(), 6) + VLAN.objects.create(name='VLAN 104', vid=104, group=vlangroup) + self.assertEqual(vlangroup.get_next_available_vid(), 105) diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index 022ea13c3ee..1e7a7238938 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -485,6 +485,8 @@ class VLANGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase): cls.form_data = { 'name': 'VLAN Group X', 'slug': 'vlan-group-x', + 'min_vid': 1, + 'max_vid': 4094, 'description': 'A new VLAN group', 'tags': [t.pk for t in tags], } diff --git a/netbox/templates/ipam/vlangroup.html b/netbox/templates/ipam/vlangroup.html index b0e2b1a21c4..f92afce46bc 100644 --- a/netbox/templates/ipam/vlangroup.html +++ b/netbox/templates/ipam/vlangroup.html @@ -23,9 +23,7 @@
    -
    - VLAN Group -
    +
    VLAN Group
    @@ -45,6 +43,10 @@ {% endif %} + + + + + + + + From 77dd68491643b92cb745ee9d2907f14bceadeb0c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 23 Dec 2021 14:20:03 -0500 Subject: [PATCH 040/271] Closes #7784: Support cluster type assignment for config contexts --- docs/release-notes/version-3.2.md | 3 + netbox/extras/api/serializers.py | 16 ++++-- netbox/extras/filtersets.py | 13 ++++- netbox/extras/forms/filtersets.py | 10 +++- netbox/extras/forms/models.py | 8 ++- .../0067_configcontext_cluster_types.py | 17 ++++++ netbox/extras/models/configcontexts.py | 5 ++ netbox/extras/querysets.py | 5 +- netbox/extras/tables.py | 2 +- netbox/extras/tests/test_filtersets.py | 22 +++++-- netbox/extras/tests/test_models.py | 57 +++++++++---------- netbox/extras/views.py | 1 + .../templates/extras/configcontext_edit.html | 1 + 13 files changed, 115 insertions(+), 45 deletions(-) create mode 100644 netbox/extras/migrations/0067_configcontext_cluster_types.py diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 2944b5ee982..f35100c7286 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -43,6 +43,7 @@ FIELD_CHOICES = { * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation * [#7681](https://github.com/netbox-community/netbox/issues/7681) - Add `service_id` field for provider networks * [#7759](https://github.com/netbox-community/netbox/issues/7759) - Improved the user preferences form +* [#7784](https://github.com/netbox-community/netbox/issues/7784) - Support cluster type assignment for config contexts * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group ### Other Changes @@ -77,6 +78,8 @@ FIELD_CHOICES = { * Added `module` field * dcim.Site * Removed the `asn`, `contact_name`, `contact_phone`, and `contact_email` fields +* extras.ConfigContext + * Add `cluster_types` field * ipam.VLANGroup * Added the `/availables-vlans/` endpoint * Added the `min_vid` and `max_vid` fields diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 9e4665cc292..fa0e5189f00 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -19,8 +19,10 @@ from tenancy.api.nested_serializers import NestedTenantSerializer, NestedTenantG from tenancy.models import Tenant, TenantGroup from users.api.nested_serializers import NestedUserSerializer from utilities.api import get_serializer_for_model -from virtualization.api.nested_serializers import NestedClusterGroupSerializer, NestedClusterSerializer -from virtualization.models import Cluster, ClusterGroup +from virtualization.api.nested_serializers import ( + NestedClusterGroupSerializer, NestedClusterSerializer, NestedClusterTypeSerializer, +) +from virtualization.models import Cluster, ClusterGroup, ClusterType from .nested_serializers import * __all__ = ( @@ -267,6 +269,12 @@ class ConfigContextSerializer(ValidatedModelSerializer): required=False, many=True ) + cluster_types = SerializedPKRelatedField( + queryset=ClusterType.objects.all(), + serializer=NestedClusterTypeSerializer, + required=False, + many=True + ) cluster_groups = SerializedPKRelatedField( queryset=ClusterGroup.objects.all(), serializer=NestedClusterGroupSerializer, @@ -302,8 +310,8 @@ class ConfigContextSerializer(ValidatedModelSerializer): model = ConfigContext fields = [ 'id', 'url', 'display', 'name', 'weight', 'description', 'is_active', 'regions', 'site_groups', 'sites', - 'device_types', 'roles', 'platforms', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', - 'data', 'created', 'last_updated', + 'device_types', 'roles', 'platforms', 'cluster_types', 'cluster_groups', 'clusters', 'tenant_groups', + 'tenants', 'tags', 'data', 'created', 'last_updated', ] diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 6233ca442b3..bf25ff76c42 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -7,7 +7,7 @@ from dcim.models import DeviceRole, DeviceType, Platform, Region, Site, SiteGrou from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet from tenancy.models import Tenant, TenantGroup from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter -from virtualization.models import Cluster, ClusterGroup +from virtualization.models import Cluster, ClusterGroup, ClusterType from .choices import * from .models import * @@ -279,6 +279,17 @@ class ConfigContextFilterSet(ChangeLoggedModelFilterSet): to_field_name='slug', label='Platform (slug)', ) + cluster_type_id = django_filters.ModelMultipleChoiceFilter( + field_name='cluster_types', + queryset=ClusterType.objects.all(), + label='Cluster type', + ) + cluster_type = django_filters.ModelMultipleChoiceFilter( + field_name='cluster_types__slug', + queryset=ClusterType.objects.all(), + to_field_name='slug', + label='Cluster type (slug)', + ) cluster_group_id = django_filters.ModelMultipleChoiceFilter( field_name='cluster_groups', queryset=ClusterGroup.objects.all(), diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 07375a20351..29527c20edb 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -12,7 +12,7 @@ from utilities.forms import ( add_blank_choice, APISelectMultiple, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DateTimePicker, DynamicModelMultipleChoiceField, FilterForm, StaticSelect, StaticSelectMultiple, BOOLEAN_WITH_BLANK_CHOICES, ) -from virtualization.models import Cluster, ClusterGroup +from virtualization.models import Cluster, ClusterGroup, ClusterType __all__ = ( 'ConfigContextFilterForm', @@ -158,7 +158,7 @@ class ConfigContextFilterForm(FilterForm): ['q', 'tag'], ['region_id', 'site_group_id', 'site_id'], ['device_type_id', 'platform_id', 'role_id'], - ['cluster_group_id', 'cluster_id'], + ['cluster_type_id', 'cluster_group_id', 'cluster_id'], ['tenant_group_id', 'tenant_id'] ] region_id = DynamicModelMultipleChoiceField( @@ -197,6 +197,12 @@ class ConfigContextFilterForm(FilterForm): label=_('Platforms'), fetch_trigger='open' ) + cluster_type_id = DynamicModelMultipleChoiceField( + queryset=ClusterType.objects.all(), + required=False, + label=_('Cluster types'), + fetch_trigger='open' + ) cluster_group_id = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), required=False, diff --git a/netbox/extras/forms/models.py b/netbox/extras/forms/models.py index 1e619ebec0d..d7521472294 100644 --- a/netbox/extras/forms/models.py +++ b/netbox/extras/forms/models.py @@ -10,7 +10,7 @@ from utilities.forms import ( add_blank_choice, BootstrapMixin, CommentField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, JSONField, SlugField, StaticSelect, ) -from virtualization.models import Cluster, ClusterGroup +from virtualization.models import Cluster, ClusterGroup, ClusterType __all__ = ( 'AddRemoveTagsForm', @@ -165,6 +165,10 @@ class ConfigContextForm(BootstrapMixin, forms.ModelForm): queryset=Platform.objects.all(), required=False ) + cluster_types = DynamicModelMultipleChoiceField( + queryset=ClusterType.objects.all(), + required=False + ) cluster_groups = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), required=False @@ -193,7 +197,7 @@ class ConfigContextForm(BootstrapMixin, forms.ModelForm): model = ConfigContext fields = ( 'name', 'weight', 'description', 'is_active', 'regions', 'site_groups', 'sites', 'roles', 'device_types', - 'platforms', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data', + 'platforms', 'cluster_types', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data', ) diff --git a/netbox/extras/migrations/0067_configcontext_cluster_types.py b/netbox/extras/migrations/0067_configcontext_cluster_types.py new file mode 100644 index 00000000000..f9376da771d --- /dev/null +++ b/netbox/extras/migrations/0067_configcontext_cluster_types.py @@ -0,0 +1,17 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('virtualization', '0026_vminterface_bridge'), + ('extras', '0066_customfield_name_validation'), + ] + + operations = [ + migrations.AddField( + model_name='configcontext', + name='cluster_types', + field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_cluster_types_+', to='virtualization.ClusterType'), + ), + ] diff --git a/netbox/extras/models/configcontexts.py b/netbox/extras/models/configcontexts.py index 8c142de8b74..2a14f143fc3 100644 --- a/netbox/extras/models/configcontexts.py +++ b/netbox/extras/models/configcontexts.py @@ -71,6 +71,11 @@ class ConfigContext(ChangeLoggedModel): related_name='+', blank=True ) + cluster_types = models.ManyToManyField( + to='virtualization.ClusterType', + related_name='+', + blank=True + ) cluster_groups = models.ManyToManyField( to='virtualization.ClusterGroup', related_name='+', diff --git a/netbox/extras/querysets.py b/netbox/extras/querysets.py index 59d16fff850..982f33d0206 100644 --- a/netbox/extras/querysets.py +++ b/netbox/extras/querysets.py @@ -22,8 +22,9 @@ class ConfigContextQuerySet(RestrictedQuerySet): # Device type assignment is relevant only for Devices device_type = getattr(obj, 'device_type', None) - # Get assigned Cluster and ClusterGroup, if any + # Get assigned cluster, group, and type (if any) cluster = getattr(obj, 'cluster', None) + cluster_type = getattr(cluster, 'type', None) cluster_group = getattr(cluster, 'group', None) # Get the group of the assigned tenant, if any @@ -44,6 +45,7 @@ class ConfigContextQuerySet(RestrictedQuerySet): Q(device_types=device_type) | Q(device_types=None), Q(roles=role) | Q(roles=None), Q(platforms=obj.platform) | Q(platforms=None), + Q(cluster_types=cluster_type) | Q(cluster_types=None), Q(cluster_groups=cluster_group) | Q(cluster_groups=None), Q(clusters=cluster) | Q(clusters=None), Q(tenant_groups=tenant_group) | Q(tenant_groups=None), @@ -93,6 +95,7 @@ class ConfigContextModelQuerySet(RestrictedQuerySet): } base_query = Q( Q(platforms=OuterRef('platform')) | Q(platforms=None), + Q(cluster_types=OuterRef('cluster__type')) | Q(cluster_types=None), Q(cluster_groups=OuterRef('cluster__group')) | Q(cluster_groups=None), Q(clusters=OuterRef('cluster')) | Q(clusters=None), Q(tenant_groups=OuterRef('tenant__group')) | Q(tenant_groups=None), diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index 266f2089a40..62317e6366a 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -193,7 +193,7 @@ class ConfigContextTable(BaseTable): model = ConfigContext fields = ( 'pk', 'id', 'name', 'weight', 'is_active', 'description', 'regions', 'sites', 'roles', - 'platforms', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', + 'platforms', 'cluster_types', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', ) default_columns = ('pk', 'name', 'weight', 'is_active', 'description') diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 0f4b35cf639..a5f77afa9f7 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -399,6 +399,13 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests): ) Platform.objects.bulk_create(platforms) + cluster_types = ( + ClusterType(name='Cluster Type 1', slug='cluster-type-1'), + ClusterType(name='Cluster Type 2', slug='cluster-type-2'), + ClusterType(name='Cluster Type 3', slug='cluster-type-3'), + ) + ClusterType.objects.bulk_create(cluster_types) + cluster_groups = ( ClusterGroup(name='Cluster Group 1', slug='cluster-group-1'), ClusterGroup(name='Cluster Group 2', slug='cluster-group-2'), @@ -406,11 +413,10 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests): ) ClusterGroup.objects.bulk_create(cluster_groups) - cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') clusters = ( - Cluster(name='Cluster 1', type=cluster_type), - Cluster(name='Cluster 2', type=cluster_type), - Cluster(name='Cluster 3', type=cluster_type), + Cluster(name='Cluster 1', type=cluster_types[0]), + Cluster(name='Cluster 2', type=cluster_types[1]), + Cluster(name='Cluster 3', type=cluster_types[2]), ) Cluster.objects.bulk_create(clusters) @@ -442,6 +448,7 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests): c.device_types.set([device_types[i]]) c.roles.set([device_roles[i]]) c.platforms.set([platforms[i]]) + c.cluster_types.set([cluster_types[i]]) c.cluster_groups.set([cluster_groups[i]]) c.clusters.set([clusters[i]]) c.tenant_groups.set([tenant_groups[i]]) @@ -504,6 +511,13 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'cluster_group': [cluster_groups[0].slug, cluster_groups[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_cluster_type(self): + cluster_types = ClusterType.objects.all()[:2] + params = {'cluster_type_id': [cluster_types[0].pk, cluster_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'cluster_type': [cluster_types[0].slug, cluster_types[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_cluster(self): clusters = Cluster.objects.all()[:2] params = {'cluster_id': [clusters[0].pk, clusters[1].pk]} diff --git a/netbox/extras/tests/test_models.py b/netbox/extras/tests/test_models.py index 10d4168b45c..17138d42b4d 100644 --- a/netbox/extras/tests/test_models.py +++ b/netbox/extras/tests/test_models.py @@ -216,80 +216,77 @@ class ConfigContextTest(TestCase): self.assertEqual(device.get_config_context(), annotated_queryset[0].get_config_context()) def test_annotation_same_as_get_for_object_virtualmachine_relations(self): + cluster_type = ClusterType.objects.create(name="Cluster Type") + cluster_group = ClusterGroup.objects.create(name="Cluster Group") + cluster = Cluster.objects.create(name="Cluster", group=cluster_group, type=cluster_type) site_context = ConfigContext.objects.create( name="site", weight=100, - data={ - "site": 1 - } + data={"site": 1} ) site_context.sites.add(self.site) + region_context = ConfigContext.objects.create( name="region", weight=100, - data={ - "region": 1 - } + data={"region": 1} ) region_context.regions.add(self.region) + sitegroup_context = ConfigContext.objects.create( name="sitegroup", weight=100, - data={ - "sitegroup": 1 - } + data={"sitegroup": 1} ) sitegroup_context.site_groups.add(self.sitegroup) + platform_context = ConfigContext.objects.create( name="platform", weight=100, - data={ - "platform": 1 - } + data={"platform": 1} ) platform_context.platforms.add(self.platform) + tenant_group_context = ConfigContext.objects.create( name="tenant group", weight=100, - data={ - "tenant_group": 1 - } + data={"tenant_group": 1} ) tenant_group_context.tenant_groups.add(self.tenantgroup) + tenant_context = ConfigContext.objects.create( name="tenant", weight=100, - data={ - "tenant": 1 - } + data={"tenant": 1} ) tenant_context.tenants.add(self.tenant) + tag_context = ConfigContext.objects.create( name="tag", weight=100, - data={ - "tag": 1 - } + data={"tag": 1} ) tag_context.tags.add(self.tag) - cluster_group = ClusterGroup.objects.create(name="Cluster Group") + + cluster_type_context = ConfigContext.objects.create( + name="cluster type", + weight=100, + data={"cluster_type": 1} + ) + cluster_type_context.cluster_types.add(cluster_type) + cluster_group_context = ConfigContext.objects.create( name="cluster group", weight=100, - data={ - "cluster_group": 1 - } + data={"cluster_group": 1} ) cluster_group_context.cluster_groups.add(cluster_group) - cluster_type = ClusterType.objects.create(name="Cluster Type 1") - cluster = Cluster.objects.create(name="Cluster", group=cluster_group, type=cluster_type) + cluster_context = ConfigContext.objects.create( name="cluster", weight=100, - data={ - "cluster": 1 - } + data={"cluster": 1} ) cluster_context.clusters.add(cluster) diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 256709c6a24..1660f821069 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -285,6 +285,7 @@ class ConfigContextView(generic.ObjectView): ('Device Types', instance.device_types.all), ('Roles', instance.roles.all), ('Platforms', instance.platforms.all), + ('Cluster Types', instance.cluster_types.all), ('Cluster Groups', instance.cluster_groups.all), ('Clusters', instance.clusters.all), ('Tenant Groups', instance.tenant_groups.all), diff --git a/netbox/templates/extras/configcontext_edit.html b/netbox/templates/extras/configcontext_edit.html index 4e4506dc638..7b37a69c624 100644 --- a/netbox/templates/extras/configcontext_edit.html +++ b/netbox/templates/extras/configcontext_edit.html @@ -20,6 +20,7 @@ {% render_field form.device_types %} {% render_field form.roles %} {% render_field form.platforms %} + {% render_field form.cluster_types %} {% render_field form.cluster_groups %} {% render_field form.clusters %} {% render_field form.tenant_groups %} From 04fb5e544d2d23622f82cc2d837182eabb123eea Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 27 Dec 2021 10:18:39 -0500 Subject: [PATCH 041/271] #3087: Add InvetoryItemRole --- docs/models/dcim/inventoryitemrole.md | 3 ++ netbox/dcim/api/nested_serializers.py | 10 ++++ netbox/dcim/api/serializers.py | 20 +++++-- netbox/dcim/api/urls.py | 3 ++ netbox/dcim/api/views.py | 12 +++++ netbox/dcim/filtersets.py | 9 ++++ netbox/dcim/forms/bulk_edit.py | 22 ++++++++ netbox/dcim/forms/bulk_import.py | 28 ++++++++++ netbox/dcim/forms/filtersets.py | 10 ++++ netbox/dcim/forms/models.py | 19 +++++++ netbox/dcim/graphql/schema.py | 3 ++ netbox/dcim/graphql/types.py | 9 ++++ .../dcim/migrations/0146_inventoryitemrole.py | 38 +++++++++++++ netbox/dcim/models/device_components.py | 45 +++++++++++++++- netbox/dcim/tables/devices.py | 31 +++++++++-- netbox/dcim/tests/test_api.py | 35 ++++++++++++ netbox/dcim/tests/test_filtersets.py | 27 ++++++++++ netbox/dcim/tests/test_views.py | 37 ++++++++++++- netbox/dcim/urls.py | 11 ++++ netbox/dcim/views.py | 53 +++++++++++++++++++ netbox/netbox/navigation_menu.py | 1 + netbox/templates/dcim/inventoryitemrole.html | 53 +++++++++++++++++++ 22 files changed, 469 insertions(+), 10 deletions(-) create mode 100644 docs/models/dcim/inventoryitemrole.md create mode 100644 netbox/dcim/migrations/0146_inventoryitemrole.py create mode 100644 netbox/templates/dcim/inventoryitemrole.html diff --git a/docs/models/dcim/inventoryitemrole.md b/docs/models/dcim/inventoryitemrole.md new file mode 100644 index 00000000000..8ed31481ad2 --- /dev/null +++ b/docs/models/dcim/inventoryitemrole.md @@ -0,0 +1,3 @@ +# Inventory Item Roles + +Inventory items can be organized by functional roles, which are fully customizable by the user. For example, you might create roles for power supplies, fans, interface optics, etc. diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 9440e5d4b13..0cd112a1d85 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -20,6 +20,7 @@ __all__ = [ 'NestedInterfaceSerializer', 'NestedInterfaceTemplateSerializer', 'NestedInventoryItemSerializer', + 'NestedInventoryItemRoleSerializer', 'NestedManufacturerSerializer', 'NestedModuleBaySerializer', 'NestedModuleBayTemplateSerializer', @@ -384,6 +385,15 @@ class NestedInventoryItemSerializer(WritableNestedSerializer): fields = ['id', 'url', 'display', 'device', 'name', '_depth'] +class NestedInventoryItemRoleSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') + inventoryitem_count = serializers.IntegerField(read_only=True) + + class Meta: + model = models.InventoryItemRole + fields = ['id', 'url', 'display', 'name', 'slug', 'inventoryitem_count'] + + # # Cables # diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index cf6c89333ab..fe84874111a 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -806,10 +806,6 @@ class DeviceBaySerializer(PrimaryModelSerializer): ] -# -# Inventory items -# - class InventoryItemSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') device = NestedDeviceSerializer() @@ -825,6 +821,22 @@ class InventoryItemSerializer(PrimaryModelSerializer): ] +# +# Device component roles +# + +class InventoryItemRoleSerializer(PrimaryModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') + inventoryitem_count = serializers.IntegerField(read_only=True) + + class Meta: + model = InventoryItemRole + fields = [ + 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', + 'last_updated', 'inventoryitem_count', + ] + + # # Cables # diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 71a768fd573..be963d36dfb 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -50,6 +50,9 @@ router.register('module-bays', views.ModuleBayViewSet) router.register('device-bays', views.DeviceBayViewSet) router.register('inventory-items', views.InventoryItemViewSet) +# Device component roles +router.register('inventory-item-roles', views.InventoryItemRoleViewSet) + # Cables router.register('cables', views.CableViewSet) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 8838eda2ca3..479abf7b2e6 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -623,6 +623,18 @@ class InventoryItemViewSet(ModelViewSet): brief_prefetch_fields = ['device'] +# +# Device component roles +# + +class InventoryItemRoleViewSet(CustomFieldModelViewSet): + queryset = InventoryItemRole.objects.prefetch_related('tags').annotate( + inventoryitem_count=count_related(InventoryItem, 'role') + ) + serializer_class = serializers.InventoryItemRoleSerializer + filterset_class = filtersets.InventoryItemRoleFilterSet + + # # Cables # diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index d91a9b574c8..5f4840fdee9 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -39,6 +39,7 @@ __all__ = ( 'InterfaceFilterSet', 'InterfaceTemplateFilterSet', 'InventoryItemFilterSet', + 'InventoryItemRoleFilterSet', 'LocationFilterSet', 'ManufacturerFilterSet', 'ModuleBayFilterSet', @@ -1304,6 +1305,14 @@ class InventoryItemFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): return queryset.filter(qs_filter) +class InventoryItemRoleFilterSet(OrganizationalModelFilterSet): + tag = TagFilter() + + class Meta: + model = InventoryItemRole + fields = ['id', 'name', 'slug', 'color'] + + class VirtualChassisFilterSet(PrimaryModelFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index d40ac6fca1f..8fc8835cbc0 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -30,6 +30,7 @@ __all__ = ( 'InterfaceBulkEditForm', 'InterfaceTemplateBulkEditForm', 'InventoryItemBulkEditForm', + 'InventoryItemRoleBulkEditForm', 'LocationBulkEditForm', 'ManufacturerBulkEditForm', 'ModuleBulkEditForm', @@ -1186,3 +1187,24 @@ class InventoryItemBulkEditForm( class Meta: nullable_fields = ['label', 'manufacturer', 'part_id', 'description'] + + +# +# Device component roles +# + +class InventoryItemRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=InventoryItemRole.objects.all(), + widget=forms.MultipleHiddenInput + ) + color = ColorField( + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['color', 'description'] diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 23d589abf2b..40838c60ca1 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -24,6 +24,7 @@ __all__ = ( 'FrontPortCSVForm', 'InterfaceCSVForm', 'InventoryItemCSVForm', + 'InventoryItemRoleCSVForm', 'LocationCSVForm', 'ManufacturerCSVForm', 'ModuleCSVForm', @@ -805,6 +806,25 @@ class InventoryItemCSVForm(CustomFieldModelCSVForm): self.fields['parent'].queryset = InventoryItem.objects.none() +# +# Device component roles +# + +class InventoryItemRoleCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = InventoryItemRole + fields = ('name', 'slug', 'color', 'description') + help_texts = { + 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), + } + + +# +# Cables +# + class CableCSVForm(CustomFieldModelCSVForm): # Termination A side_a_device = CSVModelChoiceField( @@ -906,6 +926,10 @@ class CableCSVForm(CustomFieldModelCSVForm): return length_unit if length_unit is not None else '' +# +# Virtual chassis +# + class VirtualChassisCSVForm(CustomFieldModelCSVForm): master = CSVModelChoiceField( queryset=Device.objects.all(), @@ -919,6 +943,10 @@ class VirtualChassisCSVForm(CustomFieldModelCSVForm): fields = ('name', 'domain', 'master') +# +# Power +# + class PowerPanelCSVForm(CustomFieldModelCSVForm): site = CSVModelChoiceField( queryset=Site.objects.all(), diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 819cb91cc93..ae58e1d2f15 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -27,6 +27,7 @@ __all__ = ( 'InterfaceConnectionFilterForm', 'InterfaceFilterForm', 'InventoryItemFilterForm', + 'InventoryItemRoleFilterForm', 'LocationFilterForm', 'ManufacturerFilterForm', 'ModuleFilterForm', @@ -1120,6 +1121,15 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): tag = TagFilterField(model) +# +# Device component roles +# + +class InventoryItemRoleFilterForm(CustomFieldModelFilterForm): + model = InventoryItemRole + tag = TagFilterField(model) + + # # Connections # diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 2d32093c444..b5b15e731b8 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -37,6 +37,7 @@ __all__ = ( 'InterfaceForm', 'InterfaceTemplateForm', 'InventoryItemForm', + 'InventoryItemRoleForm', 'LocationForm', 'ManufacturerForm', 'ModuleForm', @@ -1382,3 +1383,21 @@ class InventoryItemForm(CustomFieldModelForm): 'device', 'parent', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'tags', ] + + +# +# Device component roles +# + +class InventoryItemRoleForm(CustomFieldModelForm): + slug = SlugField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = InventoryItemRole + fields = [ + 'name', 'slug', 'color', 'description', 'tags', + ] diff --git a/netbox/dcim/graphql/schema.py b/netbox/dcim/graphql/schema.py index 7f660b1922c..8e03ab409ab 100644 --- a/netbox/dcim/graphql/schema.py +++ b/netbox/dcim/graphql/schema.py @@ -50,6 +50,9 @@ class DCIMQuery(graphene.ObjectType): inventory_item = ObjectField(InventoryItemType) inventory_item_list = ObjectListField(InventoryItemType) + inventory_item_role = ObjectField(InventoryItemRoleType) + inventory_item_role_list = ObjectListField(InventoryItemRoleType) + location = ObjectField(LocationType) location_list = ObjectListField(LocationType) diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index 51e1960761f..b2a94c3ed47 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -25,6 +25,7 @@ __all__ = ( 'InterfaceType', 'InterfaceTemplateType', 'InventoryItemType', + 'InventoryItemRoleType', 'LocationType', 'ManufacturerType', 'ModuleType', @@ -242,6 +243,14 @@ class InventoryItemType(ComponentObjectType): filterset_class = filtersets.InventoryItemFilterSet +class InventoryItemRoleType(OrganizationalObjectType): + + class Meta: + model = models.InventoryItemRole + fields = '__all__' + filterset_class = filtersets.InventoryItemRoleFilterSet + + class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, OrganizationalObjectType): class Meta: diff --git a/netbox/dcim/migrations/0146_inventoryitemrole.py b/netbox/dcim/migrations/0146_inventoryitemrole.py new file mode 100644 index 00000000000..97de677f8bc --- /dev/null +++ b/netbox/dcim/migrations/0146_inventoryitemrole.py @@ -0,0 +1,38 @@ +import django.core.serializers.json +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers +import utilities.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0067_configcontext_cluster_types'), + ('dcim', '0145_modules'), + ] + + operations = [ + migrations.CreateModel( + name='InventoryItemRole', + fields=[ + ('created', models.DateField(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=django.core.serializers.json.DjangoJSONEncoder)), + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100, unique=True)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('color', utilities.fields.ColorField(default='9e9e9e', max_length=6)), + ('description', models.CharField(blank=True, max_length=200)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'ordering': ['name'], + }, + ), + migrations.AddField( + model_name='inventoryitem', + name='role', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='inventory_items', to='dcim.inventoryitemrole'), + ), + ] diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index ccfe538d707..5329c9e0120 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -12,7 +12,8 @@ from dcim.constants import * from dcim.fields import MACAddressField, WWNField from dcim.svg import CableTraceSVG from extras.utils import extras_features -from netbox.models import PrimaryModel +from netbox.models import OrganizationalModel, PrimaryModel +from utilities.choices import ColorChoices from utilities.fields import ColorField, NaturalOrderingField from utilities.mptt import TreeManager from utilities.ordering import naturalize_interface @@ -30,6 +31,7 @@ __all__ = ( 'FrontPort', 'Interface', 'InventoryItem', + 'InventoryItemRole', 'ModuleBay', 'PathEndpoint', 'PowerOutlet', @@ -946,6 +948,38 @@ class DeviceBay(ComponentModel): # Inventory items # + +@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') +class InventoryItemRole(OrganizationalModel): + """ + Inventory items may optionally be assigned a functional role. + """ + name = models.CharField( + max_length=100, + unique=True + ) + slug = models.SlugField( + max_length=100, + unique=True + ) + color = ColorField( + default=ColorChoices.COLOR_GREY + ) + description = models.CharField( + max_length=200, + blank=True, + ) + + class Meta: + ordering = ['name'] + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('dcim:inventoryitemrole', args=[self.pk]) + + @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class InventoryItem(MPTTModel, ComponentModel): """ @@ -973,6 +1007,13 @@ class InventoryItem(MPTTModel, ComponentModel): blank=True, help_text='Manufacturer-assigned part identifier' ) + role = models.ForeignKey( + to='dcim.InventoryItemRole', + on_delete=models.PROTECT, + related_name='inventory_items', + blank=True, + null=True + ) serial = models.CharField( max_length=50, verbose_name='Serial number', @@ -993,7 +1034,7 @@ class InventoryItem(MPTTModel, ComponentModel): objects = TreeManager() - clone_fields = ['device', 'parent', 'manufacturer', 'part_id'] + clone_fields = ['device', 'parent', 'manufacturer', 'part_id', 'role'] class Meta: ordering = ('device__id', 'parent__id', '_name') diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 7805e60c15b..f889d52ec37 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -2,8 +2,8 @@ import django_tables2 as tables from django_tables2.utils import Accessor from dcim.models import ( - ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, FrontPort, Interface, InventoryItem, ModuleBay, - Platform, PowerOutlet, PowerPort, RearPort, VirtualChassis, + ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, FrontPort, Interface, InventoryItem, + InventoryItemRole, ModuleBay, Platform, PowerOutlet, PowerPort, RearPort, VirtualChassis, ) from tenancy.tables import TenantColumn from utilities.tables import ( @@ -33,6 +33,7 @@ __all__ = ( 'DeviceTable', 'FrontPortTable', 'InterfaceTable', + 'InventoryItemRoleTable', 'InventoryItemTable', 'ModuleBayTable', 'PlatformTable', @@ -68,11 +69,11 @@ def get_interface_state_attribute(record): else: return "disabled" + # # Device roles # - class DeviceRoleTable(BaseTable): pk = ToggleColumn() name = tables.Column( @@ -791,6 +792,30 @@ class InventoryItemTable(DeviceComponentTable): default_columns = ('pk', 'name', 'device', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag') +class InventoryItemRoleTable(BaseTable): + pk = ToggleColumn() + name = tables.Column( + linkify=True + ) + inventoryitem_count = LinkedCountColumn( + viewname='dcim:inventoryitem_list', + url_params={'role_id': 'pk'}, + verbose_name='Items' + ) + color = ColorColumn() + tags = TagColumn( + url_name='dcim:inventoryitemrole_list' + ) + actions = ButtonsColumn(InventoryItemRole) + + class Meta(BaseTable.Meta): + model = InventoryItemRole + fields = ( + 'pk', 'id', 'name', 'inventoryitem_count', 'color', 'description', 'slug', 'tags', 'actions', + ) + default_columns = ('pk', 'name', 'inventoryitem_count', 'color', 'description', 'actions') + + class DeviceInventoryItemTable(InventoryItemTable): name = tables.TemplateColumn( template_code='' diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 3b6410c8c86..a6c7760f4e8 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1649,6 +1649,41 @@ class InventoryItemTest(APIViewTestCases.APIViewTestCase): ] +class InventoryItemRoleTest(APIViewTestCases.APIViewTestCase): + model = InventoryItemRole + brief_fields = ['display', 'id', 'inventoryitem_count', 'name', 'slug', 'url'] + create_data = [ + { + 'name': 'Inventory Item Role 4', + 'slug': 'inventory-item-role-4', + 'color': 'ffff00', + }, + { + 'name': 'Inventory Item Role 5', + 'slug': 'inventory-item-role-5', + 'color': 'ffff00', + }, + { + 'name': 'Inventory Item Role 6', + 'slug': 'inventory-item-role-6', + 'color': 'ffff00', + }, + ] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + roles = ( + InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1', color='ff0000'), + InventoryItemRole(name='Inventory Item Role 2', slug='inventory-item-role-2', color='00ff00'), + InventoryItemRole(name='Inventory Item Role 3', slug='inventory-item-role-3', color='0000ff'), + ) + InventoryItemRole.objects.bulk_create(roles) + + class CableTest(APIViewTestCases.APIViewTestCase): model = Cable brief_fields = ['display', 'id', 'label', 'url'] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 8f04fb4d99e..f93e9164d22 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -3091,6 +3091,33 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) +class InventoryItemRoleTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = InventoryItemRole.objects.all() + filterset = InventoryItemRoleFilterSet + + @classmethod + def setUpTestData(cls): + + roles = ( + InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1', color='ff0000'), + InventoryItemRole(name='Inventory Item Role 2', slug='inventory-item-role-2', color='00ff00'), + InventoryItemRole(name='Inventory Item Role 3', slug='inventory-item-role-3', color='0000ff'), + ) + InventoryItemRole.objects.bulk_create(roles) + + def test_name(self): + params = {'name': ['Inventory Item Role 1', 'Inventory Item Role 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_slug(self): + params = {'slug': ['inventory-item-role-1', 'inventory-item-role-2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_color(self): + params = {'color': ['ff0000', '00ff00']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class VirtualChassisTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = VirtualChassis.objects.all() filterset = VirtualChassisFilterSet diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 12216a8ac3d..3ac7b9c7211 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -1408,7 +1408,7 @@ class DeviceRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase): tags = create_tags('Alpha', 'Bravo', 'Charlie') cls.form_data = { - 'name': 'Devie Role X', + 'name': 'Device Role X', 'slug': 'device-role-x', 'color': 'c0c0c0', 'vm_role': False, @@ -2375,6 +2375,41 @@ class InventoryItemTestCase(ViewTestCases.DeviceComponentViewTestCase): ) +class InventoryItemRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase): + model = InventoryItemRole + + @classmethod + def setUpTestData(cls): + + InventoryItemRole.objects.bulk_create([ + InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1'), + InventoryItemRole(name='Inventory Item Role 2', slug='inventory-item-role-2'), + InventoryItemRole(name='Inventory Item Role 3', slug='inventory-item-role-3'), + ]) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Inventory Item Role X', + 'slug': 'inventory-item-role-x', + 'color': 'c0c0c0', + 'description': 'New inventory item role', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,slug,color", + "Inventory Item Role 4,inventory-item-role-4,ff0000", + "Inventory Item Role 5,inventory-item-role-5,00ff00", + "Inventory Item Role 6,inventory-item-role-6,0000ff", + ) + + cls.bulk_edit_data = { + 'color': '00ff00', + '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 8ec30c0ccb1..d45ce75770e 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -425,6 +425,17 @@ urlpatterns = [ path('inventory-items//changelog/', ObjectChangeLogView.as_view(), name='inventoryitem_changelog', kwargs={'model': InventoryItem}), path('devices/inventory-items/add/', views.DeviceBulkAddInventoryItemView.as_view(), name='device_bulk_add_inventoryitem'), + # Device roles + path('inventory-item-roles/', views.InventoryItemRoleListView.as_view(), name='inventoryitemrole_list'), + path('inventory-item-roles/add/', views.InventoryItemRoleEditView.as_view(), name='inventoryitemrole_add'), + path('inventory-item-roles/import/', views.InventoryItemRoleBulkImportView.as_view(), name='inventoryitemrole_import'), + path('inventory-item-roles/edit/', views.InventoryItemRoleBulkEditView.as_view(), name='inventoryitemrole_bulk_edit'), + path('inventory-item-roles/delete/', views.InventoryItemRoleBulkDeleteView.as_view(), name='inventoryitemrole_bulk_delete'), + path('inventory-item-roles//', views.InventoryItemRoleView.as_view(), name='inventoryitemrole'), + path('inventory-item-roles//edit/', views.InventoryItemRoleEditView.as_view(), name='inventoryitemrole_edit'), + path('inventory-item-roles//delete/', views.InventoryItemRoleDeleteView.as_view(), name='inventoryitemrole_delete'), + path('inventory-item-roles//changelog/', ObjectChangeLogView.as_view(), name='inventoryitemrole_changelog', kwargs={'model': InventoryItemRole}), + # Cables path('cables/', views.CableListView.as_view(), name='cable_list'), path('cables/import/', views.CableBulkImportView.as_view(), name='cable_import'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 5aff57a4e7f..8e3d35b3e6b 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2428,6 +2428,59 @@ class InventoryItemBulkDeleteView(generic.BulkDeleteView): template_name = 'dcim/inventoryitem_bulk_delete.html' +# +# Inventory item roles +# + +class InventoryItemRoleListView(generic.ObjectListView): + queryset = InventoryItemRole.objects.annotate( + inventoryitem_count=count_related(InventoryItem, 'role'), + ) + filterset = filtersets.InventoryItemRoleFilterSet + filterset_form = forms.InventoryItemRoleFilterForm + table = tables.InventoryItemRoleTable + + +class InventoryItemRoleView(generic.ObjectView): + queryset = InventoryItemRole.objects.all() + + def get_extra_context(self, request, instance): + return { + 'inventoryitem_count': InventoryItem.objects.filter(role=instance).count(), + } + + +class InventoryItemRoleEditView(generic.ObjectEditView): + queryset = InventoryItemRole.objects.all() + model_form = forms.InventoryItemRoleForm + + +class InventoryItemRoleDeleteView(generic.ObjectDeleteView): + queryset = InventoryItemRole.objects.all() + + +class InventoryItemRoleBulkImportView(generic.BulkImportView): + queryset = InventoryItemRole.objects.all() + model_form = forms.InventoryItemRoleCSVForm + table = tables.InventoryItemRoleTable + + +class InventoryItemRoleBulkEditView(generic.BulkEditView): + queryset = InventoryItemRole.objects.annotate( + inventoryitem_count=count_related(InventoryItem, 'role'), + ) + filterset = filtersets.InventoryItemRoleFilterSet + table = tables.InventoryItemRoleTable + form = forms.InventoryItemRoleBulkEditForm + + +class InventoryItemRoleBulkDeleteView(generic.BulkDeleteView): + queryset = InventoryItemRole.objects.annotate( + inventoryitem_count=count_related(InventoryItem, 'role'), + ) + table = tables.InventoryItemRoleTable + + # # Bulk Device component creation # diff --git a/netbox/netbox/navigation_menu.py b/netbox/netbox/navigation_menu.py index 52359dcc671..3b507627344 100644 --- a/netbox/netbox/navigation_menu.py +++ b/netbox/netbox/navigation_menu.py @@ -166,6 +166,7 @@ DEVICES_MENU = Menu( get_model_item('dcim', 'modulebay', 'Module Bays', actions=['import']), get_model_item('dcim', 'devicebay', 'Device Bays', actions=['import']), get_model_item('dcim', 'inventoryitem', 'Inventory Items', actions=['import']), + get_model_item('dcim', 'inventoryitemrole', 'Inventory Item Roles'), ), ), ), diff --git a/netbox/templates/dcim/inventoryitemrole.html b/netbox/templates/dcim/inventoryitemrole.html new file mode 100644 index 00000000000..f750d74ce00 --- /dev/null +++ b/netbox/templates/dcim/inventoryitemrole.html @@ -0,0 +1,53 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load render_table from django_tables2 %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block content %} +
    +
    +
    +
    Inventory Item Role
    +
    +
    Permitted VIDs{{ object.min_vid }} - {{ object.max_vid }}
    VLANs From a03ae295f6415135bf025c429c5e5ac2c9bd4b40 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 23 Dec 2021 11:39:56 -0500 Subject: [PATCH 038/271] Update release notes --- docs/release-notes/version-3.2.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 693335ae9db..b4a20900761 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -41,6 +41,7 @@ FIELD_CHOICES = { ### Enhancements * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation +* [#7759](https://github.com/netbox-community/netbox/issues/7759) - Improved the user preferences form * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group ### Other Changes @@ -52,6 +53,25 @@ FIELD_CHOICES = { ### REST API Changes +* Added the following endpoints for modules & module types: + * `/api/dcim/modules/` + * `/api/dcim/module-bays/` + * `/api/dcim/module-bay-templates/` + * `/api/dcim/module-types/` +* dcim.ConsolePort + * Added `module` field +* dcim.ConsoleServerPort + * Added `module` field +* dcim.FrontPort + * Added `module` field +* dcim.Interface + * Added `module` field +* dcim.PowerPort + * Added `module` field +* dcim.PowerOutlet + * Added `module` field +* dcim.RearPort + * Added `module` field * dcim.Site * Removed the `asn`, `contact_name`, `contact_phone`, and `contact_email` fields * ipam.VLANGroup From bffd22038b005fc4bce8cafb7ac543ab246dd7de Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 23 Dec 2021 13:50:01 -0500 Subject: [PATCH 039/271] Closes #7681: Add service_id field for provider networks --- docs/models/circuits/providernetwork.md | 2 +- docs/release-notes/version-3.2.md | 3 +++ netbox/circuits/api/serializers.py | 4 ++-- netbox/circuits/filtersets.py | 3 ++- netbox/circuits/forms/bulk_edit.py | 8 ++++++-- netbox/circuits/forms/bulk_import.py | 2 +- netbox/circuits/forms/filtersets.py | 4 ++++ netbox/circuits/forms/models.py | 4 ++-- .../migrations/0032_provider_service_id.py | 16 ++++++++++++++++ netbox/circuits/models/providers.py | 6 +++++- netbox/circuits/tables.py | 4 ++-- netbox/templates/circuits/providernetwork.html | 4 ++++ 12 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 netbox/circuits/migrations/0032_provider_service_id.py diff --git a/docs/models/circuits/providernetwork.md b/docs/models/circuits/providernetwork.md index f5a428e96e5..42c46e13c98 100644 --- a/docs/models/circuits/providernetwork.md +++ b/docs/models/circuits/providernetwork.md @@ -2,4 +2,4 @@ This model can be used to represent the boundary of a provider network, the details of which are unknown or unimportant to the NetBox user. For example, it might represent a provider's regional MPLS network to which multiple circuits provide connectivity. -Each provider network must be assigned to a provider. A circuit may terminate to either a provider network or to a site. +Each provider network must be assigned to a provider, and may optionally be assigned an arbitrary service ID. A circuit may terminate to either a provider network or to a site. diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index b4a20900761..2944b5ee982 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -41,6 +41,7 @@ FIELD_CHOICES = { ### Enhancements * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation +* [#7681](https://github.com/netbox-community/netbox/issues/7681) - Add `service_id` field for provider networks * [#7759](https://github.com/netbox-community/netbox/issues/7759) - Improved the user preferences form * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group @@ -58,6 +59,8 @@ FIELD_CHOICES = { * `/api/dcim/module-bays/` * `/api/dcim/module-bay-templates/` * `/api/dcim/module-types/` +* circuits.ProviderNetwork + * Added `service_id` field * dcim.ConsolePort * Added `module` field * dcim.ConsoleServerPort diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index 470a0b03090..7a827d547f1 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -37,8 +37,8 @@ class ProviderNetworkSerializer(PrimaryModelSerializer): class Meta: model = ProviderNetwork fields = [ - 'id', 'url', 'display', 'provider', 'name', 'description', 'comments', 'tags', 'custom_fields', 'created', - 'last_updated', + 'id', 'url', 'display', 'provider', 'name', 'service_id', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ] diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index fd582dd99c4..0a90116bdc6 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -98,13 +98,14 @@ class ProviderNetworkFilterSet(PrimaryModelFilterSet): class Meta: model = ProviderNetwork - fields = ['id', 'name'] + fields = ['id', 'name', 'service_id'] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(name__icontains=value) | + Q(service_id__icontains=value) | Q(description__icontains=value) | Q(comments__icontains=value) ).distinct() diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 37edd3a6245..af6bca91fb5 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -62,10 +62,14 @@ class ProviderNetworkBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditFor queryset=Provider.objects.all(), required=False ) - description = forms.CharField( + service_id = forms.CharField( max_length=100, required=False ) + description = forms.CharField( + max_length=200, + required=False + ) comments = CommentField( widget=SmallTextarea, label='Comments' @@ -73,7 +77,7 @@ class ProviderNetworkBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditFor class Meta: nullable_fields = [ - 'description', 'comments', + 'service_id', 'description', 'comments', ] diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index af5ec442597..fe1b927e52f 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -32,7 +32,7 @@ class ProviderNetworkCSVForm(CustomFieldModelCSVForm): class Meta: model = ProviderNetwork fields = [ - 'provider', 'name', 'description', 'comments', + 'provider', 'name', 'service_id', 'description', 'comments', ] diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 0822ff206a6..68b57e03c31 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -64,6 +64,10 @@ class ProviderNetworkFilterForm(CustomFieldModelFilterForm): label=_('Provider'), fetch_trigger='open' ) + service_id = forms.CharField( + max_length=100, + required=False + ) tag = TagFilterField(model) diff --git a/netbox/circuits/forms/models.py b/netbox/circuits/forms/models.py index 2ea246fd078..f67114828ee 100644 --- a/netbox/circuits/forms/models.py +++ b/netbox/circuits/forms/models.py @@ -66,10 +66,10 @@ class ProviderNetworkForm(CustomFieldModelForm): class Meta: model = ProviderNetwork fields = [ - 'provider', 'name', 'description', 'comments', 'tags', + 'provider', 'name', 'service_id', 'description', 'comments', 'tags', ] fieldsets = ( - ('Provider Network', ('provider', 'name', 'description', 'tags')), + ('Provider Network', ('provider', 'name', 'service_id', 'description', 'tags')), ) diff --git a/netbox/circuits/migrations/0032_provider_service_id.py b/netbox/circuits/migrations/0032_provider_service_id.py new file mode 100644 index 00000000000..91410bd964c --- /dev/null +++ b/netbox/circuits/migrations/0032_provider_service_id.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0004_rename_cable_peer'), + ] + + operations = [ + migrations.AddField( + model_name='providernetwork', + name='service_id', + field=models.CharField(blank=True, max_length=100), + ), + ] diff --git a/netbox/circuits/models/providers.py b/netbox/circuits/models/providers.py index b3a6902f917..153e241a734 100644 --- a/netbox/circuits/models/providers.py +++ b/netbox/circuits/models/providers.py @@ -5,7 +5,6 @@ from django.urls import reverse from dcim.fields import ASNField from extras.utils import extras_features from netbox.models import PrimaryModel -from utilities.querysets import RestrictedQuerySet __all__ = ( 'ProviderNetwork', @@ -87,6 +86,11 @@ class ProviderNetwork(PrimaryModel): on_delete=models.PROTECT, related_name='networks' ) + service_id = models.CharField( + max_length=100, + blank=True, + verbose_name='Service ID' + ) description = models.CharField( max_length=200, blank=True diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 86a55eba5e1..32c40f26985 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -69,8 +69,8 @@ class ProviderNetworkTable(BaseTable): class Meta(BaseTable.Meta): model = ProviderNetwork - fields = ('pk', 'id', 'name', 'provider', 'description', 'comments', 'tags') - default_columns = ('pk', 'name', 'provider', 'description') + fields = ('pk', 'id', 'name', 'provider', 'service_id', 'description', 'comments', 'tags') + default_columns = ('pk', 'name', 'provider', 'service_id', 'description') # diff --git a/netbox/templates/circuits/providernetwork.html b/netbox/templates/circuits/providernetwork.html index 970cd4a543d..d1c513f98ea 100644 --- a/netbox/templates/circuits/providernetwork.html +++ b/netbox/templates/circuits/providernetwork.html @@ -28,6 +28,10 @@ Name {{ object.name }}
    Service ID{{ object.service_id|placeholder }}
    Description {{ object.description|placeholder }}
    + + + + + + + + + + + + + + + + +
    Name{{ object.name }}
    Description{{ object.description|placeholder }}
    Color +   +
    Inventory Items + {{ inventoryitem_count }} +
    +
    +
    + {% include 'inc/panels/tags.html' %} + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} From 6e9afccfd79363d9862c4a99aff0e477c3b27e45 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 27 Dec 2021 10:45:33 -0500 Subject: [PATCH 042/271] #8037: Add role field to InventoryItem --- docs/models/dcim/inventoryitem.md | 2 +- netbox/dcim/api/serializers.py | 3 +- netbox/dcim/filtersets.py | 10 +++++ netbox/dcim/forms/bulk_create.py | 6 +-- netbox/dcim/forms/bulk_edit.py | 8 +++- netbox/dcim/forms/bulk_import.py | 8 +++- netbox/dcim/forms/filtersets.py | 6 +++ netbox/dcim/forms/models.py | 8 +++- netbox/dcim/forms/object_create.py | 14 +++--- netbox/dcim/models/device_components.py | 16 +++---- netbox/dcim/tables/devices.py | 56 ++++++++++++------------ netbox/dcim/tests/test_api.py | 15 +++++-- netbox/dcim/tests/test_filtersets.py | 21 +++++++-- netbox/dcim/tests/test_views.py | 15 +++++-- netbox/dcim/views.py | 4 +- netbox/templates/dcim/inventoryitem.html | 14 ++++-- 16 files changed, 141 insertions(+), 65 deletions(-) diff --git a/docs/models/dcim/inventoryitem.md b/docs/models/dcim/inventoryitem.md index 237bad92cdf..f9837183392 100644 --- a/docs/models/dcim/inventoryitem.md +++ b/docs/models/dcim/inventoryitem.md @@ -2,6 +2,6 @@ Inventory items represent hardware components installed within a device, such as a power supply or CPU or line card. Inventory items are distinct from other device components in that they cannot be templatized on a device type, and cannot be connected by cables. They are intended to be used primarily for inventory purposes. -Each inventory item can be assigned a manufacturer, part ID, serial number, and asset tag (all optional). A boolean toggle is also provided to indicate whether each item was entered manually or discovered automatically (by some process outside of NetBox). +Each inventory item can be assigned a functional role, manufacturer, part ID, serial number, and asset tag (all optional). A boolean toggle is also provided to indicate whether each item was entered manually or discovered automatically (by some process outside of NetBox). Inventory items are hierarchical in nature, such that any individual item may be designated as the parent for other items. For example, an inventory item might be created to represent a line card which houses several SFP optics, each of which exists as a child item within the device. diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index fe84874111a..5e07ea3fd0e 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -811,12 +811,13 @@ class InventoryItemSerializer(PrimaryModelSerializer): device = NestedDeviceSerializer() parent = serializers.PrimaryKeyRelatedField(queryset=InventoryItem.objects.all(), allow_null=True, default=None) manufacturer = NestedManufacturerSerializer(required=False, allow_null=True, default=None) + role = NestedInventoryItemRoleSerializer(required=False, allow_null=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = InventoryItem fields = [ - 'id', 'url', 'display', 'device', 'parent', 'name', 'label', 'manufacturer', 'part_id', 'serial', + 'id', 'url', 'display', 'device', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', 'description', 'tags', 'custom_fields', 'created', 'last_updated', '_depth', ] diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 5f4840fdee9..01c0a278d21 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1284,6 +1284,16 @@ class InventoryItemFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): to_field_name='slug', label='Manufacturer (slug)', ) + role_id = django_filters.ModelMultipleChoiceFilter( + queryset=InventoryItemRole.objects.all(), + label='Role (ID)', + ) + role = django_filters.ModelMultipleChoiceFilter( + field_name='role__slug', + queryset=InventoryItemRole.objects.all(), + to_field_name='slug', + label='Role (slug)', + ) serial = django_filters.CharFilter( lookup_expr='iexact' ) diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py index 8eae46111e0..e78e0ee19af 100644 --- a/netbox/dcim/forms/bulk_create.py +++ b/netbox/dcim/forms/bulk_create.py @@ -107,11 +107,11 @@ class DeviceBayBulkCreateForm(DeviceBulkAddComponentForm): class InventoryItemBulkCreateForm( - form_from_model(InventoryItem, ['manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered']), + form_from_model(InventoryItem, ['role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered']), DeviceBulkAddComponentForm ): model = InventoryItem field_order = ( - 'name_pattern', 'label_pattern', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', 'description', - 'tags', + 'name_pattern', 'label_pattern', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', + 'description', 'tags', ) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 8fc8835cbc0..93a90a1cb6a 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -1172,7 +1172,7 @@ class DeviceBayBulkEditForm( class InventoryItemBulkEditForm( - form_from_model(InventoryItem, ['label', 'manufacturer', 'part_id', 'description']), + form_from_model(InventoryItem, ['label', 'role', 'manufacturer', 'part_id', 'description']), AddRemoveTagsForm, CustomFieldModelBulkEditForm ): @@ -1180,13 +1180,17 @@ class InventoryItemBulkEditForm( queryset=InventoryItem.objects.all(), widget=forms.MultipleHiddenInput() ) + role = DynamicModelChoiceField( + queryset=InventoryItemRole.objects.all(), + required=False + ) manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False ) class Meta: - nullable_fields = ['label', 'manufacturer', 'part_id', 'description'] + nullable_fields = ['label', 'role', 'manufacturer', 'part_id', 'description'] # diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 40838c60ca1..1297fc98024 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -772,6 +772,11 @@ class InventoryItemCSVForm(CustomFieldModelCSVForm): queryset=Device.objects.all(), to_field_name='name' ) + role = CSVModelChoiceField( + queryset=InventoryItemRole.objects.all(), + to_field_name='name', + required=False + ) manufacturer = CSVModelChoiceField( queryset=Manufacturer.objects.all(), to_field_name='name', @@ -787,7 +792,8 @@ class InventoryItemCSVForm(CustomFieldModelCSVForm): class Meta: model = InventoryItem fields = ( - 'device', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', 'description', + 'device', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', + 'description', ) def __init__(self, *args, **kwargs): diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index ae58e1d2f15..c12891dc368 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -1100,6 +1100,12 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): ['name', 'label', 'manufacturer_id', 'serial', 'asset_tag', 'discovered'], ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], ] + role_id = DynamicModelMultipleChoiceField( + queryset=InventoryItemRole.objects.all(), + required=False, + label=_('Role'), + fetch_trigger='open' + ) manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index b5b15e731b8..2be571f71eb 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1368,6 +1368,10 @@ class InventoryItemForm(CustomFieldModelForm): 'device_id': '$device' } ) + role = DynamicModelChoiceField( + queryset=InventoryItemRole.objects.all(), + required=False + ) manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False @@ -1380,8 +1384,8 @@ class InventoryItemForm(CustomFieldModelForm): class Meta: model = InventoryItem fields = [ - 'device', 'parent', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', - 'tags', + 'device', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', + 'description', 'tags', ] diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 681a17a5aa9..9e208300b2d 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -652,10 +652,6 @@ class DeviceBayCreateForm(ComponentCreateForm): class InventoryItemCreateForm(ComponentCreateForm): model = InventoryItem - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) parent = DynamicModelChoiceField( queryset=InventoryItem.objects.all(), required=False, @@ -663,6 +659,14 @@ class InventoryItemCreateForm(ComponentCreateForm): 'device_id': '$device' } ) + role = DynamicModelChoiceField( + queryset=InventoryItemRole.objects.all(), + required=False + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) part_id = forms.CharField( max_length=50, required=False, @@ -677,6 +681,6 @@ class InventoryItemCreateForm(ComponentCreateForm): required=False, ) field_order = ( - 'device', 'parent', 'name_pattern', 'label_pattern', 'manufacturer', 'part_id', 'serial', 'asset_tag', + 'device', 'parent', 'name_pattern', 'label_pattern', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'tags', ) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 5329c9e0120..cb38d86830a 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -994,6 +994,13 @@ class InventoryItem(MPTTModel, ComponentModel): null=True, db_index=True ) + role = models.ForeignKey( + to='dcim.InventoryItemRole', + on_delete=models.PROTECT, + related_name='inventory_items', + blank=True, + null=True + ) manufacturer = models.ForeignKey( to='dcim.Manufacturer', on_delete=models.PROTECT, @@ -1007,13 +1014,6 @@ class InventoryItem(MPTTModel, ComponentModel): blank=True, help_text='Manufacturer-assigned part identifier' ) - role = models.ForeignKey( - to='dcim.InventoryItemRole', - on_delete=models.PROTECT, - related_name='inventory_items', - blank=True, - null=True - ) serial = models.CharField( max_length=50, verbose_name='Serial number', @@ -1034,7 +1034,7 @@ class InventoryItem(MPTTModel, ComponentModel): objects = TreeManager() - clone_fields = ['device', 'parent', 'manufacturer', 'part_id', 'role'] + clone_fields = ['device', 'parent', 'role', 'manufacturer', 'part_id'] class Meta: ordering = ('device__id', 'parent__id', '_name') diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index f889d52ec37..9472be541cb 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -774,6 +774,9 @@ class InventoryItemTable(DeviceComponentTable): 'args': [Accessor('device_id')], } ) + role = tables.Column( + linkify=True + ) manufacturer = tables.Column( linkify=True ) @@ -786,10 +789,33 @@ class InventoryItemTable(DeviceComponentTable): class Meta(BaseTable.Meta): model = InventoryItem fields = ( - 'pk', 'id', 'name', 'device', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', - 'discovered', 'tags', + 'pk', 'id', 'name', 'device', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', + 'description', 'discovered', 'tags', + ) + default_columns = ('pk', 'name', 'device', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag') + + +class DeviceInventoryItemTable(InventoryItemTable): + name = tables.TemplateColumn( + template_code='' + '{{ value }}', + order_by=Accessor('_name'), + attrs={'td': {'class': 'text-nowrap'}} + ) + actions = ButtonsColumn( + model=InventoryItem, + buttons=('edit', 'delete') + ) + + class Meta(BaseTable.Meta): + model = InventoryItem + fields = ( + 'pk', 'id', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', + 'discovered', 'tags', 'actions', + ) + default_columns = ( + 'pk', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'actions', ) - default_columns = ('pk', 'name', 'device', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag') class InventoryItemRoleTable(BaseTable): @@ -816,30 +842,6 @@ class InventoryItemRoleTable(BaseTable): default_columns = ('pk', 'name', 'inventoryitem_count', 'color', 'description', 'actions') -class DeviceInventoryItemTable(InventoryItemTable): - name = tables.TemplateColumn( - template_code='' - '{{ value }}', - order_by=Accessor('_name'), - attrs={'td': {'class': 'text-nowrap'}} - ) - actions = ButtonsColumn( - model=InventoryItem, - buttons=('edit', 'delete') - ) - - class Meta(BaseTable.Meta): - model = InventoryItem - fields = ( - 'pk', 'id', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'discovered', - 'tags', 'actions', - ) - default_columns = ( - 'pk', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'discovered', - 'actions', - ) - - # # Virtual chassis # diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index a6c7760f4e8..e6ea1049975 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1626,24 +1626,33 @@ class InventoryItemTest(APIViewTestCases.APIViewTestCase): devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) - InventoryItem.objects.create(device=device, name='Inventory Item 1', manufacturer=manufacturer) - InventoryItem.objects.create(device=device, name='Inventory Item 2', manufacturer=manufacturer) - InventoryItem.objects.create(device=device, name='Inventory Item 3', manufacturer=manufacturer) + roles = ( + InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1'), + InventoryItemRole(name='Inventory Item Role 2', slug='inventory-item-role-2'), + ) + InventoryItemRole.objects.bulk_create(roles) + + InventoryItem.objects.create(device=device, name='Inventory Item 1', role=roles[0], manufacturer=manufacturer) + InventoryItem.objects.create(device=device, name='Inventory Item 2', role=roles[0], manufacturer=manufacturer) + InventoryItem.objects.create(device=device, name='Inventory Item 3', role=roles[0], manufacturer=manufacturer) cls.create_data = [ { 'device': device.pk, 'name': 'Inventory Item 4', + 'role': roles[1].pk, 'manufacturer': manufacturer.pk, }, { 'device': device.pk, 'name': 'Inventory Item 5', + 'role': roles[1].pk, 'manufacturer': manufacturer.pk, }, { 'device': device.pk, 'name': 'Inventory Item 6', + 'role': roles[1].pk, 'manufacturer': manufacturer.pk, }, ] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index f93e9164d22..a808aeda2a0 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -2949,7 +2949,6 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests): @classmethod def setUpTestData(cls): - manufacturers = ( Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), @@ -2998,10 +2997,17 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests): ) Device.objects.bulk_create(devices) + roles = ( + InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1'), + InventoryItemRole(name='Inventory Item Role 2', slug='inventory-item-role-2'), + InventoryItemRole(name='Inventory Item Role 3', slug='inventory-item-role-3'), + ) + InventoryItemRole.objects.bulk_create(roles) + inventory_items = ( - InventoryItem(device=devices[0], manufacturer=manufacturers[0], name='Inventory Item 1', label='A', part_id='1001', serial='ABC', asset_tag='1001', discovered=True, description='First'), - InventoryItem(device=devices[1], manufacturer=manufacturers[1], name='Inventory Item 2', label='B', part_id='1002', serial='DEF', asset_tag='1002', discovered=True, description='Second'), - InventoryItem(device=devices[2], manufacturer=manufacturers[2], name='Inventory Item 3', label='C', part_id='1003', serial='GHI', asset_tag='1003', discovered=False, description='Third'), + InventoryItem(device=devices[0], role=roles[0], manufacturer=manufacturers[0], name='Inventory Item 1', label='A', part_id='1001', serial='ABC', asset_tag='1001', discovered=True, description='First'), + InventoryItem(device=devices[1], role=roles[1], manufacturer=manufacturers[1], name='Inventory Item 2', label='B', part_id='1002', serial='DEF', asset_tag='1002', discovered=True, description='Second'), + InventoryItem(device=devices[2], role=roles[2], manufacturer=manufacturers[2], name='Inventory Item 3', label='C', part_id='1003', serial='GHI', asset_tag='1003', discovered=False, description='Third'), ) for i in inventory_items: i.save() @@ -3077,6 +3083,13 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'parent_id': [parent_items[0].pk, parent_items[1].pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_role(self): + roles = InventoryItemRole.objects.all()[:2] + params = {'role_id': [roles[0].pk, roles[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'role': [roles[0].slug, roles[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_manufacturer(self): manufacturers = Manufacturer.objects.all()[:2] params = {'manufacturer_id': [manufacturers[0].pk, manufacturers[1].pk]} diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 3ac7b9c7211..8f077df92b0 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -2331,14 +2331,21 @@ class InventoryItemTestCase(ViewTestCases.DeviceComponentViewTestCase): device = create_test_device('Device 1') manufacturer, _ = Manufacturer.objects.get_or_create(name='Manufacturer 1', slug='manufacturer-1') - InventoryItem.objects.create(device=device, name='Inventory Item 1') - InventoryItem.objects.create(device=device, name='Inventory Item 2') - InventoryItem.objects.create(device=device, name='Inventory Item 3') + roles = ( + InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1'), + InventoryItemRole(name='Inventory Item Role 2', slug='inventory-item-role-2'), + ) + InventoryItemRole.objects.bulk_create(roles) + + InventoryItem.objects.create(device=device, name='Inventory Item 1', role=roles[0], manufacturer=manufacturer) + InventoryItem.objects.create(device=device, name='Inventory Item 2', role=roles[0], manufacturer=manufacturer) + InventoryItem.objects.create(device=device, name='Inventory Item 3', role=roles[0], manufacturer=manufacturer) tags = create_tags('Alpha', 'Bravo', 'Charlie') cls.form_data = { 'device': device.pk, + 'role': roles[1].pk, 'manufacturer': manufacturer.pk, 'name': 'Inventory Item X', 'parent': None, @@ -2353,6 +2360,7 @@ class InventoryItemTestCase(ViewTestCases.DeviceComponentViewTestCase): cls.bulk_create_data = { 'device': device.pk, 'name_pattern': 'Inventory Item [4-6]', + 'role': roles[1].pk, 'manufacturer': manufacturer.pk, 'parent': None, 'discovered': False, @@ -2363,6 +2371,7 @@ class InventoryItemTestCase(ViewTestCases.DeviceComponentViewTestCase): } cls.bulk_edit_data = { + 'role': roles[1].pk, 'part_id': '123456', 'description': 'New description', } diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 8e3d35b3e6b..bfa2fecae82 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2412,7 +2412,7 @@ class InventoryItemBulkImportView(generic.BulkImportView): class InventoryItemBulkEditView(generic.BulkEditView): - queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer') + queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer', 'role') filterset = filtersets.InventoryItemFilterSet table = tables.InventoryItemTable form = forms.InventoryItemBulkEditForm @@ -2423,7 +2423,7 @@ class InventoryItemBulkRenameView(generic.BulkRenameView): class InventoryItemBulkDeleteView(generic.BulkDeleteView): - queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer') + queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer', 'role') table = tables.InventoryItemTable template_name = 'dcim/inventoryitem_bulk_delete.html' diff --git a/netbox/templates/dcim/inventoryitem.html b/netbox/templates/dcim/inventoryitem.html index 36ba0469f89..7de30365602 100644 --- a/netbox/templates/dcim/inventoryitem.html +++ b/netbox/templates/dcim/inventoryitem.html @@ -13,9 +13,7 @@
    -
    - Inventory Item -
    +
    Inventory Item
    @@ -42,6 +40,16 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% endif %} +
    Label {{ object.label|placeholder }}
    Role + {% if object.role %} + {{ object.role }} + {% else %} + + {% endif %} +
    Manufacturer From a748083f2606b28baf9ed2cf2a9c4e48d92480bd Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 27 Dec 2021 10:52:04 -0500 Subject: [PATCH 043/271] Changelog for #3087 --- docs/release-notes/version-3.2.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index f35100c7286..608a436a16e 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -18,6 +18,10 @@ A new REST API endpoint has been added at `/api/ipam/vlan-groups//available-vlans/`. A GET request to this endpoint will return a list of available VLANs within the group. A POST request can be made to this endpoint specifying the name(s) of one or more VLANs to create within the group, and their VLAN IDs will be assigned automatically. +#### Inventory Item Roles ([#3087](https://github.com/netbox-community/netbox/issues/3087)) + +A new model has been introduced to represent function roles for inventory items, similar to device roles. The assignment of roles to inventory items is optional. + #### Modules & Module Types ([#7844](https://github.com/netbox-community/netbox/issues/7844)) Several new models have been added to support field-replaceable device modules, such as those within a chassis-based switch or router. Similar to devices, each module is instantiated from a user-defined module type, and can have components associated with it. These components become available to the parent device once the module has been installed within a module bay. This makes it very convenient to replicate the addition and deletion of device components as modules are installed and removed. @@ -55,7 +59,8 @@ FIELD_CHOICES = { ### REST API Changes -* Added the following endpoints for modules & module types: +* Added the following endpoints: + * `/api/dcim/inventory-item-roles/` * `/api/dcim/modules/` * `/api/dcim/module-bays/` * `/api/dcim/module-bay-templates/` @@ -70,6 +75,8 @@ FIELD_CHOICES = { * Added `module` field * dcim.Interface * Added `module` field +* dcim.InventoryItem + * Added `role` field * dcim.PowerPort * Added `module` field * dcim.PowerOutlet From 99d5013de30330a2c943ddb0e3030db0e49f6258 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 27 Dec 2021 13:26:17 -0500 Subject: [PATCH 044/271] Initial work on #7846 --- netbox/dcim/api/serializers.py | 19 +++++++++++++-- netbox/dcim/constants.py | 21 ++++++++++++++--- netbox/dcim/filtersets.py | 2 ++ netbox/dcim/forms/models.py | 20 +++++++++++++--- netbox/dcim/forms/object_create.py | 16 ++++++++++--- .../0147_inventoryitem_component.py | 23 +++++++++++++++++++ netbox/dcim/models/device_components.py | 22 ++++++++++++++++++ netbox/dcim/tables/devices.py | 15 ++++++++---- netbox/dcim/tests/test_api.py | 19 ++++++++++++--- netbox/dcim/tests/test_filtersets.py | 16 ++++++++++--- netbox/templates/dcim/inventoryitem.html | 10 ++++++++ 11 files changed, 161 insertions(+), 22 deletions(-) create mode 100644 netbox/dcim/migrations/0147_inventoryitem_component.py diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 5e07ea3fd0e..30f451e8458 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -810,17 +810,32 @@ class InventoryItemSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') device = NestedDeviceSerializer() parent = serializers.PrimaryKeyRelatedField(queryset=InventoryItem.objects.all(), allow_null=True, default=None) - manufacturer = NestedManufacturerSerializer(required=False, allow_null=True, default=None) role = NestedInventoryItemRoleSerializer(required=False, allow_null=True) + manufacturer = NestedManufacturerSerializer(required=False, allow_null=True, default=None) + component_type = ContentTypeField( + queryset=ContentType.objects.filter(MODULAR_COMPONENT_MODELS), + required=False, + allow_null=True + ) + component = serializers.SerializerMethodField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = InventoryItem fields = [ 'id', 'url', 'display', 'device', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', - 'asset_tag', 'discovered', 'description', 'tags', 'custom_fields', 'created', 'last_updated', '_depth', + 'asset_tag', 'discovered', 'description', 'component_type', 'component_id', 'component', 'tags', + 'custom_fields', 'created', 'last_updated', '_depth', ] + @swagger_serializer_method(serializer_or_field=serializers.DictField) + def get_component(self, obj): + if obj.component is None: + return None + serializer = get_serializer_for_model(obj.component, prefix='Nested') + context = {'request': self.context['request']} + return serializer(obj.component, context=context).data + # # Device component roles diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index 2136f06aab5..00126ebf82c 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -50,16 +50,31 @@ NONCONNECTABLE_IFACE_TYPES = VIRTUAL_IFACE_TYPES + WIRELESS_IFACE_TYPES # -# PowerFeeds +# Power feeds # POWERFEED_VOLTAGE_DEFAULT = 120 - POWERFEED_AMPERAGE_DEFAULT = 20 - POWERFEED_MAX_UTILIZATION_DEFAULT = 80 # Percentage +# +# Device components +# + +MODULAR_COMPONENT_MODELS = Q( + app_label='dcim', + model__in=( + 'consoleport', + 'consoleserverport', + 'frontport', + 'interface', + 'poweroutlet', + 'powerport', + 'rearport', + )) + + # # Cabling and connections # diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 01c0a278d21..14a2ae3eea7 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1294,6 +1294,8 @@ class InventoryItemFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): to_field_name='slug', label='Role (slug)', ) + component_type = ContentTypeFilter() + component_id = MultiValueNumberFilter() serial = django_filters.CharFilter( lookup_expr='iexact' ) diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 2be571f71eb..b193f76d5d5 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -12,8 +12,8 @@ from extras.models import Tag from ipam.models import IPAddress, VLAN, VLANGroup, ASN from tenancy.forms import TenancyForm from utilities.forms import ( - APISelect, add_blank_choice, BootstrapMixin, ClearableFileInput, CommentField, DynamicModelChoiceField, - DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SelectWithPK, SmallTextarea, + APISelect, add_blank_choice, BootstrapMixin, ClearableFileInput, CommentField, ContentTypeChoiceField, + DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SelectWithPK, SmallTextarea, SlugField, StaticSelect, ) from virtualization.models import Cluster, ClusterGroup @@ -1376,6 +1376,15 @@ class InventoryItemForm(CustomFieldModelForm): queryset=Manufacturer.objects.all(), required=False ) + component_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=MODULAR_COMPONENT_MODELS, + required=False, + widget=StaticSelect + ) + component_id = forms.IntegerField( + required=False + ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1385,8 +1394,13 @@ class InventoryItemForm(CustomFieldModelForm): model = InventoryItem fields = [ 'device', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', - 'description', 'tags', + 'description', 'component_type', 'component_id', 'tags', ] + fieldsets = ( + ('Inventory Item', ('device', 'parent', 'name', 'label', 'role', 'description', 'tags')), + ('Hardware', ('manufacturer', 'part_id', 'serial', 'asset_tag')), + ('Component', ('component_type', 'component_id')), + ) # diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 9e208300b2d..03c48886556 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -1,4 +1,5 @@ from django import forms +from django.contrib.contenttypes.models import ContentType from dcim.choices import * from dcim.constants import * @@ -7,8 +8,8 @@ from extras.forms import CustomFieldModelForm, CustomFieldsMixin from extras.models import Tag from ipam.models import VLAN from utilities.forms import ( - add_blank_choice, BootstrapMixin, ColorField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, - ExpandableNameField, StaticSelect, + add_blank_choice, BootstrapMixin, ColorField, ContentTypeChoiceField, DynamicModelChoiceField, + DynamicModelMultipleChoiceField, ExpandableNameField, StaticSelect, ) from wireless.choices import * from .common import InterfaceCommonForm @@ -680,7 +681,16 @@ class InventoryItemCreateForm(ComponentCreateForm): max_length=50, required=False, ) + component_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=MODULAR_COMPONENT_MODELS, + required=False, + widget=StaticSelect + ) + component_id = forms.IntegerField( + required=False + ) field_order = ( 'device', 'parent', 'name_pattern', 'label_pattern', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', - 'description', 'tags', + 'description', 'component_type', 'component_id', 'tags', ) diff --git a/netbox/dcim/migrations/0147_inventoryitem_component.py b/netbox/dcim/migrations/0147_inventoryitem_component.py new file mode 100644 index 00000000000..36085c35d2b --- /dev/null +++ b/netbox/dcim/migrations/0147_inventoryitem_component.py @@ -0,0 +1,23 @@ +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('dcim', '0146_inventoryitemrole'), + ] + + operations = [ + migrations.AddField( + model_name='inventoryitem', + name='component_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='inventoryitem', + name='component_type', + field=models.ForeignKey(blank=True, limit_choices_to=models.Q(('app_label', 'dcim'), ('model__in', ('consoleport', 'consoleserverport', 'frontport', 'interface', 'poweroutlet', 'powerport', 'rearport'))), null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype'), + ), + ] diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index cb38d86830a..cdfaa7c89ec 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -97,6 +97,12 @@ class ModularComponentModel(ComponentModel): blank=True, null=True ) + inventory_items = GenericRelation( + to='dcim.InventoryItem', + content_type_field='component_type', + object_id_field='component_id', + related_name='%(class)ss', + ) class Meta: abstract = True @@ -994,6 +1000,22 @@ class InventoryItem(MPTTModel, ComponentModel): null=True, db_index=True ) + component_type = models.ForeignKey( + to=ContentType, + limit_choices_to=MODULAR_COMPONENT_MODELS, + on_delete=models.PROTECT, + related_name='+', + blank=True, + null=True + ) + component_id = models.PositiveBigIntegerField( + blank=True, + null=True + ) + component = GenericForeignKey( + ct_field='component_type', + fk_field='component_id' + ) role = models.ForeignKey( to='dcim.InventoryItemRole', on_delete=models.PROTECT, diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 9472be541cb..4eda4a9377a 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -780,6 +780,9 @@ class InventoryItemTable(DeviceComponentTable): manufacturer = tables.Column( linkify=True ) + component = tables.Column( + linkify=True + ) discovered = BooleanColumn() tags = TagColumn( url_name='dcim:inventoryitem_list' @@ -790,9 +793,11 @@ class InventoryItemTable(DeviceComponentTable): model = InventoryItem fields = ( 'pk', 'id', 'name', 'device', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', - 'description', 'discovered', 'tags', + 'component', 'description', 'discovered', 'tags', + ) + default_columns = ( + 'pk', 'name', 'device', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', ) - default_columns = ('pk', 'name', 'device', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag') class DeviceInventoryItemTable(InventoryItemTable): @@ -810,11 +815,11 @@ class DeviceInventoryItemTable(InventoryItemTable): class Meta(BaseTable.Meta): model = InventoryItem fields = ( - 'pk', 'id', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', - 'discovered', 'tags', 'actions', + 'pk', 'id', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'component', + 'description', 'discovered', 'tags', 'actions', ) default_columns = ( - 'pk', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'actions', + 'pk', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'component', 'actions', ) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index e6ea1049975..b3c41e277fd 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1632,9 +1632,16 @@ class InventoryItemTest(APIViewTestCases.APIViewTestCase): ) InventoryItemRole.objects.bulk_create(roles) - InventoryItem.objects.create(device=device, name='Inventory Item 1', role=roles[0], manufacturer=manufacturer) - InventoryItem.objects.create(device=device, name='Inventory Item 2', role=roles[0], manufacturer=manufacturer) - InventoryItem.objects.create(device=device, name='Inventory Item 3', role=roles[0], manufacturer=manufacturer) + interfaces = ( + Interface(device=device, name='Interface 1'), + Interface(device=device, name='Interface 2'), + Interface(device=device, name='Interface 3'), + ) + Interface.objects.bulk_create(interfaces) + + InventoryItem.objects.create(device=device, name='Inventory Item 1', role=roles[0], manufacturer=manufacturer, component=interfaces[0]) + InventoryItem.objects.create(device=device, name='Inventory Item 2', role=roles[0], manufacturer=manufacturer, component=interfaces[1]) + InventoryItem.objects.create(device=device, name='Inventory Item 3', role=roles[0], manufacturer=manufacturer, component=interfaces[2]) cls.create_data = [ { @@ -1642,18 +1649,24 @@ class InventoryItemTest(APIViewTestCases.APIViewTestCase): 'name': 'Inventory Item 4', 'role': roles[1].pk, 'manufacturer': manufacturer.pk, + 'component_type': 'dcim.interface', + 'component_id': interfaces[0].pk, }, { 'device': device.pk, 'name': 'Inventory Item 5', 'role': roles[1].pk, 'manufacturer': manufacturer.pk, + 'component_type': 'dcim.interface', + 'component_id': interfaces[1].pk, }, { 'device': device.pk, 'name': 'Inventory Item 6', 'role': roles[1].pk, 'manufacturer': manufacturer.pk, + 'component_type': 'dcim.interface', + 'component_id': interfaces[2].pk, }, ] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index a808aeda2a0..f53705336b2 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -3004,10 +3004,16 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests): ) InventoryItemRole.objects.bulk_create(roles) + components = ( + Interface.objects.create(device=devices[0], name='Interface 1'), + ConsolePort.objects.create(device=devices[1], name='Console Port 1'), + ConsoleServerPort.objects.create(device=devices[2], name='Console Server Port 1'), + ) + inventory_items = ( - InventoryItem(device=devices[0], role=roles[0], manufacturer=manufacturers[0], name='Inventory Item 1', label='A', part_id='1001', serial='ABC', asset_tag='1001', discovered=True, description='First'), - InventoryItem(device=devices[1], role=roles[1], manufacturer=manufacturers[1], name='Inventory Item 2', label='B', part_id='1002', serial='DEF', asset_tag='1002', discovered=True, description='Second'), - InventoryItem(device=devices[2], role=roles[2], manufacturer=manufacturers[2], name='Inventory Item 3', label='C', part_id='1003', serial='GHI', asset_tag='1003', discovered=False, description='Third'), + InventoryItem(device=devices[0], role=roles[0], manufacturer=manufacturers[0], name='Inventory Item 1', label='A', part_id='1001', serial='ABC', asset_tag='1001', discovered=True, description='First', component=components[0]), + InventoryItem(device=devices[1], role=roles[1], manufacturer=manufacturers[1], name='Inventory Item 2', label='B', part_id='1002', serial='DEF', asset_tag='1002', discovered=True, description='Second', component=components[1]), + InventoryItem(device=devices[2], role=roles[2], manufacturer=manufacturers[2], name='Inventory Item 3', label='C', part_id='1003', serial='GHI', asset_tag='1003', discovered=False, description='Third', component=components[2]), ) for i in inventory_items: i.save() @@ -3103,6 +3109,10 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'serial': 'abc'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_component_type(self): + params = {'component_type': 'dcim.interface'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + class InventoryItemRoleTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = InventoryItemRole.objects.all() diff --git a/netbox/templates/dcim/inventoryitem.html b/netbox/templates/dcim/inventoryitem.html index 7de30365602..0e30c5c8cc3 100644 --- a/netbox/templates/dcim/inventoryitem.html +++ b/netbox/templates/dcim/inventoryitem.html @@ -50,6 +50,16 @@ {% endif %}
    Component + {% if object.component %} + {{ object.component }} + {% else %} + + {% endif %} +
    Manufacturer From a237c01b4b7e75664c180155e8e6689f163c55d3 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 27 Dec 2021 21:04:29 -0500 Subject: [PATCH 045/271] Refactor ComponentCreateView to use separate forms for names/labels and model creation --- netbox/dcim/forms/bulk_create.py | 4 +- netbox/dcim/forms/object_create.py | 588 +------------------ netbox/dcim/tests/test_forms.py | 30 +- netbox/dcim/views.py | 19 - netbox/netbox/views/generic/object_views.py | 35 +- netbox/templates/dcim/component_create.html | 7 + netbox/virtualization/forms/object_create.py | 72 +-- netbox/virtualization/views.py | 2 +- 8 files changed, 49 insertions(+), 708 deletions(-) create mode 100644 netbox/templates/dcim/component_create.html diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py index e78e0ee19af..02c8feb4b0b 100644 --- a/netbox/dcim/forms/bulk_create.py +++ b/netbox/dcim/forms/bulk_create.py @@ -4,7 +4,7 @@ from dcim.models import * from extras.forms import CustomFieldsMixin from extras.models import Tag from utilities.forms import DynamicModelMultipleChoiceField, form_from_model -from .object_create import ComponentForm +from .object_create import ComponentCreateForm __all__ = ( 'ConsolePortBulkCreateForm', @@ -24,7 +24,7 @@ __all__ = ( # Device components # -class DeviceBulkAddComponentForm(CustomFieldsMixin, ComponentForm): +class DeviceBulkAddComponentForm(CustomFieldsMixin, ComponentCreateForm): pk = forms.ModelMultipleChoiceField( queryset=Device.objects.all(), widget=forms.MultipleHiddenInput() diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 03c48886556..8b8c00c6d2a 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -1,44 +1,19 @@ from django import forms -from django.contrib.contenttypes.models import ContentType -from dcim.choices import * -from dcim.constants import * from dcim.models import * -from extras.forms import CustomFieldModelForm, CustomFieldsMixin +from extras.forms import CustomFieldModelForm from extras.models import Tag -from ipam.models import VLAN from utilities.forms import ( - add_blank_choice, BootstrapMixin, ColorField, ContentTypeChoiceField, DynamicModelChoiceField, - DynamicModelMultipleChoiceField, ExpandableNameField, StaticSelect, + BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, ) -from wireless.choices import * -from .common import InterfaceCommonForm __all__ = ( - 'ConsolePortCreateForm', - 'ConsolePortTemplateCreateForm', - 'ConsoleServerPortCreateForm', - 'ConsoleServerPortTemplateCreateForm', - 'DeviceBayCreateForm', - 'DeviceBayTemplateCreateForm', - 'FrontPortCreateForm', - 'FrontPortTemplateCreateForm', - 'InterfaceCreateForm', - 'InterfaceTemplateCreateForm', - 'InventoryItemCreateForm', - 'ModuleBayCreateForm', - 'ModuleBayTemplateCreateForm', - 'PowerOutletCreateForm', - 'PowerOutletTemplateCreateForm', - 'PowerPortCreateForm', - 'PowerPortTemplateCreateForm', - 'RearPortCreateForm', - 'RearPortTemplateCreateForm', + 'ComponentCreateForm', 'VirtualChassisCreateForm', ) -class ComponentForm(BootstrapMixin, forms.Form): +class ComponentCreateForm(BootstrapMixin, forms.Form): """ Subclass this form when facilitating the creation of one or more device component or component templates based on a name pattern. @@ -139,558 +114,3 @@ class VirtualChassisCreateForm(CustomFieldModelForm): member.save() return instance - - -# -# Component templates -# - -class ComponentTemplateCreateForm(ComponentForm): - """ - Base form for the creation of device component templates (subclassed from ComponentTemplateModel). - """ - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - initial_params={ - 'device_types': 'device_type', - 'module_types': 'module_type', - } - ) - device_type = DynamicModelChoiceField( - queryset=DeviceType.objects.all(), - required=False, - query_params={ - 'manufacturer_id': '$manufacturer' - } - ) - description = forms.CharField( - required=False - ) - - -class ModularComponentTemplateCreateForm(ComponentTemplateCreateForm): - module_type = DynamicModelChoiceField( - queryset=ModuleType.objects.all(), - required=False, - query_params={ - 'manufacturer_id': '$manufacturer' - } - ) - - -class ConsolePortTemplateCreateForm(ModularComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - widget=StaticSelect() - ) - field_order = ( - 'manufacturer', 'device_type', 'module_type', 'name_pattern', 'label_pattern', 'type', 'description', - ) - - -class ConsoleServerPortTemplateCreateForm(ModularComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - widget=StaticSelect() - ) - field_order = ( - 'manufacturer', 'device_type', 'module_type', 'name_pattern', 'label_pattern', 'type', 'description', - ) - - -class PowerPortTemplateCreateForm(ModularComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=add_blank_choice(PowerPortTypeChoices), - required=False - ) - maximum_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Maximum power draw (watts)" - ) - allocated_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Allocated power draw (watts)" - ) - field_order = ( - 'manufacturer', 'device_type', 'module_type', 'name_pattern', 'label_pattern', 'type', 'maximum_draw', - 'allocated_draw', 'description', - ) - - -class PowerOutletTemplateCreateForm(ModularComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=add_blank_choice(PowerOutletTypeChoices), - required=False - ) - power_port = DynamicModelChoiceField( - queryset=PowerPortTemplate.objects.all(), - required=False, - query_params={ - 'devicetype_id': '$device_type', - 'moduletype_id': '$module_type', - } - ) - feed_leg = forms.ChoiceField( - choices=add_blank_choice(PowerOutletFeedLegChoices), - required=False, - widget=StaticSelect() - ) - field_order = ( - 'manufacturer', 'device_type', 'module_type', 'name_pattern', 'label_pattern', 'type', 'power_port', 'feed_leg', - 'description', - ) - - -class InterfaceTemplateCreateForm(ModularComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=InterfaceTypeChoices, - widget=StaticSelect() - ) - mgmt_only = forms.BooleanField( - required=False, - label='Management only' - ) - field_order = ( - 'manufacturer', 'device_type', 'module_type', 'name_pattern', 'label_pattern', 'type', 'mgmt_only', - 'description', - ) - - -class FrontPortTemplateCreateForm(ModularComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=PortTypeChoices, - widget=StaticSelect() - ) - color = ColorField( - required=False - ) - rear_port_set = forms.MultipleChoiceField( - choices=[], - label='Rear ports', - help_text='Select one rear port assignment for each front port being created.', - ) - field_order = ( - 'manufacturer', 'device_type', 'module_type', 'name_pattern', 'label_pattern', 'type', 'color', 'rear_port_set', - 'description', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - device_type = DeviceType.objects.get( - pk=self.initial.get('device_type') or self.data.get('device_type') - ) - - # Determine which rear port positions are occupied. These will be excluded from the list of available mappings. - occupied_port_positions = [ - (front_port.rear_port_id, front_port.rear_port_position) - for front_port in device_type.frontporttemplates.all() - ] - - # Populate rear port choices - choices = [] - rear_ports = RearPortTemplate.objects.filter(device_type=device_type) - for rear_port in rear_ports: - for i in range(1, rear_port.positions + 1): - if (rear_port.pk, i) not in occupied_port_positions: - choices.append( - ('{}:{}'.format(rear_port.pk, i), '{}:{}'.format(rear_port.name, i)) - ) - self.fields['rear_port_set'].choices = choices - - def clean(self): - super().clean() - - # Validate that the number of ports being created equals the number of selected (rear port, position) tuples - front_port_count = len(self.cleaned_data['name_pattern']) - rear_port_count = len(self.cleaned_data['rear_port_set']) - if front_port_count != rear_port_count: - raise forms.ValidationError({ - 'rear_port_set': 'The provided name pattern will create {} ports, however {} rear port assignments ' - 'were selected. These counts must match.'.format(front_port_count, rear_port_count) - }) - - def get_iterative_data(self, iteration): - - # Assign rear port and position from selected set - rear_port, position = self.cleaned_data['rear_port_set'][iteration].split(':') - - return { - 'rear_port': int(rear_port), - 'rear_port_position': int(position), - } - - -class RearPortTemplateCreateForm(ModularComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=PortTypeChoices, - widget=StaticSelect(), - ) - color = ColorField( - required=False - ) - positions = forms.IntegerField( - min_value=REARPORT_POSITIONS_MIN, - max_value=REARPORT_POSITIONS_MAX, - initial=1, - help_text='The number of front ports which may be mapped to each rear port' - ) - field_order = ( - 'manufacturer', 'device_type', 'module_type', 'name_pattern', 'label_pattern', 'type', 'color', 'positions', - 'description', - ) - - -class ModuleBayTemplateCreateForm(ComponentTemplateCreateForm): - # TODO: Support patterned position assignment - field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'description') - - -class DeviceBayTemplateCreateForm(ComponentTemplateCreateForm): - field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'description') - - -# -# Device components -# - -class ComponentCreateForm(CustomFieldsMixin, ComponentForm): - """ - Base form for the creation of device components (models subclassed from ComponentModel). - """ - device = DynamicModelChoiceField( - queryset=Device.objects.all() - ) - description = forms.CharField( - max_length=200, - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - -class ConsolePortCreateForm(ComponentCreateForm): - model = ConsolePort - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - required=False, - widget=StaticSelect() - ) - speed = forms.ChoiceField( - choices=add_blank_choice(ConsolePortSpeedChoices), - required=False, - widget=StaticSelect() - ) - field_order = ('device', 'name_pattern', 'label_pattern', 'type', 'speed', 'mark_connected', 'description', 'tags') - - -class ConsoleServerPortCreateForm(ComponentCreateForm): - model = ConsoleServerPort - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - required=False, - widget=StaticSelect() - ) - speed = forms.ChoiceField( - choices=add_blank_choice(ConsolePortSpeedChoices), - required=False, - widget=StaticSelect() - ) - field_order = ('device', 'name_pattern', 'label_pattern', 'type', 'speed', 'mark_connected', 'description', 'tags') - - -class PowerPortCreateForm(ComponentCreateForm): - model = PowerPort - type = forms.ChoiceField( - choices=add_blank_choice(PowerPortTypeChoices), - required=False, - widget=StaticSelect() - ) - maximum_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Maximum draw in watts" - ) - allocated_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Allocated draw in watts" - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', - 'description', 'tags', - ) - - -class PowerOutletCreateForm(ComponentCreateForm): - model = PowerOutlet - type = forms.ChoiceField( - choices=add_blank_choice(PowerOutletTypeChoices), - required=False, - widget=StaticSelect() - ) - power_port = forms.ModelChoiceField( - queryset=PowerPort.objects.all(), - required=False - ) - feed_leg = forms.ChoiceField( - choices=add_blank_choice(PowerOutletFeedLegChoices), - required=False - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'power_port', 'feed_leg', 'mark_connected', 'description', - 'tags', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit power_port queryset to PowerPorts which belong to the parent Device - device = Device.objects.get( - pk=self.initial.get('device') or self.data.get('device') - ) - self.fields['power_port'].queryset = PowerPort.objects.filter(device=device) - - -class InterfaceCreateForm(ComponentCreateForm, InterfaceCommonForm): - model = Interface - type = forms.ChoiceField( - choices=InterfaceTypeChoices, - widget=StaticSelect(), - ) - enabled = forms.BooleanField( - required=False, - initial=True - ) - parent = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - query_params={ - 'device_id': '$device', - } - ) - bridge = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - query_params={ - 'device_id': '$device', - } - ) - lag = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - query_params={ - 'device_id': '$device', - 'type': 'lag', - }, - label='LAG' - ) - mac_address = forms.CharField( - required=False, - label='MAC Address' - ) - wwn = forms.CharField( - required=False, - label='WWN' - ) - mgmt_only = forms.BooleanField( - required=False, - label='Management only', - help_text='This interface is used only for out-of-band management' - ) - mode = forms.ChoiceField( - choices=add_blank_choice(InterfaceModeChoices), - required=False, - widget=StaticSelect() - ) - rf_role = forms.ChoiceField( - choices=add_blank_choice(WirelessRoleChoices), - required=False, - widget=StaticSelect(), - label='Wireless role' - ) - rf_channel = forms.ChoiceField( - choices=add_blank_choice(WirelessChannelChoices), - required=False, - widget=StaticSelect(), - label='Wireless channel' - ) - rf_channel_frequency = forms.DecimalField( - required=False, - label='Channel frequency (MHz)' - ) - rf_channel_width = forms.DecimalField( - required=False, - label='Channel width (MHz)' - ) - untagged_vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False, - label='Untagged VLAN' - ) - tagged_vlans = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False, - label='Tagged VLANs' - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'enabled', 'parent', 'bridge', 'lag', 'mtu', 'mac_address', - 'wwn', 'description', 'mgmt_only', 'mark_connected', 'rf_role', 'rf_channel', 'rf_channel_frequency', - 'rf_channel_width', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags' - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit VLAN choices by device - device_id = self.initial.get('device') or self.data.get('device') - self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device_id) - self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device_id) - - -class FrontPortCreateForm(ComponentCreateForm): - model = FrontPort - type = forms.ChoiceField( - choices=PortTypeChoices, - widget=StaticSelect(), - ) - color = ColorField( - required=False - ) - rear_port_set = forms.MultipleChoiceField( - choices=[], - label='Rear ports', - help_text='Select one rear port assignment for each front port being created.', - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'color', 'rear_port_set', 'mark_connected', 'description', - 'tags', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - device = Device.objects.get( - pk=self.initial.get('device') or self.data.get('device') - ) - - # Determine which rear port positions are occupied. These will be excluded from the list of available - # mappings. - occupied_port_positions = [ - (front_port.rear_port_id, front_port.rear_port_position) - for front_port in device.frontports.all() - ] - - # Populate rear port choices - choices = [] - rear_ports = RearPort.objects.filter(device=device) - for rear_port in rear_ports: - for i in range(1, rear_port.positions + 1): - if (rear_port.pk, i) not in occupied_port_positions: - choices.append( - ('{}:{}'.format(rear_port.pk, i), '{}:{}'.format(rear_port.name, i)) - ) - self.fields['rear_port_set'].choices = choices - - def clean(self): - super().clean() - - # Validate that the number of ports being created equals the number of selected (rear port, position) tuples - front_port_count = len(self.cleaned_data['name_pattern']) - rear_port_count = len(self.cleaned_data['rear_port_set']) - if front_port_count != rear_port_count: - raise forms.ValidationError({ - 'rear_port_set': 'The provided name pattern will create {} ports, however {} rear port assignments ' - 'were selected. These counts must match.'.format(front_port_count, rear_port_count) - }) - - def get_iterative_data(self, iteration): - - # Assign rear port and position from selected set - rear_port, position = self.cleaned_data['rear_port_set'][iteration].split(':') - - return { - 'rear_port': int(rear_port), - 'rear_port_position': int(position), - } - - -class RearPortCreateForm(ComponentCreateForm): - model = RearPort - type = forms.ChoiceField( - choices=PortTypeChoices, - widget=StaticSelect(), - ) - color = ColorField( - required=False - ) - positions = forms.IntegerField( - min_value=REARPORT_POSITIONS_MIN, - max_value=REARPORT_POSITIONS_MAX, - initial=1, - help_text='The number of front ports which may be mapped to each rear port' - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'color', 'positions', 'mark_connected', 'description', - 'tags', - ) - - -class ModuleBayCreateForm(ComponentCreateForm): - model = ModuleBay - field_order = ('device', 'name_pattern', 'label_pattern', 'description', 'tags') - - -class DeviceBayCreateForm(ComponentCreateForm): - model = DeviceBay - field_order = ('device', 'name_pattern', 'label_pattern', 'description', 'tags') - - -class InventoryItemCreateForm(ComponentCreateForm): - model = InventoryItem - parent = DynamicModelChoiceField( - queryset=InventoryItem.objects.all(), - required=False, - query_params={ - 'device_id': '$device' - } - ) - role = DynamicModelChoiceField( - queryset=InventoryItemRole.objects.all(), - required=False - ) - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) - part_id = forms.CharField( - max_length=50, - required=False, - label='Part ID' - ) - serial = forms.CharField( - max_length=50, - required=False, - ) - asset_tag = forms.CharField( - max_length=50, - required=False, - ) - component_type = ContentTypeChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=MODULAR_COMPONENT_MODELS, - required=False, - widget=StaticSelect - ) - component_id = forms.IntegerField( - required=False - ) - field_order = ( - 'device', 'parent', 'name_pattern', 'label_pattern', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', - 'description', 'component_type', 'component_id', 'tags', - ) diff --git a/netbox/dcim/tests/test_forms.py b/netbox/dcim/tests/test_forms.py index 3b2a9eff052..4c5de12844e 100644 --- a/netbox/dcim/tests/test_forms.py +++ b/netbox/dcim/tests/test_forms.py @@ -118,41 +118,27 @@ class DeviceTestCase(TestCase): class LabelTestCase(TestCase): - @classmethod - def setUpTestData(cls): - site = Site.objects.create(name='Site 2', slug='site-2') - manufacturer = Manufacturer.objects.create(name='Manufacturer 2', slug='manufacturer-2') - cls.device_type = DeviceType.objects.create( - manufacturer=manufacturer, model='Device Type 2', slug='device-type-2', u_height=1 - ) - device_role = DeviceRole.objects.create( - name='Device Role 2', slug='device-role-2', color='ffff00' - ) - cls.device = Device.objects.create( - name='Device 2', device_type=cls.device_type, device_role=device_role, site=site - ) - def test_interface_label_count_valid(self): - """Test that a `label` can be generated for each generated `name` from `name_pattern` on InterfaceCreateForm""" + """ + Test that generating an equal number of names and labels passes form validation. + """ interface_data = { - 'device': self.device.pk, 'name_pattern': 'eth[0-9]', 'label_pattern': 'Interface[0-9]', - 'type': InterfaceTypeChoices.TYPE_100ME_FIXED, } - form = InterfaceCreateForm(interface_data) + form = ComponentCreateForm(interface_data) self.assertTrue(form.is_valid()) def test_interface_label_count_mismatch(self): - """Test that a `label` cannot be generated for each generated `name` from `name_pattern` due to invalid `label_pattern` on InterfaceCreateForm""" + """ + Check that attempting to generate a differing number of names and labels results in a validation error. + """ bad_interface_data = { - 'device': self.device.pk, 'name_pattern': 'eth[0-9]', 'label_pattern': 'Interface[0-1]', - 'type': InterfaceTypeChoices.TYPE_100ME_FIXED, } - form = InterfaceCreateForm(bad_interface_data) + form = ComponentCreateForm(bad_interface_data) self.assertFalse(form.is_valid()) self.assertIn('label_pattern', form.errors) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index bfa2fecae82..1616b95e9df 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1054,7 +1054,6 @@ class ModuleTypeBulkDeleteView(generic.BulkDeleteView): class ConsolePortTemplateCreateView(generic.ComponentCreateView): queryset = ConsolePortTemplate.objects.all() - form = forms.ConsolePortTemplateCreateForm model_form = forms.ConsolePortTemplateForm @@ -1088,7 +1087,6 @@ class ConsolePortTemplateBulkDeleteView(generic.BulkDeleteView): class ConsoleServerPortTemplateCreateView(generic.ComponentCreateView): queryset = ConsoleServerPortTemplate.objects.all() - form = forms.ConsoleServerPortTemplateCreateForm model_form = forms.ConsoleServerPortTemplateForm @@ -1122,7 +1120,6 @@ class ConsoleServerPortTemplateBulkDeleteView(generic.BulkDeleteView): class PowerPortTemplateCreateView(generic.ComponentCreateView): queryset = PowerPortTemplate.objects.all() - form = forms.PowerPortTemplateCreateForm model_form = forms.PowerPortTemplateForm @@ -1156,7 +1153,6 @@ class PowerPortTemplateBulkDeleteView(generic.BulkDeleteView): class PowerOutletTemplateCreateView(generic.ComponentCreateView): queryset = PowerOutletTemplate.objects.all() - form = forms.PowerOutletTemplateCreateForm model_form = forms.PowerOutletTemplateForm @@ -1190,7 +1186,6 @@ class PowerOutletTemplateBulkDeleteView(generic.BulkDeleteView): class InterfaceTemplateCreateView(generic.ComponentCreateView): queryset = InterfaceTemplate.objects.all() - form = forms.InterfaceTemplateCreateForm model_form = forms.InterfaceTemplateForm @@ -1224,7 +1219,6 @@ class InterfaceTemplateBulkDeleteView(generic.BulkDeleteView): class FrontPortTemplateCreateView(generic.ComponentCreateView): queryset = FrontPortTemplate.objects.all() - form = forms.FrontPortTemplateCreateForm model_form = forms.FrontPortTemplateForm @@ -1258,7 +1252,6 @@ class FrontPortTemplateBulkDeleteView(generic.BulkDeleteView): class RearPortTemplateCreateView(generic.ComponentCreateView): queryset = RearPortTemplate.objects.all() - form = forms.RearPortTemplateCreateForm model_form = forms.RearPortTemplateForm @@ -1292,7 +1285,6 @@ class RearPortTemplateBulkDeleteView(generic.BulkDeleteView): class ModuleBayTemplateCreateView(generic.ComponentCreateView): queryset = ModuleBayTemplate.objects.all() - form = forms.ModuleBayTemplateCreateForm model_form = forms.ModuleBayTemplateForm @@ -1326,7 +1318,6 @@ class ModuleBayTemplateBulkDeleteView(generic.BulkDeleteView): class DeviceBayTemplateCreateView(generic.ComponentCreateView): queryset = DeviceBayTemplate.objects.all() - form = forms.DeviceBayTemplateCreateForm model_form = forms.DeviceBayTemplateForm @@ -1741,7 +1732,6 @@ class ConsolePortView(generic.ObjectView): class ConsolePortCreateView(generic.ComponentCreateView): queryset = ConsolePort.objects.all() - form = forms.ConsolePortCreateForm model_form = forms.ConsolePortForm @@ -1800,7 +1790,6 @@ class ConsoleServerPortView(generic.ObjectView): class ConsoleServerPortCreateView(generic.ComponentCreateView): queryset = ConsoleServerPort.objects.all() - form = forms.ConsoleServerPortCreateForm model_form = forms.ConsoleServerPortForm @@ -1859,7 +1848,6 @@ class PowerPortView(generic.ObjectView): class PowerPortCreateView(generic.ComponentCreateView): queryset = PowerPort.objects.all() - form = forms.PowerPortCreateForm model_form = forms.PowerPortForm @@ -1918,7 +1906,6 @@ class PowerOutletView(generic.ObjectView): class PowerOutletCreateView(generic.ComponentCreateView): queryset = PowerOutlet.objects.all() - form = forms.PowerOutletCreateForm model_form = forms.PowerOutletForm @@ -2012,7 +1999,6 @@ class InterfaceView(generic.ObjectView): class InterfaceCreateView(generic.ComponentCreateView): queryset = Interface.objects.all() - form = forms.InterfaceCreateForm model_form = forms.InterfaceForm template_name = 'dcim/interface_create.html' @@ -2098,7 +2084,6 @@ class FrontPortView(generic.ObjectView): class FrontPortCreateView(generic.ComponentCreateView): queryset = FrontPort.objects.all() - form = forms.FrontPortCreateForm model_form = forms.FrontPortForm @@ -2157,7 +2142,6 @@ class RearPortView(generic.ObjectView): class RearPortCreateView(generic.ComponentCreateView): queryset = RearPort.objects.all() - form = forms.RearPortCreateForm model_form = forms.RearPortForm @@ -2216,7 +2200,6 @@ class ModuleBayView(generic.ObjectView): class ModuleBayCreateView(generic.ComponentCreateView): queryset = ModuleBay.objects.all() - form = forms.ModuleBayCreateForm model_form = forms.ModuleBayForm @@ -2271,7 +2254,6 @@ class DeviceBayView(generic.ObjectView): class DeviceBayCreateView(generic.ComponentCreateView): queryset = DeviceBay.objects.all() - form = forms.DeviceBayCreateForm model_form = forms.DeviceBayForm @@ -2397,7 +2379,6 @@ class InventoryItemEditView(generic.ObjectEditView): class InventoryItemCreateView(generic.ComponentCreateView): queryset = InventoryItem.objects.all() - form = forms.InventoryItemCreateForm model_form = forms.InventoryItemForm diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index fed4b2f602b..00942203897 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -6,6 +6,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.db import transaction from django.db.models import ProtectedError +from django.forms.widgets import HiddenInput from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.utils.html import escape @@ -14,6 +15,7 @@ from django.utils.safestring import mark_safe from django.views.generic import View from django_tables2.export import TableExport +from dcim.forms.object_create import ComponentCreateForm from extras.models import ExportTemplate from extras.signals import clear_webhooks from utilities.error_handlers import handle_protectederror @@ -674,33 +676,45 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): # Device/VirtualMachine components # -# TODO: Replace with BulkCreateView class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine. """ queryset = None - form = None + form = ComponentCreateForm model_form = None - template_name = 'generic/object_edit.html' + template_name = 'dcim/component_create.html' + patterned_fields = ('name', 'label') def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') - def get(self, request): + def initialize_forms(self, request): + data = request.POST if request.method == 'POST' else None + initial_data = normalize_querydict(request.GET) - form = self.form(initial=request.GET) + form = self.form(data=data, initial=request.GET) + model_form = self.model_form(data=data, initial=initial_data) + + # These fields will be set from the pattern values + for field_name in self.patterned_fields: + model_form.fields[field_name].widget = HiddenInput() + + return form, model_form + + def get(self, request): + form, model_form = self.initialize_forms(request) return render(request, self.template_name, { - 'obj': self.queryset.model(), 'obj_type': self.queryset.model._meta.verbose_name, 'form': form, + 'model_form': model_form, 'return_url': self.get_return_url(request), }) def post(self, request): - logger = logging.getLogger('netbox.views.ComponentCreateView') - form = self.form(request.POST, initial=request.GET) + form, model_form = self.initialize_forms(request) + self.validate_form(request, form) if form.is_valid() and not form.errors: @@ -712,6 +726,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View return render(request, self.template_name, { 'obj_type': self.queryset.model._meta.verbose_name, 'form': form, + 'model_form': model_form, 'return_url': self.get_return_url(request), }) @@ -734,8 +749,8 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View data['name'] = name data['label'] = label - if hasattr(form, 'get_iterative_data'): - data.update(form.get_iterative_data(i)) + # if hasattr(form, 'get_iterative_data'): + # data.update(form.get_iterative_data(i)) component_form = self.model_form(data) diff --git a/netbox/templates/dcim/component_create.html b/netbox/templates/dcim/component_create.html new file mode 100644 index 00000000000..367fc2d1104 --- /dev/null +++ b/netbox/templates/dcim/component_create.html @@ -0,0 +1,7 @@ +{% extends 'generic/object_edit.html' %} +{% load form_helpers %} + +{% block form %} + {% render_form form %} + {% render_form model_form %} +{% endblock form %} diff --git a/netbox/virtualization/forms/object_create.py b/netbox/virtualization/forms/object_create.py index 332334594bf..f275469fd4f 100644 --- a/netbox/virtualization/forms/object_create.py +++ b/netbox/virtualization/forms/object_create.py @@ -1,81 +1,13 @@ from django import forms -from dcim.choices import InterfaceModeChoices -from dcim.forms.common import InterfaceCommonForm -from extras.forms import CustomFieldsMixin -from extras.models import Tag -from ipam.models import VLAN -from utilities.forms import ( - add_blank_choice, BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, - StaticSelect, -) -from virtualization.models import VMInterface, VirtualMachine +from utilities.forms import BootstrapMixin, ExpandableNameField __all__ = ( 'VMInterfaceCreateForm', ) -class VMInterfaceCreateForm(BootstrapMixin, CustomFieldsMixin, InterfaceCommonForm): - model = VMInterface - virtual_machine = DynamicModelChoiceField( - queryset=VirtualMachine.objects.all() - ) +class VMInterfaceCreateForm(BootstrapMixin, forms.Form): name_pattern = ExpandableNameField( label='Name' ) - enabled = forms.BooleanField( - required=False, - initial=True - ) - parent = DynamicModelChoiceField( - queryset=VMInterface.objects.all(), - required=False, - query_params={ - 'virtual_machine_id': '$virtual_machine', - } - ) - bridge = DynamicModelChoiceField( - queryset=VMInterface.objects.all(), - required=False, - query_params={ - 'virtual_machine_id': '$virtual_machine', - } - ) - mac_address = forms.CharField( - required=False, - label='MAC Address' - ) - description = forms.CharField( - max_length=200, - required=False - ) - mode = forms.ChoiceField( - choices=add_blank_choice(InterfaceModeChoices), - required=False, - widget=StaticSelect(), - ) - untagged_vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - tagged_vlans = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - field_order = ( - 'virtual_machine', 'name_pattern', 'enabled', 'parent', 'bridge', 'mtu', 'mac_address', 'description', 'mode', - 'untagged_vlan', 'tagged_vlans', 'tags' - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - vm_id = self.initial.get('virtual_machine') or self.data.get('virtual_machine') - - # Limit VLAN choices by virtual machine - self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) - self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id) diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 8183555bdaa..742d6d9ea34 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -447,11 +447,11 @@ class VMInterfaceView(generic.ObjectView): } -# TODO: This should not use ComponentCreateView class VMInterfaceCreateView(generic.ComponentCreateView): queryset = VMInterface.objects.all() form = forms.VMInterfaceCreateForm model_form = forms.VMInterfaceForm + patterned_fields = ('name',) class VMInterfaceEditView(generic.ObjectEditView): From ba85101d30cde82a5e108f3c47ff2b7a28913694 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 27 Dec 2021 21:25:47 -0500 Subject: [PATCH 046/271] Update component model forms to use DynamicModelChoiceField query_params for related objects --- netbox/dcim/forms/models.py | 112 ++++++++++++-------------- netbox/dcim/views.py | 53 ++++++------ netbox/virtualization/forms/models.py | 24 +++--- 3 files changed, 87 insertions(+), 102 deletions(-) diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index b193f76d5d5..f5988030c8a 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -957,6 +957,7 @@ class ConsolePortTemplateForm(BootstrapMixin, forms.ModelForm): widgets = { 'device_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(), + 'type': StaticSelect, } @@ -969,6 +970,7 @@ class ConsoleServerPortTemplateForm(BootstrapMixin, forms.ModelForm): widgets = { 'device_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(), + 'type': StaticSelect, } @@ -981,10 +983,19 @@ class PowerPortTemplateForm(BootstrapMixin, forms.ModelForm): widgets = { 'device_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(), + 'type': StaticSelect(), } class PowerOutletTemplateForm(BootstrapMixin, forms.ModelForm): + power_port = DynamicModelChoiceField( + queryset=PowerPortTemplate.objects.all(), + required=False, + query_params={ + 'devicetype_id': '$device_type', + } + ) + class Meta: model = PowerOutletTemplate fields = [ @@ -993,18 +1004,10 @@ class PowerOutletTemplateForm(BootstrapMixin, forms.ModelForm): widgets = { 'device_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(), + 'type': StaticSelect(), + 'feed_leg': StaticSelect(), } - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit power_port choices to current DeviceType/ModuleType - if self.instance.pk: - self.fields['power_port'].queryset = PowerPortTemplate.objects.filter( - device_type=self.instance.device_type, - module_type=self.instance.module_type - ) - class InterfaceTemplateForm(BootstrapMixin, forms.ModelForm): class Meta: @@ -1020,6 +1023,14 @@ class InterfaceTemplateForm(BootstrapMixin, forms.ModelForm): class FrontPortTemplateForm(BootstrapMixin, forms.ModelForm): + rear_port = DynamicModelChoiceField( + queryset=RearPortTemplate.objects.all(), + required=False, + query_params={ + 'devicetype_id': '$device_type', + } + ) + class Meta: model = FrontPortTemplate fields = [ @@ -1029,19 +1040,9 @@ class FrontPortTemplateForm(BootstrapMixin, forms.ModelForm): widgets = { 'device_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(), - 'rear_port': StaticSelect(), + 'type': StaticSelect(), } - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit rear_port choices to current DeviceType/ModuleType - if self.instance.pk: - self.fields['rear_port'].queryset = RearPortTemplate.objects.filter( - device_type=self.instance.device_type, - module_type=self.instance.module_type - ) - class RearPortTemplateForm(BootstrapMixin, forms.ModelForm): class Meta: @@ -1095,6 +1096,7 @@ class ConsolePortForm(CustomFieldModelForm): ] widgets = { 'device': forms.HiddenInput(), + 'type': StaticSelect(), } @@ -1111,6 +1113,7 @@ class ConsoleServerPortForm(CustomFieldModelForm): ] widgets = { 'device': forms.HiddenInput(), + 'type': StaticSelect(), } @@ -1128,13 +1131,17 @@ class PowerPortForm(CustomFieldModelForm): ] widgets = { 'device': forms.HiddenInput(), + 'type': StaticSelect(), } class PowerOutletForm(CustomFieldModelForm): - power_port = forms.ModelChoiceField( + power_port = DynamicModelChoiceField( queryset=PowerPort.objects.all(), - required=False + required=False, + query_params={ + 'device_id': '$device', + } ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -1148,34 +1155,34 @@ class PowerOutletForm(CustomFieldModelForm): ] widgets = { 'device': forms.HiddenInput(), + 'type': StaticSelect(), + 'feed_leg': StaticSelect(), } - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit power_port choices to the local device - if hasattr(self.instance, 'device'): - self.fields['power_port'].queryset = PowerPort.objects.filter( - device=self.instance.device - ) - class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): parent = DynamicModelChoiceField( queryset=Interface.objects.all(), required=False, - label='Parent interface' + label='Parent interface', + query_params={ + 'device_id': '$device', + } ) bridge = DynamicModelChoiceField( queryset=Interface.objects.all(), required=False, - label='Bridged interface' + label='Bridged interface', + query_params={ + 'device_id': '$device', + } ) lag = DynamicModelChoiceField( queryset=Interface.objects.all(), required=False, label='LAG interface', query_params={ + 'device_id': '$device', 'type': 'lag', } ) @@ -1203,6 +1210,7 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): label='Untagged VLAN', query_params={ 'group_id': '$vlan_group', + 'available_on_device': '$device', } ) tagged_vlans = DynamicModelMultipleChoiceField( @@ -1211,6 +1219,7 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): label='Tagged VLANs', query_params={ 'group_id': '$vlan_group', + 'available_on_device': '$device', } ) tags = DynamicModelMultipleChoiceField( @@ -1241,26 +1250,15 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): 'rf_channel_width': "Populated by selected channel (if set)", } - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - device = Device.objects.get(pk=self.data['device']) if self.is_bound else self.instance.device - - # Restrict parent/bridge/LAG interface assignment by device/VC - self.fields['parent'].widget.add_query_param('device_id', device.pk) - self.fields['bridge'].widget.add_query_param('device_id', device.pk) - self.fields['lag'].widget.add_query_param('device_id', device.pk) - if device.virtual_chassis and device.virtual_chassis.master: - self.fields['parent'].widget.add_query_param('device_id', device.virtual_chassis.master.pk) - self.fields['bridge'].widget.add_query_param('device_id', device.virtual_chassis.master.pk) - self.fields['lag'].widget.add_query_param('device_id', device.virtual_chassis.master.pk) - - # Limit VLAN choices by device - self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device.pk) - self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device.pk) - class FrontPortForm(CustomFieldModelForm): + rear_port = DynamicModelChoiceField( + queryset=RearPort.objects.all(), + required=False, + query_params={ + 'device_id': '$device', + } + ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1275,18 +1273,8 @@ class FrontPortForm(CustomFieldModelForm): widgets = { 'device': forms.HiddenInput(), 'type': StaticSelect(), - 'rear_port': StaticSelect(), } - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit RearPort choices to the local device - if hasattr(self.instance, 'device'): - self.fields['rear_port'].queryset = self.fields['rear_port'].queryset.filter( - device=self.instance.device - ) - class RearPortForm(CustomFieldModelForm): tags = DynamicModelMultipleChoiceField( diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 1616b95e9df..05416b7200f 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2000,33 +2000,34 @@ class InterfaceView(generic.ObjectView): class InterfaceCreateView(generic.ComponentCreateView): queryset = Interface.objects.all() model_form = forms.InterfaceForm - template_name = 'dcim/interface_create.html' + # template_name = 'dcim/interface_create.html' - def post(self, request): - """ - Override inherited post() method to handle request to assign newly created - interface objects (first object) to an IP Address object. - """ - form = self.form(request.POST, initial=request.GET) - new_objs = self.validate_form(request, form) - - if form.is_valid() and not form.errors: - if '_addanother' in request.POST: - return redirect(request.get_full_path()) - elif new_objs is not None and '_assignip' in request.POST and len(new_objs) >= 1 and \ - request.user.has_perm('ipam.add_ipaddress'): - first_obj = new_objs[0].pk - return redirect( - f'/ipam/ip-addresses/add/?interface={first_obj}&return_url={self.get_return_url(request)}' - ) - else: - return redirect(self.get_return_url(request)) - - return render(request, self.template_name, { - 'obj_type': self.queryset.model._meta.verbose_name, - 'form': form, - 'return_url': self.get_return_url(request), - }) + # TODO: Figure out what to do with this + # def post(self, request): + # """ + # Override inherited post() method to handle request to assign newly created + # interface objects (first object) to an IP Address object. + # """ + # form = self.form(request.POST, initial=request.GET) + # new_objs = self.validate_form(request, form) + # + # if form.is_valid() and not form.errors: + # if '_addanother' in request.POST: + # return redirect(request.get_full_path()) + # elif new_objs is not None and '_assignip' in request.POST and len(new_objs) >= 1 and \ + # request.user.has_perm('ipam.add_ipaddress'): + # first_obj = new_objs[0].pk + # return redirect( + # f'/ipam/ip-addresses/add/?interface={first_obj}&return_url={self.get_return_url(request)}' + # ) + # else: + # return redirect(self.get_return_url(request)) + # + # return render(request, self.template_name, { + # 'obj_type': self.queryset.model._meta.verbose_name, + # 'form': form, + # 'return_url': self.get_return_url(request), + # }) class InterfaceEditView(generic.ObjectEditView): diff --git a/netbox/virtualization/forms/models.py b/netbox/virtualization/forms/models.py index 6fa90ea6547..624c9e87fa1 100644 --- a/netbox/virtualization/forms/models.py +++ b/netbox/virtualization/forms/models.py @@ -275,12 +275,18 @@ class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm): parent = DynamicModelChoiceField( queryset=VMInterface.objects.all(), required=False, - label='Parent interface' + label='Parent interface', + query_params={ + 'virtual_machine_id': '$virtual_machine', + } ) bridge = DynamicModelChoiceField( queryset=VMInterface.objects.all(), required=False, - label='Bridged interface' + label='Bridged interface', + query_params={ + 'virtual_machine_id': '$virtual_machine', + } ) vlan_group = DynamicModelChoiceField( queryset=VLANGroup.objects.all(), @@ -293,6 +299,7 @@ class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm): label='Untagged VLAN', query_params={ 'group_id': '$vlan_group', + 'available_on_virtualmachine': '$virtual_machine', } ) tagged_vlans = DynamicModelMultipleChoiceField( @@ -301,6 +308,7 @@ class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm): label='Tagged VLANs', query_params={ 'group_id': '$vlan_group', + 'available_on_virtualmachine': '$virtual_machine', } ) tags = DynamicModelMultipleChoiceField( @@ -324,15 +332,3 @@ class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm): help_texts = { 'mode': INTERFACE_MODE_HELP_TEXT, } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - vm_id = self.initial.get('virtual_machine') or self.data.get('virtual_machine') - - # Restrict parent interface assignment by VM - self.fields['parent'].widget.add_query_param('virtual_machine_id', vm_id) - self.fields['bridge'].widget.add_query_param('virtual_machine_id', vm_id) - - # Limit VLAN choices by virtual machine - self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) - self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id) From 8ca09ec07fdffc3caabd16866818503d93ad3225 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 08:54:03 -0500 Subject: [PATCH 047/271] Clean up form display --- netbox/dcim/forms/models.py | 13 +++++++++++++ netbox/netbox/views/generic/object_views.py | 8 ++++---- netbox/templates/dcim/component_create.html | 4 ++-- netbox/templates/dcim/interface_create.html | 16 ---------------- netbox/templates/generic/object_edit.html | 8 ++++---- netbox/utilities/forms/fields.py | 6 +----- 6 files changed, 24 insertions(+), 31 deletions(-) delete mode 100644 netbox/templates/dcim/interface_create.html diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index f5988030c8a..d5b52aed301 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1097,6 +1097,7 @@ class ConsolePortForm(CustomFieldModelForm): widgets = { 'device': forms.HiddenInput(), 'type': StaticSelect(), + 'speed': StaticSelect(), } @@ -1114,6 +1115,7 @@ class ConsoleServerPortForm(CustomFieldModelForm): widgets = { 'device': forms.HiddenInput(), 'type': StaticSelect(), + 'speed': StaticSelect(), } @@ -1234,6 +1236,17 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): 'mgmt_only', 'mark_connected', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'tags', ] + # fieldsets = ( + # ('Interface', ('device', 'name', 'type', 'label', 'description', 'tags')), + # ('Addressing', ('mac_address', 'wwn')), + # ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), + # ('Related Interfaces', ('parent', 'bridge', 'lag')), + # ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')), + # ('Wireless', ( + # 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'wireless_lan_group', + # 'wireless_lans', + # )), + # ) widgets = { 'device': forms.HiddenInput(), 'type': StaticSelect(), diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 00942203897..682501895af 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -707,8 +707,8 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View return render(request, self.template_name, { 'obj_type': self.queryset.model._meta.verbose_name, - 'form': form, - 'model_form': model_form, + 'replication_form': form, + 'form': model_form, 'return_url': self.get_return_url(request), }) @@ -725,8 +725,8 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View return render(request, self.template_name, { 'obj_type': self.queryset.model._meta.verbose_name, - 'form': form, - 'model_form': model_form, + 'replication_form': form, + 'form': model_form, 'return_url': self.get_return_url(request), }) diff --git a/netbox/templates/dcim/component_create.html b/netbox/templates/dcim/component_create.html index 367fc2d1104..a8750e20e46 100644 --- a/netbox/templates/dcim/component_create.html +++ b/netbox/templates/dcim/component_create.html @@ -2,6 +2,6 @@ {% load form_helpers %} {% block form %} - {% render_form form %} - {% render_form model_form %} + {% render_form replication_form %} + {{ block.super }} {% endblock form %} diff --git a/netbox/templates/dcim/interface_create.html b/netbox/templates/dcim/interface_create.html deleted file mode 100644 index 6b5486eff81..00000000000 --- a/netbox/templates/dcim/interface_create.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends 'generic/object_edit.html' %} - -{% block buttons %} - Cancel - {% if component_type == 'interface' and perms.ipam.add_ipaddress %} - - {% endif %} - - -{% endblock %} \ No newline at end of file diff --git a/netbox/templates/generic/object_edit.html b/netbox/templates/generic/object_edit.html index c7b4c8a8bb3..d72210dc78e 100644 --- a/netbox/templates/generic/object_edit.html +++ b/netbox/templates/generic/object_edit.html @@ -40,7 +40,7 @@ {# Render grouped fields according to Form #} {% for group, fields in form.Meta.fieldsets %} -
    +
    {{ group }}
    @@ -51,7 +51,7 @@ {% endfor %} {% if form.custom_fields %} -
    +
    Custom Fields
    @@ -60,7 +60,7 @@ {% endif %} {% if form.comments %} -
    +
    Comments
    {% render_field form.comments %}
    @@ -68,7 +68,7 @@ {% else %} {# Render all fields in a single group #} -
    +
    {% block form_fields %}{% render_form form %}{% endblock %}
    {% endif %} diff --git a/netbox/utilities/forms/fields.py b/netbox/utilities/forms/fields.py index 007215b6e5d..0e1b42b28bb 100644 --- a/netbox/utilities/forms/fields.py +++ b/netbox/utilities/forms/fields.py @@ -346,11 +346,7 @@ class ExpandableNameField(forms.CharField): if not self.help_text: self.help_text = """ Alphanumeric ranges are supported for bulk creation. Mixed cases and types within a single range - are not supported. Examples: -
      -
    • [ge,xe]-0/0/[0-9]
    • -
    • e[0-3][a-d,f]
    • -
    + are not supported. Example: [ge,xe]-0/0/[0-9] """ def to_python(self, value): From 4075cc8518da585f35536f667c76c5293a520bdc Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 09:53:56 -0500 Subject: [PATCH 048/271] Restore front port component creation --- netbox/dcim/forms/models.py | 1 - netbox/dcim/forms/object_create.py | 93 +++++++++++++++++++++ netbox/dcim/views.py | 18 ++++ netbox/netbox/views/generic/object_views.py | 5 +- netbox/templates/generic/object_edit.html | 8 +- 5 files changed, 118 insertions(+), 7 deletions(-) diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index d5b52aed301..223f0a63fdd 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1267,7 +1267,6 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): class FrontPortForm(CustomFieldModelForm): rear_port = DynamicModelChoiceField( queryset=RearPort.objects.all(), - required=False, query_params={ 'device_id': '$device', } diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 8b8c00c6d2a..5e8daf38d00 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -9,6 +9,8 @@ from utilities.forms import ( __all__ = ( 'ComponentCreateForm', + 'FrontPortCreateForm', + 'FrontPortTemplateCreateForm', 'VirtualChassisCreateForm', ) @@ -41,6 +43,97 @@ class ComponentCreateForm(BootstrapMixin, forms.Form): }, code='label_pattern_mismatch') +class FrontPortTemplateCreateForm(ComponentCreateForm): + rear_port_set = forms.MultipleChoiceField( + choices=[], + label='Rear ports', + help_text='Select one rear port assignment for each front port being created.', + ) + field_order = ( + 'name_pattern', 'label_pattern', 'rear_port_set', + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + device_type = DeviceType.objects.get( + pk=self.initial.get('device_type') or self.data.get('device_type') + ) + + # Determine which rear port positions are occupied. These will be excluded from the list of available mappings. + occupied_port_positions = [ + (front_port.rear_port_id, front_port.rear_port_position) + for front_port in device_type.frontporttemplates.all() + ] + + # Populate rear port choices + choices = [] + rear_ports = RearPortTemplate.objects.filter(device_type=device_type) + for rear_port in rear_ports: + for i in range(1, rear_port.positions + 1): + if (rear_port.pk, i) not in occupied_port_positions: + choices.append( + ('{}:{}'.format(rear_port.pk, i), '{}:{}'.format(rear_port.name, i)) + ) + self.fields['rear_port_set'].choices = choices + + def get_iterative_data(self, iteration): + + # Assign rear port and position from selected set + rear_port, position = self.cleaned_data['rear_port_set'][iteration].split(':') + + return { + 'rear_port': int(rear_port), + 'rear_port_position': int(position), + } + + +class FrontPortCreateForm(ComponentCreateForm): + rear_port_set = forms.MultipleChoiceField( + choices=[], + label='Rear ports', + help_text='Select one rear port assignment for each front port being created.', + ) + field_order = ( + 'name_pattern', 'label_pattern', 'rear_port_set', + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + device = Device.objects.get( + pk=self.initial.get('device') or self.data.get('device') + ) + + # Determine which rear port positions are occupied. These will be excluded from the list of available + # mappings. + occupied_port_positions = [ + (front_port.rear_port_id, front_port.rear_port_position) + for front_port in device.frontports.all() + ] + + # Populate rear port choices + choices = [] + rear_ports = RearPort.objects.filter(device=device) + for rear_port in rear_ports: + for i in range(1, rear_port.positions + 1): + if (rear_port.pk, i) not in occupied_port_positions: + choices.append( + ('{}:{}'.format(rear_port.pk, i), '{}:{}'.format(rear_port.name, i)) + ) + self.fields['rear_port_set'].choices = choices + + def get_iterative_data(self, iteration): + + # Assign rear port and position from selected set + rear_port, position = self.cleaned_data['rear_port_set'][iteration].split(':') + + return { + 'rear_port': int(rear_port), + 'rear_port_position': int(position), + } + + class VirtualChassisCreateForm(CustomFieldModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 05416b7200f..bee7f9ef090 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1219,8 +1219,17 @@ class InterfaceTemplateBulkDeleteView(generic.BulkDeleteView): class FrontPortTemplateCreateView(generic.ComponentCreateView): queryset = FrontPortTemplate.objects.all() + form = forms.FrontPortTemplateCreateForm model_form = forms.FrontPortTemplateForm + def initialize_forms(self, request): + form, model_form = super().initialize_forms(request) + + model_form.fields.pop('rear_port') + model_form.fields.pop('rear_port_position') + + return form, model_form + class FrontPortTemplateEditView(generic.ObjectEditView): queryset = FrontPortTemplate.objects.all() @@ -2085,8 +2094,17 @@ class FrontPortView(generic.ObjectView): class FrontPortCreateView(generic.ComponentCreateView): queryset = FrontPort.objects.all() + form = forms.FrontPortCreateForm model_form = forms.FrontPortForm + def initialize_forms(self, request): + form, model_form = super().initialize_forms(request) + + model_form.fields.pop('rear_port') + model_form.fields.pop('rear_port_position') + + return form, model_form + class FrontPortEditView(generic.ObjectEditView): queryset = FrontPort.objects.all() diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 682501895af..a44d027b2d1 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -735,7 +735,6 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View Validate form values and set errors on the form object as they are detected. If no errors are found, signal success messages. """ - logger = logging.getLogger('netbox.views.ComponentCreateView') if form.is_valid(): new_components = [] @@ -749,8 +748,8 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View data['name'] = name data['label'] = label - # if hasattr(form, 'get_iterative_data'): - # data.update(form.get_iterative_data(i)) + if hasattr(form, 'get_iterative_data'): + data.update(form.get_iterative_data(i)) component_form = self.model_form(data) diff --git a/netbox/templates/generic/object_edit.html b/netbox/templates/generic/object_edit.html index d72210dc78e..c9498130591 100644 --- a/netbox/templates/generic/object_edit.html +++ b/netbox/templates/generic/object_edit.html @@ -31,13 +31,15 @@ {% csrf_token %} - {% for field in form.hidden_fields %} - {{ field }} - {% endfor %} {% block form %} {% if form.Meta.fieldsets %} + {# Render hidden fields #} + {% for field in form.hidden_fields %} + {{ field }} + {% endfor %} + {# Render grouped fields according to Form #} {% for group, fields in form.Meta.fieldsets %}
    From e0319cc894f3218afe6d727eea08485634c7f188 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 10:22:00 -0500 Subject: [PATCH 049/271] Clean up form rendering --- netbox/dcim/forms/models.py | 28 ++++++++++----------- netbox/netbox/views/generic/object_views.py | 2 ++ netbox/templates/generic/object_edit.html | 8 ++++-- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 223f0a63fdd..6db3e263458 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1236,17 +1236,17 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): 'mgmt_only', 'mark_connected', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'tags', ] - # fieldsets = ( - # ('Interface', ('device', 'name', 'type', 'label', 'description', 'tags')), - # ('Addressing', ('mac_address', 'wwn')), - # ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), - # ('Related Interfaces', ('parent', 'bridge', 'lag')), - # ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')), - # ('Wireless', ( - # 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'wireless_lan_group', - # 'wireless_lans', - # )), - # ) + fieldsets = ( + ('Interface', ('device', 'name', 'type', 'label', 'description', 'tags')), + ('Addressing', ('mac_address', 'wwn')), + ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), + ('Related Interfaces', ('parent', 'bridge', 'lag')), + ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')), + ('Wireless', ( + 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'wireless_lan_group', + 'wireless_lans', + )), + ) widgets = { 'device': forms.HiddenInput(), 'type': StaticSelect(), @@ -1358,9 +1358,6 @@ class PopulateDeviceBayForm(BootstrapMixin, forms.Form): class InventoryItemForm(CustomFieldModelForm): - device = DynamicModelChoiceField( - queryset=Device.objects.all() - ) parent = DynamicModelChoiceField( queryset=InventoryItem.objects.all(), required=False, @@ -1401,6 +1398,9 @@ class InventoryItemForm(CustomFieldModelForm): ('Hardware', ('manufacturer', 'part_id', 'serial', 'asset_tag')), ('Component', ('component_type', 'component_id')), ) + widgets = { + 'device': forms.HiddenInput(), + } # diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index a44d027b2d1..577dfa4bf88 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -706,6 +706,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View form, model_form = self.initialize_forms(request) return render(request, self.template_name, { + 'obj': self.queryset.model, 'obj_type': self.queryset.model._meta.verbose_name, 'replication_form': form, 'form': model_form, @@ -724,6 +725,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View return redirect(self.get_return_url(request)) return render(request, self.template_name, { + 'obj': self.queryset.model, 'obj_type': self.queryset.model._meta.verbose_name, 'replication_form': form, 'form': model_form, diff --git a/netbox/templates/generic/object_edit.html b/netbox/templates/generic/object_edit.html index c9498130591..5dc8f995d85 100644 --- a/netbox/templates/generic/object_edit.html +++ b/netbox/templates/generic/object_edit.html @@ -29,7 +29,7 @@
    {% endif %} - + {% csrf_token %} {% block form %} @@ -47,7 +47,11 @@
    {{ group }}
    {% for name in fields %} - {% render_field form|getfield:name %} + {% with field=form|getfield:name %} + {% if not field.field.widget.is_hidden %} + {% render_field field %} + {% endif %} + {% endwith %} {% endfor %}
    {% endfor %} From a0836b6876f94ef596f02277323bf2c9017968a8 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 11:06:34 -0500 Subject: [PATCH 050/271] Add inventory items panel to device component views --- netbox/templates/dcim/consoleport.html | 159 +++++++++--------- netbox/templates/dcim/consoleserverport.html | 1 + netbox/templates/dcim/frontport.html | 1 + .../dcim/inc/panels/inventory_items.html | 59 +++++++ netbox/templates/dcim/interface.html | 1 + netbox/templates/dcim/poweroutlet.html | 1 + netbox/templates/dcim/powerport.html | 1 + netbox/templates/dcim/rearport.html | 1 + 8 files changed, 145 insertions(+), 79 deletions(-) create mode 100644 netbox/templates/dcim/inc/panels/inventory_items.html diff --git a/netbox/templates/dcim/consoleport.html b/netbox/templates/dcim/consoleport.html index 38cfb90ae60..ed3c649dd09 100644 --- a/netbox/templates/dcim/consoleport.html +++ b/netbox/templates/dcim/consoleport.html @@ -58,91 +58,92 @@
    {% if object.mark_connected %} - Marked as connected + Marked as connected {% elif object.cable %} - - - - - - {% if object.connected_endpoint %} +
    Cable - {{ object.cable }} - - - -
    - + - - - - - - - - - - - - - - - - - {% endif %} -
    DeviceCable - {{ object.connected_endpoint.device }} + {{ object.cable }} + + +
    Name - {{ object.connected_endpoint.name }} -
    Type{{ object.connected_endpoint.get_type_display|placeholder }}
    Description{{ object.connected_endpoint.description|placeholder }}
    Path Status - {% if object.path.is_active %} - Reachable - {% else %} - Not Reachable - {% endif %} -
    - {% else %} -
    - Not Connected - {% if perms.dcim.add_cable %} - - {% endif %} -
    - {% endif %} -
    + {% if object.connected_endpoint %} +
    Device + {{ object.connected_endpoint.device }} +
    Name + {{ object.connected_endpoint.name }} +
    Type{{ object.connected_endpoint.get_type_display|placeholder }}
    Description{{ object.connected_endpoint.description|placeholder }}
    Path Status + {% if object.path.is_active %} + Reachable + {% else %} + Not Reachable + {% endif %} +
    + {% else %} +
    + Not Connected + {% if perms.dcim.add_cable %} + + {% endif %} +
    + {% endif %} +
    + {% include 'dcim/inc/panels/inventory_items.html' %} {% plugin_right_page object %}
    diff --git a/netbox/templates/dcim/consoleserverport.html b/netbox/templates/dcim/consoleserverport.html index b44c4a9b87c..b64e352e7b7 100644 --- a/netbox/templates/dcim/consoleserverport.html +++ b/netbox/templates/dcim/consoleserverport.html @@ -143,6 +143,7 @@ {% endif %}
    + {% include 'dcim/inc/panels/inventory_items.html' %} {% plugin_right_page object %}
    diff --git a/netbox/templates/dcim/frontport.html b/netbox/templates/dcim/frontport.html index 05be82fc97b..e11036f8a2c 100644 --- a/netbox/templates/dcim/frontport.html +++ b/netbox/templates/dcim/frontport.html @@ -129,6 +129,7 @@ {% endif %}
    + {% include 'dcim/inc/panels/inventory_items.html' %} {% plugin_right_page object %}
    diff --git a/netbox/templates/dcim/inc/panels/inventory_items.html b/netbox/templates/dcim/inc/panels/inventory_items.html new file mode 100644 index 00000000000..c65b342b290 --- /dev/null +++ b/netbox/templates/dcim/inc/panels/inventory_items.html @@ -0,0 +1,59 @@ +{% load helpers %} + +
    +
    Inventory Items
    +
    + + + + + + + + + + + {% for item in object.inventory_items.all %} + + + + + + + {% empty %} + + + + {% endfor %} + +
    NameLabelRole
    + {{ item.name }} + + {{ item.label|placeholder }} + + {% if item.role %} + {{ item.role }} + {% else %} + + {% endif %} + + {% if perms.dcim.change_inventoryitem %} + + + + {% endif %} + {% if perms.ipam.delete_inventoryitem %} + + + + {% endif %} +
    None
    +
    + +
    diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index bd0569c397a..a8b8da5cb42 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -448,6 +448,7 @@ {% endif %} {% include 'ipam/inc/panels/fhrp_groups.html' %} + {% include 'dcim/inc/panels/inventory_items.html' %} {% plugin_right_page object %} diff --git a/netbox/templates/dcim/poweroutlet.html b/netbox/templates/dcim/poweroutlet.html index 3f2c469afe1..90858c8d9d6 100644 --- a/netbox/templates/dcim/poweroutlet.html +++ b/netbox/templates/dcim/poweroutlet.html @@ -121,6 +121,7 @@ {% endif %} + {% include 'dcim/inc/panels/inventory_items.html' %} {% plugin_right_page object %} diff --git a/netbox/templates/dcim/powerport.html b/netbox/templates/dcim/powerport.html index f38edec8e23..1ee85b6baca 100644 --- a/netbox/templates/dcim/powerport.html +++ b/netbox/templates/dcim/powerport.html @@ -131,6 +131,7 @@ {% endif %} + {% include 'dcim/inc/panels/inventory_items.html' %} {% plugin_right_page object %} diff --git a/netbox/templates/dcim/rearport.html b/netbox/templates/dcim/rearport.html index 311ccd7fff7..c56bf0c4fd4 100644 --- a/netbox/templates/dcim/rearport.html +++ b/netbox/templates/dcim/rearport.html @@ -117,6 +117,7 @@ {% endif %} + {% include 'dcim/inc/panels/inventory_items.html' %} {% plugin_right_page object %} From 4c5a5c70b0129febfe191c70cce300aecba1aa8c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 11:19:46 -0500 Subject: [PATCH 051/271] Changelog for #7846 --- docs/release-notes/version-3.2.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 608a436a16e..e0db0b13b97 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -48,6 +48,7 @@ FIELD_CHOICES = { * [#7681](https://github.com/netbox-community/netbox/issues/7681) - Add `service_id` field for provider networks * [#7759](https://github.com/netbox-community/netbox/issues/7759) - Improved the user preferences form * [#7784](https://github.com/netbox-community/netbox/issues/7784) - Support cluster type assignment for config contexts +* [#7846](https://github.com/netbox-community/netbox/issues/7846) - Enable associating inventory items with device components * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group ### Other Changes @@ -76,7 +77,8 @@ FIELD_CHOICES = { * dcim.Interface * Added `module` field * dcim.InventoryItem - * Added `role` field + * Added `component_type`, `component_id`, and `role` fields + * Added read-only `component` field * dcim.PowerPort * Added `module` field * dcim.PowerOutlet From 21356b487a295c1a67bd9e0049f3514032d1a62c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 14:06:20 -0500 Subject: [PATCH 052/271] #7846: Show assigned component (if any) when creating inventory item --- netbox/dcim/forms/models.py | 6 +++--- netbox/dcim/tables/devices.py | 6 ++++-- netbox/dcim/views.py | 12 ++++++++++++ netbox/netbox/views/generic/object_views.py | 9 +++++++-- .../templates/dcim/inventoryitem_create.html | 18 ++++++++++++++++++ 5 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 netbox/templates/dcim/inventoryitem_create.html diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 6db3e263458..76292465344 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1377,10 +1377,11 @@ class InventoryItemForm(CustomFieldModelForm): queryset=ContentType.objects.all(), limit_choices_to=MODULAR_COMPONENT_MODELS, required=False, - widget=StaticSelect + widget=forms.HiddenInput ) component_id = forms.IntegerField( - required=False + required=False, + widget=forms.HiddenInput ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -1396,7 +1397,6 @@ class InventoryItemForm(CustomFieldModelForm): fieldsets = ( ('Inventory Item', ('device', 'parent', 'name', 'label', 'role', 'description', 'tags')), ('Hardware', ('manufacturer', 'part_id', 'serial', 'asset_tag')), - ('Component', ('component_type', 'component_id')), ) widgets = { 'device': forms.HiddenInput(), diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 4eda4a9377a..0c3a5f6a1f7 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -781,6 +781,8 @@ class InventoryItemTable(DeviceComponentTable): linkify=True ) component = tables.Column( + accessor=Accessor('component'), + orderable=False, linkify=True ) discovered = BooleanColumn() @@ -792,8 +794,8 @@ class InventoryItemTable(DeviceComponentTable): class Meta(BaseTable.Meta): model = InventoryItem fields = ( - 'pk', 'id', 'name', 'device', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', - 'component', 'description', 'discovered', 'tags', + 'pk', 'id', 'name', 'device', 'component', 'label', 'role', 'manufacturer', 'part_id', 'serial', + 'asset_tag', 'description', 'discovered', 'tags', ) default_columns = ( 'pk', 'name', 'device', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index bee7f9ef090..81f45f7d062 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2399,6 +2399,18 @@ class InventoryItemEditView(generic.ObjectEditView): class InventoryItemCreateView(generic.ComponentCreateView): queryset = InventoryItem.objects.all() model_form = forms.InventoryItemForm + template_name = 'dcim/inventoryitem_create.html' + + def alter_object(self, instance, request): + # Set component (if any) + component_type = request.GET.get('component_type') + component_id = request.GET.get('component_id') + + if component_type and component_id: + content_type = get_object_or_404(ContentType, pk=component_type) + instance.component = get_object_or_404(content_type.model_class(), pk=component_id) + + return instance class InventoryItemDeleteView(generic.ObjectDeleteView): diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 577dfa4bf88..3f5b1465893 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -689,6 +689,9 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') + def alter_object(self, instance, request): + return instance + def initialize_forms(self, request): data = request.POST if request.method == 'POST' else None initial_data = normalize_querydict(request.GET) @@ -704,9 +707,10 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View def get(self, request): form, model_form = self.initialize_forms(request) + instance = self.alter_object(self.queryset.model, request) return render(request, self.template_name, { - 'obj': self.queryset.model, + 'obj': instance, 'obj_type': self.queryset.model._meta.verbose_name, 'replication_form': form, 'form': model_form, @@ -715,6 +719,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View def post(self, request): form, model_form = self.initialize_forms(request) + instance = self.alter_object(self.queryset.model, request) self.validate_form(request, form) @@ -725,7 +730,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View return redirect(self.get_return_url(request)) return render(request, self.template_name, { - 'obj': self.queryset.model, + 'obj': instance, 'obj_type': self.queryset.model._meta.verbose_name, 'replication_form': form, 'form': model_form, diff --git a/netbox/templates/dcim/inventoryitem_create.html b/netbox/templates/dcim/inventoryitem_create.html new file mode 100644 index 00000000000..ef20a218819 --- /dev/null +++ b/netbox/templates/dcim/inventoryitem_create.html @@ -0,0 +1,18 @@ +{% extends 'dcim/component_create.html' %} +{% load helpers %} + +{% block form %} + {% if obj.component %} +
    + + +
    + {% endif %} + {{ block.super }} +{% endblock %} From 3982f13569a22d58a71af926c5fe09788108a25d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 15:07:14 -0500 Subject: [PATCH 053/271] Show parent device/VM when creating new components --- netbox/dcim/forms/object_create.py | 25 ++++++++++++++++---- netbox/dcim/tests/test_forms.py | 13 +++++++--- netbox/dcim/views.py | 17 +++++++++++++ netbox/netbox/views/generic/object_views.py | 2 +- netbox/virtualization/forms/object_create.py | 6 ++++- 5 files changed, 53 insertions(+), 10 deletions(-) diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 5e8daf38d00..1fea886ea64 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -8,7 +8,8 @@ from utilities.forms import ( ) __all__ = ( - 'ComponentCreateForm', + 'DeviceComponentCreateForm', + 'DeviceTypeComponentCreateForm', 'FrontPortCreateForm', 'FrontPortTemplateCreateForm', 'VirtualChassisCreateForm', @@ -43,14 +44,28 @@ class ComponentCreateForm(BootstrapMixin, forms.Form): }, code='label_pattern_mismatch') -class FrontPortTemplateCreateForm(ComponentCreateForm): +class DeviceTypeComponentCreateForm(ComponentCreateForm): + device_type = DynamicModelChoiceField( + queryset=DeviceType.objects.all(), + ) + field_order = ('device_type', 'name_pattern', 'label_pattern') + + +class DeviceComponentCreateForm(ComponentCreateForm): + device = DynamicModelChoiceField( + queryset=Device.objects.all() + ) + field_order = ('device', 'name_pattern', 'label_pattern') + + +class FrontPortTemplateCreateForm(DeviceTypeComponentCreateForm): rear_port_set = forms.MultipleChoiceField( choices=[], label='Rear ports', help_text='Select one rear port assignment for each front port being created.', ) field_order = ( - 'name_pattern', 'label_pattern', 'rear_port_set', + 'device_type', 'name_pattern', 'label_pattern', 'rear_port_set', ) def __init__(self, *args, **kwargs): @@ -88,14 +103,14 @@ class FrontPortTemplateCreateForm(ComponentCreateForm): } -class FrontPortCreateForm(ComponentCreateForm): +class FrontPortCreateForm(DeviceComponentCreateForm): rear_port_set = forms.MultipleChoiceField( choices=[], label='Rear ports', help_text='Select one rear port assignment for each front port being created.', ) field_order = ( - 'name_pattern', 'label_pattern', 'rear_port_set', + 'device', 'name_pattern', 'label_pattern', 'rear_port_set', ) def __init__(self, *args, **kwargs): diff --git a/netbox/dcim/tests/test_forms.py b/netbox/dcim/tests/test_forms.py index 4c5de12844e..53474314f6c 100644 --- a/netbox/dcim/tests/test_forms.py +++ b/netbox/dcim/tests/test_forms.py @@ -1,8 +1,9 @@ from django.test import TestCase -from dcim.choices import DeviceFaceChoices, DeviceStatusChoices, InterfaceTypeChoices +from dcim.choices import DeviceFaceChoices, DeviceStatusChoices from dcim.forms import * from dcim.models import * +from utilities.testing import create_test_device from virtualization.models import Cluster, ClusterGroup, ClusterType @@ -118,15 +119,20 @@ class DeviceTestCase(TestCase): class LabelTestCase(TestCase): + @classmethod + def setUpTestData(cls): + cls.device = create_test_device('Device 1') + def test_interface_label_count_valid(self): """ Test that generating an equal number of names and labels passes form validation. """ interface_data = { + 'device': self.device.pk, 'name_pattern': 'eth[0-9]', 'label_pattern': 'Interface[0-9]', } - form = ComponentCreateForm(interface_data) + form = DeviceComponentCreateForm(interface_data) self.assertTrue(form.is_valid()) @@ -135,10 +141,11 @@ class LabelTestCase(TestCase): Check that attempting to generate a differing number of names and labels results in a validation error. """ bad_interface_data = { + 'device': self.device.pk, 'name_pattern': 'eth[0-9]', 'label_pattern': 'Interface[0-1]', } - form = ComponentCreateForm(bad_interface_data) + form = DeviceComponentCreateForm(bad_interface_data) self.assertFalse(form.is_valid()) self.assertIn('label_pattern', form.errors) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 81f45f7d062..4e63c0e76cf 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1054,6 +1054,7 @@ class ModuleTypeBulkDeleteView(generic.BulkDeleteView): class ConsolePortTemplateCreateView(generic.ComponentCreateView): queryset = ConsolePortTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm model_form = forms.ConsolePortTemplateForm @@ -1087,6 +1088,7 @@ class ConsolePortTemplateBulkDeleteView(generic.BulkDeleteView): class ConsoleServerPortTemplateCreateView(generic.ComponentCreateView): queryset = ConsoleServerPortTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm model_form = forms.ConsoleServerPortTemplateForm @@ -1120,6 +1122,7 @@ class ConsoleServerPortTemplateBulkDeleteView(generic.BulkDeleteView): class PowerPortTemplateCreateView(generic.ComponentCreateView): queryset = PowerPortTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm model_form = forms.PowerPortTemplateForm @@ -1153,6 +1156,7 @@ class PowerPortTemplateBulkDeleteView(generic.BulkDeleteView): class PowerOutletTemplateCreateView(generic.ComponentCreateView): queryset = PowerOutletTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm model_form = forms.PowerOutletTemplateForm @@ -1186,6 +1190,7 @@ class PowerOutletTemplateBulkDeleteView(generic.BulkDeleteView): class InterfaceTemplateCreateView(generic.ComponentCreateView): queryset = InterfaceTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm model_form = forms.InterfaceTemplateForm @@ -1261,6 +1266,7 @@ class FrontPortTemplateBulkDeleteView(generic.BulkDeleteView): class RearPortTemplateCreateView(generic.ComponentCreateView): queryset = RearPortTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm model_form = forms.RearPortTemplateForm @@ -1294,6 +1300,7 @@ class RearPortTemplateBulkDeleteView(generic.BulkDeleteView): class ModuleBayTemplateCreateView(generic.ComponentCreateView): queryset = ModuleBayTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm model_form = forms.ModuleBayTemplateForm @@ -1327,6 +1334,7 @@ class ModuleBayTemplateBulkDeleteView(generic.BulkDeleteView): class DeviceBayTemplateCreateView(generic.ComponentCreateView): queryset = DeviceBayTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm model_form = forms.DeviceBayTemplateForm @@ -1741,6 +1749,7 @@ class ConsolePortView(generic.ObjectView): class ConsolePortCreateView(generic.ComponentCreateView): queryset = ConsolePort.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.ConsolePortForm @@ -1799,6 +1808,7 @@ class ConsoleServerPortView(generic.ObjectView): class ConsoleServerPortCreateView(generic.ComponentCreateView): queryset = ConsoleServerPort.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.ConsoleServerPortForm @@ -1857,6 +1867,7 @@ class PowerPortView(generic.ObjectView): class PowerPortCreateView(generic.ComponentCreateView): queryset = PowerPort.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.PowerPortForm @@ -1915,6 +1926,7 @@ class PowerOutletView(generic.ObjectView): class PowerOutletCreateView(generic.ComponentCreateView): queryset = PowerOutlet.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.PowerOutletForm @@ -2008,6 +2020,7 @@ class InterfaceView(generic.ObjectView): class InterfaceCreateView(generic.ComponentCreateView): queryset = Interface.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.InterfaceForm # template_name = 'dcim/interface_create.html' @@ -2161,6 +2174,7 @@ class RearPortView(generic.ObjectView): class RearPortCreateView(generic.ComponentCreateView): queryset = RearPort.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.RearPortForm @@ -2219,6 +2233,7 @@ class ModuleBayView(generic.ObjectView): class ModuleBayCreateView(generic.ComponentCreateView): queryset = ModuleBay.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.ModuleBayForm @@ -2273,6 +2288,7 @@ class DeviceBayView(generic.ObjectView): class DeviceBayCreateView(generic.ComponentCreateView): queryset = DeviceBay.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.DeviceBayForm @@ -2398,6 +2414,7 @@ class InventoryItemEditView(generic.ObjectEditView): class InventoryItemCreateView(generic.ComponentCreateView): queryset = InventoryItem.objects.all() + form = forms.DeviceComponentCreateForm model_form = forms.InventoryItemForm template_name = 'dcim/inventoryitem_create.html' diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 3f5b1465893..5895a7a6e05 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -681,7 +681,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine. """ queryset = None - form = ComponentCreateForm + form = None model_form = None template_name = 'dcim/component_create.html' patterned_fields = ('name', 'label') diff --git a/netbox/virtualization/forms/object_create.py b/netbox/virtualization/forms/object_create.py index f275469fd4f..feab3bb3a9f 100644 --- a/netbox/virtualization/forms/object_create.py +++ b/netbox/virtualization/forms/object_create.py @@ -1,6 +1,7 @@ from django import forms -from utilities.forms import BootstrapMixin, ExpandableNameField +from utilities.forms import BootstrapMixin, DynamicModelChoiceField, ExpandableNameField +from .models import VirtualMachine __all__ = ( 'VMInterfaceCreateForm', @@ -8,6 +9,9 @@ __all__ = ( class VMInterfaceCreateForm(BootstrapMixin, forms.Form): + virtual_machine = DynamicModelChoiceField( + queryset=VirtualMachine.objects.all() + ) name_pattern = ExpandableNameField( label='Name' ) From a0d6cb1fd30afb1fabb16ff40b6ae0bb5c5e98c1 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 17:14:04 -0500 Subject: [PATCH 054/271] Simplify theme color palette --- netbox/project-static/dist/netbox-dark.css | 2 +- netbox/project-static/dist/netbox-light.css | 2 +- netbox/project-static/dist/netbox-print.css | 2 +- netbox/project-static/styles/theme-base.scss | 89 ------------------- netbox/project-static/styles/theme-dark.scss | 19 ++-- netbox/project-static/styles/theme-light.scss | 51 +++++++---- 6 files changed, 51 insertions(+), 114 deletions(-) diff --git a/netbox/project-static/dist/netbox-dark.css b/netbox/project-static/dist/netbox-dark.css index e711685bf40..fe89a1b48d9 100644 --- a/netbox/project-static/dist/netbox-dark.css +++ b/netbox/project-static/dist/netbox-dark.css @@ -1 +1 @@ -html[data-netbox-color-mode=dark] :root{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #6ea8fe;--bs-secondary: #adb5bd;--bs-success: #75b798;--bs-info: #6edff6;--bs-warning: #ffda6a;--bs-danger: #ea868f;--bs-light: #dee2e6;--bs-dark: #adb5bd;--bs-red: #ea868f;--bs-yellow: #ffda6a;--bs-green: #75b798;--bs-blue: #6ea8fe;--bs-cyan: #6edff6;--bs-indigo: #a370f7;--bs-purple: #a98eda;--bs-pink: #e685b5;--bs-darker: #1b1f22;--bs-darkest: #171b1d;--bs-gray: #ced4da;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-red-100: #f8d7da;--bs-red-200: #f1aeb5;--bs-red-300: #ea868f;--bs-red-400: #e35d6a;--bs-red-500: #dc3545;--bs-red-600: #b02a37;--bs-red-700: #842029;--bs-red-800: #58151c;--bs-red-900: #2c0b0e;--bs-yellow-100: #fff3cd;--bs-yellow-200: #ffe69c;--bs-yellow-300: #ffda6a;--bs-yellow-400: #ffcd39;--bs-yellow-500: #ffc107;--bs-yellow-600: #cc9a06;--bs-yellow-700: #997404;--bs-yellow-800: #664d03;--bs-yellow-900: #332701;--bs-green-100: #d1e7dd;--bs-green-200: #a3cfbb;--bs-green-300: #75b798;--bs-green-400: #479f76;--bs-green-500: #198754;--bs-green-600: #146c43;--bs-green-700: #0f5132;--bs-green-800: #0a3622;--bs-green-900: #051b11;--bs-blue-100: #cfe2ff;--bs-blue-200: #9ec5fe;--bs-blue-300: #6ea8fe;--bs-blue-400: #3d8bfd;--bs-blue-500: #0d6efd;--bs-blue-600: #0a58ca;--bs-blue-700: #084298;--bs-blue-800: #052c65;--bs-blue-900: #031633;--bs-cyan-100: #cff4fc;--bs-cyan-200: #9eeaf9;--bs-cyan-300: #6edff6;--bs-cyan-400: #3dd5f3;--bs-cyan-500: #0dcaf0;--bs-cyan-600: #0aa2c0;--bs-cyan-700: #087990;--bs-cyan-800: #055160;--bs-cyan-900: #032830;--bs-indigo-100: #e0cffc;--bs-indigo-200: #c29ffa;--bs-indigo-300: #a370f7;--bs-indigo-400: #8540f5;--bs-indigo-500: #6610f2;--bs-indigo-600: #520dc2;--bs-indigo-700: #3d0a91;--bs-indigo-800: #290661;--bs-indigo-900: #140330;--bs-purple-100: #e2d9f3;--bs-purple-200: #c5b3e6;--bs-purple-300: #a98eda;--bs-purple-400: #8c68cd;--bs-purple-500: #6f42c1;--bs-purple-600: #59359a;--bs-purple-700: #432874;--bs-purple-800: #2c1a4d;--bs-purple-900: #160d27;--bs-pink-100: #f7d6e6;--bs-pink-200: #efadce;--bs-pink-300: #e685b5;--bs-pink-400: #de5c9d;--bs-pink-500: #d63384;--bs-pink-600: #ab296a;--bs-pink-700: #801f4f;--bs-pink-800: #561435;--bs-pink-900: #2b0a1a;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0))}html[data-netbox-color-mode=dark] *,html[data-netbox-color-mode=dark] *:before,html[data-netbox-color-mode=dark] *:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){html[data-netbox-color-mode=dark] :root{scroll-behavior:smooth}}html[data-netbox-color-mode=dark] body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#fff;background-color:#1b1f22;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}html[data-netbox-color-mode=dark] hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}html[data-netbox-color-mode=dark] hr:not([size]){height:1px}html[data-netbox-color-mode=dark] h6,html[data-netbox-color-mode=dark] .h6,html[data-netbox-color-mode=dark] h5,html[data-netbox-color-mode=dark] .h5,html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=dark] .h4,html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=dark] .h3,html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=dark] .h2,html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=dark] .h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=dark] .h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=dark] .h1{font-size:2.5rem}}html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=dark] .h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=dark] .h2{font-size:2rem}}html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=dark] .h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=dark] .h3{font-size:1.75rem}}html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=dark] .h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=dark] .h4{font-size:1.5rem}}html[data-netbox-color-mode=dark] h5,html[data-netbox-color-mode=dark] .h5{font-size:1.25rem}html[data-netbox-color-mode=dark] h6,html[data-netbox-color-mode=dark] .h6{font-size:1rem}html[data-netbox-color-mode=dark] p{margin-top:0;margin-bottom:1rem}html[data-netbox-color-mode=dark] abbr[title],html[data-netbox-color-mode=dark] abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}html[data-netbox-color-mode=dark] address{margin-bottom:1rem;font-style:normal;line-height:inherit}html[data-netbox-color-mode=dark] ol,html[data-netbox-color-mode=dark] ul{padding-left:2rem}html[data-netbox-color-mode=dark] ol,html[data-netbox-color-mode=dark] ul,html[data-netbox-color-mode=dark] dl{margin-top:0;margin-bottom:1rem}html[data-netbox-color-mode=dark] ol ol,html[data-netbox-color-mode=dark] ul ul,html[data-netbox-color-mode=dark] ol ul,html[data-netbox-color-mode=dark] ul ol{margin-bottom:0}html[data-netbox-color-mode=dark] dt{font-weight:700}html[data-netbox-color-mode=dark] dd{margin-bottom:.5rem;margin-left:0}html[data-netbox-color-mode=dark] blockquote{margin:0 0 1rem}html[data-netbox-color-mode=dark] b,html[data-netbox-color-mode=dark] strong{font-weight:800}html[data-netbox-color-mode=dark] small,html[data-netbox-color-mode=dark] .small{font-size:.875em}html[data-netbox-color-mode=dark] mark,html[data-netbox-color-mode=dark] .mark{padding:.2em;background-color:#fcf8e3}html[data-netbox-color-mode=dark] sub,html[data-netbox-color-mode=dark] sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}html[data-netbox-color-mode=dark] sub{bottom:-.25em}html[data-netbox-color-mode=dark] sup{top:-.5em}html[data-netbox-color-mode=dark] a{color:#9ec5fe;text-decoration:underline}html[data-netbox-color-mode=dark] a:hover{color:#cfe2ff}html[data-netbox-color-mode=dark] a:not([href]):not([class]),html[data-netbox-color-mode=dark] a:not([href]):not([class]):hover{color:inherit;text-decoration:none}html[data-netbox-color-mode=dark] pre,html[data-netbox-color-mode=dark] code,html[data-netbox-color-mode=dark] kbd,html[data-netbox-color-mode=dark] samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}html[data-netbox-color-mode=dark] pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}html[data-netbox-color-mode=dark] pre code{font-size:inherit;color:inherit;word-break:normal}html[data-netbox-color-mode=dark] code{font-size:.875em;color:#e9ecef;word-wrap:break-word}a>html[data-netbox-color-mode=dark] code{color:inherit}html[data-netbox-color-mode=dark] kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#dee2e6;border-radius:.375rem}html[data-netbox-color-mode=dark] kbd kbd{padding:0;font-size:1em;font-weight:700}html[data-netbox-color-mode=dark] figure{margin:0 0 1rem}html[data-netbox-color-mode=dark] img,html[data-netbox-color-mode=dark] svg{vertical-align:middle}html[data-netbox-color-mode=dark] table{caption-side:bottom;border-collapse:collapse}html[data-netbox-color-mode=dark] caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}html[data-netbox-color-mode=dark] th{text-align:inherit;text-align:-webkit-match-parent}html[data-netbox-color-mode=dark] thead,html[data-netbox-color-mode=dark] tbody,html[data-netbox-color-mode=dark] tfoot,html[data-netbox-color-mode=dark] tr,html[data-netbox-color-mode=dark] td,html[data-netbox-color-mode=dark] th{border-color:inherit;border-style:solid;border-width:0}html[data-netbox-color-mode=dark] label{display:inline-block}html[data-netbox-color-mode=dark] button{border-radius:0}html[data-netbox-color-mode=dark] button:focus:not(:focus-visible){outline:0}html[data-netbox-color-mode=dark] input,html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] select,html[data-netbox-color-mode=dark] optgroup,html[data-netbox-color-mode=dark] textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] select{text-transform:none}html[data-netbox-color-mode=dark] [role=button]{cursor:pointer}html[data-netbox-color-mode=dark] select{word-wrap:normal}html[data-netbox-color-mode=dark] select:disabled{opacity:1}html[data-netbox-color-mode=dark] [list]::-webkit-calendar-picker-indicator{display:none}html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] [type=button],html[data-netbox-color-mode=dark] [type=reset],html[data-netbox-color-mode=dark] [type=submit]{-webkit-appearance:button}html[data-netbox-color-mode=dark] button:not(:disabled),html[data-netbox-color-mode=dark] [type=button]:not(:disabled),html[data-netbox-color-mode=dark] [type=reset]:not(:disabled),html[data-netbox-color-mode=dark] [type=submit]:not(:disabled){cursor:pointer}html[data-netbox-color-mode=dark] ::-moz-focus-inner{padding:0;border-style:none}html[data-netbox-color-mode=dark] textarea{resize:vertical}html[data-netbox-color-mode=dark] fieldset{min-width:0;padding:0;margin:0;border:0}html[data-netbox-color-mode=dark] legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){html[data-netbox-color-mode=dark] legend{font-size:1.5rem}}html[data-netbox-color-mode=dark] legend+*{clear:left}html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-fields-wrapper,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-text,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-minute,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-hour-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-day-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-month-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-year-field{padding:0}html[data-netbox-color-mode=dark] ::-webkit-inner-spin-button{height:auto}html[data-netbox-color-mode=dark] [type=search]{outline-offset:-2px;-webkit-appearance:textfield}html[data-netbox-color-mode=dark] ::-webkit-search-decoration{-webkit-appearance:none}html[data-netbox-color-mode=dark] ::-webkit-color-swatch-wrapper{padding:0}html[data-netbox-color-mode=dark] ::file-selector-button{font:inherit}html[data-netbox-color-mode=dark] ::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}html[data-netbox-color-mode=dark] output{display:inline-block}html[data-netbox-color-mode=dark] iframe{border:0}html[data-netbox-color-mode=dark] summary{display:list-item;cursor:pointer}html[data-netbox-color-mode=dark] progress{vertical-align:baseline}html[data-netbox-color-mode=dark] [hidden]{display:none!important}html[data-netbox-color-mode=dark] .lead{font-size:1.25rem;font-weight:300}html[data-netbox-color-mode=dark] .display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-1{font-size:5rem}}html[data-netbox-color-mode=dark] .display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-2{font-size:4.5rem}}html[data-netbox-color-mode=dark] .display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-3{font-size:4rem}}html[data-netbox-color-mode=dark] .display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-4{font-size:3.5rem}}html[data-netbox-color-mode=dark] .display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-5{font-size:3rem}}html[data-netbox-color-mode=dark] .display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-6{font-size:2.5rem}}html[data-netbox-color-mode=dark] .list-unstyled{padding-left:0;list-style:none}html[data-netbox-color-mode=dark] .list-inline{padding-left:0;list-style:none}html[data-netbox-color-mode=dark] .list-inline-item{display:inline-block}html[data-netbox-color-mode=dark] .list-inline-item:not(:last-child){margin-right:.5rem}html[data-netbox-color-mode=dark] .initialism{font-size:.875em;text-transform:uppercase}html[data-netbox-color-mode=dark] .blockquote{margin-bottom:1rem;font-size:1.25rem}html[data-netbox-color-mode=dark] .blockquote>:last-child{margin-bottom:0}html[data-netbox-color-mode=dark] .blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}html[data-netbox-color-mode=dark] .blockquote-footer:before{content:"\2014\a0"}html[data-netbox-color-mode=dark] .img-fluid{max-width:100%;height:auto}html[data-netbox-color-mode=dark] .img-thumbnail{padding:.25rem;background-color:#1b1f22;border:1px solid #dee2e6;border-radius:.375rem;max-width:100%;height:auto}html[data-netbox-color-mode=dark] .figure{display:inline-block}html[data-netbox-color-mode=dark] .figure-img{margin-bottom:.5rem;line-height:1}html[data-netbox-color-mode=dark] .figure-caption{font-size:.875em;color:#6c757d}html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=dark] .container-fluid,html[data-netbox-color-mode=dark] .container-xxl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm{width:100%;padding-right:var(--bs-gutter-x, .75rem);padding-left:var(--bs-gutter-x, .75rem);margin-right:auto;margin-left:auto}@media (min-width: 576px){html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:540px}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:720px}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:960px}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:1140px}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .container-xxl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:1320px}}html[data-netbox-color-mode=dark] .row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}html[data-netbox-color-mode=dark] .row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}html[data-netbox-color-mode=dark] .col{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-6>*{flex:0 0 auto;width:16.6666666667%}@media (min-width: 576px){html[data-netbox-color-mode=dark] .col-sm{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-sm-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-sm-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-sm-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-sm-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-sm-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .col-md{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-md-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-md-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-md-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-md-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-md-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .col-lg{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-lg-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-lg-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-lg-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-lg-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-lg-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .col-xl{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-xl-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-xl-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-xl-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-xl-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-xl-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .col-xxl{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-xxl-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-xxl-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-xxl-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-xxl-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-xxl-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}html[data-netbox-color-mode=dark] .col-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-0,html[data-netbox-color-mode=dark] .gx-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-0,html[data-netbox-color-mode=dark] .gy-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-1,html[data-netbox-color-mode=dark] .gx-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-1,html[data-netbox-color-mode=dark] .gy-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-2,html[data-netbox-color-mode=dark] .gx-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-2,html[data-netbox-color-mode=dark] .gy-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-3,html[data-netbox-color-mode=dark] .gx-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-3,html[data-netbox-color-mode=dark] .gy-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-4,html[data-netbox-color-mode=dark] .gx-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-4,html[data-netbox-color-mode=dark] .gy-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-5,html[data-netbox-color-mode=dark] .gx-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-5,html[data-netbox-color-mode=dark] .gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){html[data-netbox-color-mode=dark] .col-sm-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-sm-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-sm-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-sm-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-sm-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-sm-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-sm-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-sm-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-sm-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-sm-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-sm-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-sm-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-sm-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-sm-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-sm-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-sm-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-sm-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-sm-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-sm-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-sm-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-sm-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-sm-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-sm-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-sm-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-sm-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-sm-0,html[data-netbox-color-mode=dark] .gx-sm-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-sm-0,html[data-netbox-color-mode=dark] .gy-sm-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-sm-1,html[data-netbox-color-mode=dark] .gx-sm-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-sm-1,html[data-netbox-color-mode=dark] .gy-sm-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-sm-2,html[data-netbox-color-mode=dark] .gx-sm-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-sm-2,html[data-netbox-color-mode=dark] .gy-sm-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-sm-3,html[data-netbox-color-mode=dark] .gx-sm-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-sm-3,html[data-netbox-color-mode=dark] .gy-sm-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-sm-4,html[data-netbox-color-mode=dark] .gx-sm-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-sm-4,html[data-netbox-color-mode=dark] .gy-sm-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-sm-5,html[data-netbox-color-mode=dark] .gx-sm-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-sm-5,html[data-netbox-color-mode=dark] .gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .col-md-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-md-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-md-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-md-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-md-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-md-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-md-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-md-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-md-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-md-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-md-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-md-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-md-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-md-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-md-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-md-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-md-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-md-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-md-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-md-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-md-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-md-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-md-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-md-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-md-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-md-0,html[data-netbox-color-mode=dark] .gx-md-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-md-0,html[data-netbox-color-mode=dark] .gy-md-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-md-1,html[data-netbox-color-mode=dark] .gx-md-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-md-1,html[data-netbox-color-mode=dark] .gy-md-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-md-2,html[data-netbox-color-mode=dark] .gx-md-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-md-2,html[data-netbox-color-mode=dark] .gy-md-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-md-3,html[data-netbox-color-mode=dark] .gx-md-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-md-3,html[data-netbox-color-mode=dark] .gy-md-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-md-4,html[data-netbox-color-mode=dark] .gx-md-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-md-4,html[data-netbox-color-mode=dark] .gy-md-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-md-5,html[data-netbox-color-mode=dark] .gx-md-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-md-5,html[data-netbox-color-mode=dark] .gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .col-lg-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-lg-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-lg-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-lg-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-lg-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-lg-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-lg-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-lg-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-lg-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-lg-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-lg-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-lg-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-lg-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-lg-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-lg-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-lg-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-lg-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-lg-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-lg-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-lg-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-lg-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-lg-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-lg-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-lg-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-lg-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-lg-0,html[data-netbox-color-mode=dark] .gx-lg-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-lg-0,html[data-netbox-color-mode=dark] .gy-lg-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-lg-1,html[data-netbox-color-mode=dark] .gx-lg-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-lg-1,html[data-netbox-color-mode=dark] .gy-lg-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-lg-2,html[data-netbox-color-mode=dark] .gx-lg-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-lg-2,html[data-netbox-color-mode=dark] .gy-lg-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-lg-3,html[data-netbox-color-mode=dark] .gx-lg-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-lg-3,html[data-netbox-color-mode=dark] .gy-lg-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-lg-4,html[data-netbox-color-mode=dark] .gx-lg-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-lg-4,html[data-netbox-color-mode=dark] .gy-lg-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-lg-5,html[data-netbox-color-mode=dark] .gx-lg-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-lg-5,html[data-netbox-color-mode=dark] .gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .col-xl-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-xl-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-xl-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-xl-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-xl-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-xl-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-xl-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-xl-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-xl-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-xl-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-xl-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-xl-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-xl-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-xl-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-xl-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-xl-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-xl-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-xl-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-xl-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-xl-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-xl-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-xl-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-xl-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-xl-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-xl-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-xl-0,html[data-netbox-color-mode=dark] .gx-xl-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-xl-0,html[data-netbox-color-mode=dark] .gy-xl-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-xl-1,html[data-netbox-color-mode=dark] .gx-xl-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-xl-1,html[data-netbox-color-mode=dark] .gy-xl-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-xl-2,html[data-netbox-color-mode=dark] .gx-xl-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-xl-2,html[data-netbox-color-mode=dark] .gy-xl-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-xl-3,html[data-netbox-color-mode=dark] .gx-xl-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-xl-3,html[data-netbox-color-mode=dark] .gy-xl-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-xl-4,html[data-netbox-color-mode=dark] .gx-xl-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-xl-4,html[data-netbox-color-mode=dark] .gy-xl-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-xl-5,html[data-netbox-color-mode=dark] .gx-xl-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-xl-5,html[data-netbox-color-mode=dark] .gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .col-xxl-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-xxl-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-xxl-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-xxl-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-xxl-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-xxl-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-xxl-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-xxl-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-xxl-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-xxl-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-xxl-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-xxl-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-xxl-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-xxl-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-xxl-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-xxl-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-xxl-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-xxl-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-xxl-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-xxl-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-xxl-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-xxl-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-xxl-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-xxl-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-xxl-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-xxl-0,html[data-netbox-color-mode=dark] .gx-xxl-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-xxl-0,html[data-netbox-color-mode=dark] .gy-xxl-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-xxl-1,html[data-netbox-color-mode=dark] .gx-xxl-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-xxl-1,html[data-netbox-color-mode=dark] .gy-xxl-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-xxl-2,html[data-netbox-color-mode=dark] .gx-xxl-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-xxl-2,html[data-netbox-color-mode=dark] .gy-xxl-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-xxl-3,html[data-netbox-color-mode=dark] .gx-xxl-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-xxl-3,html[data-netbox-color-mode=dark] .gy-xxl-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-xxl-4,html[data-netbox-color-mode=dark] .gx-xxl-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-xxl-4,html[data-netbox-color-mode=dark] .gy-xxl-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-xxl-5,html[data-netbox-color-mode=dark] .gx-xxl-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-xxl-5,html[data-netbox-color-mode=dark] .gy-xxl-5{--bs-gutter-y: 3rem}}html[data-netbox-color-mode=dark] .table{--bs-table-bg: transparent;--bs-table-accent-bg: transparent;--bs-table-striped-color: #f8f9fa;--bs-table-striped-bg: rgba(255, 255, 255, .05);--bs-table-active-color: #f8f9fa;--bs-table-active-bg: rgba(255, 255, 255, .1);--bs-table-hover-color: #f8f9fa;--bs-table-hover-bg: rgba(255, 255, 255, .075);width:100%;margin-bottom:1rem;color:#f8f9fa;vertical-align:top;border-color:#495057}html[data-netbox-color-mode=dark] .table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}html[data-netbox-color-mode=dark] .table>tbody{vertical-align:inherit}html[data-netbox-color-mode=dark] .table>thead{vertical-align:bottom}html[data-netbox-color-mode=dark] .table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}html[data-netbox-color-mode=dark] .caption-top{caption-side:top}html[data-netbox-color-mode=dark] .table-sm>:not(caption)>*>*{padding:.25rem}html[data-netbox-color-mode=dark] .table-bordered>:not(caption)>*{border-width:1px 0}html[data-netbox-color-mode=dark] .table-bordered>:not(caption)>*>*{border-width:0 1px}html[data-netbox-color-mode=dark] .table-borderless>:not(caption)>*>*{border-bottom-width:0}html[data-netbox-color-mode=dark] .table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}html[data-netbox-color-mode=dark] .table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}html[data-netbox-color-mode=dark] .table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}html[data-netbox-color-mode=dark] .table-primary{--bs-table-bg: #cfe2ff;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:#000;border-color:#bacbe6}html[data-netbox-color-mode=dark] .table-secondary{--bs-table-bg: #e2e3e5;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:#000;border-color:#cbccce}html[data-netbox-color-mode=dark] .table-success{--bs-table-bg: #d1e7dd;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:#000;border-color:#bcd0c7}html[data-netbox-color-mode=dark] .table-info{--bs-table-bg: #cff4fc;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:#000;border-color:#badce3}html[data-netbox-color-mode=dark] .table-warning{--bs-table-bg: #fff3cd;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:#000;border-color:#e6dbb9}html[data-netbox-color-mode=dark] .table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}html[data-netbox-color-mode=dark] .table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}html[data-netbox-color-mode=dark] .table-dark{--bs-table-bg: #212529;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:#fff;border-color:#373b3e}html[data-netbox-color-mode=dark] .table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){html[data-netbox-color-mode=dark] .table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){html[data-netbox-color-mode=dark] .table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] .table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){html[data-netbox-color-mode=dark] .table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){html[data-netbox-color-mode=dark] .table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}html[data-netbox-color-mode=dark] .form-label{margin-bottom:.5rem}html[data-netbox-color-mode=dark] .col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}html[data-netbox-color-mode=dark] .col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}html[data-netbox-color-mode=dark] .col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}html[data-netbox-color-mode=dark] .form-text{margin-top:.25rem;font-size:.875em;color:#ced4da}html[data-netbox-color-mode=dark] .form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#f8f9fa;background-color:#212529;background-clip:padding-box;border:1px solid #495057;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-control{transition:none}}html[data-netbox-color-mode=dark] .form-control[type=file]{overflow:hidden}html[data-netbox-color-mode=dark] .form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}html[data-netbox-color-mode=dark] .form-control:focus{color:#f8f9fa;background-color:#212529;border-color:#7db1fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-control::-webkit-date-and-time-value{height:1.5em}html[data-netbox-color-mode=dark] .form-control::placeholder{color:#495057;opacity:1}html[data-netbox-color-mode=dark] .form-control:disabled,html[data-netbox-color-mode=dark] .form-control[readonly]{background-color:#495057;opacity:1}html[data-netbox-color-mode=dark] .form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#f8f9fa;background-color:#495057;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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){html[data-netbox-color-mode=dark] .form-control::file-selector-button{transition:none}}html[data-netbox-color-mode=dark] .form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#454c53}html[data-netbox-color-mode=dark] .form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#f8f9fa;background-color:#495057;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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){html[data-netbox-color-mode=dark] .form-control::-webkit-file-upload-button{transition:none}}html[data-netbox-color-mode=dark] .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#454c53}html[data-netbox-color-mode=dark] .form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#fff;background-color:transparent;border:solid transparent;border-width:1px 0}html[data-netbox-color-mode=dark] .form-control-plaintext.form-control-sm,html[data-netbox-color-mode=dark] .form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}html[data-netbox-color-mode=dark] .form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html[data-netbox-color-mode=dark] .form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}html[data-netbox-color-mode=dark] .form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}html[data-netbox-color-mode=dark] .form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}html[data-netbox-color-mode=dark] .form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}html[data-netbox-color-mode=dark] .form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}html[data-netbox-color-mode=dark] textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}html[data-netbox-color-mode=dark] textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}html[data-netbox-color-mode=dark] textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}html[data-netbox-color-mode=dark] .form-control-color{max-width:3rem;height:auto;padding:.375rem}html[data-netbox-color-mode=dark] .form-control-color:not(:disabled):not([readonly]){cursor:pointer}html[data-netbox-color-mode=dark] .form-control-color::-moz-color-swatch{height:1.5em;border-radius:.375rem}html[data-netbox-color-mode=dark] .form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.375rem}html[data-netbox-color-mode=dark] .form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#f8f9fa;background-color:#212529;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='%23f8f9fa' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #495057;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-select{transition:none}}html[data-netbox-color-mode=dark] .form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-select[multiple],html[data-netbox-color-mode=dark] .form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}html[data-netbox-color-mode=dark] .form-select:disabled{color:#adb5bd;background-color:#495057}html[data-netbox-color-mode=dark] .form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #f8f9fa}html[data-netbox-color-mode=dark] .form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}html[data-netbox-color-mode=dark] .form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}html[data-netbox-color-mode=dark] .form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}html[data-netbox-color-mode=dark] .form-check .form-check-input{float:left;margin-left:-1.5em}html[data-netbox-color-mode=dark] .form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#212529;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(255,255,255,.25);appearance:none;color-adjust:exact}html[data-netbox-color-mode=dark] .form-check-input[type=checkbox]{border-radius:.25em}html[data-netbox-color-mode=dark] .form-check-input[type=radio]{border-radius:50%}html[data-netbox-color-mode=dark] .form-check-input:active{filter:brightness(90%)}html[data-netbox-color-mode=dark] .form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-check-input:checked{background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-check-input[type=checkbox]:indeterminate{background-color:#6ea8fe;border-color:#6ea8fe;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}html[data-netbox-color-mode=dark] .form-check-input[disabled]~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input:disabled~.form-check-label{opacity:.5}html[data-netbox-color-mode=dark] .form-switch{padding-left:2.5em}html[data-netbox-color-mode=dark] .form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-switch .form-check-input{transition:none}}html[data-netbox-color-mode=dark] .form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-check-inline{display:inline-block;margin-right:1rem}html[data-netbox-color-mode=dark] .btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}html[data-netbox-color-mode=dark] .btn-check[disabled]+.btn,html[data-netbox-color-mode=dark] .btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}html[data-netbox-color-mode=dark] .form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}html[data-netbox-color-mode=dark] .form-range:focus{outline:0}html[data-netbox-color-mode=dark] .form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #1b1f22,0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #1b1f22,0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-range::-moz-focus-outer{border:0}html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#6ea8fe;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb{transition:none}}html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb:active{background-color:#d4e5ff}html[data-netbox-color-mode=dark] .form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#6ea8fe;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb{transition:none}}html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb:active{background-color:#d4e5ff}html[data-netbox-color-mode=dark] .form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}html[data-netbox-color-mode=dark] .form-range:disabled{pointer-events:none}html[data-netbox-color-mode=dark] .form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}html[data-netbox-color-mode=dark] .form-range:disabled::-moz-range-thumb{background-color:#adb5bd}html[data-netbox-color-mode=dark] .form-floating>.form-control,html[data-netbox-color-mode=dark] .form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}html[data-netbox-color-mode=dark] .form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-floating>label{transition:none}}html[data-netbox-color-mode=dark] .form-floating>.form-control{padding:1rem .75rem}html[data-netbox-color-mode=dark] .form-floating>.form-control::placeholder{color:transparent}html[data-netbox-color-mode=dark] .form-floating>.form-control:focus,html[data-netbox-color-mode=dark] .form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.form-control:focus~label,html[data-netbox-color-mode=dark] .form-floating>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=dark] .form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}html[data-netbox-color-mode=dark] .form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}html[data-netbox-color-mode=dark] .input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}html[data-netbox-color-mode=dark] .input-group>.form-control,html[data-netbox-color-mode=dark] .input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}html[data-netbox-color-mode=dark] .input-group>.form-control:focus,html[data-netbox-color-mode=dark] .input-group>.form-select:focus{z-index:3}html[data-netbox-color-mode=dark] .input-group .btn{position:relative;z-index:2}html[data-netbox-color-mode=dark] .input-group .btn:focus{z-index:3}html[data-netbox-color-mode=dark] .input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#f8f9fa;text-align:center;white-space:nowrap;background-color:#495057;border:1px solid #495057;border-radius:.375rem}html[data-netbox-color-mode=dark] .input-group-lg>.form-control,html[data-netbox-color-mode=dark] .input-group-lg>.form-select,html[data-netbox-color-mode=dark] .input-group-lg>.input-group-text,html[data-netbox-color-mode=dark] .input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}html[data-netbox-color-mode=dark] .input-group-sm>.form-control,html[data-netbox-color-mode=dark] .input-group-sm>.form-select,html[data-netbox-color-mode=dark] .input-group-sm>.input-group-text,html[data-netbox-color-mode=dark] .input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html[data-netbox-color-mode=dark] .input-group-lg>.form-select,html[data-netbox-color-mode=dark] .input-group-sm>.form-select{padding-right:3rem}html[data-netbox-color-mode=dark] .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=dark] .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=dark] .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}html[data-netbox-color-mode=dark] .valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#198754e6;border-radius:.375rem}.was-validated html[data-netbox-color-mode=dark]:valid~.valid-feedback,.was-validated html[data-netbox-color-mode=dark]:valid~.valid-tooltip,html[data-netbox-color-mode=dark].is-valid~.valid-feedback,html[data-netbox-color-mode=dark].is-valid~.valid-tooltip{display:block}.was-validated html[data-netbox-color-mode=dark] .form-control:valid,html[data-netbox-color-mode=dark] .form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html[data-netbox-color-mode=dark] .form-control:valid:focus,html[data-netbox-color-mode=dark] .form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}.was-validated html[data-netbox-color-mode=dark] textarea.form-control:valid,html[data-netbox-color-mode=dark] textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated html[data-netbox-color-mode=dark] .form-select:valid,html[data-netbox-color-mode=dark] .form-select.is-valid{border-color:#198754}.was-validated html[data-netbox-color-mode=dark] .form-select:valid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=dark] .form-select:valid:not([multiple])[size="1"],html[data-netbox-color-mode=dark] .form-select.is-valid:not([multiple]):not([size]),html[data-netbox-color-mode=dark] .form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23f8f9fa' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html[data-netbox-color-mode=dark] .form-select:valid:focus,html[data-netbox-color-mode=dark] .form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid,html[data-netbox-color-mode=dark] .form-check-input.is-valid{border-color:#198754}.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid:checked,html[data-netbox-color-mode=dark] .form-check-input.is-valid:checked{background-color:#198754}.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid:focus,html[data-netbox-color-mode=dark] .form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem #19875440}.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input.is-valid~.form-check-label{color:#198754}html[data-netbox-color-mode=dark] .form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:valid,html[data-netbox-color-mode=dark] .input-group .form-control.is-valid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:valid,html[data-netbox-color-mode=dark] .input-group .form-select.is-valid{z-index:1}.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:valid:focus,html[data-netbox-color-mode=dark] .input-group .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:valid:focus,html[data-netbox-color-mode=dark] .input-group .form-select.is-valid:focus{z-index:3}html[data-netbox-color-mode=dark] .invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}html[data-netbox-color-mode=dark] .invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#dc3545e6;border-radius:.375rem}.was-validated html[data-netbox-color-mode=dark]:invalid~.invalid-feedback,.was-validated html[data-netbox-color-mode=dark]:invalid~.invalid-tooltip,html[data-netbox-color-mode=dark].is-invalid~.invalid-feedback,html[data-netbox-color-mode=dark].is-invalid~.invalid-tooltip{display:block}.was-validated html[data-netbox-color-mode=dark] .form-control:invalid,html[data-netbox-color-mode=dark] .form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html[data-netbox-color-mode=dark] .form-control:invalid:focus,html[data-netbox-color-mode=dark] .form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated html[data-netbox-color-mode=dark] textarea.form-control:invalid,html[data-netbox-color-mode=dark] textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated html[data-netbox-color-mode=dark] .form-select:invalid,html[data-netbox-color-mode=dark] .form-select.is-invalid{border-color:#dc3545}.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:not([multiple])[size="1"],html[data-netbox-color-mode=dark] .form-select.is-invalid:not([multiple]):not([size]),html[data-netbox-color-mode=dark] .form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23f8f9fa' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:focus,html[data-netbox-color-mode=dark] .form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid,html[data-netbox-color-mode=dark] .form-check-input.is-invalid{border-color:#dc3545}.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid:checked,html[data-netbox-color-mode=dark] .form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid:focus,html[data-netbox-color-mode=dark] .form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem #dc354540}.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input.is-invalid~.form-check-label{color:#dc3545}html[data-netbox-color-mode=dark] .form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:invalid,html[data-netbox-color-mode=dark] .input-group .form-control.is-invalid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:invalid,html[data-netbox-color-mode=dark] .input-group .form-select.is-invalid{z-index:2}.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:invalid:focus,html[data-netbox-color-mode=dark] .input-group .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:invalid:focus,html[data-netbox-color-mode=dark] .input-group .form-select.is-invalid:focus{z-index:3}html[data-netbox-color-mode=dark] .btn{display:inline-block;font-weight:400;line-height:1.5;color:#fff;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.375rem;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){html[data-netbox-color-mode=dark] .btn{transition:none}}html[data-netbox-color-mode=dark] .btn:hover{color:#fff}.btn-check:focus+html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=dark] .btn:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .btn:disabled,html[data-netbox-color-mode=dark] .btn.disabled,fieldset:disabled html[data-netbox-color-mode=dark] .btn{pointer-events:none;opacity:.65}html[data-netbox-color-mode=dark] .btn-primary{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-primary:hover{color:#000;background-color:#84b5fe;border-color:#7db1fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=dark] .btn-primary:focus{color:#000;background-color:#84b5fe;border-color:#7db1fe;box-shadow:0 0 0 .25rem #5e8fd880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-primary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=dark] .btn-primary:active,html[data-netbox-color-mode=dark] .btn-primary.active,.show>html[data-netbox-color-mode=dark] .btn-primary.dropdown-toggle{color:#000;background-color:#8bb9fe;border-color:#7db1fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-primary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-primary:focus,html[data-netbox-color-mode=dark] .btn-primary:active:focus,html[data-netbox-color-mode=dark] .btn-primary.active:focus,.show>html[data-netbox-color-mode=dark] .btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5e8fd880}html[data-netbox-color-mode=dark] .btn-primary:disabled,html[data-netbox-color-mode=dark] .btn-primary.disabled{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-secondary{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-secondary:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-secondary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary:active,html[data-netbox-color-mode=dark] .btn-secondary.active,.show>html[data-netbox-color-mode=dark] .btn-secondary.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-secondary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-secondary:focus,html[data-netbox-color-mode=dark] .btn-secondary:active:focus,html[data-netbox-color-mode=dark] .btn-secondary.active:focus,.show>html[data-netbox-color-mode=dark] .btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}html[data-netbox-color-mode=dark] .btn-secondary:disabled,html[data-netbox-color-mode=dark] .btn-secondary.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-success{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-success:hover{color:#000;background-color:#8ac2a7;border-color:#83bea2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=dark] .btn-success:focus{color:#000;background-color:#8ac2a7;border-color:#83bea2;box-shadow:0 0 0 .25rem #639c8180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-success,.btn-check:active+html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=dark] .btn-success:active,html[data-netbox-color-mode=dark] .btn-success.active,.show>html[data-netbox-color-mode=dark] .btn-success.dropdown-toggle{color:#000;background-color:#91c5ad;border-color:#83bea2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-success:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-success:focus,html[data-netbox-color-mode=dark] .btn-success:active:focus,html[data-netbox-color-mode=dark] .btn-success.active:focus,.show>html[data-netbox-color-mode=dark] .btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #639c8180}html[data-netbox-color-mode=dark] .btn-success:disabled,html[data-netbox-color-mode=dark] .btn-success.disabled{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-info{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-info:hover{color:#000;background-color:#84e4f7;border-color:#7de2f7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=dark] .btn-info:focus{color:#000;background-color:#84e4f7;border-color:#7de2f7;box-shadow:0 0 0 .25rem #5ebed180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-info,.btn-check:active+html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=dark] .btn-info:active,html[data-netbox-color-mode=dark] .btn-info.active,.show>html[data-netbox-color-mode=dark] .btn-info.dropdown-toggle{color:#000;background-color:#8be5f8;border-color:#7de2f7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-info:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-info:focus,html[data-netbox-color-mode=dark] .btn-info:active:focus,html[data-netbox-color-mode=dark] .btn-info.active:focus,.show>html[data-netbox-color-mode=dark] .btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5ebed180}html[data-netbox-color-mode=dark] .btn-info:disabled,html[data-netbox-color-mode=dark] .btn-info.disabled{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-warning{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-warning:hover{color:#000;background-color:#ffe080;border-color:#ffde79}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=dark] .btn-warning:focus{color:#000;background-color:#ffe080;border-color:#ffde79;box-shadow:0 0 0 .25rem #d9b95a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-warning,.btn-check:active+html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=dark] .btn-warning:active,html[data-netbox-color-mode=dark] .btn-warning.active,.show>html[data-netbox-color-mode=dark] .btn-warning.dropdown-toggle{color:#000;background-color:#ffe188;border-color:#ffde79}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-warning:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-warning:focus,html[data-netbox-color-mode=dark] .btn-warning:active:focus,html[data-netbox-color-mode=dark] .btn-warning.active:focus,.show>html[data-netbox-color-mode=dark] .btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9b95a80}html[data-netbox-color-mode=dark] .btn-warning:disabled,html[data-netbox-color-mode=dark] .btn-warning.disabled{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-danger{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-danger:hover{color:#000;background-color:#ed98a0;border-color:#ec929a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=dark] .btn-danger:focus{color:#000;background-color:#ed98a0;border-color:#ec929a;box-shadow:0 0 0 .25rem #c7727a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-danger,.btn-check:active+html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=dark] .btn-danger:active,html[data-netbox-color-mode=dark] .btn-danger.active,.show>html[data-netbox-color-mode=dark] .btn-danger.dropdown-toggle{color:#000;background-color:#ee9ea5;border-color:#ec929a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-danger:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-danger:focus,html[data-netbox-color-mode=dark] .btn-danger:active:focus,html[data-netbox-color-mode=dark] .btn-danger.active:focus,.show>html[data-netbox-color-mode=dark] .btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c7727a80}html[data-netbox-color-mode=dark] .btn-danger:disabled,html[data-netbox-color-mode=dark] .btn-danger.disabled{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-light{color:#000;background-color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-light:hover{color:#000;background-color:#e3e6ea;border-color:#e1e5e9}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=dark] .btn-light:focus{color:#000;background-color:#e3e6ea;border-color:#e1e5e9;box-shadow:0 0 0 .25rem #bdc0c480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-light,.btn-check:active+html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=dark] .btn-light:active,html[data-netbox-color-mode=dark] .btn-light.active,.show>html[data-netbox-color-mode=dark] .btn-light.dropdown-toggle{color:#000;background-color:#e5e8eb;border-color:#e1e5e9}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-light:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-light:focus,html[data-netbox-color-mode=dark] .btn-light:active:focus,html[data-netbox-color-mode=dark] .btn-light.active:focus,.show>html[data-netbox-color-mode=dark] .btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bdc0c480}html[data-netbox-color-mode=dark] .btn-light:disabled,html[data-netbox-color-mode=dark] .btn-light.disabled{color:#000;background-color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-dark{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-dark:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=dark] .btn-dark:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-dark,.btn-check:active+html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=dark] .btn-dark:active,html[data-netbox-color-mode=dark] .btn-dark.active,.show>html[data-netbox-color-mode=dark] .btn-dark.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-dark:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-dark:focus,html[data-netbox-color-mode=dark] .btn-dark:active:focus,html[data-netbox-color-mode=dark] .btn-dark.active:focus,.show>html[data-netbox-color-mode=dark] .btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}html[data-netbox-color-mode=dark] .btn-dark:disabled,html[data-netbox-color-mode=dark] .btn-dark.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-red{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-red:hover{color:#000;background-color:#ed98a0;border-color:#ec929a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=dark] .btn-red:focus{color:#000;background-color:#ed98a0;border-color:#ec929a;box-shadow:0 0 0 .25rem #c7727a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=dark] .btn-red:active,html[data-netbox-color-mode=dark] .btn-red.active,.show>html[data-netbox-color-mode=dark] .btn-red.dropdown-toggle{color:#000;background-color:#ee9ea5;border-color:#ec929a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red:focus,html[data-netbox-color-mode=dark] .btn-red:active:focus,html[data-netbox-color-mode=dark] .btn-red.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c7727a80}html[data-netbox-color-mode=dark] .btn-red:disabled,html[data-netbox-color-mode=dark] .btn-red.disabled{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-yellow{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-yellow:hover{color:#000;background-color:#ffe080;border-color:#ffde79}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow:focus{color:#000;background-color:#ffe080;border-color:#ffde79;box-shadow:0 0 0 .25rem #d9b95a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow:active,html[data-netbox-color-mode=dark] .btn-yellow.active,.show>html[data-netbox-color-mode=dark] .btn-yellow.dropdown-toggle{color:#000;background-color:#ffe188;border-color:#ffde79}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow:focus,html[data-netbox-color-mode=dark] .btn-yellow:active:focus,html[data-netbox-color-mode=dark] .btn-yellow.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9b95a80}html[data-netbox-color-mode=dark] .btn-yellow:disabled,html[data-netbox-color-mode=dark] .btn-yellow.disabled{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-green{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-green:hover{color:#000;background-color:#8ac2a7;border-color:#83bea2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=dark] .btn-green:focus{color:#000;background-color:#8ac2a7;border-color:#83bea2;box-shadow:0 0 0 .25rem #639c8180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=dark] .btn-green:active,html[data-netbox-color-mode=dark] .btn-green.active,.show>html[data-netbox-color-mode=dark] .btn-green.dropdown-toggle{color:#000;background-color:#91c5ad;border-color:#83bea2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green:focus,html[data-netbox-color-mode=dark] .btn-green:active:focus,html[data-netbox-color-mode=dark] .btn-green.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #639c8180}html[data-netbox-color-mode=dark] .btn-green:disabled,html[data-netbox-color-mode=dark] .btn-green.disabled{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-blue{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-blue:hover{color:#000;background-color:#84b5fe;border-color:#7db1fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=dark] .btn-blue:focus{color:#000;background-color:#84b5fe;border-color:#7db1fe;box-shadow:0 0 0 .25rem #5e8fd880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=dark] .btn-blue:active,html[data-netbox-color-mode=dark] .btn-blue.active,.show>html[data-netbox-color-mode=dark] .btn-blue.dropdown-toggle{color:#000;background-color:#8bb9fe;border-color:#7db1fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue:focus,html[data-netbox-color-mode=dark] .btn-blue:active:focus,html[data-netbox-color-mode=dark] .btn-blue.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5e8fd880}html[data-netbox-color-mode=dark] .btn-blue:disabled,html[data-netbox-color-mode=dark] .btn-blue.disabled{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-cyan{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-cyan:hover{color:#000;background-color:#84e4f7;border-color:#7de2f7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan:focus{color:#000;background-color:#84e4f7;border-color:#7de2f7;box-shadow:0 0 0 .25rem #5ebed180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan:active,html[data-netbox-color-mode=dark] .btn-cyan.active,.show>html[data-netbox-color-mode=dark] .btn-cyan.dropdown-toggle{color:#000;background-color:#8be5f8;border-color:#7de2f7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan:focus,html[data-netbox-color-mode=dark] .btn-cyan:active:focus,html[data-netbox-color-mode=dark] .btn-cyan.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5ebed180}html[data-netbox-color-mode=dark] .btn-cyan:disabled,html[data-netbox-color-mode=dark] .btn-cyan.disabled{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-indigo{color:#000;background-color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-indigo:hover{color:#000;background-color:#b185f8;border-color:#ac7ef8}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo:focus{color:#000;background-color:#b185f8;border-color:#ac7ef8;box-shadow:0 0 0 .25rem #8b5fd280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo:active,html[data-netbox-color-mode=dark] .btn-indigo.active,.show>html[data-netbox-color-mode=dark] .btn-indigo.dropdown-toggle{color:#000;background-color:#b58df9;border-color:#ac7ef8}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo:focus,html[data-netbox-color-mode=dark] .btn-indigo:active:focus,html[data-netbox-color-mode=dark] .btn-indigo.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #8b5fd280}html[data-netbox-color-mode=dark] .btn-indigo:disabled,html[data-netbox-color-mode=dark] .btn-indigo.disabled{color:#000;background-color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-purple{color:#000;background-color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-purple:hover{color:#000;background-color:#b69fe0;border-color:#b299de}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=dark] .btn-purple:focus{color:#000;background-color:#b69fe0;border-color:#b299de;box-shadow:0 0 0 .25rem #9079b980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=dark] .btn-purple:active,html[data-netbox-color-mode=dark] .btn-purple.active,.show>html[data-netbox-color-mode=dark] .btn-purple.dropdown-toggle{color:#000;background-color:#baa5e1;border-color:#b299de}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple:focus,html[data-netbox-color-mode=dark] .btn-purple:active:focus,html[data-netbox-color-mode=dark] .btn-purple.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #9079b980}html[data-netbox-color-mode=dark] .btn-purple:disabled,html[data-netbox-color-mode=dark] .btn-purple.disabled{color:#000;background-color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-pink{color:#000;background-color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-pink:hover{color:#000;background-color:#ea97c0;border-color:#e991bc}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=dark] .btn-pink:focus{color:#000;background-color:#ea97c0;border-color:#e991bc;box-shadow:0 0 0 .25rem #c4719a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=dark] .btn-pink:active,html[data-netbox-color-mode=dark] .btn-pink.active,.show>html[data-netbox-color-mode=dark] .btn-pink.dropdown-toggle{color:#000;background-color:#eb9dc4;border-color:#e991bc}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink:focus,html[data-netbox-color-mode=dark] .btn-pink:active:focus,html[data-netbox-color-mode=dark] .btn-pink.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c4719a80}html[data-netbox-color-mode=dark] .btn-pink:disabled,html[data-netbox-color-mode=dark] .btn-pink.disabled{color:#000;background-color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-darker{color:#fff;background-color:#1b1f22;border-color:#1b1f22}html[data-netbox-color-mode=dark] .btn-darker:hover{color:#fff;background-color:#171a1d;border-color:#16191b}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-darker,html[data-netbox-color-mode=dark] .btn-darker:focus{color:#fff;background-color:#171a1d;border-color:#16191b;box-shadow:0 0 0 .25rem #3d414380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-darker,.btn-check:active+html[data-netbox-color-mode=dark] .btn-darker,html[data-netbox-color-mode=dark] .btn-darker:active,html[data-netbox-color-mode=dark] .btn-darker.active,.show>html[data-netbox-color-mode=dark] .btn-darker.dropdown-toggle{color:#fff;background-color:#16191b;border-color:#14171a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-darker:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-darker:focus,html[data-netbox-color-mode=dark] .btn-darker:active:focus,html[data-netbox-color-mode=dark] .btn-darker.active:focus,.show>html[data-netbox-color-mode=dark] .btn-darker.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3d414380}html[data-netbox-color-mode=dark] .btn-darker:disabled,html[data-netbox-color-mode=dark] .btn-darker.disabled{color:#fff;background-color:#1b1f22;border-color:#1b1f22}html[data-netbox-color-mode=dark] .btn-darkest{color:#fff;background-color:#171b1d;border-color:#171b1d}html[data-netbox-color-mode=dark] .btn-darkest:hover{color:#fff;background-color:#141719;border-color:#121617}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-darkest,html[data-netbox-color-mode=dark] .btn-darkest:focus{color:#fff;background-color:#141719;border-color:#121617;box-shadow:0 0 0 .25rem #3a3d3f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-darkest,.btn-check:active+html[data-netbox-color-mode=dark] .btn-darkest,html[data-netbox-color-mode=dark] .btn-darkest:active,html[data-netbox-color-mode=dark] .btn-darkest.active,.show>html[data-netbox-color-mode=dark] .btn-darkest.dropdown-toggle{color:#fff;background-color:#121617;border-color:#111416}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-darkest:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-darkest:focus,html[data-netbox-color-mode=dark] .btn-darkest:active:focus,html[data-netbox-color-mode=dark] .btn-darkest.active:focus,.show>html[data-netbox-color-mode=dark] .btn-darkest.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3a3d3f80}html[data-netbox-color-mode=dark] .btn-darkest:disabled,html[data-netbox-color-mode=dark] .btn-darkest.disabled{color:#fff;background-color:#171b1d;border-color:#171b1d}html[data-netbox-color-mode=dark] .btn-gray{color:#000;background-color:#ced4da;border-color:#ced4da}html[data-netbox-color-mode=dark] .btn-gray:hover{color:#000;background-color:#d5dae0;border-color:#d3d8de}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=dark] .btn-gray:focus{color:#000;background-color:#d5dae0;border-color:#d3d8de;box-shadow:0 0 0 .25rem #afb4b980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=dark] .btn-gray:active,html[data-netbox-color-mode=dark] .btn-gray.active,.show>html[data-netbox-color-mode=dark] .btn-gray.dropdown-toggle{color:#000;background-color:#d8dde1;border-color:#d3d8de}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray:focus,html[data-netbox-color-mode=dark] .btn-gray:active:focus,html[data-netbox-color-mode=dark] .btn-gray.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #afb4b980}html[data-netbox-color-mode=dark] .btn-gray:disabled,html[data-netbox-color-mode=dark] .btn-gray.disabled{color:#000;background-color:#ced4da;border-color:#ced4da}html[data-netbox-color-mode=dark] .btn-gray-100{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}html[data-netbox-color-mode=dark] .btn-gray-100:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-100,html[data-netbox-color-mode=dark] .btn-gray-100:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem #d3d4d580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-100,html[data-netbox-color-mode=dark] .btn-gray-100:active,html[data-netbox-color-mode=dark] .btn-gray-100.active,.show>html[data-netbox-color-mode=dark] .btn-gray-100.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-100:focus,html[data-netbox-color-mode=dark] .btn-gray-100:active:focus,html[data-netbox-color-mode=dark] .btn-gray-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3d4d580}html[data-netbox-color-mode=dark] .btn-gray-100:disabled,html[data-netbox-color-mode=dark] .btn-gray-100.disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}html[data-netbox-color-mode=dark] .btn-gray-200{color:#000;background-color:#e9ecef;border-color:#e9ecef}html[data-netbox-color-mode=dark] .btn-gray-200:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-200,html[data-netbox-color-mode=dark] .btn-gray-200:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-200,html[data-netbox-color-mode=dark] .btn-gray-200:active,html[data-netbox-color-mode=dark] .btn-gray-200.active,.show>html[data-netbox-color-mode=dark] .btn-gray-200.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-200:focus,html[data-netbox-color-mode=dark] .btn-gray-200:active:focus,html[data-netbox-color-mode=dark] .btn-gray-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}html[data-netbox-color-mode=dark] .btn-gray-200:disabled,html[data-netbox-color-mode=dark] .btn-gray-200.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}html[data-netbox-color-mode=dark] .btn-gray-300{color:#000;background-color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-gray-300:hover{color:#000;background-color:#e3e6ea;border-color:#e1e5e9}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-300,html[data-netbox-color-mode=dark] .btn-gray-300:focus{color:#000;background-color:#e3e6ea;border-color:#e1e5e9;box-shadow:0 0 0 .25rem #bdc0c480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-300,html[data-netbox-color-mode=dark] .btn-gray-300:active,html[data-netbox-color-mode=dark] .btn-gray-300.active,.show>html[data-netbox-color-mode=dark] .btn-gray-300.dropdown-toggle{color:#000;background-color:#e5e8eb;border-color:#e1e5e9}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-300:focus,html[data-netbox-color-mode=dark] .btn-gray-300:active:focus,html[data-netbox-color-mode=dark] .btn-gray-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bdc0c480}html[data-netbox-color-mode=dark] .btn-gray-300:disabled,html[data-netbox-color-mode=dark] .btn-gray-300.disabled{color:#000;background-color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-gray-400{color:#000;background-color:#ced4da;border-color:#ced4da}html[data-netbox-color-mode=dark] .btn-gray-400:hover{color:#000;background-color:#d5dae0;border-color:#d3d8de}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-400,html[data-netbox-color-mode=dark] .btn-gray-400:focus{color:#000;background-color:#d5dae0;border-color:#d3d8de;box-shadow:0 0 0 .25rem #afb4b980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-400,html[data-netbox-color-mode=dark] .btn-gray-400:active,html[data-netbox-color-mode=dark] .btn-gray-400.active,.show>html[data-netbox-color-mode=dark] .btn-gray-400.dropdown-toggle{color:#000;background-color:#d8dde1;border-color:#d3d8de}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-400:focus,html[data-netbox-color-mode=dark] .btn-gray-400:active:focus,html[data-netbox-color-mode=dark] .btn-gray-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #afb4b980}html[data-netbox-color-mode=dark] .btn-gray-400:disabled,html[data-netbox-color-mode=dark] .btn-gray-400.disabled{color:#000;background-color:#ced4da;border-color:#ced4da}html[data-netbox-color-mode=dark] .btn-gray-500{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-gray-500:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-500,html[data-netbox-color-mode=dark] .btn-gray-500:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-500,html[data-netbox-color-mode=dark] .btn-gray-500:active,html[data-netbox-color-mode=dark] .btn-gray-500.active,.show>html[data-netbox-color-mode=dark] .btn-gray-500.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-500:focus,html[data-netbox-color-mode=dark] .btn-gray-500:active:focus,html[data-netbox-color-mode=dark] .btn-gray-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}html[data-netbox-color-mode=dark] .btn-gray-500:disabled,html[data-netbox-color-mode=dark] .btn-gray-500.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-gray-600{color:#fff;background-color:#6c757d;border-color:#6c757d}html[data-netbox-color-mode=dark] .btn-gray-600:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-600,html[data-netbox-color-mode=dark] .btn-gray-600:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem #828a9180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-600,html[data-netbox-color-mode=dark] .btn-gray-600:active,html[data-netbox-color-mode=dark] .btn-gray-600.active,.show>html[data-netbox-color-mode=dark] .btn-gray-600.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-600:focus,html[data-netbox-color-mode=dark] .btn-gray-600:active:focus,html[data-netbox-color-mode=dark] .btn-gray-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #828a9180}html[data-netbox-color-mode=dark] .btn-gray-600:disabled,html[data-netbox-color-mode=dark] .btn-gray-600.disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}html[data-netbox-color-mode=dark] .btn-gray-700{color:#fff;background-color:#495057;border-color:#495057}html[data-netbox-color-mode=dark] .btn-gray-700:hover{color:#fff;background-color:#3e444a;border-color:#3a4046}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-700,html[data-netbox-color-mode=dark] .btn-gray-700:focus{color:#fff;background-color:#3e444a;border-color:#3a4046;box-shadow:0 0 0 .25rem #646a7080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-700,html[data-netbox-color-mode=dark] .btn-gray-700:active,html[data-netbox-color-mode=dark] .btn-gray-700.active,.show>html[data-netbox-color-mode=dark] .btn-gray-700.dropdown-toggle{color:#fff;background-color:#3a4046;border-color:#373c41}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-700:focus,html[data-netbox-color-mode=dark] .btn-gray-700:active:focus,html[data-netbox-color-mode=dark] .btn-gray-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #646a7080}html[data-netbox-color-mode=dark] .btn-gray-700:disabled,html[data-netbox-color-mode=dark] .btn-gray-700.disabled{color:#fff;background-color:#495057;border-color:#495057}html[data-netbox-color-mode=dark] .btn-gray-800{color:#fff;background-color:#343a40;border-color:#343a40}html[data-netbox-color-mode=dark] .btn-gray-800:hover{color:#fff;background-color:#2c3136;border-color:#2a2e33}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-800,html[data-netbox-color-mode=dark] .btn-gray-800:focus{color:#fff;background-color:#2c3136;border-color:#2a2e33;box-shadow:0 0 0 .25rem #52585d80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-800,html[data-netbox-color-mode=dark] .btn-gray-800:active,html[data-netbox-color-mode=dark] .btn-gray-800.active,.show>html[data-netbox-color-mode=dark] .btn-gray-800.dropdown-toggle{color:#fff;background-color:#2a2e33;border-color:#272c30}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-800:focus,html[data-netbox-color-mode=dark] .btn-gray-800:active:focus,html[data-netbox-color-mode=dark] .btn-gray-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52585d80}html[data-netbox-color-mode=dark] .btn-gray-800:disabled,html[data-netbox-color-mode=dark] .btn-gray-800.disabled{color:#fff;background-color:#343a40;border-color:#343a40}html[data-netbox-color-mode=dark] .btn-gray-900{color:#fff;background-color:#212529;border-color:#212529}html[data-netbox-color-mode=dark] .btn-gray-900:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-900,html[data-netbox-color-mode=dark] .btn-gray-900:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem #42464980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-900,html[data-netbox-color-mode=dark] .btn-gray-900:active,html[data-netbox-color-mode=dark] .btn-gray-900.active,.show>html[data-netbox-color-mode=dark] .btn-gray-900.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-900:focus,html[data-netbox-color-mode=dark] .btn-gray-900:active:focus,html[data-netbox-color-mode=dark] .btn-gray-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #42464980}html[data-netbox-color-mode=dark] .btn-gray-900:disabled,html[data-netbox-color-mode=dark] .btn-gray-900.disabled{color:#fff;background-color:#212529;border-color:#212529}html[data-netbox-color-mode=dark] .btn-red-100{color:#000;background-color:#f8d7da;border-color:#f8d7da}html[data-netbox-color-mode=dark] .btn-red-100:hover{color:#000;background-color:#f9dde0;border-color:#f9dbde}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-100,html[data-netbox-color-mode=dark] .btn-red-100:focus{color:#000;background-color:#f9dde0;border-color:#f9dbde;box-shadow:0 0 0 .25rem #d3b7b980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-100,html[data-netbox-color-mode=dark] .btn-red-100:active,html[data-netbox-color-mode=dark] .btn-red-100.active,.show>html[data-netbox-color-mode=dark] .btn-red-100.dropdown-toggle{color:#000;background-color:#f9dfe1;border-color:#f9dbde}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-100:focus,html[data-netbox-color-mode=dark] .btn-red-100:active:focus,html[data-netbox-color-mode=dark] .btn-red-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3b7b980}html[data-netbox-color-mode=dark] .btn-red-100:disabled,html[data-netbox-color-mode=dark] .btn-red-100.disabled{color:#000;background-color:#f8d7da;border-color:#f8d7da}html[data-netbox-color-mode=dark] .btn-red-200{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}html[data-netbox-color-mode=dark] .btn-red-200:hover{color:#000;background-color:#f3bac0;border-color:#f2b6bc}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-200,html[data-netbox-color-mode=dark] .btn-red-200:focus{color:#000;background-color:#f3bac0;border-color:#f2b6bc;box-shadow:0 0 0 .25rem #cd949a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-200,html[data-netbox-color-mode=dark] .btn-red-200:active,html[data-netbox-color-mode=dark] .btn-red-200.active,.show>html[data-netbox-color-mode=dark] .btn-red-200.dropdown-toggle{color:#000;background-color:#f4bec4;border-color:#f2b6bc}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-200:focus,html[data-netbox-color-mode=dark] .btn-red-200:active:focus,html[data-netbox-color-mode=dark] .btn-red-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #cd949a80}html[data-netbox-color-mode=dark] .btn-red-200:disabled,html[data-netbox-color-mode=dark] .btn-red-200.disabled{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}html[data-netbox-color-mode=dark] .btn-red-300{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-red-300:hover{color:#000;background-color:#ed98a0;border-color:#ec929a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-300,html[data-netbox-color-mode=dark] .btn-red-300:focus{color:#000;background-color:#ed98a0;border-color:#ec929a;box-shadow:0 0 0 .25rem #c7727a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-300,html[data-netbox-color-mode=dark] .btn-red-300:active,html[data-netbox-color-mode=dark] .btn-red-300.active,.show>html[data-netbox-color-mode=dark] .btn-red-300.dropdown-toggle{color:#000;background-color:#ee9ea5;border-color:#ec929a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-300:focus,html[data-netbox-color-mode=dark] .btn-red-300:active:focus,html[data-netbox-color-mode=dark] .btn-red-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c7727a80}html[data-netbox-color-mode=dark] .btn-red-300:disabled,html[data-netbox-color-mode=dark] .btn-red-300.disabled{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-red-400{color:#000;background-color:#e35d6a;border-color:#e35d6a}html[data-netbox-color-mode=dark] .btn-red-400:hover{color:#000;background-color:#e77580;border-color:#e66d79}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-400,html[data-netbox-color-mode=dark] .btn-red-400:focus{color:#000;background-color:#e77580;border-color:#e66d79;box-shadow:0 0 0 .25rem #c14f5a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-400,html[data-netbox-color-mode=dark] .btn-red-400:active,html[data-netbox-color-mode=dark] .btn-red-400.active,.show>html[data-netbox-color-mode=dark] .btn-red-400.dropdown-toggle{color:#000;background-color:#e97d88;border-color:#e66d79}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-400:focus,html[data-netbox-color-mode=dark] .btn-red-400:active:focus,html[data-netbox-color-mode=dark] .btn-red-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c14f5a80}html[data-netbox-color-mode=dark] .btn-red-400:disabled,html[data-netbox-color-mode=dark] .btn-red-400.disabled{color:#000;background-color:#e35d6a;border-color:#e35d6a}html[data-netbox-color-mode=dark] .btn-red-500{color:#fff;background-color:#dc3545;border-color:#dc3545}html[data-netbox-color-mode=dark] .btn-red-500:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-500,html[data-netbox-color-mode=dark] .btn-red-500:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-500,html[data-netbox-color-mode=dark] .btn-red-500:active,html[data-netbox-color-mode=dark] .btn-red-500.active,.show>html[data-netbox-color-mode=dark] .btn-red-500.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-500:focus,html[data-netbox-color-mode=dark] .btn-red-500:active:focus,html[data-netbox-color-mode=dark] .btn-red-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}html[data-netbox-color-mode=dark] .btn-red-500:disabled,html[data-netbox-color-mode=dark] .btn-red-500.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}html[data-netbox-color-mode=dark] .btn-red-600{color:#fff;background-color:#b02a37;border-color:#b02a37}html[data-netbox-color-mode=dark] .btn-red-600:hover{color:#fff;background-color:#96242f;border-color:#8d222c}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-600,html[data-netbox-color-mode=dark] .btn-red-600:focus{color:#fff;background-color:#96242f;border-color:#8d222c;box-shadow:0 0 0 .25rem #bc4a5580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-600,html[data-netbox-color-mode=dark] .btn-red-600:active,html[data-netbox-color-mode=dark] .btn-red-600.active,.show>html[data-netbox-color-mode=dark] .btn-red-600.dropdown-toggle{color:#fff;background-color:#8d222c;border-color:#842029}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-600:focus,html[data-netbox-color-mode=dark] .btn-red-600:active:focus,html[data-netbox-color-mode=dark] .btn-red-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bc4a5580}html[data-netbox-color-mode=dark] .btn-red-600:disabled,html[data-netbox-color-mode=dark] .btn-red-600.disabled{color:#fff;background-color:#b02a37;border-color:#b02a37}html[data-netbox-color-mode=dark] .btn-red-700{color:#fff;background-color:#842029;border-color:#842029}html[data-netbox-color-mode=dark] .btn-red-700:hover{color:#fff;background-color:#701b23;border-color:#6a1a21}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-700,html[data-netbox-color-mode=dark] .btn-red-700:focus{color:#fff;background-color:#701b23;border-color:#6a1a21;box-shadow:0 0 0 .25rem #96414980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-700,html[data-netbox-color-mode=dark] .btn-red-700:active,html[data-netbox-color-mode=dark] .btn-red-700.active,.show>html[data-netbox-color-mode=dark] .btn-red-700.dropdown-toggle{color:#fff;background-color:#6a1a21;border-color:#63181f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-700:focus,html[data-netbox-color-mode=dark] .btn-red-700:active:focus,html[data-netbox-color-mode=dark] .btn-red-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #96414980}html[data-netbox-color-mode=dark] .btn-red-700:disabled,html[data-netbox-color-mode=dark] .btn-red-700.disabled{color:#fff;background-color:#842029;border-color:#842029}html[data-netbox-color-mode=dark] .btn-red-800{color:#fff;background-color:#58151c;border-color:#58151c}html[data-netbox-color-mode=dark] .btn-red-800:hover{color:#fff;background-color:#4b1218;border-color:#461116}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-800,html[data-netbox-color-mode=dark] .btn-red-800:focus{color:#fff;background-color:#4b1218;border-color:#461116;box-shadow:0 0 0 .25rem #71383e80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-800,html[data-netbox-color-mode=dark] .btn-red-800:active,html[data-netbox-color-mode=dark] .btn-red-800.active,.show>html[data-netbox-color-mode=dark] .btn-red-800.dropdown-toggle{color:#fff;background-color:#461116;border-color:#421015}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-800:focus,html[data-netbox-color-mode=dark] .btn-red-800:active:focus,html[data-netbox-color-mode=dark] .btn-red-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #71383e80}html[data-netbox-color-mode=dark] .btn-red-800:disabled,html[data-netbox-color-mode=dark] .btn-red-800.disabled{color:#fff;background-color:#58151c;border-color:#58151c}html[data-netbox-color-mode=dark] .btn-red-900{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}html[data-netbox-color-mode=dark] .btn-red-900:hover{color:#fff;background-color:#25090c;border-color:#23090b}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-900,html[data-netbox-color-mode=dark] .btn-red-900:focus{color:#fff;background-color:#25090c;border-color:#23090b;box-shadow:0 0 0 .25rem #4c303280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-900,html[data-netbox-color-mode=dark] .btn-red-900:active,html[data-netbox-color-mode=dark] .btn-red-900.active,.show>html[data-netbox-color-mode=dark] .btn-red-900.dropdown-toggle{color:#fff;background-color:#23090b;border-color:#21080b}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-900:focus,html[data-netbox-color-mode=dark] .btn-red-900:active:focus,html[data-netbox-color-mode=dark] .btn-red-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4c303280}html[data-netbox-color-mode=dark] .btn-red-900:disabled,html[data-netbox-color-mode=dark] .btn-red-900.disabled{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}html[data-netbox-color-mode=dark] .btn-yellow-100{color:#000;background-color:#fff3cd;border-color:#fff3cd}html[data-netbox-color-mode=dark] .btn-yellow-100:hover{color:#000;background-color:#fff5d5;border-color:#fff4d2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-100,html[data-netbox-color-mode=dark] .btn-yellow-100:focus{color:#000;background-color:#fff5d5;border-color:#fff4d2;box-shadow:0 0 0 .25rem #d9cfae80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-100,html[data-netbox-color-mode=dark] .btn-yellow-100:active,html[data-netbox-color-mode=dark] .btn-yellow-100.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-100.dropdown-toggle{color:#000;background-color:#fff5d7;border-color:#fff4d2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-100:focus,html[data-netbox-color-mode=dark] .btn-yellow-100:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9cfae80}html[data-netbox-color-mode=dark] .btn-yellow-100:disabled,html[data-netbox-color-mode=dark] .btn-yellow-100.disabled{color:#000;background-color:#fff3cd;border-color:#fff3cd}html[data-netbox-color-mode=dark] .btn-yellow-200{color:#000;background-color:#ffe69c;border-color:#ffe69c}html[data-netbox-color-mode=dark] .btn-yellow-200:hover{color:#000;background-color:#ffeaab;border-color:#ffe9a6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-200,html[data-netbox-color-mode=dark] .btn-yellow-200:focus{color:#000;background-color:#ffeaab;border-color:#ffe9a6;box-shadow:0 0 0 .25rem #d9c48580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-200,html[data-netbox-color-mode=dark] .btn-yellow-200:active,html[data-netbox-color-mode=dark] .btn-yellow-200.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-200.dropdown-toggle{color:#000;background-color:#ffebb0;border-color:#ffe9a6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-200:focus,html[data-netbox-color-mode=dark] .btn-yellow-200:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9c48580}html[data-netbox-color-mode=dark] .btn-yellow-200:disabled,html[data-netbox-color-mode=dark] .btn-yellow-200.disabled{color:#000;background-color:#ffe69c;border-color:#ffe69c}html[data-netbox-color-mode=dark] .btn-yellow-300{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-yellow-300:hover{color:#000;background-color:#ffe080;border-color:#ffde79}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-300,html[data-netbox-color-mode=dark] .btn-yellow-300:focus{color:#000;background-color:#ffe080;border-color:#ffde79;box-shadow:0 0 0 .25rem #d9b95a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-300,html[data-netbox-color-mode=dark] .btn-yellow-300:active,html[data-netbox-color-mode=dark] .btn-yellow-300.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-300.dropdown-toggle{color:#000;background-color:#ffe188;border-color:#ffde79}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-300:focus,html[data-netbox-color-mode=dark] .btn-yellow-300:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9b95a80}html[data-netbox-color-mode=dark] .btn-yellow-300:disabled,html[data-netbox-color-mode=dark] .btn-yellow-300.disabled{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-yellow-400{color:#000;background-color:#ffcd39;border-color:#ffcd39}html[data-netbox-color-mode=dark] .btn-yellow-400:hover{color:#000;background-color:#ffd557;border-color:#ffd24d}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-400,html[data-netbox-color-mode=dark] .btn-yellow-400:focus{color:#000;background-color:#ffd557;border-color:#ffd24d;box-shadow:0 0 0 .25rem #d9ae3080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-400,html[data-netbox-color-mode=dark] .btn-yellow-400:active,html[data-netbox-color-mode=dark] .btn-yellow-400.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-400.dropdown-toggle{color:#000;background-color:#ffd761;border-color:#ffd24d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-400:focus,html[data-netbox-color-mode=dark] .btn-yellow-400:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9ae3080}html[data-netbox-color-mode=dark] .btn-yellow-400:disabled,html[data-netbox-color-mode=dark] .btn-yellow-400.disabled{color:#000;background-color:#ffcd39;border-color:#ffcd39}html[data-netbox-color-mode=dark] .btn-yellow-500{color:#000;background-color:#ffc107;border-color:#ffc107}html[data-netbox-color-mode=dark] .btn-yellow-500:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-500,html[data-netbox-color-mode=dark] .btn-yellow-500:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-500,html[data-netbox-color-mode=dark] .btn-yellow-500:active,html[data-netbox-color-mode=dark] .btn-yellow-500.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-500.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-500:focus,html[data-netbox-color-mode=dark] .btn-yellow-500:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}html[data-netbox-color-mode=dark] .btn-yellow-500:disabled,html[data-netbox-color-mode=dark] .btn-yellow-500.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}html[data-netbox-color-mode=dark] .btn-yellow-600{color:#000;background-color:#cc9a06;border-color:#cc9a06}html[data-netbox-color-mode=dark] .btn-yellow-600:hover{color:#000;background-color:#d4a92b;border-color:#d1a41f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-600,html[data-netbox-color-mode=dark] .btn-yellow-600:focus{color:#000;background-color:#d4a92b;border-color:#d1a41f;box-shadow:0 0 0 .25rem #ad830580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-600,html[data-netbox-color-mode=dark] .btn-yellow-600:active,html[data-netbox-color-mode=dark] .btn-yellow-600.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-600.dropdown-toggle{color:#000;background-color:#d6ae38;border-color:#d1a41f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-600:focus,html[data-netbox-color-mode=dark] .btn-yellow-600:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #ad830580}html[data-netbox-color-mode=dark] .btn-yellow-600:disabled,html[data-netbox-color-mode=dark] .btn-yellow-600.disabled{color:#000;background-color:#cc9a06;border-color:#cc9a06}html[data-netbox-color-mode=dark] .btn-yellow-700{color:#000;background-color:#997404;border-color:#997404}html[data-netbox-color-mode=dark] .btn-yellow-700:hover{color:#000;background-color:#a8892a;border-color:#a3821d}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-700,html[data-netbox-color-mode=dark] .btn-yellow-700:focus{color:#000;background-color:#a8892a;border-color:#a3821d;box-shadow:0 0 0 .25rem #82630380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-700,html[data-netbox-color-mode=dark] .btn-yellow-700:active,html[data-netbox-color-mode=dark] .btn-yellow-700.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-700.dropdown-toggle{color:#000;background-color:#ad9036;border-color:#a3821d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-700:focus,html[data-netbox-color-mode=dark] .btn-yellow-700:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #82630380}html[data-netbox-color-mode=dark] .btn-yellow-700:disabled,html[data-netbox-color-mode=dark] .btn-yellow-700.disabled{color:#000;background-color:#997404;border-color:#997404}html[data-netbox-color-mode=dark] .btn-yellow-800{color:#fff;background-color:#664d03;border-color:#664d03}html[data-netbox-color-mode=dark] .btn-yellow-800:hover{color:#fff;background-color:#574103;border-color:#523e02}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-800,html[data-netbox-color-mode=dark] .btn-yellow-800:focus{color:#fff;background-color:#574103;border-color:#523e02;box-shadow:0 0 0 .25rem #7d682980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-800,html[data-netbox-color-mode=dark] .btn-yellow-800:active,html[data-netbox-color-mode=dark] .btn-yellow-800.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-800.dropdown-toggle{color:#fff;background-color:#523e02;border-color:#4d3a02}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-800:focus,html[data-netbox-color-mode=dark] .btn-yellow-800:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d682980}html[data-netbox-color-mode=dark] .btn-yellow-800:disabled,html[data-netbox-color-mode=dark] .btn-yellow-800.disabled{color:#fff;background-color:#664d03;border-color:#664d03}html[data-netbox-color-mode=dark] .btn-yellow-900{color:#fff;background-color:#332701;border-color:#332701}html[data-netbox-color-mode=dark] .btn-yellow-900:hover{color:#fff;background-color:#2b2101;border-color:#291f01}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-900,html[data-netbox-color-mode=dark] .btn-yellow-900:focus{color:#fff;background-color:#2b2101;border-color:#291f01;box-shadow:0 0 0 .25rem #52472780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-900,html[data-netbox-color-mode=dark] .btn-yellow-900:active,html[data-netbox-color-mode=dark] .btn-yellow-900.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-900.dropdown-toggle{color:#fff;background-color:#291f01;border-color:#261d01}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-900:focus,html[data-netbox-color-mode=dark] .btn-yellow-900:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52472780}html[data-netbox-color-mode=dark] .btn-yellow-900:disabled,html[data-netbox-color-mode=dark] .btn-yellow-900.disabled{color:#fff;background-color:#332701;border-color:#332701}html[data-netbox-color-mode=dark] .btn-green-100{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}html[data-netbox-color-mode=dark] .btn-green-100:hover{color:#000;background-color:#d8ebe2;border-color:#d6e9e0}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-100,html[data-netbox-color-mode=dark] .btn-green-100:focus{color:#000;background-color:#d8ebe2;border-color:#d6e9e0;box-shadow:0 0 0 .25rem #b2c4bc80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-100,html[data-netbox-color-mode=dark] .btn-green-100:active,html[data-netbox-color-mode=dark] .btn-green-100.active,.show>html[data-netbox-color-mode=dark] .btn-green-100.dropdown-toggle{color:#000;background-color:#daece4;border-color:#d6e9e0}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-100:focus,html[data-netbox-color-mode=dark] .btn-green-100:active:focus,html[data-netbox-color-mode=dark] .btn-green-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b2c4bc80}html[data-netbox-color-mode=dark] .btn-green-100:disabled,html[data-netbox-color-mode=dark] .btn-green-100.disabled{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}html[data-netbox-color-mode=dark] .btn-green-200{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}html[data-netbox-color-mode=dark] .btn-green-200:hover{color:#000;background-color:#b1d6c5;border-color:#acd4c2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-200,html[data-netbox-color-mode=dark] .btn-green-200:focus{color:#000;background-color:#b1d6c5;border-color:#acd4c2;box-shadow:0 0 0 .25rem #8bb09f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-200,html[data-netbox-color-mode=dark] .btn-green-200:active,html[data-netbox-color-mode=dark] .btn-green-200.active,.show>html[data-netbox-color-mode=dark] .btn-green-200.dropdown-toggle{color:#000;background-color:#b5d9c9;border-color:#acd4c2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-200:focus,html[data-netbox-color-mode=dark] .btn-green-200:active:focus,html[data-netbox-color-mode=dark] .btn-green-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #8bb09f80}html[data-netbox-color-mode=dark] .btn-green-200:disabled,html[data-netbox-color-mode=dark] .btn-green-200.disabled{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}html[data-netbox-color-mode=dark] .btn-green-300{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-green-300:hover{color:#000;background-color:#8ac2a7;border-color:#83bea2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-300,html[data-netbox-color-mode=dark] .btn-green-300:focus{color:#000;background-color:#8ac2a7;border-color:#83bea2;box-shadow:0 0 0 .25rem #639c8180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-300,html[data-netbox-color-mode=dark] .btn-green-300:active,html[data-netbox-color-mode=dark] .btn-green-300.active,.show>html[data-netbox-color-mode=dark] .btn-green-300.dropdown-toggle{color:#000;background-color:#91c5ad;border-color:#83bea2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-300:focus,html[data-netbox-color-mode=dark] .btn-green-300:active:focus,html[data-netbox-color-mode=dark] .btn-green-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #639c8180}html[data-netbox-color-mode=dark] .btn-green-300:disabled,html[data-netbox-color-mode=dark] .btn-green-300.disabled{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-green-400{color:#000;background-color:#479f76;border-color:#479f76}html[data-netbox-color-mode=dark] .btn-green-400:hover{color:#000;background-color:#63ad8b;border-color:#59a984}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-400,html[data-netbox-color-mode=dark] .btn-green-400:focus{color:#000;background-color:#63ad8b;border-color:#59a984;box-shadow:0 0 0 .25rem #3c876480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-400,html[data-netbox-color-mode=dark] .btn-green-400:active,html[data-netbox-color-mode=dark] .btn-green-400.active,.show>html[data-netbox-color-mode=dark] .btn-green-400.dropdown-toggle{color:#000;background-color:#6cb291;border-color:#59a984}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-400:focus,html[data-netbox-color-mode=dark] .btn-green-400:active:focus,html[data-netbox-color-mode=dark] .btn-green-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c876480}html[data-netbox-color-mode=dark] .btn-green-400:disabled,html[data-netbox-color-mode=dark] .btn-green-400.disabled{color:#000;background-color:#479f76;border-color:#479f76}html[data-netbox-color-mode=dark] .btn-green-500{color:#fff;background-color:#198754;border-color:#198754}html[data-netbox-color-mode=dark] .btn-green-500:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-500,html[data-netbox-color-mode=dark] .btn-green-500:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-500,html[data-netbox-color-mode=dark] .btn-green-500:active,html[data-netbox-color-mode=dark] .btn-green-500.active,.show>html[data-netbox-color-mode=dark] .btn-green-500.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-500:focus,html[data-netbox-color-mode=dark] .btn-green-500:active:focus,html[data-netbox-color-mode=dark] .btn-green-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}html[data-netbox-color-mode=dark] .btn-green-500:disabled,html[data-netbox-color-mode=dark] .btn-green-500.disabled{color:#fff;background-color:#198754;border-color:#198754}html[data-netbox-color-mode=dark] .btn-green-600{color:#fff;background-color:#146c43;border-color:#146c43}html[data-netbox-color-mode=dark] .btn-green-600:hover{color:#fff;background-color:#115c39;border-color:#105636}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-600,html[data-netbox-color-mode=dark] .btn-green-600:focus{color:#fff;background-color:#115c39;border-color:#105636;box-shadow:0 0 0 .25rem #37825f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-600,html[data-netbox-color-mode=dark] .btn-green-600:active,html[data-netbox-color-mode=dark] .btn-green-600.active,.show>html[data-netbox-color-mode=dark] .btn-green-600.dropdown-toggle{color:#fff;background-color:#105636;border-color:#0f5132}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-600:focus,html[data-netbox-color-mode=dark] .btn-green-600:active:focus,html[data-netbox-color-mode=dark] .btn-green-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #37825f80}html[data-netbox-color-mode=dark] .btn-green-600:disabled,html[data-netbox-color-mode=dark] .btn-green-600.disabled{color:#fff;background-color:#146c43;border-color:#146c43}html[data-netbox-color-mode=dark] .btn-green-700{color:#fff;background-color:#0f5132;border-color:#0f5132}html[data-netbox-color-mode=dark] .btn-green-700:hover{color:#fff;background-color:#0d452b;border-color:#0c4128}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-700,html[data-netbox-color-mode=dark] .btn-green-700:focus{color:#fff;background-color:#0d452b;border-color:#0c4128;box-shadow:0 0 0 .25rem #336b5180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-700,html[data-netbox-color-mode=dark] .btn-green-700:active,html[data-netbox-color-mode=dark] .btn-green-700.active,.show>html[data-netbox-color-mode=dark] .btn-green-700.dropdown-toggle{color:#fff;background-color:#0c4128;border-color:#0b3d26}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-700:focus,html[data-netbox-color-mode=dark] .btn-green-700:active:focus,html[data-netbox-color-mode=dark] .btn-green-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #336b5180}html[data-netbox-color-mode=dark] .btn-green-700:disabled,html[data-netbox-color-mode=dark] .btn-green-700.disabled{color:#fff;background-color:#0f5132;border-color:#0f5132}html[data-netbox-color-mode=dark] .btn-green-800{color:#fff;background-color:#0a3622;border-color:#0a3622}html[data-netbox-color-mode=dark] .btn-green-800:hover{color:#fff;background-color:#092e1d;border-color:#082b1b}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-800,html[data-netbox-color-mode=dark] .btn-green-800:focus{color:#fff;background-color:#092e1d;border-color:#082b1b;box-shadow:0 0 0 .25rem #2f544380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-800,html[data-netbox-color-mode=dark] .btn-green-800:active,html[data-netbox-color-mode=dark] .btn-green-800.active,.show>html[data-netbox-color-mode=dark] .btn-green-800.dropdown-toggle{color:#fff;background-color:#082b1b;border-color:#08291a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-800:focus,html[data-netbox-color-mode=dark] .btn-green-800:active:focus,html[data-netbox-color-mode=dark] .btn-green-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2f544380}html[data-netbox-color-mode=dark] .btn-green-800:disabled,html[data-netbox-color-mode=dark] .btn-green-800.disabled{color:#fff;background-color:#0a3622;border-color:#0a3622}html[data-netbox-color-mode=dark] .btn-green-900{color:#fff;background-color:#051b11;border-color:#051b11}html[data-netbox-color-mode=dark] .btn-green-900:hover{color:#fff;background-color:#04170e;border-color:#04160e}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-900,html[data-netbox-color-mode=dark] .btn-green-900:focus{color:#fff;background-color:#04170e;border-color:#04160e;box-shadow:0 0 0 .25rem #2b3d3580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-900,html[data-netbox-color-mode=dark] .btn-green-900:active,html[data-netbox-color-mode=dark] .btn-green-900.active,.show>html[data-netbox-color-mode=dark] .btn-green-900.dropdown-toggle{color:#fff;background-color:#04160e;border-color:#04140d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-900:focus,html[data-netbox-color-mode=dark] .btn-green-900:active:focus,html[data-netbox-color-mode=dark] .btn-green-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b3d3580}html[data-netbox-color-mode=dark] .btn-green-900:disabled,html[data-netbox-color-mode=dark] .btn-green-900.disabled{color:#fff;background-color:#051b11;border-color:#051b11}html[data-netbox-color-mode=dark] .btn-blue-100{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}html[data-netbox-color-mode=dark] .btn-blue-100:hover{color:#000;background-color:#d6e6ff;border-color:#d4e5ff}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-100,html[data-netbox-color-mode=dark] .btn-blue-100:focus{color:#000;background-color:#d6e6ff;border-color:#d4e5ff;box-shadow:0 0 0 .25rem #b0c0d980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-100,html[data-netbox-color-mode=dark] .btn-blue-100:active,html[data-netbox-color-mode=dark] .btn-blue-100.active,.show>html[data-netbox-color-mode=dark] .btn-blue-100.dropdown-toggle{color:#000;background-color:#d9e8ff;border-color:#d4e5ff}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-100:focus,html[data-netbox-color-mode=dark] .btn-blue-100:active:focus,html[data-netbox-color-mode=dark] .btn-blue-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b0c0d980}html[data-netbox-color-mode=dark] .btn-blue-100:disabled,html[data-netbox-color-mode=dark] .btn-blue-100.disabled{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}html[data-netbox-color-mode=dark] .btn-blue-200{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}html[data-netbox-color-mode=dark] .btn-blue-200:hover{color:#000;background-color:#adcefe;border-color:#a8cbfe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-200,html[data-netbox-color-mode=dark] .btn-blue-200:focus{color:#000;background-color:#adcefe;border-color:#a8cbfe;box-shadow:0 0 0 .25rem #86a7d880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-200,html[data-netbox-color-mode=dark] .btn-blue-200:active,html[data-netbox-color-mode=dark] .btn-blue-200.active,.show>html[data-netbox-color-mode=dark] .btn-blue-200.dropdown-toggle{color:#000;background-color:#b1d1fe;border-color:#a8cbfe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-200:focus,html[data-netbox-color-mode=dark] .btn-blue-200:active:focus,html[data-netbox-color-mode=dark] .btn-blue-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #86a7d880}html[data-netbox-color-mode=dark] .btn-blue-200:disabled,html[data-netbox-color-mode=dark] .btn-blue-200.disabled{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}html[data-netbox-color-mode=dark] .btn-blue-300{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-blue-300:hover{color:#000;background-color:#84b5fe;border-color:#7db1fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-300,html[data-netbox-color-mode=dark] .btn-blue-300:focus{color:#000;background-color:#84b5fe;border-color:#7db1fe;box-shadow:0 0 0 .25rem #5e8fd880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-300,html[data-netbox-color-mode=dark] .btn-blue-300:active,html[data-netbox-color-mode=dark] .btn-blue-300.active,.show>html[data-netbox-color-mode=dark] .btn-blue-300.dropdown-toggle{color:#000;background-color:#8bb9fe;border-color:#7db1fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-300:focus,html[data-netbox-color-mode=dark] .btn-blue-300:active:focus,html[data-netbox-color-mode=dark] .btn-blue-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5e8fd880}html[data-netbox-color-mode=dark] .btn-blue-300:disabled,html[data-netbox-color-mode=dark] .btn-blue-300.disabled{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-blue-400{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}html[data-netbox-color-mode=dark] .btn-blue-400:hover{color:#000;background-color:#5a9cfd;border-color:#5097fd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-400,html[data-netbox-color-mode=dark] .btn-blue-400:focus{color:#000;background-color:#5a9cfd;border-color:#5097fd;box-shadow:0 0 0 .25rem #3476d780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-400,html[data-netbox-color-mode=dark] .btn-blue-400:active,html[data-netbox-color-mode=dark] .btn-blue-400.active,.show>html[data-netbox-color-mode=dark] .btn-blue-400.dropdown-toggle{color:#000;background-color:#64a2fd;border-color:#5097fd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-400:focus,html[data-netbox-color-mode=dark] .btn-blue-400:active:focus,html[data-netbox-color-mode=dark] .btn-blue-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3476d780}html[data-netbox-color-mode=dark] .btn-blue-400:disabled,html[data-netbox-color-mode=dark] .btn-blue-400.disabled{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}html[data-netbox-color-mode=dark] .btn-blue-500{color:#fff;background-color:#0d6efd;border-color:#0d6efd}html[data-netbox-color-mode=dark] .btn-blue-500:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-500,html[data-netbox-color-mode=dark] .btn-blue-500:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem #3184fd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-500,html[data-netbox-color-mode=dark] .btn-blue-500:active,html[data-netbox-color-mode=dark] .btn-blue-500.active,.show>html[data-netbox-color-mode=dark] .btn-blue-500.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-500:focus,html[data-netbox-color-mode=dark] .btn-blue-500:active:focus,html[data-netbox-color-mode=dark] .btn-blue-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3184fd80}html[data-netbox-color-mode=dark] .btn-blue-500:disabled,html[data-netbox-color-mode=dark] .btn-blue-500.disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}html[data-netbox-color-mode=dark] .btn-blue-600{color:#fff;background-color:#0a58ca;border-color:#0a58ca}html[data-netbox-color-mode=dark] .btn-blue-600:hover{color:#fff;background-color:#094bac;border-color:#0846a2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-600,html[data-netbox-color-mode=dark] .btn-blue-600:focus{color:#fff;background-color:#094bac;border-color:#0846a2;box-shadow:0 0 0 .25rem #2f71d280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-600,html[data-netbox-color-mode=dark] .btn-blue-600:active,html[data-netbox-color-mode=dark] .btn-blue-600.active,.show>html[data-netbox-color-mode=dark] .btn-blue-600.dropdown-toggle{color:#fff;background-color:#0846a2;border-color:#084298}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-600:focus,html[data-netbox-color-mode=dark] .btn-blue-600:active:focus,html[data-netbox-color-mode=dark] .btn-blue-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2f71d280}html[data-netbox-color-mode=dark] .btn-blue-600:disabled,html[data-netbox-color-mode=dark] .btn-blue-600.disabled{color:#fff;background-color:#0a58ca;border-color:#0a58ca}html[data-netbox-color-mode=dark] .btn-blue-700{color:#fff;background-color:#084298;border-color:#084298}html[data-netbox-color-mode=dark] .btn-blue-700:hover{color:#fff;background-color:#073881;border-color:#06357a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-700,html[data-netbox-color-mode=dark] .btn-blue-700:focus{color:#fff;background-color:#073881;border-color:#06357a;box-shadow:0 0 0 .25rem #2d5ea780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-700,html[data-netbox-color-mode=dark] .btn-blue-700:active,html[data-netbox-color-mode=dark] .btn-blue-700.active,.show>html[data-netbox-color-mode=dark] .btn-blue-700.dropdown-toggle{color:#fff;background-color:#06357a;border-color:#063272}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-700:focus,html[data-netbox-color-mode=dark] .btn-blue-700:active:focus,html[data-netbox-color-mode=dark] .btn-blue-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2d5ea780}html[data-netbox-color-mode=dark] .btn-blue-700:disabled,html[data-netbox-color-mode=dark] .btn-blue-700.disabled{color:#fff;background-color:#084298;border-color:#084298}html[data-netbox-color-mode=dark] .btn-blue-800{color:#fff;background-color:#052c65;border-color:#052c65}html[data-netbox-color-mode=dark] .btn-blue-800:hover{color:#fff;background-color:#042556;border-color:#042351}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-800,html[data-netbox-color-mode=dark] .btn-blue-800:focus{color:#fff;background-color:#042556;border-color:#042351;box-shadow:0 0 0 .25rem #2b4c7c80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-800,html[data-netbox-color-mode=dark] .btn-blue-800:active,html[data-netbox-color-mode=dark] .btn-blue-800.active,.show>html[data-netbox-color-mode=dark] .btn-blue-800.dropdown-toggle{color:#fff;background-color:#042351;border-color:#04214c}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-800:focus,html[data-netbox-color-mode=dark] .btn-blue-800:active:focus,html[data-netbox-color-mode=dark] .btn-blue-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b4c7c80}html[data-netbox-color-mode=dark] .btn-blue-800:disabled,html[data-netbox-color-mode=dark] .btn-blue-800.disabled{color:#fff;background-color:#052c65;border-color:#052c65}html[data-netbox-color-mode=dark] .btn-blue-900{color:#fff;background-color:#031633;border-color:#031633}html[data-netbox-color-mode=dark] .btn-blue-900:hover{color:#fff;background-color:#03132b;border-color:#021229}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-900,html[data-netbox-color-mode=dark] .btn-blue-900:focus{color:#fff;background-color:#03132b;border-color:#021229;box-shadow:0 0 0 .25rem #29395280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-900,html[data-netbox-color-mode=dark] .btn-blue-900:active,html[data-netbox-color-mode=dark] .btn-blue-900.active,.show>html[data-netbox-color-mode=dark] .btn-blue-900.dropdown-toggle{color:#fff;background-color:#021229;border-color:#021126}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-900:focus,html[data-netbox-color-mode=dark] .btn-blue-900:active:focus,html[data-netbox-color-mode=dark] .btn-blue-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #29395280}html[data-netbox-color-mode=dark] .btn-blue-900:disabled,html[data-netbox-color-mode=dark] .btn-blue-900.disabled{color:#fff;background-color:#031633;border-color:#031633}html[data-netbox-color-mode=dark] .btn-cyan-100{color:#000;background-color:#cff4fc;border-color:#cff4fc}html[data-netbox-color-mode=dark] .btn-cyan-100:hover{color:#000;background-color:#d6f6fc;border-color:#d4f5fc}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-100,html[data-netbox-color-mode=dark] .btn-cyan-100:focus{color:#000;background-color:#d6f6fc;border-color:#d4f5fc;box-shadow:0 0 0 .25rem #b0cfd680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-100,html[data-netbox-color-mode=dark] .btn-cyan-100:active,html[data-netbox-color-mode=dark] .btn-cyan-100.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-100.dropdown-toggle{color:#000;background-color:#d9f6fd;border-color:#d4f5fc}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-100:focus,html[data-netbox-color-mode=dark] .btn-cyan-100:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b0cfd680}html[data-netbox-color-mode=dark] .btn-cyan-100:disabled,html[data-netbox-color-mode=dark] .btn-cyan-100.disabled{color:#000;background-color:#cff4fc;border-color:#cff4fc}html[data-netbox-color-mode=dark] .btn-cyan-200{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}html[data-netbox-color-mode=dark] .btn-cyan-200:hover{color:#000;background-color:#adedfa;border-color:#a8ecfa}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-200,html[data-netbox-color-mode=dark] .btn-cyan-200:focus{color:#000;background-color:#adedfa;border-color:#a8ecfa;box-shadow:0 0 0 .25rem #86c7d480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-200,html[data-netbox-color-mode=dark] .btn-cyan-200:active,html[data-netbox-color-mode=dark] .btn-cyan-200.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-200.dropdown-toggle{color:#000;background-color:#b1eefa;border-color:#a8ecfa}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-200:focus,html[data-netbox-color-mode=dark] .btn-cyan-200:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #86c7d480}html[data-netbox-color-mode=dark] .btn-cyan-200:disabled,html[data-netbox-color-mode=dark] .btn-cyan-200.disabled{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}html[data-netbox-color-mode=dark] .btn-cyan-300{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-cyan-300:hover{color:#000;background-color:#84e4f7;border-color:#7de2f7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-300,html[data-netbox-color-mode=dark] .btn-cyan-300:focus{color:#000;background-color:#84e4f7;border-color:#7de2f7;box-shadow:0 0 0 .25rem #5ebed180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-300,html[data-netbox-color-mode=dark] .btn-cyan-300:active,html[data-netbox-color-mode=dark] .btn-cyan-300.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-300.dropdown-toggle{color:#000;background-color:#8be5f8;border-color:#7de2f7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-300:focus,html[data-netbox-color-mode=dark] .btn-cyan-300:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5ebed180}html[data-netbox-color-mode=dark] .btn-cyan-300:disabled,html[data-netbox-color-mode=dark] .btn-cyan-300.disabled{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-cyan-400{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}html[data-netbox-color-mode=dark] .btn-cyan-400:hover{color:#000;background-color:#5adbf5;border-color:#50d9f4}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-400,html[data-netbox-color-mode=dark] .btn-cyan-400:focus{color:#000;background-color:#5adbf5;border-color:#50d9f4;box-shadow:0 0 0 .25rem #34b5cf80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-400,html[data-netbox-color-mode=dark] .btn-cyan-400:active,html[data-netbox-color-mode=dark] .btn-cyan-400.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-400.dropdown-toggle{color:#000;background-color:#64ddf5;border-color:#50d9f4}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-400:focus,html[data-netbox-color-mode=dark] .btn-cyan-400:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #34b5cf80}html[data-netbox-color-mode=dark] .btn-cyan-400:disabled,html[data-netbox-color-mode=dark] .btn-cyan-400.disabled{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}html[data-netbox-color-mode=dark] .btn-cyan-500{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}html[data-netbox-color-mode=dark] .btn-cyan-500:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-500,html[data-netbox-color-mode=dark] .btn-cyan-500:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem #0baccc80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-500,html[data-netbox-color-mode=dark] .btn-cyan-500:active,html[data-netbox-color-mode=dark] .btn-cyan-500.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-500.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-500:focus,html[data-netbox-color-mode=dark] .btn-cyan-500:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #0baccc80}html[data-netbox-color-mode=dark] .btn-cyan-500:disabled,html[data-netbox-color-mode=dark] .btn-cyan-500.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}html[data-netbox-color-mode=dark] .btn-cyan-600{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}html[data-netbox-color-mode=dark] .btn-cyan-600:hover{color:#000;background-color:#2fb0c9;border-color:#23abc6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-600,html[data-netbox-color-mode=dark] .btn-cyan-600:focus{color:#000;background-color:#2fb0c9;border-color:#23abc6;box-shadow:0 0 0 .25rem #098aa380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-600,html[data-netbox-color-mode=dark] .btn-cyan-600:active,html[data-netbox-color-mode=dark] .btn-cyan-600.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-600.dropdown-toggle{color:#000;background-color:#3bb5cd;border-color:#23abc6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-600:focus,html[data-netbox-color-mode=dark] .btn-cyan-600:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #098aa380}html[data-netbox-color-mode=dark] .btn-cyan-600:disabled,html[data-netbox-color-mode=dark] .btn-cyan-600.disabled{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}html[data-netbox-color-mode=dark] .btn-cyan-700{color:#fff;background-color:#087990;border-color:#087990}html[data-netbox-color-mode=dark] .btn-cyan-700:hover{color:#fff;background-color:#07677a;border-color:#066173}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-700,html[data-netbox-color-mode=dark] .btn-cyan-700:focus{color:#fff;background-color:#07677a;border-color:#066173;box-shadow:0 0 0 .25rem #2d8da180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-700,html[data-netbox-color-mode=dark] .btn-cyan-700:active,html[data-netbox-color-mode=dark] .btn-cyan-700.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-700.dropdown-toggle{color:#fff;background-color:#066173;border-color:#065b6c}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-700:focus,html[data-netbox-color-mode=dark] .btn-cyan-700:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2d8da180}html[data-netbox-color-mode=dark] .btn-cyan-700:disabled,html[data-netbox-color-mode=dark] .btn-cyan-700.disabled{color:#fff;background-color:#087990;border-color:#087990}html[data-netbox-color-mode=dark] .btn-cyan-800{color:#fff;background-color:#055160;border-color:#055160}html[data-netbox-color-mode=dark] .btn-cyan-800:hover{color:#fff;background-color:#044552;border-color:#04414d}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-800,html[data-netbox-color-mode=dark] .btn-cyan-800:focus{color:#fff;background-color:#044552;border-color:#04414d;box-shadow:0 0 0 .25rem #2b6b7880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-800,html[data-netbox-color-mode=dark] .btn-cyan-800:active,html[data-netbox-color-mode=dark] .btn-cyan-800.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-800.dropdown-toggle{color:#fff;background-color:#04414d;border-color:#043d48}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-800:focus,html[data-netbox-color-mode=dark] .btn-cyan-800:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b6b7880}html[data-netbox-color-mode=dark] .btn-cyan-800:disabled,html[data-netbox-color-mode=dark] .btn-cyan-800.disabled{color:#fff;background-color:#055160;border-color:#055160}html[data-netbox-color-mode=dark] .btn-cyan-900{color:#fff;background-color:#032830;border-color:#032830}html[data-netbox-color-mode=dark] .btn-cyan-900:hover{color:#fff;background-color:#032229;border-color:#022026}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-900,html[data-netbox-color-mode=dark] .btn-cyan-900:focus{color:#fff;background-color:#032229;border-color:#022026;box-shadow:0 0 0 .25rem #29484f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-900,html[data-netbox-color-mode=dark] .btn-cyan-900:active,html[data-netbox-color-mode=dark] .btn-cyan-900.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-900.dropdown-toggle{color:#fff;background-color:#022026;border-color:#021e24}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-900:focus,html[data-netbox-color-mode=dark] .btn-cyan-900:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #29484f80}html[data-netbox-color-mode=dark] .btn-cyan-900:disabled,html[data-netbox-color-mode=dark] .btn-cyan-900.disabled{color:#fff;background-color:#032830;border-color:#032830}html[data-netbox-color-mode=dark] .btn-indigo-100{color:#000;background-color:#e0cffc;border-color:#e0cffc}html[data-netbox-color-mode=dark] .btn-indigo-100:hover{color:#000;background-color:#e5d6fc;border-color:#e3d4fc}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-100,html[data-netbox-color-mode=dark] .btn-indigo-100:focus{color:#000;background-color:#e5d6fc;border-color:#e3d4fc;box-shadow:0 0 0 .25rem #beb0d680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-100,html[data-netbox-color-mode=dark] .btn-indigo-100:active,html[data-netbox-color-mode=dark] .btn-indigo-100.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-100.dropdown-toggle{color:#000;background-color:#e6d9fd;border-color:#e3d4fc}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-100:focus,html[data-netbox-color-mode=dark] .btn-indigo-100:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #beb0d680}html[data-netbox-color-mode=dark] .btn-indigo-100:disabled,html[data-netbox-color-mode=dark] .btn-indigo-100.disabled{color:#000;background-color:#e0cffc;border-color:#e0cffc}html[data-netbox-color-mode=dark] .btn-indigo-200{color:#000;background-color:#c29ffa;border-color:#c29ffa}html[data-netbox-color-mode=dark] .btn-indigo-200:hover{color:#000;background-color:#cbadfb;border-color:#c8a9fb}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-200,html[data-netbox-color-mode=dark] .btn-indigo-200:focus{color:#000;background-color:#cbadfb;border-color:#c8a9fb;box-shadow:0 0 0 .25rem #a587d580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-200,html[data-netbox-color-mode=dark] .btn-indigo-200:active,html[data-netbox-color-mode=dark] .btn-indigo-200.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-200.dropdown-toggle{color:#000;background-color:#ceb2fb;border-color:#c8a9fb}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-200:focus,html[data-netbox-color-mode=dark] .btn-indigo-200:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #a587d580}html[data-netbox-color-mode=dark] .btn-indigo-200:disabled,html[data-netbox-color-mode=dark] .btn-indigo-200.disabled{color:#000;background-color:#c29ffa;border-color:#c29ffa}html[data-netbox-color-mode=dark] .btn-indigo-300{color:#000;background-color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-indigo-300:hover{color:#000;background-color:#b185f8;border-color:#ac7ef8}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-300,html[data-netbox-color-mode=dark] .btn-indigo-300:focus{color:#000;background-color:#b185f8;border-color:#ac7ef8;box-shadow:0 0 0 .25rem #8b5fd280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-300,html[data-netbox-color-mode=dark] .btn-indigo-300:active,html[data-netbox-color-mode=dark] .btn-indigo-300.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-300.dropdown-toggle{color:#000;background-color:#b58df9;border-color:#ac7ef8}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-300:focus,html[data-netbox-color-mode=dark] .btn-indigo-300:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #8b5fd280}html[data-netbox-color-mode=dark] .btn-indigo-300:disabled,html[data-netbox-color-mode=dark] .btn-indigo-300.disabled{color:#000;background-color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-indigo-400{color:#fff;background-color:#8540f5;border-color:#8540f5}html[data-netbox-color-mode=dark] .btn-indigo-400:hover{color:#fff;background-color:#7136d0;border-color:#6a33c4}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-400,html[data-netbox-color-mode=dark] .btn-indigo-400:focus{color:#fff;background-color:#7136d0;border-color:#6a33c4;box-shadow:0 0 0 .25rem #975df780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-400,html[data-netbox-color-mode=dark] .btn-indigo-400:active,html[data-netbox-color-mode=dark] .btn-indigo-400.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-400.dropdown-toggle{color:#fff;background-color:#6a33c4;border-color:#6430b8}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-400:focus,html[data-netbox-color-mode=dark] .btn-indigo-400:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #975df780}html[data-netbox-color-mode=dark] .btn-indigo-400:disabled,html[data-netbox-color-mode=dark] .btn-indigo-400.disabled{color:#fff;background-color:#8540f5;border-color:#8540f5}html[data-netbox-color-mode=dark] .btn-indigo-500{color:#fff;background-color:#6610f2;border-color:#6610f2}html[data-netbox-color-mode=dark] .btn-indigo-500:hover{color:#fff;background-color:#570ece;border-color:#520dc2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-500,html[data-netbox-color-mode=dark] .btn-indigo-500:focus{color:#fff;background-color:#570ece;border-color:#520dc2;box-shadow:0 0 0 .25rem #7d34f480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-500,html[data-netbox-color-mode=dark] .btn-indigo-500:active,html[data-netbox-color-mode=dark] .btn-indigo-500.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-500.dropdown-toggle{color:#fff;background-color:#520dc2;border-color:#4d0cb6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-500:focus,html[data-netbox-color-mode=dark] .btn-indigo-500:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d34f480}html[data-netbox-color-mode=dark] .btn-indigo-500:disabled,html[data-netbox-color-mode=dark] .btn-indigo-500.disabled{color:#fff;background-color:#6610f2;border-color:#6610f2}html[data-netbox-color-mode=dark] .btn-indigo-600{color:#fff;background-color:#520dc2;border-color:#520dc2}html[data-netbox-color-mode=dark] .btn-indigo-600:hover{color:#fff;background-color:#460ba5;border-color:#420a9b}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-600,html[data-netbox-color-mode=dark] .btn-indigo-600:focus{color:#fff;background-color:#460ba5;border-color:#420a9b;box-shadow:0 0 0 .25rem #6c31cb80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-600,html[data-netbox-color-mode=dark] .btn-indigo-600:active,html[data-netbox-color-mode=dark] .btn-indigo-600.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-600.dropdown-toggle{color:#fff;background-color:#420a9b;border-color:#3e0a92}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-600:focus,html[data-netbox-color-mode=dark] .btn-indigo-600:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #6c31cb80}html[data-netbox-color-mode=dark] .btn-indigo-600:disabled,html[data-netbox-color-mode=dark] .btn-indigo-600.disabled{color:#fff;background-color:#520dc2;border-color:#520dc2}html[data-netbox-color-mode=dark] .btn-indigo-700{color:#fff;background-color:#3d0a91;border-color:#3d0a91}html[data-netbox-color-mode=dark] .btn-indigo-700:hover{color:#fff;background-color:#34097b;border-color:#310874}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-700,html[data-netbox-color-mode=dark] .btn-indigo-700:focus{color:#fff;background-color:#34097b;border-color:#310874;box-shadow:0 0 0 .25rem #5a2fa280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-700,html[data-netbox-color-mode=dark] .btn-indigo-700:active,html[data-netbox-color-mode=dark] .btn-indigo-700.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-700.dropdown-toggle{color:#fff;background-color:#310874;border-color:#2e086d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-700:focus,html[data-netbox-color-mode=dark] .btn-indigo-700:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5a2fa280}html[data-netbox-color-mode=dark] .btn-indigo-700:disabled,html[data-netbox-color-mode=dark] .btn-indigo-700.disabled{color:#fff;background-color:#3d0a91;border-color:#3d0a91}html[data-netbox-color-mode=dark] .btn-indigo-800{color:#fff;background-color:#290661;border-color:#290661}html[data-netbox-color-mode=dark] .btn-indigo-800:hover{color:#fff;background-color:#230552;border-color:#21054e}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-800,html[data-netbox-color-mode=dark] .btn-indigo-800:focus{color:#fff;background-color:#230552;border-color:#21054e;box-shadow:0 0 0 .25rem #492b7980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-800,html[data-netbox-color-mode=dark] .btn-indigo-800:active,html[data-netbox-color-mode=dark] .btn-indigo-800.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-800.dropdown-toggle{color:#fff;background-color:#21054e;border-color:#1f0549}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-800:focus,html[data-netbox-color-mode=dark] .btn-indigo-800:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #492b7980}html[data-netbox-color-mode=dark] .btn-indigo-800:disabled,html[data-netbox-color-mode=dark] .btn-indigo-800.disabled{color:#fff;background-color:#290661;border-color:#290661}html[data-netbox-color-mode=dark] .btn-indigo-900{color:#fff;background-color:#140330;border-color:#140330}html[data-netbox-color-mode=dark] .btn-indigo-900:hover{color:#fff;background-color:#110329;border-color:#100226}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-900,html[data-netbox-color-mode=dark] .btn-indigo-900:focus{color:#fff;background-color:#110329;border-color:#100226;box-shadow:0 0 0 .25rem #37294f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-900,html[data-netbox-color-mode=dark] .btn-indigo-900:active,html[data-netbox-color-mode=dark] .btn-indigo-900.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-900.dropdown-toggle{color:#fff;background-color:#100226;border-color:#0f0224}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-900:focus,html[data-netbox-color-mode=dark] .btn-indigo-900:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #37294f80}html[data-netbox-color-mode=dark] .btn-indigo-900:disabled,html[data-netbox-color-mode=dark] .btn-indigo-900.disabled{color:#fff;background-color:#140330;border-color:#140330}html[data-netbox-color-mode=dark] .btn-purple-100{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}html[data-netbox-color-mode=dark] .btn-purple-100:hover{color:#000;background-color:#e6dff5;border-color:#e5ddf4}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-100,html[data-netbox-color-mode=dark] .btn-purple-100:focus{color:#000;background-color:#e6dff5;border-color:#e5ddf4;box-shadow:0 0 0 .25rem #c0b8cf80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-100,html[data-netbox-color-mode=dark] .btn-purple-100:active,html[data-netbox-color-mode=dark] .btn-purple-100.active,.show>html[data-netbox-color-mode=dark] .btn-purple-100.dropdown-toggle{color:#000;background-color:#e8e1f5;border-color:#e5ddf4}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-100:focus,html[data-netbox-color-mode=dark] .btn-purple-100:active:focus,html[data-netbox-color-mode=dark] .btn-purple-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c0b8cf80}html[data-netbox-color-mode=dark] .btn-purple-100:disabled,html[data-netbox-color-mode=dark] .btn-purple-100.disabled{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}html[data-netbox-color-mode=dark] .btn-purple-200{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}html[data-netbox-color-mode=dark] .btn-purple-200:hover{color:#000;background-color:#cebeea;border-color:#cbbbe9}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-200,html[data-netbox-color-mode=dark] .btn-purple-200:focus{color:#000;background-color:#cebeea;border-color:#cbbbe9;box-shadow:0 0 0 .25rem #a798c480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-200,html[data-netbox-color-mode=dark] .btn-purple-200:active,html[data-netbox-color-mode=dark] .btn-purple-200.active,.show>html[data-netbox-color-mode=dark] .btn-purple-200.dropdown-toggle{color:#000;background-color:#d1c2eb;border-color:#cbbbe9}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-200:focus,html[data-netbox-color-mode=dark] .btn-purple-200:active:focus,html[data-netbox-color-mode=dark] .btn-purple-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #a798c480}html[data-netbox-color-mode=dark] .btn-purple-200:disabled,html[data-netbox-color-mode=dark] .btn-purple-200.disabled{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}html[data-netbox-color-mode=dark] .btn-purple-300{color:#000;background-color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-purple-300:hover{color:#000;background-color:#b69fe0;border-color:#b299de}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-300,html[data-netbox-color-mode=dark] .btn-purple-300:focus{color:#000;background-color:#b69fe0;border-color:#b299de;box-shadow:0 0 0 .25rem #9079b980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-300,html[data-netbox-color-mode=dark] .btn-purple-300:active,html[data-netbox-color-mode=dark] .btn-purple-300.active,.show>html[data-netbox-color-mode=dark] .btn-purple-300.dropdown-toggle{color:#000;background-color:#baa5e1;border-color:#b299de}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-300:focus,html[data-netbox-color-mode=dark] .btn-purple-300:active:focus,html[data-netbox-color-mode=dark] .btn-purple-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #9079b980}html[data-netbox-color-mode=dark] .btn-purple-300:disabled,html[data-netbox-color-mode=dark] .btn-purple-300.disabled{color:#000;background-color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-purple-400{color:#000;background-color:#8c68cd;border-color:#8c68cd}html[data-netbox-color-mode=dark] .btn-purple-400:hover{color:#000;background-color:#9d7fd5;border-color:#9877d2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-400,html[data-netbox-color-mode=dark] .btn-purple-400:focus{color:#000;background-color:#9d7fd5;border-color:#9877d2;box-shadow:0 0 0 .25rem #7758ae80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-400,html[data-netbox-color-mode=dark] .btn-purple-400:active,html[data-netbox-color-mode=dark] .btn-purple-400.active,.show>html[data-netbox-color-mode=dark] .btn-purple-400.dropdown-toggle{color:#000;background-color:#a386d7;border-color:#9877d2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-400:focus,html[data-netbox-color-mode=dark] .btn-purple-400:active:focus,html[data-netbox-color-mode=dark] .btn-purple-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7758ae80}html[data-netbox-color-mode=dark] .btn-purple-400:disabled,html[data-netbox-color-mode=dark] .btn-purple-400.disabled{color:#000;background-color:#8c68cd;border-color:#8c68cd}html[data-netbox-color-mode=dark] .btn-purple-500{color:#fff;background-color:#6f42c1;border-color:#6f42c1}html[data-netbox-color-mode=dark] .btn-purple-500:hover{color:#fff;background-color:#5e38a4;border-color:#59359a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-500,html[data-netbox-color-mode=dark] .btn-purple-500:focus{color:#fff;background-color:#5e38a4;border-color:#59359a;box-shadow:0 0 0 .25rem #855eca80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-500,html[data-netbox-color-mode=dark] .btn-purple-500:active,html[data-netbox-color-mode=dark] .btn-purple-500.active,.show>html[data-netbox-color-mode=dark] .btn-purple-500.dropdown-toggle{color:#fff;background-color:#59359a;border-color:#533291}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-500:focus,html[data-netbox-color-mode=dark] .btn-purple-500:active:focus,html[data-netbox-color-mode=dark] .btn-purple-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #855eca80}html[data-netbox-color-mode=dark] .btn-purple-500:disabled,html[data-netbox-color-mode=dark] .btn-purple-500.disabled{color:#fff;background-color:#6f42c1;border-color:#6f42c1}html[data-netbox-color-mode=dark] .btn-purple-600{color:#fff;background-color:#59359a;border-color:#59359a}html[data-netbox-color-mode=dark] .btn-purple-600:hover{color:#fff;background-color:#4c2d83;border-color:#472a7b}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-600,html[data-netbox-color-mode=dark] .btn-purple-600:focus{color:#fff;background-color:#4c2d83;border-color:#472a7b;box-shadow:0 0 0 .25rem #7253a980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-600,html[data-netbox-color-mode=dark] .btn-purple-600:active,html[data-netbox-color-mode=dark] .btn-purple-600.active,.show>html[data-netbox-color-mode=dark] .btn-purple-600.dropdown-toggle{color:#fff;background-color:#472a7b;border-color:#432874}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-600:focus,html[data-netbox-color-mode=dark] .btn-purple-600:active:focus,html[data-netbox-color-mode=dark] .btn-purple-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7253a980}html[data-netbox-color-mode=dark] .btn-purple-600:disabled,html[data-netbox-color-mode=dark] .btn-purple-600.disabled{color:#fff;background-color:#59359a;border-color:#59359a}html[data-netbox-color-mode=dark] .btn-purple-700{color:#fff;background-color:#432874;border-color:#432874}html[data-netbox-color-mode=dark] .btn-purple-700:hover{color:#fff;background-color:#392263;border-color:#36205d}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-700,html[data-netbox-color-mode=dark] .btn-purple-700:focus{color:#fff;background-color:#392263;border-color:#36205d;box-shadow:0 0 0 .25rem #5f488980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-700,html[data-netbox-color-mode=dark] .btn-purple-700:active,html[data-netbox-color-mode=dark] .btn-purple-700.active,.show>html[data-netbox-color-mode=dark] .btn-purple-700.dropdown-toggle{color:#fff;background-color:#36205d;border-color:#321e57}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-700:focus,html[data-netbox-color-mode=dark] .btn-purple-700:active:focus,html[data-netbox-color-mode=dark] .btn-purple-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5f488980}html[data-netbox-color-mode=dark] .btn-purple-700:disabled,html[data-netbox-color-mode=dark] .btn-purple-700.disabled{color:#fff;background-color:#432874;border-color:#432874}html[data-netbox-color-mode=dark] .btn-purple-800{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}html[data-netbox-color-mode=dark] .btn-purple-800:hover{color:#fff;background-color:#251641;border-color:#23153e}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-800,html[data-netbox-color-mode=dark] .btn-purple-800:focus{color:#fff;background-color:#251641;border-color:#23153e;box-shadow:0 0 0 .25rem #4c3c6880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-800,html[data-netbox-color-mode=dark] .btn-purple-800:active,html[data-netbox-color-mode=dark] .btn-purple-800.active,.show>html[data-netbox-color-mode=dark] .btn-purple-800.dropdown-toggle{color:#fff;background-color:#23153e;border-color:#21143a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-800:focus,html[data-netbox-color-mode=dark] .btn-purple-800:active:focus,html[data-netbox-color-mode=dark] .btn-purple-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4c3c6880}html[data-netbox-color-mode=dark] .btn-purple-800:disabled,html[data-netbox-color-mode=dark] .btn-purple-800.disabled{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}html[data-netbox-color-mode=dark] .btn-purple-900{color:#fff;background-color:#160d27;border-color:#160d27}html[data-netbox-color-mode=dark] .btn-purple-900:hover{color:#fff;background-color:#130b21;border-color:#120a1f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-900,html[data-netbox-color-mode=dark] .btn-purple-900:focus{color:#fff;background-color:#130b21;border-color:#120a1f;box-shadow:0 0 0 .25rem #39314780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-900,html[data-netbox-color-mode=dark] .btn-purple-900:active,html[data-netbox-color-mode=dark] .btn-purple-900.active,.show>html[data-netbox-color-mode=dark] .btn-purple-900.dropdown-toggle{color:#fff;background-color:#120a1f;border-color:#110a1d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-900:focus,html[data-netbox-color-mode=dark] .btn-purple-900:active:focus,html[data-netbox-color-mode=dark] .btn-purple-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #39314780}html[data-netbox-color-mode=dark] .btn-purple-900:disabled,html[data-netbox-color-mode=dark] .btn-purple-900.disabled{color:#fff;background-color:#160d27;border-color:#160d27}html[data-netbox-color-mode=dark] .btn-pink-100{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}html[data-netbox-color-mode=dark] .btn-pink-100:hover{color:#000;background-color:#f8dcea;border-color:#f8dae9}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-100,html[data-netbox-color-mode=dark] .btn-pink-100:focus{color:#000;background-color:#f8dcea;border-color:#f8dae9;box-shadow:0 0 0 .25rem #d2b6c480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-100,html[data-netbox-color-mode=dark] .btn-pink-100:active,html[data-netbox-color-mode=dark] .btn-pink-100.active,.show>html[data-netbox-color-mode=dark] .btn-pink-100.dropdown-toggle{color:#000;background-color:#f9deeb;border-color:#f8dae9}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-100:focus,html[data-netbox-color-mode=dark] .btn-pink-100:active:focus,html[data-netbox-color-mode=dark] .btn-pink-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d2b6c480}html[data-netbox-color-mode=dark] .btn-pink-100:disabled,html[data-netbox-color-mode=dark] .btn-pink-100.disabled{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}html[data-netbox-color-mode=dark] .btn-pink-200{color:#000;background-color:#efadce;border-color:#efadce}html[data-netbox-color-mode=dark] .btn-pink-200:hover{color:#000;background-color:#f1b9d5;border-color:#f1b5d3}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-200,html[data-netbox-color-mode=dark] .btn-pink-200:focus{color:#000;background-color:#f1b9d5;border-color:#f1b5d3;box-shadow:0 0 0 .25rem #cb93af80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-200,html[data-netbox-color-mode=dark] .btn-pink-200:active,html[data-netbox-color-mode=dark] .btn-pink-200.active,.show>html[data-netbox-color-mode=dark] .btn-pink-200.dropdown-toggle{color:#000;background-color:#f2bdd8;border-color:#f1b5d3}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-200:focus,html[data-netbox-color-mode=dark] .btn-pink-200:active:focus,html[data-netbox-color-mode=dark] .btn-pink-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #cb93af80}html[data-netbox-color-mode=dark] .btn-pink-200:disabled,html[data-netbox-color-mode=dark] .btn-pink-200.disabled{color:#000;background-color:#efadce;border-color:#efadce}html[data-netbox-color-mode=dark] .btn-pink-300{color:#000;background-color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-pink-300:hover{color:#000;background-color:#ea97c0;border-color:#e991bc}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-300,html[data-netbox-color-mode=dark] .btn-pink-300:focus{color:#000;background-color:#ea97c0;border-color:#e991bc;box-shadow:0 0 0 .25rem #c4719a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-300,html[data-netbox-color-mode=dark] .btn-pink-300:active,html[data-netbox-color-mode=dark] .btn-pink-300.active,.show>html[data-netbox-color-mode=dark] .btn-pink-300.dropdown-toggle{color:#000;background-color:#eb9dc4;border-color:#e991bc}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-300:focus,html[data-netbox-color-mode=dark] .btn-pink-300:active:focus,html[data-netbox-color-mode=dark] .btn-pink-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c4719a80}html[data-netbox-color-mode=dark] .btn-pink-300:disabled,html[data-netbox-color-mode=dark] .btn-pink-300.disabled{color:#000;background-color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-pink-400{color:#000;background-color:#de5c9d;border-color:#de5c9d}html[data-netbox-color-mode=dark] .btn-pink-400:hover{color:#000;background-color:#e374ac;border-color:#e16ca7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-400,html[data-netbox-color-mode=dark] .btn-pink-400:focus{color:#000;background-color:#e374ac;border-color:#e16ca7;box-shadow:0 0 0 .25rem #bd4e8580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-400,html[data-netbox-color-mode=dark] .btn-pink-400:active,html[data-netbox-color-mode=dark] .btn-pink-400.active,.show>html[data-netbox-color-mode=dark] .btn-pink-400.dropdown-toggle{color:#000;background-color:#e57db1;border-color:#e16ca7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-400:focus,html[data-netbox-color-mode=dark] .btn-pink-400:active:focus,html[data-netbox-color-mode=dark] .btn-pink-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bd4e8580}html[data-netbox-color-mode=dark] .btn-pink-400:disabled,html[data-netbox-color-mode=dark] .btn-pink-400.disabled{color:#000;background-color:#de5c9d;border-color:#de5c9d}html[data-netbox-color-mode=dark] .btn-pink-500{color:#fff;background-color:#d63384;border-color:#d63384}html[data-netbox-color-mode=dark] .btn-pink-500:hover{color:#fff;background-color:#b62b70;border-color:#ab296a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-500,html[data-netbox-color-mode=dark] .btn-pink-500:focus{color:#fff;background-color:#b62b70;border-color:#ab296a;box-shadow:0 0 0 .25rem #dc529680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-500,html[data-netbox-color-mode=dark] .btn-pink-500:active,html[data-netbox-color-mode=dark] .btn-pink-500.active,.show>html[data-netbox-color-mode=dark] .btn-pink-500.dropdown-toggle{color:#fff;background-color:#ab296a;border-color:#a12663}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-500:focus,html[data-netbox-color-mode=dark] .btn-pink-500:active:focus,html[data-netbox-color-mode=dark] .btn-pink-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #dc529680}html[data-netbox-color-mode=dark] .btn-pink-500:disabled,html[data-netbox-color-mode=dark] .btn-pink-500.disabled{color:#fff;background-color:#d63384;border-color:#d63384}html[data-netbox-color-mode=dark] .btn-pink-600{color:#fff;background-color:#ab296a;border-color:#ab296a}html[data-netbox-color-mode=dark] .btn-pink-600:hover{color:#fff;background-color:#91235a;border-color:#892155}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-600,html[data-netbox-color-mode=dark] .btn-pink-600:focus{color:#fff;background-color:#91235a;border-color:#892155;box-shadow:0 0 0 .25rem #b8498080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-600,html[data-netbox-color-mode=dark] .btn-pink-600:active,html[data-netbox-color-mode=dark] .btn-pink-600.active,.show>html[data-netbox-color-mode=dark] .btn-pink-600.dropdown-toggle{color:#fff;background-color:#892155;border-color:#801f50}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-600:focus,html[data-netbox-color-mode=dark] .btn-pink-600:active:focus,html[data-netbox-color-mode=dark] .btn-pink-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b8498080}html[data-netbox-color-mode=dark] .btn-pink-600:disabled,html[data-netbox-color-mode=dark] .btn-pink-600.disabled{color:#fff;background-color:#ab296a;border-color:#ab296a}html[data-netbox-color-mode=dark] .btn-pink-700{color:#fff;background-color:#801f4f;border-color:#801f4f}html[data-netbox-color-mode=dark] .btn-pink-700:hover{color:#fff;background-color:#6d1a43;border-color:#66193f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-700,html[data-netbox-color-mode=dark] .btn-pink-700:focus{color:#fff;background-color:#6d1a43;border-color:#66193f;box-shadow:0 0 0 .25rem #93416980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-700,html[data-netbox-color-mode=dark] .btn-pink-700:active,html[data-netbox-color-mode=dark] .btn-pink-700.active,.show>html[data-netbox-color-mode=dark] .btn-pink-700.dropdown-toggle{color:#fff;background-color:#66193f;border-color:#60173b}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-700:focus,html[data-netbox-color-mode=dark] .btn-pink-700:active:focus,html[data-netbox-color-mode=dark] .btn-pink-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #93416980}html[data-netbox-color-mode=dark] .btn-pink-700:disabled,html[data-netbox-color-mode=dark] .btn-pink-700.disabled{color:#fff;background-color:#801f4f;border-color:#801f4f}html[data-netbox-color-mode=dark] .btn-pink-800{color:#fff;background-color:#561435;border-color:#561435}html[data-netbox-color-mode=dark] .btn-pink-800:hover{color:#fff;background-color:#49112d;border-color:#45102a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-800,html[data-netbox-color-mode=dark] .btn-pink-800:focus{color:#fff;background-color:#49112d;border-color:#45102a;box-shadow:0 0 0 .25rem #6f375380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-800,html[data-netbox-color-mode=dark] .btn-pink-800:active,html[data-netbox-color-mode=dark] .btn-pink-800.active,.show>html[data-netbox-color-mode=dark] .btn-pink-800.dropdown-toggle{color:#fff;background-color:#45102a;border-color:#410f28}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-800:focus,html[data-netbox-color-mode=dark] .btn-pink-800:active:focus,html[data-netbox-color-mode=dark] .btn-pink-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #6f375380}html[data-netbox-color-mode=dark] .btn-pink-800:disabled,html[data-netbox-color-mode=dark] .btn-pink-800.disabled{color:#fff;background-color:#561435;border-color:#561435}html[data-netbox-color-mode=dark] .btn-pink-900{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}html[data-netbox-color-mode=dark] .btn-pink-900:hover{color:#fff;background-color:#250916;border-color:#220815}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-900,html[data-netbox-color-mode=dark] .btn-pink-900:focus{color:#fff;background-color:#250916;border-color:#220815;box-shadow:0 0 0 .25rem #4b2f3c80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-900,html[data-netbox-color-mode=dark] .btn-pink-900:active,html[data-netbox-color-mode=dark] .btn-pink-900.active,.show>html[data-netbox-color-mode=dark] .btn-pink-900.dropdown-toggle{color:#fff;background-color:#220815;border-color:#200814}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-900:focus,html[data-netbox-color-mode=dark] .btn-pink-900:active:focus,html[data-netbox-color-mode=dark] .btn-pink-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4b2f3c80}html[data-netbox-color-mode=dark] .btn-pink-900:disabled,html[data-netbox-color-mode=dark] .btn-pink-900.disabled{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}html[data-netbox-color-mode=dark] .btn-outline-primary{color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-outline-primary:hover{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary:focus{box-shadow:0 0 0 .25rem #6ea8fe80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-primary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary:active,html[data-netbox-color-mode=dark] .btn-outline-primary.active,html[data-netbox-color-mode=dark] .btn-outline-primary.dropdown-toggle.show{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-primary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-primary:focus,html[data-netbox-color-mode=dark] .btn-outline-primary:active:focus,html[data-netbox-color-mode=dark] .btn-outline-primary.active:focus,html[data-netbox-color-mode=dark] .btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6ea8fe80}html[data-netbox-color-mode=dark] .btn-outline-primary:disabled,html[data-netbox-color-mode=dark] .btn-outline-primary.disabled{color:#6ea8fe;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-secondary{color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-outline-secondary:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-secondary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary:active,html[data-netbox-color-mode=dark] .btn-outline-secondary.active,html[data-netbox-color-mode=dark] .btn-outline-secondary.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary:active:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary.active:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}html[data-netbox-color-mode=dark] .btn-outline-secondary:disabled,html[data-netbox-color-mode=dark] .btn-outline-secondary.disabled{color:#adb5bd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-success{color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-outline-success:hover{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success:focus{box-shadow:0 0 0 .25rem #75b79880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-success,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success:active,html[data-netbox-color-mode=dark] .btn-outline-success.active,html[data-netbox-color-mode=dark] .btn-outline-success.dropdown-toggle.show{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-success:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-success:focus,html[data-netbox-color-mode=dark] .btn-outline-success:active:focus,html[data-netbox-color-mode=dark] .btn-outline-success.active:focus,html[data-netbox-color-mode=dark] .btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #75b79880}html[data-netbox-color-mode=dark] .btn-outline-success:disabled,html[data-netbox-color-mode=dark] .btn-outline-success.disabled{color:#75b798;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-info{color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-outline-info:hover{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info:focus{box-shadow:0 0 0 .25rem #6edff680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-info,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info:active,html[data-netbox-color-mode=dark] .btn-outline-info.active,html[data-netbox-color-mode=dark] .btn-outline-info.dropdown-toggle.show{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-info:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-info:focus,html[data-netbox-color-mode=dark] .btn-outline-info:active:focus,html[data-netbox-color-mode=dark] .btn-outline-info.active:focus,html[data-netbox-color-mode=dark] .btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6edff680}html[data-netbox-color-mode=dark] .btn-outline-info:disabled,html[data-netbox-color-mode=dark] .btn-outline-info.disabled{color:#6edff6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-warning{color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-outline-warning:hover{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning:focus{box-shadow:0 0 0 .25rem #ffda6a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-warning,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning:active,html[data-netbox-color-mode=dark] .btn-outline-warning.active,html[data-netbox-color-mode=dark] .btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-warning:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-warning:focus,html[data-netbox-color-mode=dark] .btn-outline-warning:active:focus,html[data-netbox-color-mode=dark] .btn-outline-warning.active:focus,html[data-netbox-color-mode=dark] .btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffda6a80}html[data-netbox-color-mode=dark] .btn-outline-warning:disabled,html[data-netbox-color-mode=dark] .btn-outline-warning.disabled{color:#ffda6a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-danger{color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-outline-danger:hover{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger:focus{box-shadow:0 0 0 .25rem #ea868f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-danger,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger:active,html[data-netbox-color-mode=dark] .btn-outline-danger.active,html[data-netbox-color-mode=dark] .btn-outline-danger.dropdown-toggle.show{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-danger:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-danger:focus,html[data-netbox-color-mode=dark] .btn-outline-danger:active:focus,html[data-netbox-color-mode=dark] .btn-outline-danger.active:focus,html[data-netbox-color-mode=dark] .btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ea868f80}html[data-netbox-color-mode=dark] .btn-outline-danger:disabled,html[data-netbox-color-mode=dark] .btn-outline-danger.disabled{color:#ea868f;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-light{color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-outline-light:hover{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light:focus{box-shadow:0 0 0 .25rem #dee2e680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-light,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light:active,html[data-netbox-color-mode=dark] .btn-outline-light.active,html[data-netbox-color-mode=dark] .btn-outline-light.dropdown-toggle.show{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-light:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-light:focus,html[data-netbox-color-mode=dark] .btn-outline-light:active:focus,html[data-netbox-color-mode=dark] .btn-outline-light.active:focus,html[data-netbox-color-mode=dark] .btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dee2e680}html[data-netbox-color-mode=dark] .btn-outline-light:disabled,html[data-netbox-color-mode=dark] .btn-outline-light.disabled{color:#dee2e6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-dark{color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-outline-dark:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-dark,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark:active,html[data-netbox-color-mode=dark] .btn-outline-dark.active,html[data-netbox-color-mode=dark] .btn-outline-dark.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-dark:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-dark:focus,html[data-netbox-color-mode=dark] .btn-outline-dark:active:focus,html[data-netbox-color-mode=dark] .btn-outline-dark.active:focus,html[data-netbox-color-mode=dark] .btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}html[data-netbox-color-mode=dark] .btn-outline-dark:disabled,html[data-netbox-color-mode=dark] .btn-outline-dark.disabled{color:#adb5bd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red{color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-outline-red:hover{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red:focus{box-shadow:0 0 0 .25rem #ea868f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red:active,html[data-netbox-color-mode=dark] .btn-outline-red.active,html[data-netbox-color-mode=dark] .btn-outline-red.dropdown-toggle.show{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red:focus,html[data-netbox-color-mode=dark] .btn-outline-red:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ea868f80}html[data-netbox-color-mode=dark] .btn-outline-red:disabled,html[data-netbox-color-mode=dark] .btn-outline-red.disabled{color:#ea868f;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow{color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-outline-yellow:hover{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow:focus{box-shadow:0 0 0 .25rem #ffda6a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow:active,html[data-netbox-color-mode=dark] .btn-outline-yellow.active,html[data-netbox-color-mode=dark] .btn-outline-yellow.dropdown-toggle.show{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffda6a80}html[data-netbox-color-mode=dark] .btn-outline-yellow:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow.disabled{color:#ffda6a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green{color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-outline-green:hover{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green:focus{box-shadow:0 0 0 .25rem #75b79880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green:active,html[data-netbox-color-mode=dark] .btn-outline-green.active,html[data-netbox-color-mode=dark] .btn-outline-green.dropdown-toggle.show{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green:focus,html[data-netbox-color-mode=dark] .btn-outline-green:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #75b79880}html[data-netbox-color-mode=dark] .btn-outline-green:disabled,html[data-netbox-color-mode=dark] .btn-outline-green.disabled{color:#75b798;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue{color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-outline-blue:hover{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue:focus{box-shadow:0 0 0 .25rem #6ea8fe80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue:active,html[data-netbox-color-mode=dark] .btn-outline-blue.active,html[data-netbox-color-mode=dark] .btn-outline-blue.dropdown-toggle.show{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue:focus,html[data-netbox-color-mode=dark] .btn-outline-blue:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6ea8fe80}html[data-netbox-color-mode=dark] .btn-outline-blue:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue.disabled{color:#6ea8fe;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan{color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-outline-cyan:hover{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan:focus{box-shadow:0 0 0 .25rem #6edff680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan:active,html[data-netbox-color-mode=dark] .btn-outline-cyan.active,html[data-netbox-color-mode=dark] .btn-outline-cyan.dropdown-toggle.show{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6edff680}html[data-netbox-color-mode=dark] .btn-outline-cyan:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan.disabled{color:#6edff6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo{color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-outline-indigo:hover{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo:focus{box-shadow:0 0 0 .25rem #a370f780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo:active,html[data-netbox-color-mode=dark] .btn-outline-indigo.active,html[data-netbox-color-mode=dark] .btn-outline-indigo.dropdown-toggle.show{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a370f780}html[data-netbox-color-mode=dark] .btn-outline-indigo:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo.disabled{color:#a370f7;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple{color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-outline-purple:hover{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple:focus{box-shadow:0 0 0 .25rem #a98eda80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple:active,html[data-netbox-color-mode=dark] .btn-outline-purple.active,html[data-netbox-color-mode=dark] .btn-outline-purple.dropdown-toggle.show{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple:focus,html[data-netbox-color-mode=dark] .btn-outline-purple:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a98eda80}html[data-netbox-color-mode=dark] .btn-outline-purple:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple.disabled{color:#a98eda;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink{color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-outline-pink:hover{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink:focus{box-shadow:0 0 0 .25rem #e685b580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink:active,html[data-netbox-color-mode=dark] .btn-outline-pink.active,html[data-netbox-color-mode=dark] .btn-outline-pink.dropdown-toggle.show{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink:focus,html[data-netbox-color-mode=dark] .btn-outline-pink:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e685b580}html[data-netbox-color-mode=dark] .btn-outline-pink:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink.disabled{color:#e685b5;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-darker{color:#1b1f22;border-color:#1b1f22}html[data-netbox-color-mode=dark] .btn-outline-darker:hover{color:#fff;background-color:#1b1f22;border-color:#1b1f22}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-darker,html[data-netbox-color-mode=dark] .btn-outline-darker:focus{box-shadow:0 0 0 .25rem #1b1f2280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-darker,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-darker,html[data-netbox-color-mode=dark] .btn-outline-darker:active,html[data-netbox-color-mode=dark] .btn-outline-darker.active,html[data-netbox-color-mode=dark] .btn-outline-darker.dropdown-toggle.show{color:#fff;background-color:#1b1f22;border-color:#1b1f22}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-darker:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-darker:focus,html[data-netbox-color-mode=dark] .btn-outline-darker:active:focus,html[data-netbox-color-mode=dark] .btn-outline-darker.active:focus,html[data-netbox-color-mode=dark] .btn-outline-darker.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #1b1f2280}html[data-netbox-color-mode=dark] .btn-outline-darker:disabled,html[data-netbox-color-mode=dark] .btn-outline-darker.disabled{color:#1b1f22;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-darkest{color:#171b1d;border-color:#171b1d}html[data-netbox-color-mode=dark] .btn-outline-darkest:hover{color:#fff;background-color:#171b1d;border-color:#171b1d}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-darkest,html[data-netbox-color-mode=dark] .btn-outline-darkest:focus{box-shadow:0 0 0 .25rem #171b1d80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-darkest,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-darkest,html[data-netbox-color-mode=dark] .btn-outline-darkest:active,html[data-netbox-color-mode=dark] .btn-outline-darkest.active,html[data-netbox-color-mode=dark] .btn-outline-darkest.dropdown-toggle.show{color:#fff;background-color:#171b1d;border-color:#171b1d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-darkest:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-darkest:focus,html[data-netbox-color-mode=dark] .btn-outline-darkest:active:focus,html[data-netbox-color-mode=dark] .btn-outline-darkest.active:focus,html[data-netbox-color-mode=dark] .btn-outline-darkest.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #171b1d80}html[data-netbox-color-mode=dark] .btn-outline-darkest:disabled,html[data-netbox-color-mode=dark] .btn-outline-darkest.disabled{color:#171b1d;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray{color:#ced4da;border-color:#ced4da}html[data-netbox-color-mode=dark] .btn-outline-gray:hover{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray:focus{box-shadow:0 0 0 .25rem #ced4da80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray:active,html[data-netbox-color-mode=dark] .btn-outline-gray.active,html[data-netbox-color-mode=dark] .btn-outline-gray.dropdown-toggle.show{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray:focus,html[data-netbox-color-mode=dark] .btn-outline-gray:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ced4da80}html[data-netbox-color-mode=dark] .btn-outline-gray:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray.disabled{color:#ced4da;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-100{color:#f8f9fa;border-color:#f8f9fa}html[data-netbox-color-mode=dark] .btn-outline-gray-100:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-100,html[data-netbox-color-mode=dark] .btn-outline-gray-100:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-100,html[data-netbox-color-mode=dark] .btn-outline-gray-100:active,html[data-netbox-color-mode=dark] .btn-outline-gray-100.active,html[data-netbox-color-mode=dark] .btn-outline-gray-100.dropdown-toggle.show{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-100:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8f9fa80}html[data-netbox-color-mode=dark] .btn-outline-gray-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-100.disabled{color:#f8f9fa;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-200{color:#e9ecef;border-color:#e9ecef}html[data-netbox-color-mode=dark] .btn-outline-gray-200:hover{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-200,html[data-netbox-color-mode=dark] .btn-outline-gray-200:focus{box-shadow:0 0 0 .25rem #e9ecef80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-200,html[data-netbox-color-mode=dark] .btn-outline-gray-200:active,html[data-netbox-color-mode=dark] .btn-outline-gray-200.active,html[data-netbox-color-mode=dark] .btn-outline-gray-200.dropdown-toggle.show{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-200:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e9ecef80}html[data-netbox-color-mode=dark] .btn-outline-gray-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-200.disabled{color:#e9ecef;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-300{color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-outline-gray-300:hover{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-300,html[data-netbox-color-mode=dark] .btn-outline-gray-300:focus{box-shadow:0 0 0 .25rem #dee2e680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-300,html[data-netbox-color-mode=dark] .btn-outline-gray-300:active,html[data-netbox-color-mode=dark] .btn-outline-gray-300.active,html[data-netbox-color-mode=dark] .btn-outline-gray-300.dropdown-toggle.show{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-300:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dee2e680}html[data-netbox-color-mode=dark] .btn-outline-gray-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-300.disabled{color:#dee2e6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-400{color:#ced4da;border-color:#ced4da}html[data-netbox-color-mode=dark] .btn-outline-gray-400:hover{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-400,html[data-netbox-color-mode=dark] .btn-outline-gray-400:focus{box-shadow:0 0 0 .25rem #ced4da80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-400,html[data-netbox-color-mode=dark] .btn-outline-gray-400:active,html[data-netbox-color-mode=dark] .btn-outline-gray-400.active,html[data-netbox-color-mode=dark] .btn-outline-gray-400.dropdown-toggle.show{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-400:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ced4da80}html[data-netbox-color-mode=dark] .btn-outline-gray-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-400.disabled{color:#ced4da;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-500{color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-outline-gray-500:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-500,html[data-netbox-color-mode=dark] .btn-outline-gray-500:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-500,html[data-netbox-color-mode=dark] .btn-outline-gray-500:active,html[data-netbox-color-mode=dark] .btn-outline-gray-500.active,html[data-netbox-color-mode=dark] .btn-outline-gray-500.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-500:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}html[data-netbox-color-mode=dark] .btn-outline-gray-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-500.disabled{color:#adb5bd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-600{color:#6c757d;border-color:#6c757d}html[data-netbox-color-mode=dark] .btn-outline-gray-600:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-600,html[data-netbox-color-mode=dark] .btn-outline-gray-600:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-600,html[data-netbox-color-mode=dark] .btn-outline-gray-600:active,html[data-netbox-color-mode=dark] .btn-outline-gray-600.active,html[data-netbox-color-mode=dark] .btn-outline-gray-600.dropdown-toggle.show{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-600:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6c757d80}html[data-netbox-color-mode=dark] .btn-outline-gray-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-600.disabled{color:#6c757d;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-700{color:#495057;border-color:#495057}html[data-netbox-color-mode=dark] .btn-outline-gray-700:hover{color:#fff;background-color:#495057;border-color:#495057}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-700,html[data-netbox-color-mode=dark] .btn-outline-gray-700:focus{box-shadow:0 0 0 .25rem #49505780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-700,html[data-netbox-color-mode=dark] .btn-outline-gray-700:active,html[data-netbox-color-mode=dark] .btn-outline-gray-700.active,html[data-netbox-color-mode=dark] .btn-outline-gray-700.dropdown-toggle.show{color:#fff;background-color:#495057;border-color:#495057}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-700:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #49505780}html[data-netbox-color-mode=dark] .btn-outline-gray-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-700.disabled{color:#495057;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-800{color:#343a40;border-color:#343a40}html[data-netbox-color-mode=dark] .btn-outline-gray-800:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-800,html[data-netbox-color-mode=dark] .btn-outline-gray-800:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-800,html[data-netbox-color-mode=dark] .btn-outline-gray-800:active,html[data-netbox-color-mode=dark] .btn-outline-gray-800.active,html[data-netbox-color-mode=dark] .btn-outline-gray-800.dropdown-toggle.show{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-800:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #343a4080}html[data-netbox-color-mode=dark] .btn-outline-gray-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-800.disabled{color:#343a40;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray-900{color:#212529;border-color:#212529}html[data-netbox-color-mode=dark] .btn-outline-gray-900:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-900,html[data-netbox-color-mode=dark] .btn-outline-gray-900:focus{box-shadow:0 0 0 .25rem #21252980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-900,html[data-netbox-color-mode=dark] .btn-outline-gray-900:active,html[data-netbox-color-mode=dark] .btn-outline-gray-900.active,html[data-netbox-color-mode=dark] .btn-outline-gray-900.dropdown-toggle.show{color:#fff;background-color:#212529;border-color:#212529}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-900:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #21252980}html[data-netbox-color-mode=dark] .btn-outline-gray-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-900.disabled{color:#212529;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-100{color:#f8d7da;border-color:#f8d7da}html[data-netbox-color-mode=dark] .btn-outline-red-100:hover{color:#000;background-color:#f8d7da;border-color:#f8d7da}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-100,html[data-netbox-color-mode=dark] .btn-outline-red-100:focus{box-shadow:0 0 0 .25rem #f8d7da80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-100,html[data-netbox-color-mode=dark] .btn-outline-red-100:active,html[data-netbox-color-mode=dark] .btn-outline-red-100.active,html[data-netbox-color-mode=dark] .btn-outline-red-100.dropdown-toggle.show{color:#000;background-color:#f8d7da;border-color:#f8d7da}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-100:focus,html[data-netbox-color-mode=dark] .btn-outline-red-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8d7da80}html[data-netbox-color-mode=dark] .btn-outline-red-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-100.disabled{color:#f8d7da;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-200{color:#f1aeb5;border-color:#f1aeb5}html[data-netbox-color-mode=dark] .btn-outline-red-200:hover{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-200,html[data-netbox-color-mode=dark] .btn-outline-red-200:focus{box-shadow:0 0 0 .25rem #f1aeb580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-200,html[data-netbox-color-mode=dark] .btn-outline-red-200:active,html[data-netbox-color-mode=dark] .btn-outline-red-200.active,html[data-netbox-color-mode=dark] .btn-outline-red-200.dropdown-toggle.show{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-200:focus,html[data-netbox-color-mode=dark] .btn-outline-red-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f1aeb580}html[data-netbox-color-mode=dark] .btn-outline-red-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-200.disabled{color:#f1aeb5;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-300{color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-outline-red-300:hover{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-300,html[data-netbox-color-mode=dark] .btn-outline-red-300:focus{box-shadow:0 0 0 .25rem #ea868f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-300,html[data-netbox-color-mode=dark] .btn-outline-red-300:active,html[data-netbox-color-mode=dark] .btn-outline-red-300.active,html[data-netbox-color-mode=dark] .btn-outline-red-300.dropdown-toggle.show{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-300:focus,html[data-netbox-color-mode=dark] .btn-outline-red-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ea868f80}html[data-netbox-color-mode=dark] .btn-outline-red-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-300.disabled{color:#ea868f;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-400{color:#e35d6a;border-color:#e35d6a}html[data-netbox-color-mode=dark] .btn-outline-red-400:hover{color:#000;background-color:#e35d6a;border-color:#e35d6a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-400,html[data-netbox-color-mode=dark] .btn-outline-red-400:focus{box-shadow:0 0 0 .25rem #e35d6a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-400,html[data-netbox-color-mode=dark] .btn-outline-red-400:active,html[data-netbox-color-mode=dark] .btn-outline-red-400.active,html[data-netbox-color-mode=dark] .btn-outline-red-400.dropdown-toggle.show{color:#000;background-color:#e35d6a;border-color:#e35d6a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-400:focus,html[data-netbox-color-mode=dark] .btn-outline-red-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e35d6a80}html[data-netbox-color-mode=dark] .btn-outline-red-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-400.disabled{color:#e35d6a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-500{color:#dc3545;border-color:#dc3545}html[data-netbox-color-mode=dark] .btn-outline-red-500:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-500,html[data-netbox-color-mode=dark] .btn-outline-red-500:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-500,html[data-netbox-color-mode=dark] .btn-outline-red-500:active,html[data-netbox-color-mode=dark] .btn-outline-red-500.active,html[data-netbox-color-mode=dark] .btn-outline-red-500.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-500:focus,html[data-netbox-color-mode=dark] .btn-outline-red-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}html[data-netbox-color-mode=dark] .btn-outline-red-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-500.disabled{color:#dc3545;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-600{color:#b02a37;border-color:#b02a37}html[data-netbox-color-mode=dark] .btn-outline-red-600:hover{color:#fff;background-color:#b02a37;border-color:#b02a37}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-600,html[data-netbox-color-mode=dark] .btn-outline-red-600:focus{box-shadow:0 0 0 .25rem #b02a3780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-600,html[data-netbox-color-mode=dark] .btn-outline-red-600:active,html[data-netbox-color-mode=dark] .btn-outline-red-600.active,html[data-netbox-color-mode=dark] .btn-outline-red-600.dropdown-toggle.show{color:#fff;background-color:#b02a37;border-color:#b02a37}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-600:focus,html[data-netbox-color-mode=dark] .btn-outline-red-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #b02a3780}html[data-netbox-color-mode=dark] .btn-outline-red-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-600.disabled{color:#b02a37;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-700{color:#842029;border-color:#842029}html[data-netbox-color-mode=dark] .btn-outline-red-700:hover{color:#fff;background-color:#842029;border-color:#842029}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-700,html[data-netbox-color-mode=dark] .btn-outline-red-700:focus{box-shadow:0 0 0 .25rem #84202980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-700,html[data-netbox-color-mode=dark] .btn-outline-red-700:active,html[data-netbox-color-mode=dark] .btn-outline-red-700.active,html[data-netbox-color-mode=dark] .btn-outline-red-700.dropdown-toggle.show{color:#fff;background-color:#842029;border-color:#842029}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-700:focus,html[data-netbox-color-mode=dark] .btn-outline-red-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #84202980}html[data-netbox-color-mode=dark] .btn-outline-red-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-700.disabled{color:#842029;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-800{color:#58151c;border-color:#58151c}html[data-netbox-color-mode=dark] .btn-outline-red-800:hover{color:#fff;background-color:#58151c;border-color:#58151c}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-800,html[data-netbox-color-mode=dark] .btn-outline-red-800:focus{box-shadow:0 0 0 .25rem #58151c80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-800,html[data-netbox-color-mode=dark] .btn-outline-red-800:active,html[data-netbox-color-mode=dark] .btn-outline-red-800.active,html[data-netbox-color-mode=dark] .btn-outline-red-800.dropdown-toggle.show{color:#fff;background-color:#58151c;border-color:#58151c}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-800:focus,html[data-netbox-color-mode=dark] .btn-outline-red-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #58151c80}html[data-netbox-color-mode=dark] .btn-outline-red-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-800.disabled{color:#58151c;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red-900{color:#2c0b0e;border-color:#2c0b0e}html[data-netbox-color-mode=dark] .btn-outline-red-900:hover{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-900,html[data-netbox-color-mode=dark] .btn-outline-red-900:focus{box-shadow:0 0 0 .25rem #2c0b0e80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-900,html[data-netbox-color-mode=dark] .btn-outline-red-900:active,html[data-netbox-color-mode=dark] .btn-outline-red-900.active,html[data-netbox-color-mode=dark] .btn-outline-red-900.dropdown-toggle.show{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-900:focus,html[data-netbox-color-mode=dark] .btn-outline-red-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2c0b0e80}html[data-netbox-color-mode=dark] .btn-outline-red-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-900.disabled{color:#2c0b0e;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-100{color:#fff3cd;border-color:#fff3cd}html[data-netbox-color-mode=dark] .btn-outline-yellow-100:hover{color:#000;background-color:#fff3cd;border-color:#fff3cd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-100,html[data-netbox-color-mode=dark] .btn-outline-yellow-100:focus{box-shadow:0 0 0 .25rem #fff3cd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-100,html[data-netbox-color-mode=dark] .btn-outline-yellow-100:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.dropdown-toggle.show{color:#000;background-color:#fff3cd;border-color:#fff3cd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-100:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #fff3cd80}html[data-netbox-color-mode=dark] .btn-outline-yellow-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.disabled{color:#fff3cd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-200{color:#ffe69c;border-color:#ffe69c}html[data-netbox-color-mode=dark] .btn-outline-yellow-200:hover{color:#000;background-color:#ffe69c;border-color:#ffe69c}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-200,html[data-netbox-color-mode=dark] .btn-outline-yellow-200:focus{box-shadow:0 0 0 .25rem #ffe69c80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-200,html[data-netbox-color-mode=dark] .btn-outline-yellow-200:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.dropdown-toggle.show{color:#000;background-color:#ffe69c;border-color:#ffe69c}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-200:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffe69c80}html[data-netbox-color-mode=dark] .btn-outline-yellow-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.disabled{color:#ffe69c;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-300{color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-outline-yellow-300:hover{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-300,html[data-netbox-color-mode=dark] .btn-outline-yellow-300:focus{box-shadow:0 0 0 .25rem #ffda6a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-300,html[data-netbox-color-mode=dark] .btn-outline-yellow-300:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.dropdown-toggle.show{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-300:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffda6a80}html[data-netbox-color-mode=dark] .btn-outline-yellow-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.disabled{color:#ffda6a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-400{color:#ffcd39;border-color:#ffcd39}html[data-netbox-color-mode=dark] .btn-outline-yellow-400:hover{color:#000;background-color:#ffcd39;border-color:#ffcd39}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-400,html[data-netbox-color-mode=dark] .btn-outline-yellow-400:focus{box-shadow:0 0 0 .25rem #ffcd3980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-400,html[data-netbox-color-mode=dark] .btn-outline-yellow-400:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.dropdown-toggle.show{color:#000;background-color:#ffcd39;border-color:#ffcd39}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-400:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffcd3980}html[data-netbox-color-mode=dark] .btn-outline-yellow-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.disabled{color:#ffcd39;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-500{color:#ffc107;border-color:#ffc107}html[data-netbox-color-mode=dark] .btn-outline-yellow-500:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-500,html[data-netbox-color-mode=dark] .btn-outline-yellow-500:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-500,html[data-netbox-color-mode=dark] .btn-outline-yellow-500:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-500:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}html[data-netbox-color-mode=dark] .btn-outline-yellow-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.disabled{color:#ffc107;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-600{color:#cc9a06;border-color:#cc9a06}html[data-netbox-color-mode=dark] .btn-outline-yellow-600:hover{color:#000;background-color:#cc9a06;border-color:#cc9a06}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-600,html[data-netbox-color-mode=dark] .btn-outline-yellow-600:focus{box-shadow:0 0 0 .25rem #cc9a0680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-600,html[data-netbox-color-mode=dark] .btn-outline-yellow-600:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.dropdown-toggle.show{color:#000;background-color:#cc9a06;border-color:#cc9a06}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-600:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cc9a0680}html[data-netbox-color-mode=dark] .btn-outline-yellow-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.disabled{color:#cc9a06;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-700{color:#997404;border-color:#997404}html[data-netbox-color-mode=dark] .btn-outline-yellow-700:hover{color:#000;background-color:#997404;border-color:#997404}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-700,html[data-netbox-color-mode=dark] .btn-outline-yellow-700:focus{box-shadow:0 0 0 .25rem #99740480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-700,html[data-netbox-color-mode=dark] .btn-outline-yellow-700:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.dropdown-toggle.show{color:#000;background-color:#997404;border-color:#997404}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-700:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #99740480}html[data-netbox-color-mode=dark] .btn-outline-yellow-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.disabled{color:#997404;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-800{color:#664d03;border-color:#664d03}html[data-netbox-color-mode=dark] .btn-outline-yellow-800:hover{color:#fff;background-color:#664d03;border-color:#664d03}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-800,html[data-netbox-color-mode=dark] .btn-outline-yellow-800:focus{box-shadow:0 0 0 .25rem #664d0380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-800,html[data-netbox-color-mode=dark] .btn-outline-yellow-800:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.dropdown-toggle.show{color:#fff;background-color:#664d03;border-color:#664d03}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-800:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #664d0380}html[data-netbox-color-mode=dark] .btn-outline-yellow-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.disabled{color:#664d03;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow-900{color:#332701;border-color:#332701}html[data-netbox-color-mode=dark] .btn-outline-yellow-900:hover{color:#fff;background-color:#332701;border-color:#332701}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-900,html[data-netbox-color-mode=dark] .btn-outline-yellow-900:focus{box-shadow:0 0 0 .25rem #33270180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-900,html[data-netbox-color-mode=dark] .btn-outline-yellow-900:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.dropdown-toggle.show{color:#fff;background-color:#332701;border-color:#332701}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-900:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #33270180}html[data-netbox-color-mode=dark] .btn-outline-yellow-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.disabled{color:#332701;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-100{color:#d1e7dd;border-color:#d1e7dd}html[data-netbox-color-mode=dark] .btn-outline-green-100:hover{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-100,html[data-netbox-color-mode=dark] .btn-outline-green-100:focus{box-shadow:0 0 0 .25rem #d1e7dd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-100,html[data-netbox-color-mode=dark] .btn-outline-green-100:active,html[data-netbox-color-mode=dark] .btn-outline-green-100.active,html[data-netbox-color-mode=dark] .btn-outline-green-100.dropdown-toggle.show{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-100:focus,html[data-netbox-color-mode=dark] .btn-outline-green-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d1e7dd80}html[data-netbox-color-mode=dark] .btn-outline-green-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-100.disabled{color:#d1e7dd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-200{color:#a3cfbb;border-color:#a3cfbb}html[data-netbox-color-mode=dark] .btn-outline-green-200:hover{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-200,html[data-netbox-color-mode=dark] .btn-outline-green-200:focus{box-shadow:0 0 0 .25rem #a3cfbb80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-200,html[data-netbox-color-mode=dark] .btn-outline-green-200:active,html[data-netbox-color-mode=dark] .btn-outline-green-200.active,html[data-netbox-color-mode=dark] .btn-outline-green-200.dropdown-toggle.show{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-200:focus,html[data-netbox-color-mode=dark] .btn-outline-green-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a3cfbb80}html[data-netbox-color-mode=dark] .btn-outline-green-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-200.disabled{color:#a3cfbb;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-300{color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-outline-green-300:hover{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-300,html[data-netbox-color-mode=dark] .btn-outline-green-300:focus{box-shadow:0 0 0 .25rem #75b79880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-300,html[data-netbox-color-mode=dark] .btn-outline-green-300:active,html[data-netbox-color-mode=dark] .btn-outline-green-300.active,html[data-netbox-color-mode=dark] .btn-outline-green-300.dropdown-toggle.show{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-300:focus,html[data-netbox-color-mode=dark] .btn-outline-green-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #75b79880}html[data-netbox-color-mode=dark] .btn-outline-green-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-300.disabled{color:#75b798;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-400{color:#479f76;border-color:#479f76}html[data-netbox-color-mode=dark] .btn-outline-green-400:hover{color:#000;background-color:#479f76;border-color:#479f76}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-400,html[data-netbox-color-mode=dark] .btn-outline-green-400:focus{box-shadow:0 0 0 .25rem #479f7680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-400,html[data-netbox-color-mode=dark] .btn-outline-green-400:active,html[data-netbox-color-mode=dark] .btn-outline-green-400.active,html[data-netbox-color-mode=dark] .btn-outline-green-400.dropdown-toggle.show{color:#000;background-color:#479f76;border-color:#479f76}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-400:focus,html[data-netbox-color-mode=dark] .btn-outline-green-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #479f7680}html[data-netbox-color-mode=dark] .btn-outline-green-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-400.disabled{color:#479f76;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-500{color:#198754;border-color:#198754}html[data-netbox-color-mode=dark] .btn-outline-green-500:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-500,html[data-netbox-color-mode=dark] .btn-outline-green-500:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-500,html[data-netbox-color-mode=dark] .btn-outline-green-500:active,html[data-netbox-color-mode=dark] .btn-outline-green-500.active,html[data-netbox-color-mode=dark] .btn-outline-green-500.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-500:focus,html[data-netbox-color-mode=dark] .btn-outline-green-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}html[data-netbox-color-mode=dark] .btn-outline-green-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-500.disabled{color:#198754;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-600{color:#146c43;border-color:#146c43}html[data-netbox-color-mode=dark] .btn-outline-green-600:hover{color:#fff;background-color:#146c43;border-color:#146c43}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-600,html[data-netbox-color-mode=dark] .btn-outline-green-600:focus{box-shadow:0 0 0 .25rem #146c4380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-600,html[data-netbox-color-mode=dark] .btn-outline-green-600:active,html[data-netbox-color-mode=dark] .btn-outline-green-600.active,html[data-netbox-color-mode=dark] .btn-outline-green-600.dropdown-toggle.show{color:#fff;background-color:#146c43;border-color:#146c43}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-600:focus,html[data-netbox-color-mode=dark] .btn-outline-green-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #146c4380}html[data-netbox-color-mode=dark] .btn-outline-green-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-600.disabled{color:#146c43;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-700{color:#0f5132;border-color:#0f5132}html[data-netbox-color-mode=dark] .btn-outline-green-700:hover{color:#fff;background-color:#0f5132;border-color:#0f5132}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-700,html[data-netbox-color-mode=dark] .btn-outline-green-700:focus{box-shadow:0 0 0 .25rem #0f513280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-700,html[data-netbox-color-mode=dark] .btn-outline-green-700:active,html[data-netbox-color-mode=dark] .btn-outline-green-700.active,html[data-netbox-color-mode=dark] .btn-outline-green-700.dropdown-toggle.show{color:#fff;background-color:#0f5132;border-color:#0f5132}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-700:focus,html[data-netbox-color-mode=dark] .btn-outline-green-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0f513280}html[data-netbox-color-mode=dark] .btn-outline-green-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-700.disabled{color:#0f5132;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-800{color:#0a3622;border-color:#0a3622}html[data-netbox-color-mode=dark] .btn-outline-green-800:hover{color:#fff;background-color:#0a3622;border-color:#0a3622}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-800,html[data-netbox-color-mode=dark] .btn-outline-green-800:focus{box-shadow:0 0 0 .25rem #0a362280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-800,html[data-netbox-color-mode=dark] .btn-outline-green-800:active,html[data-netbox-color-mode=dark] .btn-outline-green-800.active,html[data-netbox-color-mode=dark] .btn-outline-green-800.dropdown-toggle.show{color:#fff;background-color:#0a3622;border-color:#0a3622}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-800:focus,html[data-netbox-color-mode=dark] .btn-outline-green-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0a362280}html[data-netbox-color-mode=dark] .btn-outline-green-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-800.disabled{color:#0a3622;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green-900{color:#051b11;border-color:#051b11}html[data-netbox-color-mode=dark] .btn-outline-green-900:hover{color:#fff;background-color:#051b11;border-color:#051b11}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-900,html[data-netbox-color-mode=dark] .btn-outline-green-900:focus{box-shadow:0 0 0 .25rem #051b1180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-900,html[data-netbox-color-mode=dark] .btn-outline-green-900:active,html[data-netbox-color-mode=dark] .btn-outline-green-900.active,html[data-netbox-color-mode=dark] .btn-outline-green-900.dropdown-toggle.show{color:#fff;background-color:#051b11;border-color:#051b11}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-900:focus,html[data-netbox-color-mode=dark] .btn-outline-green-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #051b1180}html[data-netbox-color-mode=dark] .btn-outline-green-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-900.disabled{color:#051b11;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-100{color:#cfe2ff;border-color:#cfe2ff}html[data-netbox-color-mode=dark] .btn-outline-blue-100:hover{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-100,html[data-netbox-color-mode=dark] .btn-outline-blue-100:focus{box-shadow:0 0 0 .25rem #cfe2ff80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-100,html[data-netbox-color-mode=dark] .btn-outline-blue-100:active,html[data-netbox-color-mode=dark] .btn-outline-blue-100.active,html[data-netbox-color-mode=dark] .btn-outline-blue-100.dropdown-toggle.show{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-100:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cfe2ff80}html[data-netbox-color-mode=dark] .btn-outline-blue-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-100.disabled{color:#cfe2ff;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-200{color:#9ec5fe;border-color:#9ec5fe}html[data-netbox-color-mode=dark] .btn-outline-blue-200:hover{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-200,html[data-netbox-color-mode=dark] .btn-outline-blue-200:focus{box-shadow:0 0 0 .25rem #9ec5fe80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-200,html[data-netbox-color-mode=dark] .btn-outline-blue-200:active,html[data-netbox-color-mode=dark] .btn-outline-blue-200.active,html[data-netbox-color-mode=dark] .btn-outline-blue-200.dropdown-toggle.show{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-200:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #9ec5fe80}html[data-netbox-color-mode=dark] .btn-outline-blue-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-200.disabled{color:#9ec5fe;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-300{color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-outline-blue-300:hover{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-300,html[data-netbox-color-mode=dark] .btn-outline-blue-300:focus{box-shadow:0 0 0 .25rem #6ea8fe80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-300,html[data-netbox-color-mode=dark] .btn-outline-blue-300:active,html[data-netbox-color-mode=dark] .btn-outline-blue-300.active,html[data-netbox-color-mode=dark] .btn-outline-blue-300.dropdown-toggle.show{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-300:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6ea8fe80}html[data-netbox-color-mode=dark] .btn-outline-blue-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-300.disabled{color:#6ea8fe;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-400{color:#3d8bfd;border-color:#3d8bfd}html[data-netbox-color-mode=dark] .btn-outline-blue-400:hover{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-400,html[data-netbox-color-mode=dark] .btn-outline-blue-400:focus{box-shadow:0 0 0 .25rem #3d8bfd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-400,html[data-netbox-color-mode=dark] .btn-outline-blue-400:active,html[data-netbox-color-mode=dark] .btn-outline-blue-400.active,html[data-netbox-color-mode=dark] .btn-outline-blue-400.dropdown-toggle.show{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-400:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3d8bfd80}html[data-netbox-color-mode=dark] .btn-outline-blue-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-400.disabled{color:#3d8bfd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-500{color:#0d6efd;border-color:#0d6efd}html[data-netbox-color-mode=dark] .btn-outline-blue-500:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-500,html[data-netbox-color-mode=dark] .btn-outline-blue-500:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-500,html[data-netbox-color-mode=dark] .btn-outline-blue-500:active,html[data-netbox-color-mode=dark] .btn-outline-blue-500.active,html[data-netbox-color-mode=dark] .btn-outline-blue-500.dropdown-toggle.show{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-500:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0d6efd80}html[data-netbox-color-mode=dark] .btn-outline-blue-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-500.disabled{color:#0d6efd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-600{color:#0a58ca;border-color:#0a58ca}html[data-netbox-color-mode=dark] .btn-outline-blue-600:hover{color:#fff;background-color:#0a58ca;border-color:#0a58ca}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-600,html[data-netbox-color-mode=dark] .btn-outline-blue-600:focus{box-shadow:0 0 0 .25rem #0a58ca80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-600,html[data-netbox-color-mode=dark] .btn-outline-blue-600:active,html[data-netbox-color-mode=dark] .btn-outline-blue-600.active,html[data-netbox-color-mode=dark] .btn-outline-blue-600.dropdown-toggle.show{color:#fff;background-color:#0a58ca;border-color:#0a58ca}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-600:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0a58ca80}html[data-netbox-color-mode=dark] .btn-outline-blue-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-600.disabled{color:#0a58ca;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-700{color:#084298;border-color:#084298}html[data-netbox-color-mode=dark] .btn-outline-blue-700:hover{color:#fff;background-color:#084298;border-color:#084298}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-700,html[data-netbox-color-mode=dark] .btn-outline-blue-700:focus{box-shadow:0 0 0 .25rem #08429880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-700,html[data-netbox-color-mode=dark] .btn-outline-blue-700:active,html[data-netbox-color-mode=dark] .btn-outline-blue-700.active,html[data-netbox-color-mode=dark] .btn-outline-blue-700.dropdown-toggle.show{color:#fff;background-color:#084298;border-color:#084298}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-700:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #08429880}html[data-netbox-color-mode=dark] .btn-outline-blue-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-700.disabled{color:#084298;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-800{color:#052c65;border-color:#052c65}html[data-netbox-color-mode=dark] .btn-outline-blue-800:hover{color:#fff;background-color:#052c65;border-color:#052c65}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-800,html[data-netbox-color-mode=dark] .btn-outline-blue-800:focus{box-shadow:0 0 0 .25rem #052c6580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-800,html[data-netbox-color-mode=dark] .btn-outline-blue-800:active,html[data-netbox-color-mode=dark] .btn-outline-blue-800.active,html[data-netbox-color-mode=dark] .btn-outline-blue-800.dropdown-toggle.show{color:#fff;background-color:#052c65;border-color:#052c65}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-800:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #052c6580}html[data-netbox-color-mode=dark] .btn-outline-blue-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-800.disabled{color:#052c65;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue-900{color:#031633;border-color:#031633}html[data-netbox-color-mode=dark] .btn-outline-blue-900:hover{color:#fff;background-color:#031633;border-color:#031633}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-900,html[data-netbox-color-mode=dark] .btn-outline-blue-900:focus{box-shadow:0 0 0 .25rem #03163380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-900,html[data-netbox-color-mode=dark] .btn-outline-blue-900:active,html[data-netbox-color-mode=dark] .btn-outline-blue-900.active,html[data-netbox-color-mode=dark] .btn-outline-blue-900.dropdown-toggle.show{color:#fff;background-color:#031633;border-color:#031633}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-900:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #03163380}html[data-netbox-color-mode=dark] .btn-outline-blue-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-900.disabled{color:#031633;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-100{color:#cff4fc;border-color:#cff4fc}html[data-netbox-color-mode=dark] .btn-outline-cyan-100:hover{color:#000;background-color:#cff4fc;border-color:#cff4fc}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-100,html[data-netbox-color-mode=dark] .btn-outline-cyan-100:focus{box-shadow:0 0 0 .25rem #cff4fc80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-100,html[data-netbox-color-mode=dark] .btn-outline-cyan-100:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.dropdown-toggle.show{color:#000;background-color:#cff4fc;border-color:#cff4fc}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-100:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cff4fc80}html[data-netbox-color-mode=dark] .btn-outline-cyan-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.disabled{color:#cff4fc;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-200{color:#9eeaf9;border-color:#9eeaf9}html[data-netbox-color-mode=dark] .btn-outline-cyan-200:hover{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-200,html[data-netbox-color-mode=dark] .btn-outline-cyan-200:focus{box-shadow:0 0 0 .25rem #9eeaf980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-200,html[data-netbox-color-mode=dark] .btn-outline-cyan-200:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.dropdown-toggle.show{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-200:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #9eeaf980}html[data-netbox-color-mode=dark] .btn-outline-cyan-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.disabled{color:#9eeaf9;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-300{color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-outline-cyan-300:hover{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-300,html[data-netbox-color-mode=dark] .btn-outline-cyan-300:focus{box-shadow:0 0 0 .25rem #6edff680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-300,html[data-netbox-color-mode=dark] .btn-outline-cyan-300:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.dropdown-toggle.show{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-300:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6edff680}html[data-netbox-color-mode=dark] .btn-outline-cyan-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.disabled{color:#6edff6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-400{color:#3dd5f3;border-color:#3dd5f3}html[data-netbox-color-mode=dark] .btn-outline-cyan-400:hover{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-400,html[data-netbox-color-mode=dark] .btn-outline-cyan-400:focus{box-shadow:0 0 0 .25rem #3dd5f380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-400,html[data-netbox-color-mode=dark] .btn-outline-cyan-400:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.dropdown-toggle.show{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-400:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3dd5f380}html[data-netbox-color-mode=dark] .btn-outline-cyan-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.disabled{color:#3dd5f3;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-500{color:#0dcaf0;border-color:#0dcaf0}html[data-netbox-color-mode=dark] .btn-outline-cyan-500:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-500,html[data-netbox-color-mode=dark] .btn-outline-cyan-500:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-500,html[data-netbox-color-mode=dark] .btn-outline-cyan-500:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-500:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0dcaf080}html[data-netbox-color-mode=dark] .btn-outline-cyan-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.disabled{color:#0dcaf0;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-600{color:#0aa2c0;border-color:#0aa2c0}html[data-netbox-color-mode=dark] .btn-outline-cyan-600:hover{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-600,html[data-netbox-color-mode=dark] .btn-outline-cyan-600:focus{box-shadow:0 0 0 .25rem #0aa2c080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-600,html[data-netbox-color-mode=dark] .btn-outline-cyan-600:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.dropdown-toggle.show{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-600:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0aa2c080}html[data-netbox-color-mode=dark] .btn-outline-cyan-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.disabled{color:#0aa2c0;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-700{color:#087990;border-color:#087990}html[data-netbox-color-mode=dark] .btn-outline-cyan-700:hover{color:#fff;background-color:#087990;border-color:#087990}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-700,html[data-netbox-color-mode=dark] .btn-outline-cyan-700:focus{box-shadow:0 0 0 .25rem #08799080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-700,html[data-netbox-color-mode=dark] .btn-outline-cyan-700:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.dropdown-toggle.show{color:#fff;background-color:#087990;border-color:#087990}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-700:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #08799080}html[data-netbox-color-mode=dark] .btn-outline-cyan-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.disabled{color:#087990;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-800{color:#055160;border-color:#055160}html[data-netbox-color-mode=dark] .btn-outline-cyan-800:hover{color:#fff;background-color:#055160;border-color:#055160}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-800,html[data-netbox-color-mode=dark] .btn-outline-cyan-800:focus{box-shadow:0 0 0 .25rem #05516080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-800,html[data-netbox-color-mode=dark] .btn-outline-cyan-800:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.dropdown-toggle.show{color:#fff;background-color:#055160;border-color:#055160}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-800:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #05516080}html[data-netbox-color-mode=dark] .btn-outline-cyan-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.disabled{color:#055160;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan-900{color:#032830;border-color:#032830}html[data-netbox-color-mode=dark] .btn-outline-cyan-900:hover{color:#fff;background-color:#032830;border-color:#032830}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-900,html[data-netbox-color-mode=dark] .btn-outline-cyan-900:focus{box-shadow:0 0 0 .25rem #03283080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-900,html[data-netbox-color-mode=dark] .btn-outline-cyan-900:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.dropdown-toggle.show{color:#fff;background-color:#032830;border-color:#032830}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-900:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #03283080}html[data-netbox-color-mode=dark] .btn-outline-cyan-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.disabled{color:#032830;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-100{color:#e0cffc;border-color:#e0cffc}html[data-netbox-color-mode=dark] .btn-outline-indigo-100:hover{color:#000;background-color:#e0cffc;border-color:#e0cffc}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-100,html[data-netbox-color-mode=dark] .btn-outline-indigo-100:focus{box-shadow:0 0 0 .25rem #e0cffc80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-100,html[data-netbox-color-mode=dark] .btn-outline-indigo-100:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.dropdown-toggle.show{color:#000;background-color:#e0cffc;border-color:#e0cffc}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-100:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e0cffc80}html[data-netbox-color-mode=dark] .btn-outline-indigo-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.disabled{color:#e0cffc;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-200{color:#c29ffa;border-color:#c29ffa}html[data-netbox-color-mode=dark] .btn-outline-indigo-200:hover{color:#000;background-color:#c29ffa;border-color:#c29ffa}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-200,html[data-netbox-color-mode=dark] .btn-outline-indigo-200:focus{box-shadow:0 0 0 .25rem #c29ffa80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-200,html[data-netbox-color-mode=dark] .btn-outline-indigo-200:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.dropdown-toggle.show{color:#000;background-color:#c29ffa;border-color:#c29ffa}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-200:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #c29ffa80}html[data-netbox-color-mode=dark] .btn-outline-indigo-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.disabled{color:#c29ffa;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-300{color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-outline-indigo-300:hover{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-300,html[data-netbox-color-mode=dark] .btn-outline-indigo-300:focus{box-shadow:0 0 0 .25rem #a370f780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-300,html[data-netbox-color-mode=dark] .btn-outline-indigo-300:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.dropdown-toggle.show{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-300:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a370f780}html[data-netbox-color-mode=dark] .btn-outline-indigo-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.disabled{color:#a370f7;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-400{color:#8540f5;border-color:#8540f5}html[data-netbox-color-mode=dark] .btn-outline-indigo-400:hover{color:#fff;background-color:#8540f5;border-color:#8540f5}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-400,html[data-netbox-color-mode=dark] .btn-outline-indigo-400:focus{box-shadow:0 0 0 .25rem #8540f580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-400,html[data-netbox-color-mode=dark] .btn-outline-indigo-400:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.dropdown-toggle.show{color:#fff;background-color:#8540f5;border-color:#8540f5}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-400:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #8540f580}html[data-netbox-color-mode=dark] .btn-outline-indigo-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.disabled{color:#8540f5;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-500{color:#6610f2;border-color:#6610f2}html[data-netbox-color-mode=dark] .btn-outline-indigo-500:hover{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-500,html[data-netbox-color-mode=dark] .btn-outline-indigo-500:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-500,html[data-netbox-color-mode=dark] .btn-outline-indigo-500:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.dropdown-toggle.show{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-500:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6610f280}html[data-netbox-color-mode=dark] .btn-outline-indigo-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.disabled{color:#6610f2;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-600{color:#520dc2;border-color:#520dc2}html[data-netbox-color-mode=dark] .btn-outline-indigo-600:hover{color:#fff;background-color:#520dc2;border-color:#520dc2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-600,html[data-netbox-color-mode=dark] .btn-outline-indigo-600:focus{box-shadow:0 0 0 .25rem #520dc280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-600,html[data-netbox-color-mode=dark] .btn-outline-indigo-600:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.dropdown-toggle.show{color:#fff;background-color:#520dc2;border-color:#520dc2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-600:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #520dc280}html[data-netbox-color-mode=dark] .btn-outline-indigo-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.disabled{color:#520dc2;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-700{color:#3d0a91;border-color:#3d0a91}html[data-netbox-color-mode=dark] .btn-outline-indigo-700:hover{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-700,html[data-netbox-color-mode=dark] .btn-outline-indigo-700:focus{box-shadow:0 0 0 .25rem #3d0a9180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-700,html[data-netbox-color-mode=dark] .btn-outline-indigo-700:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.dropdown-toggle.show{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-700:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3d0a9180}html[data-netbox-color-mode=dark] .btn-outline-indigo-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.disabled{color:#3d0a91;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-800{color:#290661;border-color:#290661}html[data-netbox-color-mode=dark] .btn-outline-indigo-800:hover{color:#fff;background-color:#290661;border-color:#290661}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-800,html[data-netbox-color-mode=dark] .btn-outline-indigo-800:focus{box-shadow:0 0 0 .25rem #29066180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-800,html[data-netbox-color-mode=dark] .btn-outline-indigo-800:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.dropdown-toggle.show{color:#fff;background-color:#290661;border-color:#290661}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-800:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #29066180}html[data-netbox-color-mode=dark] .btn-outline-indigo-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.disabled{color:#290661;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo-900{color:#140330;border-color:#140330}html[data-netbox-color-mode=dark] .btn-outline-indigo-900:hover{color:#fff;background-color:#140330;border-color:#140330}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-900,html[data-netbox-color-mode=dark] .btn-outline-indigo-900:focus{box-shadow:0 0 0 .25rem #14033080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-900,html[data-netbox-color-mode=dark] .btn-outline-indigo-900:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.dropdown-toggle.show{color:#fff;background-color:#140330;border-color:#140330}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-900:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #14033080}html[data-netbox-color-mode=dark] .btn-outline-indigo-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.disabled{color:#140330;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-100{color:#e2d9f3;border-color:#e2d9f3}html[data-netbox-color-mode=dark] .btn-outline-purple-100:hover{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-100,html[data-netbox-color-mode=dark] .btn-outline-purple-100:focus{box-shadow:0 0 0 .25rem #e2d9f380}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-100,html[data-netbox-color-mode=dark] .btn-outline-purple-100:active,html[data-netbox-color-mode=dark] .btn-outline-purple-100.active,html[data-netbox-color-mode=dark] .btn-outline-purple-100.dropdown-toggle.show{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-100:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e2d9f380}html[data-netbox-color-mode=dark] .btn-outline-purple-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-100.disabled{color:#e2d9f3;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-200{color:#c5b3e6;border-color:#c5b3e6}html[data-netbox-color-mode=dark] .btn-outline-purple-200:hover{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-200,html[data-netbox-color-mode=dark] .btn-outline-purple-200:focus{box-shadow:0 0 0 .25rem #c5b3e680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-200,html[data-netbox-color-mode=dark] .btn-outline-purple-200:active,html[data-netbox-color-mode=dark] .btn-outline-purple-200.active,html[data-netbox-color-mode=dark] .btn-outline-purple-200.dropdown-toggle.show{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-200:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #c5b3e680}html[data-netbox-color-mode=dark] .btn-outline-purple-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-200.disabled{color:#c5b3e6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-300{color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-outline-purple-300:hover{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-300,html[data-netbox-color-mode=dark] .btn-outline-purple-300:focus{box-shadow:0 0 0 .25rem #a98eda80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-300,html[data-netbox-color-mode=dark] .btn-outline-purple-300:active,html[data-netbox-color-mode=dark] .btn-outline-purple-300.active,html[data-netbox-color-mode=dark] .btn-outline-purple-300.dropdown-toggle.show{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-300:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a98eda80}html[data-netbox-color-mode=dark] .btn-outline-purple-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-300.disabled{color:#a98eda;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-400{color:#8c68cd;border-color:#8c68cd}html[data-netbox-color-mode=dark] .btn-outline-purple-400:hover{color:#000;background-color:#8c68cd;border-color:#8c68cd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-400,html[data-netbox-color-mode=dark] .btn-outline-purple-400:focus{box-shadow:0 0 0 .25rem #8c68cd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-400,html[data-netbox-color-mode=dark] .btn-outline-purple-400:active,html[data-netbox-color-mode=dark] .btn-outline-purple-400.active,html[data-netbox-color-mode=dark] .btn-outline-purple-400.dropdown-toggle.show{color:#000;background-color:#8c68cd;border-color:#8c68cd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-400:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #8c68cd80}html[data-netbox-color-mode=dark] .btn-outline-purple-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-400.disabled{color:#8c68cd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-500{color:#6f42c1;border-color:#6f42c1}html[data-netbox-color-mode=dark] .btn-outline-purple-500:hover{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-500,html[data-netbox-color-mode=dark] .btn-outline-purple-500:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-500,html[data-netbox-color-mode=dark] .btn-outline-purple-500:active,html[data-netbox-color-mode=dark] .btn-outline-purple-500.active,html[data-netbox-color-mode=dark] .btn-outline-purple-500.dropdown-toggle.show{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-500:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6f42c180}html[data-netbox-color-mode=dark] .btn-outline-purple-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-500.disabled{color:#6f42c1;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-600{color:#59359a;border-color:#59359a}html[data-netbox-color-mode=dark] .btn-outline-purple-600:hover{color:#fff;background-color:#59359a;border-color:#59359a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-600,html[data-netbox-color-mode=dark] .btn-outline-purple-600:focus{box-shadow:0 0 0 .25rem #59359a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-600,html[data-netbox-color-mode=dark] .btn-outline-purple-600:active,html[data-netbox-color-mode=dark] .btn-outline-purple-600.active,html[data-netbox-color-mode=dark] .btn-outline-purple-600.dropdown-toggle.show{color:#fff;background-color:#59359a;border-color:#59359a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-600:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #59359a80}html[data-netbox-color-mode=dark] .btn-outline-purple-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-600.disabled{color:#59359a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-700{color:#432874;border-color:#432874}html[data-netbox-color-mode=dark] .btn-outline-purple-700:hover{color:#fff;background-color:#432874;border-color:#432874}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-700,html[data-netbox-color-mode=dark] .btn-outline-purple-700:focus{box-shadow:0 0 0 .25rem #43287480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-700,html[data-netbox-color-mode=dark] .btn-outline-purple-700:active,html[data-netbox-color-mode=dark] .btn-outline-purple-700.active,html[data-netbox-color-mode=dark] .btn-outline-purple-700.dropdown-toggle.show{color:#fff;background-color:#432874;border-color:#432874}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-700:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #43287480}html[data-netbox-color-mode=dark] .btn-outline-purple-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-700.disabled{color:#432874;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-800{color:#2c1a4d;border-color:#2c1a4d}html[data-netbox-color-mode=dark] .btn-outline-purple-800:hover{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-800,html[data-netbox-color-mode=dark] .btn-outline-purple-800:focus{box-shadow:0 0 0 .25rem #2c1a4d80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-800,html[data-netbox-color-mode=dark] .btn-outline-purple-800:active,html[data-netbox-color-mode=dark] .btn-outline-purple-800.active,html[data-netbox-color-mode=dark] .btn-outline-purple-800.dropdown-toggle.show{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-800:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2c1a4d80}html[data-netbox-color-mode=dark] .btn-outline-purple-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-800.disabled{color:#2c1a4d;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple-900{color:#160d27;border-color:#160d27}html[data-netbox-color-mode=dark] .btn-outline-purple-900:hover{color:#fff;background-color:#160d27;border-color:#160d27}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-900,html[data-netbox-color-mode=dark] .btn-outline-purple-900:focus{box-shadow:0 0 0 .25rem #160d2780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-900,html[data-netbox-color-mode=dark] .btn-outline-purple-900:active,html[data-netbox-color-mode=dark] .btn-outline-purple-900.active,html[data-netbox-color-mode=dark] .btn-outline-purple-900.dropdown-toggle.show{color:#fff;background-color:#160d27;border-color:#160d27}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-900:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #160d2780}html[data-netbox-color-mode=dark] .btn-outline-purple-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-900.disabled{color:#160d27;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-100{color:#f7d6e6;border-color:#f7d6e6}html[data-netbox-color-mode=dark] .btn-outline-pink-100:hover{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-100,html[data-netbox-color-mode=dark] .btn-outline-pink-100:focus{box-shadow:0 0 0 .25rem #f7d6e680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-100,html[data-netbox-color-mode=dark] .btn-outline-pink-100:active,html[data-netbox-color-mode=dark] .btn-outline-pink-100.active,html[data-netbox-color-mode=dark] .btn-outline-pink-100.dropdown-toggle.show{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-100:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f7d6e680}html[data-netbox-color-mode=dark] .btn-outline-pink-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-100.disabled{color:#f7d6e6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-200{color:#efadce;border-color:#efadce}html[data-netbox-color-mode=dark] .btn-outline-pink-200:hover{color:#000;background-color:#efadce;border-color:#efadce}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-200,html[data-netbox-color-mode=dark] .btn-outline-pink-200:focus{box-shadow:0 0 0 .25rem #efadce80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-200,html[data-netbox-color-mode=dark] .btn-outline-pink-200:active,html[data-netbox-color-mode=dark] .btn-outline-pink-200.active,html[data-netbox-color-mode=dark] .btn-outline-pink-200.dropdown-toggle.show{color:#000;background-color:#efadce;border-color:#efadce}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-200:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #efadce80}html[data-netbox-color-mode=dark] .btn-outline-pink-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-200.disabled{color:#efadce;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-300{color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-outline-pink-300:hover{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-300,html[data-netbox-color-mode=dark] .btn-outline-pink-300:focus{box-shadow:0 0 0 .25rem #e685b580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-300,html[data-netbox-color-mode=dark] .btn-outline-pink-300:active,html[data-netbox-color-mode=dark] .btn-outline-pink-300.active,html[data-netbox-color-mode=dark] .btn-outline-pink-300.dropdown-toggle.show{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-300:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e685b580}html[data-netbox-color-mode=dark] .btn-outline-pink-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-300.disabled{color:#e685b5;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-400{color:#de5c9d;border-color:#de5c9d}html[data-netbox-color-mode=dark] .btn-outline-pink-400:hover{color:#000;background-color:#de5c9d;border-color:#de5c9d}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-400,html[data-netbox-color-mode=dark] .btn-outline-pink-400:focus{box-shadow:0 0 0 .25rem #de5c9d80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-400,html[data-netbox-color-mode=dark] .btn-outline-pink-400:active,html[data-netbox-color-mode=dark] .btn-outline-pink-400.active,html[data-netbox-color-mode=dark] .btn-outline-pink-400.dropdown-toggle.show{color:#000;background-color:#de5c9d;border-color:#de5c9d}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-400:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #de5c9d80}html[data-netbox-color-mode=dark] .btn-outline-pink-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-400.disabled{color:#de5c9d;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-500{color:#d63384;border-color:#d63384}html[data-netbox-color-mode=dark] .btn-outline-pink-500:hover{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-500,html[data-netbox-color-mode=dark] .btn-outline-pink-500:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-500,html[data-netbox-color-mode=dark] .btn-outline-pink-500:active,html[data-netbox-color-mode=dark] .btn-outline-pink-500.active,html[data-netbox-color-mode=dark] .btn-outline-pink-500.dropdown-toggle.show{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-500:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d6338480}html[data-netbox-color-mode=dark] .btn-outline-pink-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-500.disabled{color:#d63384;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-600{color:#ab296a;border-color:#ab296a}html[data-netbox-color-mode=dark] .btn-outline-pink-600:hover{color:#fff;background-color:#ab296a;border-color:#ab296a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-600,html[data-netbox-color-mode=dark] .btn-outline-pink-600:focus{box-shadow:0 0 0 .25rem #ab296a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-600,html[data-netbox-color-mode=dark] .btn-outline-pink-600:active,html[data-netbox-color-mode=dark] .btn-outline-pink-600.active,html[data-netbox-color-mode=dark] .btn-outline-pink-600.dropdown-toggle.show{color:#fff;background-color:#ab296a;border-color:#ab296a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-600:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ab296a80}html[data-netbox-color-mode=dark] .btn-outline-pink-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-600.disabled{color:#ab296a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-700{color:#801f4f;border-color:#801f4f}html[data-netbox-color-mode=dark] .btn-outline-pink-700:hover{color:#fff;background-color:#801f4f;border-color:#801f4f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-700,html[data-netbox-color-mode=dark] .btn-outline-pink-700:focus{box-shadow:0 0 0 .25rem #801f4f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-700,html[data-netbox-color-mode=dark] .btn-outline-pink-700:active,html[data-netbox-color-mode=dark] .btn-outline-pink-700.active,html[data-netbox-color-mode=dark] .btn-outline-pink-700.dropdown-toggle.show{color:#fff;background-color:#801f4f;border-color:#801f4f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-700:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #801f4f80}html[data-netbox-color-mode=dark] .btn-outline-pink-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-700.disabled{color:#801f4f;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-800{color:#561435;border-color:#561435}html[data-netbox-color-mode=dark] .btn-outline-pink-800:hover{color:#fff;background-color:#561435;border-color:#561435}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-800,html[data-netbox-color-mode=dark] .btn-outline-pink-800:focus{box-shadow:0 0 0 .25rem #56143580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-800,html[data-netbox-color-mode=dark] .btn-outline-pink-800:active,html[data-netbox-color-mode=dark] .btn-outline-pink-800.active,html[data-netbox-color-mode=dark] .btn-outline-pink-800.dropdown-toggle.show{color:#fff;background-color:#561435;border-color:#561435}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-800:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #56143580}html[data-netbox-color-mode=dark] .btn-outline-pink-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-800.disabled{color:#561435;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink-900{color:#2b0a1a;border-color:#2b0a1a}html[data-netbox-color-mode=dark] .btn-outline-pink-900:hover{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-900,html[data-netbox-color-mode=dark] .btn-outline-pink-900:focus{box-shadow:0 0 0 .25rem #2b0a1a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-900,html[data-netbox-color-mode=dark] .btn-outline-pink-900:active,html[data-netbox-color-mode=dark] .btn-outline-pink-900.active,html[data-netbox-color-mode=dark] .btn-outline-pink-900.dropdown-toggle.show{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-900:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2b0a1a80}html[data-netbox-color-mode=dark] .btn-outline-pink-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-900.disabled{color:#2b0a1a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}html[data-netbox-color-mode=dark] .btn-link:hover{color:#0a58ca}html[data-netbox-color-mode=dark] .btn-link:disabled,html[data-netbox-color-mode=dark] .btn-link.disabled{color:#dee2e6}html[data-netbox-color-mode=dark] .btn-lg,html[data-netbox-color-mode=dark] .btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}html[data-netbox-color-mode=dark] .btn-sm,html[data-netbox-color-mode=dark] .btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html[data-netbox-color-mode=dark] .fade{transition:opacity .15s linear}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .fade{transition:none}}html[data-netbox-color-mode=dark] .fade:not(.show){opacity:0}html[data-netbox-color-mode=dark] .collapse:not(.show){display:none}html[data-netbox-color-mode=dark] .collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .collapsing{transition:none}}html[data-netbox-color-mode=dark] .dropup,html[data-netbox-color-mode=dark] .dropend,html[data-netbox-color-mode=dark] .dropdown,html[data-netbox-color-mode=dark] .dropstart{position:relative}html[data-netbox-color-mode=dark] .dropdown-toggle{white-space:nowrap}html[data-netbox-color-mode=dark] .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}html[data-netbox-color-mode=dark] .dropdown-toggle:empty:after{margin-left:0}html[data-netbox-color-mode=dark] .dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#fff;text-align:left;list-style:none;background-color:#212529;background-clip:padding-box;border:1px solid rgba(255,255,255,.15);border-radius:.375rem}html[data-netbox-color-mode=dark] .dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}html[data-netbox-color-mode=dark] .dropdown-menu-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width: 576px){html[data-netbox-color-mode=dark] .dropdown-menu-sm-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-sm-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .dropdown-menu-md-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-md-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .dropdown-menu-lg-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-lg-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .dropdown-menu-xl-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-xl-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .dropdown-menu-xxl-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-xxl-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}html[data-netbox-color-mode=dark] .dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}html[data-netbox-color-mode=dark] .dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}html[data-netbox-color-mode=dark] .dropup .dropdown-toggle:empty:after{margin-left:0}html[data-netbox-color-mode=dark] .dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:empty:after{margin-left:0}html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:after{vertical-align:0}html[data-netbox-color-mode=dark] .dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:after{display:none}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:empty:after{margin-left:0}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:before{vertical-align:0}html[data-netbox-color-mode=dark] .dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}html[data-netbox-color-mode=dark] .dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#f8f9fa;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}html[data-netbox-color-mode=dark] .dropdown-item:hover,html[data-netbox-color-mode=dark] .dropdown-item:focus{color:#fff;background-color:#6c757d}html[data-netbox-color-mode=dark] .dropdown-item.active,html[data-netbox-color-mode=dark] .dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}html[data-netbox-color-mode=dark] .dropdown-item.disabled,html[data-netbox-color-mode=dark] .dropdown-item:disabled{color:#343a40;pointer-events:none;background-color:transparent}html[data-netbox-color-mode=dark] .dropdown-menu.show{display:block}html[data-netbox-color-mode=dark] .dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}html[data-netbox-color-mode=dark] .dropdown-item-text{display:block;padding:.25rem 1rem;color:#f8f9fa}html[data-netbox-color-mode=dark] .dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#00000026}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item{color:#dee2e6}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:hover,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:#ffffff26}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item.active,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item.disabled,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-divider{border-color:#00000026}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item-text{color:#dee2e6}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-header{color:#adb5bd}html[data-netbox-color-mode=dark] .btn-group,html[data-netbox-color-mode=dark] .btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}html[data-netbox-color-mode=dark] .btn-group>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn{position:relative;flex:1 1 auto}html[data-netbox-color-mode=dark] .btn-group>.btn-check:checked+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn-check:focus+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn:hover,html[data-netbox-color-mode=dark] .btn-group>.btn:focus,html[data-netbox-color-mode=dark] .btn-group>.btn:active,html[data-netbox-color-mode=dark] .btn-group>.btn.active,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-check:checked+.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-check:focus+.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:hover,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:focus,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:active,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn.active{z-index:1}html[data-netbox-color-mode=dark] .btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .btn-toolbar .input-group{width:auto}html[data-netbox-color-mode=dark] .btn-group>.btn:not(:first-child),html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:first-child){margin-left:-1px}html[data-netbox-color-mode=dark] .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .btn-group>.btn:nth-child(n+3),html[data-netbox-color-mode=dark] .btn-group>:not(.btn-check)+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,.dropup html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,.dropend html[data-netbox-color-mode=dark] .dropdown-toggle-split:after{margin-left:0}.dropstart html[data-netbox-color-mode=dark] .dropdown-toggle-split:before{margin-right:0}html[data-netbox-color-mode=dark] .btn-sm+.dropdown-toggle-split,html[data-netbox-color-mode=dark] .btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}html[data-netbox-color-mode=dark] .btn-lg+.dropdown-toggle-split,html[data-netbox-color-mode=dark] .btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}html[data-netbox-color-mode=dark] .btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}html[data-netbox-color-mode=dark] .btn-group-vertical>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group{width:100%}html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:not(:first-child),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .btn-group-vertical>.btn~.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}html[data-netbox-color-mode=dark] .nav-link{display:block;padding:.5rem 1rem;color:#fff;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .nav-link{transition:none}}html[data-netbox-color-mode=dark] .nav-link.disabled{color:#343a40;pointer-events:none;cursor:default}html[data-netbox-color-mode=dark] .nav-tabs{border-bottom:1px solid #495057}html[data-netbox-color-mode=dark] .nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:.375rem;border-top-right-radius:.375rem}html[data-netbox-color-mode=dark] .nav-tabs .nav-link:hover,html[data-netbox-color-mode=dark] .nav-tabs .nav-link:focus{border-color:rgba(52,58,64,.5) rgba(52,58,64,.5) #495057;isolation:isolate}html[data-netbox-color-mode=dark] .nav-tabs .nav-link.disabled{color:#343a40;background-color:transparent;border-color:transparent}html[data-netbox-color-mode=dark] .nav-tabs .nav-link.active,html[data-netbox-color-mode=dark] .nav-tabs .nav-item.show .nav-link{color:#f8f9fa;background-color:#1b1f22;border-color:#343a40 #343a40 #1b1f22}html[data-netbox-color-mode=dark] .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .nav-pills .nav-link{background:none;border:0;border-radius:.375rem}html[data-netbox-color-mode=dark] .nav-pills .nav-link.active,html[data-netbox-color-mode=dark] .nav-pills .show>.nav-link{color:#000;background-color:#6ea8fe}html[data-netbox-color-mode=dark] .nav-fill>.nav-link,html[data-netbox-color-mode=dark] .nav-fill .nav-item{flex:1 1 auto;text-align:center}html[data-netbox-color-mode=dark] .nav-justified>.nav-link,html[data-netbox-color-mode=dark] .nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}html[data-netbox-color-mode=dark] .nav-fill .nav-item .nav-link,html[data-netbox-color-mode=dark] .nav-justified .nav-item .nav-link{width:100%}html[data-netbox-color-mode=dark] .tab-content>.tab-pane{display:none}html[data-netbox-color-mode=dark] .tab-content>.active{display:block}html[data-netbox-color-mode=dark] .navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}html[data-netbox-color-mode=dark] .navbar>.container,html[data-netbox-color-mode=dark] .navbar>.container-fluid,html[data-netbox-color-mode=dark] .navbar>.container-sm,html[data-netbox-color-mode=dark] .navbar>.container-md,html[data-netbox-color-mode=dark] .navbar>.container-lg,html[data-netbox-color-mode=dark] .navbar>.container-xl,html[data-netbox-color-mode=dark] .navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}html[data-netbox-color-mode=dark] .navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}html[data-netbox-color-mode=dark] .navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}html[data-netbox-color-mode=dark] .navbar-nav .nav-link{padding-right:0;padding-left:0}html[data-netbox-color-mode=dark] .navbar-nav .dropdown-menu{position:static}html[data-netbox-color-mode=dark] .navbar-text{padding-top:.5rem;padding-bottom:.5rem}html[data-netbox-color-mode=dark] .navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}html[data-netbox-color-mode=dark] .navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.375rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .navbar-toggler{transition:none}}html[data-netbox-color-mode=dark] .navbar-toggler:hover{text-decoration:none}html[data-netbox-color-mode=dark] .navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}html[data-netbox-color-mode=dark] .navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}html[data-netbox-color-mode=dark] .navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){html[data-netbox-color-mode=dark] .navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-toggler{display:none}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-toggler{display:none}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-toggler{display:none}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-toggler{display:none}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-toggler{display:none}}html[data-netbox-color-mode=dark] .navbar-expand{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand .navbar-toggler{display:none}html[data-netbox-color-mode=dark] .navbar-light .navbar-brand{color:#000000e6}html[data-netbox-color-mode=dark] .navbar-light .navbar-brand:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-brand:focus{color:#000000e6}html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link{color:#adb5bd}html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link:focus{color:#000000b3}html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .show>.nav-link,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link.active{color:#000000e6}html[data-netbox-color-mode=dark] .navbar-light .navbar-toggler{color:#adb5bd;border-color:#495057}html[data-netbox-color-mode=dark] .navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23adb5bd' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .navbar-light .navbar-text{color:#adb5bd}html[data-netbox-color-mode=dark] .navbar-light .navbar-text a,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a:focus{color:#000000e6}html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand{color:#fff}html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand:focus{color:#fff}html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link{color:#ffffff8c}html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link:focus{color:#ffffffbf}html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .show>.nav-link,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link.active{color:#fff}html[data-netbox-color-mode=dark] .navbar-dark .navbar-toggler{color:#ffffff8c;border-color:#ffffff1a}html[data-netbox-color-mode=dark] .navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .navbar-dark .navbar-text{color:#ffffff8c}html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a:focus{color:#fff}html[data-netbox-color-mode=dark] .card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#212529;background-clip:border-box;border:1px solid rgba(255,255,255,.125);border-radius:.375rem}html[data-netbox-color-mode=dark] .card>hr{margin-right:0;margin-left:0}html[data-netbox-color-mode=dark] .card>.list-group{border-top:inherit;border-bottom:inherit}html[data-netbox-color-mode=dark] .card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card>.card-header+.list-group,html[data-netbox-color-mode=dark] .card>.list-group+.card-footer{border-top:0}html[data-netbox-color-mode=dark] .card-body{flex:1 1 auto;padding:1rem}html[data-netbox-color-mode=dark] .card-title{margin-bottom:.5rem}html[data-netbox-color-mode=dark] .card-subtitle{margin-top:-.25rem;margin-bottom:0}html[data-netbox-color-mode=dark] .card-text:last-child{margin-bottom:0}html[data-netbox-color-mode=dark] .card-link:hover{text-decoration:none}html[data-netbox-color-mode=dark] .card-link+.card-link{margin-left:1rem}html[data-netbox-color-mode=dark] .card-header{padding:.5rem 1rem;margin-bottom:0;background-color:"unset";border-bottom:1px solid rgba(255,255,255,.125)}html[data-netbox-color-mode=dark] .card-header:first-child{border-radius:calc(.375rem - 1px) calc(.375rem - 1px) 0 0}html[data-netbox-color-mode=dark] .card-footer{padding:.5rem 1rem;background-color:"unset";border-top:1px solid rgba(255,255,255,.125)}html[data-netbox-color-mode=dark] .card-footer:last-child{border-radius:0 0 calc(.375rem - 1px) calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}html[data-netbox-color-mode=dark] .card-header-tabs .nav-link.active{background-color:#212529;border-bottom-color:#212529}html[data-netbox-color-mode=dark] .card-header-pills{margin-right:-.5rem;margin-left:-.5rem}html[data-netbox-color-mode=dark] .card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-top,html[data-netbox-color-mode=dark] .card-img-bottom{width:100%}html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-top{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-bottom{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card-group>.card{margin-bottom:.75rem}@media (min-width: 576px){html[data-netbox-color-mode=dark] .card-group{display:flex;flex-flow:row wrap}html[data-netbox-color-mode=dark] .card-group>.card{flex:1 0 0%;margin-bottom:0}html[data-netbox-color-mode=dark] .card-group>.card+.card{margin-left:0;border-left:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-img-top,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-img-bottom,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-img-top,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-img-bottom,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}html[data-netbox-color-mode=dark] .accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#fff;text-align:left;background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .accordion-button{transition:none}}html[data-netbox-color-mode=dark] .accordion-button:not(.collapsed){color:#000;background-color:#6397e5;box-shadow:inset 0 -1px #495057}html[data-netbox-color-mode=dark] .accordion-button:not(.collapsed):after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}html[data-netbox-color-mode=dark] .accordion-button:after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .accordion-button:after{transition:none}}html[data-netbox-color-mode=dark] .accordion-button:hover{z-index:2}html[data-netbox-color-mode=dark] .accordion-button:focus{z-index:3;border-color:#7db1fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .accordion-header{margin-bottom:0}html[data-netbox-color-mode=dark] .accordion-item{background-color:transparent;border:1px solid #495057}html[data-netbox-color-mode=dark] .accordion-item:first-of-type{border-top-left-radius:.375rem;border-top-right-radius:.375rem}html[data-netbox-color-mode=dark] .accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .accordion-item:not(:first-of-type){border-top:0}html[data-netbox-color-mode=dark] .accordion-item:last-of-type{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .accordion-body{padding:1rem 1.25rem}html[data-netbox-color-mode=dark] .accordion-flush .accordion-collapse{border-width:0}html[data-netbox-color-mode=dark] .accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}html[data-netbox-color-mode=dark] .accordion-flush .accordion-item:first-child{border-top:0}html[data-netbox-color-mode=dark] .accordion-flush .accordion-item:last-child{border-bottom:0}html[data-netbox-color-mode=dark] .accordion-flush .accordion-item .accordion-button{border-radius:0}html[data-netbox-color-mode=dark] .breadcrumb{display:flex;flex-wrap:wrap;padding:0;margin-bottom:1rem;list-style:none}html[data-netbox-color-mode=dark] .breadcrumb-item+.breadcrumb-item{padding-left:.5rem}html[data-netbox-color-mode=dark] .breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#f8f9fa;content:var(--bs-breadcrumb-divider, url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='%23f8f9fa'/%3E%3C/svg%3E"))}html[data-netbox-color-mode=dark] .breadcrumb-item.active{color:#fff}html[data-netbox-color-mode=dark] .pagination{display:flex;padding-left:0;list-style:none}html[data-netbox-color-mode=dark] .page-link{position:relative;display:block;color:#9ec5fe;text-decoration:none;background-color:#343a40;border:1px solid #6c757d;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){html[data-netbox-color-mode=dark] .page-link{transition:none}}html[data-netbox-color-mode=dark] .page-link:hover{z-index:2;color:#cfe2ff;background-color:#ced4da;border-color:#adb5bd}html[data-netbox-color-mode=dark] .page-link:focus{z-index:3;color:#cfe2ff;background-color:#ced4da;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .page-item:not(:first-child) .page-link{margin-left:-1px}html[data-netbox-color-mode=dark] .page-item.active .page-link{z-index:3;color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#343a40;border-color:#6c757d}html[data-netbox-color-mode=dark] .page-link{padding:.375rem .75rem}html[data-netbox-color-mode=dark] .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}html[data-netbox-color-mode=dark] .pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}html[data-netbox-color-mode=dark] .pagination-lg .page-item:first-child .page-link{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}html[data-netbox-color-mode=dark] .pagination-lg .page-item:last-child .page-link{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}html[data-netbox-color-mode=dark] .pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}html[data-netbox-color-mode=dark] .pagination-sm .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .pagination-sm .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}html[data-netbox-color-mode=dark] .badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.375rem}html[data-netbox-color-mode=dark] .badge:empty{display:none}html[data-netbox-color-mode=dark] .btn .badge{position:relative;top:-1px}html[data-netbox-color-mode=dark] .alert{position:relative;padding:1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.375rem}html[data-netbox-color-mode=dark] .alert-heading{color:inherit}html[data-netbox-color-mode=dark] .alert-link{font-weight:700}html[data-netbox-color-mode=dark] .alert-dismissible{padding-right:3rem}html[data-netbox-color-mode=dark] .alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}html[data-netbox-color-mode=dark] .alert-primary{color:#162233;background-color:#75acfe;border-color:#8bb9fe}html[data-netbox-color-mode=dark] .alert-primary .alert-link{color:#121b29}html[data-netbox-color-mode=dark] .alert-secondary{color:#232426;background-color:#b1b9c0;border-color:#bdc4ca}html[data-netbox-color-mode=dark] .alert-secondary .alert-link{color:#1c1d1e}html[data-netbox-color-mode=dark] .alert-success{color:#17251e;background-color:#7cbb9d;border-color:#91c5ad}html[data-netbox-color-mode=dark] .alert-success .alert-link{color:#121e18}html[data-netbox-color-mode=dark] .alert-info{color:#162d31;background-color:#75e1f6;border-color:#8be5f8}html[data-netbox-color-mode=dark] .alert-info .alert-link{color:#122427}html[data-netbox-color-mode=dark] .alert-warning{color:#332c15;background-color:#ffdc71;border-color:#ffe188}html[data-netbox-color-mode=dark] .alert-warning .alert-link{color:#292311}html[data-netbox-color-mode=dark] .alert-danger{color:#2f1b1d;background-color:#eb8c95;border-color:#ee9ea5}html[data-netbox-color-mode=dark] .alert-danger .alert-link{color:#261617}html[data-netbox-color-mode=dark] .alert-light{color:#2c2d2e;background-color:#e0e3e7;border-color:#e5e8eb}html[data-netbox-color-mode=dark] .alert-light .alert-link{color:#232425}html[data-netbox-color-mode=dark] .alert-dark{color:#232426;background-color:#b1b9c0;border-color:#bdc4ca}html[data-netbox-color-mode=dark] .alert-dark .alert-link{color:#1c1d1e}html[data-netbox-color-mode=dark] .alert-red{color:#2f1b1d;background-color:#eb8c95;border-color:#ee9ea5}html[data-netbox-color-mode=dark] .alert-red .alert-link{color:#261617}html[data-netbox-color-mode=dark] .alert-yellow{color:#332c15;background-color:#ffdc71;border-color:#ffe188}html[data-netbox-color-mode=dark] .alert-yellow .alert-link{color:#292311}html[data-netbox-color-mode=dark] .alert-green{color:#17251e;background-color:#7cbb9d;border-color:#91c5ad}html[data-netbox-color-mode=dark] .alert-green .alert-link{color:#121e18}html[data-netbox-color-mode=dark] .alert-blue{color:#162233;background-color:#75acfe;border-color:#8bb9fe}html[data-netbox-color-mode=dark] .alert-blue .alert-link{color:#121b29}html[data-netbox-color-mode=dark] .alert-cyan{color:#162d31;background-color:#75e1f6;border-color:#8be5f8}html[data-netbox-color-mode=dark] .alert-cyan .alert-link{color:#122427}html[data-netbox-color-mode=dark] .alert-indigo{color:#211631;background-color:#a877f7;border-color:#b58df9}html[data-netbox-color-mode=dark] .alert-indigo .alert-link{color:#1a1227}html[data-netbox-color-mode=dark] .alert-purple{color:#221c2c;background-color:#ad94dc;border-color:#baa5e1}html[data-netbox-color-mode=dark] .alert-purple .alert-link{color:#1b1623}html[data-netbox-color-mode=dark] .alert-pink{color:#2e1b24;background-color:#e78bb9;border-color:#eb9dc4}html[data-netbox-color-mode=dark] .alert-pink .alert-link{color:#25161d}html[data-netbox-color-mode=dark] .alert-darker{color:#d1d2d3;background-color:#262a2d;border-color:#494c4e}html[data-netbox-color-mode=dark] .alert-darker .alert-link{color:#a7a8a9}html[data-netbox-color-mode=dark] .alert-darkest{color:#d1d1d2;background-color:#232628;border-color:#45494a}html[data-netbox-color-mode=dark] .alert-darkest .alert-link{color:#a7a7a8}html[data-netbox-color-mode=dark] .alert-gray{color:#292a2c;background-color:#d0d6dc;border-color:#d8dde1}html[data-netbox-color-mode=dark] .alert-gray .alert-link{color:#212223}html[data-netbox-color-mode=dark] .alert-gray-100{color:#323232;background-color:#f8f9fa;border-color:#f9fafb}html[data-netbox-color-mode=dark] .alert-gray-100 .alert-link{color:#282828}html[data-netbox-color-mode=dark] .alert-gray-200{color:#2f2f30;background-color:#eaedf0;border-color:#edf0f2}html[data-netbox-color-mode=dark] .alert-gray-200 .alert-link{color:#262626}html[data-netbox-color-mode=dark] .alert-gray-300{color:#2c2d2e;background-color:#e0e3e7;border-color:#e5e8eb}html[data-netbox-color-mode=dark] .alert-gray-300 .alert-link{color:#232425}html[data-netbox-color-mode=dark] .alert-gray-400{color:#292a2c;background-color:#d0d6dc;border-color:#d8dde1}html[data-netbox-color-mode=dark] .alert-gray-400 .alert-link{color:#212223}html[data-netbox-color-mode=dark] .alert-gray-500{color:#232426;background-color:#b1b9c0;border-color:#bdc4ca}html[data-netbox-color-mode=dark] .alert-gray-500 .alert-link{color:#1c1d1e}html[data-netbox-color-mode=dark] .alert-gray-600{color:#161719;background-color:#737c84;border-color:#899197}html[data-netbox-color-mode=dark] .alert-gray-600 .alert-link{color:#121214}html[data-netbox-color-mode=dark] .alert-gray-700{color:#dbdcdd;background-color:#52595f;border-color:#6d7379}html[data-netbox-color-mode=dark] .alert-gray-700 .alert-link{color:#afb0b1}html[data-netbox-color-mode=dark] .alert-gray-800{color:#d6d8d9;background-color:#3e444a;border-color:#5d6166}html[data-netbox-color-mode=dark] .alert-gray-800 .alert-link{color:#abadae}html[data-netbox-color-mode=dark] .alert-gray-900{color:#d3d3d4;background-color:#2c3034;border-color:#4d5154}html[data-netbox-color-mode=dark] .alert-gray-900 .alert-link{color:#a9a9aa}html[data-netbox-color-mode=dark] .alert-red-100{color:#322b2c;background-color:#f8d9dc;border-color:#f9dfe1}html[data-netbox-color-mode=dark] .alert-red-100 .alert-link{color:#282223}html[data-netbox-color-mode=dark] .alert-red-200{color:#302324;background-color:#f2b2b9;border-color:#f4bec4}html[data-netbox-color-mode=dark] .alert-red-200 .alert-link{color:#261c1d}html[data-netbox-color-mode=dark] .alert-red-300{color:#2f1b1d;background-color:#eb8c95;border-color:#ee9ea5}html[data-netbox-color-mode=dark] .alert-red-300 .alert-link{color:#261617}html[data-netbox-color-mode=dark] .alert-red-400{color:#2d1315;background-color:#e46571;border-color:#e97d88}html[data-netbox-color-mode=dark] .alert-red-400 .alert-link{color:#240f11}html[data-netbox-color-mode=dark] .alert-red-500{color:#2c0b0e;background-color:#de3f4e;border-color:#e35d6a}html[data-netbox-color-mode=dark] .alert-red-500 .alert-link{color:#23090b}html[data-netbox-color-mode=dark] .alert-red-600{color:#efd4d7;background-color:#b43541;border-color:#c0555f}html[data-netbox-color-mode=dark] .alert-red-600 .alert-link{color:#bfaaac}html[data-netbox-color-mode=dark] .alert-red-700{color:#e6d2d4;background-color:#8a2b34;border-color:#9d4d54}html[data-netbox-color-mode=dark] .alert-red-700 .alert-link{color:#b8a8aa}html[data-netbox-color-mode=dark] .alert-red-800{color:#ded0d2;background-color:#602127;border-color:#794449}html[data-netbox-color-mode=dark] .alert-red-800 .alert-link{color:#b2a6a8}html[data-netbox-color-mode=dark] .alert-red-900{color:#d5cecf;background-color:#37171a;border-color:#563c3e}html[data-netbox-color-mode=dark] .alert-red-900 .alert-link{color:#aaa5a6}html[data-netbox-color-mode=dark] .alert-yellow-100{color:#333129;background-color:#fff4d0;border-color:#fff5d7}html[data-netbox-color-mode=dark] .alert-yellow-100 .alert-link{color:#292721}html[data-netbox-color-mode=dark] .alert-yellow-200{color:#332e1f;background-color:#ffe7a1;border-color:#ffebb0}html[data-netbox-color-mode=dark] .alert-yellow-200 .alert-link{color:#292519}html[data-netbox-color-mode=dark] .alert-yellow-300{color:#332c15;background-color:#ffdc71;border-color:#ffe188}html[data-netbox-color-mode=dark] .alert-yellow-300 .alert-link{color:#292311}html[data-netbox-color-mode=dark] .alert-yellow-400{color:#33290b;background-color:#ffd043;border-color:#ffd761}html[data-netbox-color-mode=dark] .alert-yellow-400 .alert-link{color:#292109}html[data-netbox-color-mode=dark] .alert-yellow-500{color:#332701;background-color:#ffc413;border-color:#ffcd39}html[data-netbox-color-mode=dark] .alert-yellow-500 .alert-link{color:#291f01}html[data-netbox-color-mode=dark] .alert-yellow-600{color:#291f01;background-color:#cf9f12;border-color:#d6ae38}html[data-netbox-color-mode=dark] .alert-yellow-600 .alert-link{color:#211901}html[data-netbox-color-mode=dark] .alert-yellow-700{color:#1f1701;background-color:#9e7b11;border-color:#ad9036}html[data-netbox-color-mode=dark] .alert-yellow-700 .alert-link{color:#191201}html[data-netbox-color-mode=dark] .alert-yellow-800{color:#e0dbcd;background-color:#6e5610;border-color:#857135}html[data-netbox-color-mode=dark] .alert-yellow-800 .alert-link{color:#b3afa4}html[data-netbox-color-mode=dark] .alert-yellow-900{color:#d6d4cc;background-color:#3d320e;border-color:#5c5234}html[data-netbox-color-mode=dark] .alert-yellow-900 .alert-link{color:#abaaa3}html[data-netbox-color-mode=dark] .alert-green-100{color:#2a2e2c;background-color:#d3e8df;border-color:#daece4}html[data-netbox-color-mode=dark] .alert-green-100 .alert-link{color:#222523}html[data-netbox-color-mode=dark] .alert-green-200{color:#212925;background-color:#a8d1be;border-color:#b5d9c9}html[data-netbox-color-mode=dark] .alert-green-200 .alert-link{color:#1a211e}html[data-netbox-color-mode=dark] .alert-green-300{color:#17251e;background-color:#7cbb9d;border-color:#91c5ad}html[data-netbox-color-mode=dark] .alert-green-300 .alert-link{color:#121e18}html[data-netbox-color-mode=dark] .alert-green-400{color:#0e2018;background-color:#50a47d;border-color:#6cb291}html[data-netbox-color-mode=dark] .alert-green-400 .alert-link{color:#0b1a13}html[data-netbox-color-mode=dark] .alert-green-500{color:#051b11;background-color:#258d5d;border-color:#479f76}html[data-netbox-color-mode=dark] .alert-green-500 .alert-link{color:#04160e}html[data-netbox-color-mode=dark] .alert-green-600{color:#d0e2d9;background-color:#20734c;border-color:#438969}html[data-netbox-color-mode=dark] .alert-green-600 .alert-link{color:#a6b5ae}html[data-netbox-color-mode=dark] .alert-green-700{color:#cfdcd6;background-color:#1b5a3c;border-color:#3f745b}html[data-netbox-color-mode=dark] .alert-green-700 .alert-link{color:#a6b0ab}html[data-netbox-color-mode=dark] .alert-green-800{color:#ced7d3;background-color:#16402d;border-color:#3b5e4e}html[data-netbox-color-mode=dark] .alert-green-800 .alert-link{color:#a5aca9}html[data-netbox-color-mode=dark] .alert-green-900{color:#cdd1cf;background-color:#12261d;border-color:#374941}html[data-netbox-color-mode=dark] .alert-green-900 .alert-link{color:#a4a7a6}html[data-netbox-color-mode=dark] .alert-blue-100{color:#292d33;background-color:#d1e3ff;border-color:#d9e8ff}html[data-netbox-color-mode=dark] .alert-blue-100 .alert-link{color:#212429}html[data-netbox-color-mode=dark] .alert-blue-200{color:#202733;background-color:#a3c8fe;border-color:#b1d1fe}html[data-netbox-color-mode=dark] .alert-blue-200 .alert-link{color:#1a1f29}html[data-netbox-color-mode=dark] .alert-blue-300{color:#162233;background-color:#75acfe;border-color:#8bb9fe}html[data-netbox-color-mode=dark] .alert-blue-300 .alert-link{color:#121b29}html[data-netbox-color-mode=dark] .alert-blue-400{color:#0c1c33;background-color:#4791fd;border-color:#64a2fd}html[data-netbox-color-mode=dark] .alert-blue-400 .alert-link{color:#0a1629}html[data-netbox-color-mode=dark] .alert-blue-500{color:#031633;background-color:#1975fd;border-color:#3d8bfd}html[data-netbox-color-mode=dark] .alert-blue-500 .alert-link{color:#021229}html[data-netbox-color-mode=dark] .alert-blue-600{color:#cedef4;background-color:#1660cd;border-color:#3b79d5}html[data-netbox-color-mode=dark] .alert-blue-600 .alert-link{color:#a5b2c3}html[data-netbox-color-mode=dark] .alert-blue-700{color:#ced9ea;background-color:#144b9d;border-color:#3968ad}html[data-netbox-color-mode=dark] .alert-blue-700 .alert-link{color:#a5aebb}html[data-netbox-color-mode=dark] .alert-blue-800{color:#cdd5e0;background-color:#12376d;border-color:#375684}html[data-netbox-color-mode=dark] .alert-blue-800 .alert-link{color:#a4aab3}html[data-netbox-color-mode=dark] .alert-blue-900{color:#cdd0d6;background-color:#10223d;border-color:#35455c}html[data-netbox-color-mode=dark] .alert-blue-900 .alert-link{color:#a4a6ab}html[data-netbox-color-mode=dark] .alert-cyan-100{color:#293132;background-color:#d1f5fc;border-color:#d9f6fd}html[data-netbox-color-mode=dark] .alert-cyan-100 .alert-link{color:#212728}html[data-netbox-color-mode=dark] .alert-cyan-200{color:#202f32;background-color:#a3ebf9;border-color:#b1eefa}html[data-netbox-color-mode=dark] .alert-cyan-200 .alert-link{color:#1a2628}html[data-netbox-color-mode=dark] .alert-cyan-300{color:#162d31;background-color:#75e1f6;border-color:#8be5f8}html[data-netbox-color-mode=dark] .alert-cyan-300 .alert-link{color:#122427}html[data-netbox-color-mode=dark] .alert-cyan-400{color:#0c2b31;background-color:#47d7f4;border-color:#64ddf5}html[data-netbox-color-mode=dark] .alert-cyan-400 .alert-link{color:#0a2227}html[data-netbox-color-mode=dark] .alert-cyan-500{color:#032830;background-color:#19cdf1;border-color:#3dd5f3}html[data-netbox-color-mode=dark] .alert-cyan-500 .alert-link{color:#022026}html[data-netbox-color-mode=dark] .alert-cyan-600{color:#022026;background-color:#16a7c3;border-color:#3bb5cd}html[data-netbox-color-mode=dark] .alert-cyan-600 .alert-link{color:#021a1e}html[data-netbox-color-mode=dark] .alert-cyan-700{color:#cee4e9;background-color:#148096;border-color:#3994a6}html[data-netbox-color-mode=dark] .alert-cyan-700 .alert-link{color:#a5b6ba}html[data-netbox-color-mode=dark] .alert-cyan-800{color:#cddcdf;background-color:#125a68;border-color:#377480}html[data-netbox-color-mode=dark] .alert-cyan-800 .alert-link{color:#a4b0b2}html[data-netbox-color-mode=dark] .alert-cyan-900{color:#cdd4d6;background-color:#10333a;border-color:#355359}html[data-netbox-color-mode=dark] .alert-cyan-900 .alert-link{color:#a4aaab}html[data-netbox-color-mode=dark] .alert-indigo-100{color:#2d2932;background-color:#e2d1fc;border-color:#e6d9fd}html[data-netbox-color-mode=dark] .alert-indigo-100 .alert-link{color:#242128}html[data-netbox-color-mode=dark] .alert-indigo-200{color:#272032;background-color:#c5a4fa;border-color:#ceb2fb}html[data-netbox-color-mode=dark] .alert-indigo-200 .alert-link{color:#1f1a28}html[data-netbox-color-mode=dark] .alert-indigo-300{color:#211631;background-color:#a877f7;border-color:#b58df9}html[data-netbox-color-mode=dark] .alert-indigo-300 .alert-link{color:#1a1227}html[data-netbox-color-mode=dark] .alert-indigo-400{color:#e7d9fd;background-color:#8b4af6;border-color:#9d66f7}html[data-netbox-color-mode=dark] .alert-indigo-400 .alert-link{color:#b9aeca}html[data-netbox-color-mode=dark] .alert-indigo-500{color:#e0cffc;background-color:#6e1cf3;border-color:#8540f5}html[data-netbox-color-mode=dark] .alert-indigo-500 .alert-link{color:#b3a6ca}html[data-netbox-color-mode=dark] .alert-indigo-600{color:#dccff3;background-color:#5b19c5;border-color:#753dce}html[data-netbox-color-mode=dark] .alert-indigo-600 .alert-link{color:#b0a6c2}html[data-netbox-color-mode=dark] .alert-indigo-700{color:#d8cee9;background-color:#471697;border-color:#643ba7}html[data-netbox-color-mode=dark] .alert-indigo-700 .alert-link{color:#ada5ba}html[data-netbox-color-mode=dark] .alert-indigo-800{color:#d4cddf;background-color:#341269;border-color:#543881}html[data-netbox-color-mode=dark] .alert-indigo-800 .alert-link{color:#aaa4b2}html[data-netbox-color-mode=dark] .alert-indigo-900{color:#d0cdd6;background-color:#20103a;border-color:#433559}html[data-netbox-color-mode=dark] .alert-indigo-900 .alert-link{color:#a6a4ab}html[data-netbox-color-mode=dark] .alert-purple-100{color:#2d2b31;background-color:#e3dbf4;border-color:#e8e1f5}html[data-netbox-color-mode=dark] .alert-purple-100 .alert-link{color:#242227}html[data-netbox-color-mode=dark] .alert-purple-200{color:#27242e;background-color:#c8b7e7;border-color:#d1c2eb}html[data-netbox-color-mode=dark] .alert-purple-200 .alert-link{color:#1f1d25}html[data-netbox-color-mode=dark] .alert-purple-300{color:#221c2c;background-color:#ad94dc;border-color:#baa5e1}html[data-netbox-color-mode=dark] .alert-purple-300 .alert-link{color:#1b1623}html[data-netbox-color-mode=dark] .alert-purple-400{color:#1c1529;background-color:#9270d0;border-color:#a386d7}html[data-netbox-color-mode=dark] .alert-purple-400 .alert-link{color:#161121}html[data-netbox-color-mode=dark] .alert-purple-500{color:#e2d9f3;background-color:#764bc4;border-color:#8c68cd}html[data-netbox-color-mode=dark] .alert-purple-500 .alert-link{color:#b5aec2}html[data-netbox-color-mode=dark] .alert-purple-600{color:#ded7eb;background-color:#613f9f;border-color:#7a5dae}html[data-netbox-color-mode=dark] .alert-purple-600 .alert-link{color:#b2acbc}html[data-netbox-color-mode=dark] .alert-purple-700{color:#d9d4e3;background-color:#4c337b;border-color:#695390}html[data-netbox-color-mode=dark] .alert-purple-700 .alert-link{color:#aeaab6}html[data-netbox-color-mode=dark] .alert-purple-800{color:#d5d1db;background-color:#372556;border-color:#564871}html[data-netbox-color-mode=dark] .alert-purple-800 .alert-link{color:#aaa7af}html[data-netbox-color-mode=dark] .alert-purple-900{color:#d0cfd4;background-color:#221932;border-color:#453d52}html[data-netbox-color-mode=dark] .alert-purple-900 .alert-link{color:#a6a6aa}html[data-netbox-color-mode=dark] .alert-pink-100{color:#312b2e;background-color:#f7d8e7;border-color:#f9deeb}html[data-netbox-color-mode=dark] .alert-pink-100 .alert-link{color:#272225}html[data-netbox-color-mode=dark] .alert-pink-200{color:#302329;background-color:#f0b1d0;border-color:#f2bdd8}html[data-netbox-color-mode=dark] .alert-pink-200 .alert-link{color:#261c21}html[data-netbox-color-mode=dark] .alert-pink-300{color:#2e1b24;background-color:#e78bb9;border-color:#eb9dc4}html[data-netbox-color-mode=dark] .alert-pink-300 .alert-link{color:#25161d}html[data-netbox-color-mode=dark] .alert-pink-400{color:#2c121f;background-color:#e064a2;border-color:#e57db1}html[data-netbox-color-mode=dark] .alert-pink-400 .alert-link{color:#230e19}html[data-netbox-color-mode=dark] .alert-pink-500{color:#2b0a1a;background-color:#d83d8a;border-color:#de5c9d}html[data-netbox-color-mode=dark] .alert-pink-500 .alert-link{color:#220815}html[data-netbox-color-mode=dark] .alert-pink-600{color:#eed4e1;background-color:#af3471;border-color:#bc5488}html[data-netbox-color-mode=dark] .alert-pink-600 .alert-link{color:#beaab4}html[data-netbox-color-mode=dark] .alert-pink-700{color:#e6d2dc;background-color:#862a58;border-color:#994c72}html[data-netbox-color-mode=dark] .alert-pink-700 .alert-link{color:#b8a8b0}html[data-netbox-color-mode=dark] .alert-pink-800{color:#ddd0d7;background-color:#5e203f;border-color:#78435d}html[data-netbox-color-mode=dark] .alert-pink-800 .alert-link{color:#b1a6ac}html[data-netbox-color-mode=dark] .alert-pink-900{color:#d5ced1;background-color:#361625;border-color:#553b48}html[data-netbox-color-mode=dark] .alert-pink-900 .alert-link{color:#aaa5a7}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}html[data-netbox-color-mode=dark] .progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#6c757d;border-radius:.375rem}html[data-netbox-color-mode=dark] .progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#6ea8fe;transition:width .6s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .progress-bar{transition:none}}html[data-netbox-color-mode=dark] .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:1rem 1rem}html[data-netbox-color-mode=dark] .progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .progress-bar-animated{animation:none}}html[data-netbox-color-mode=dark] .list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.375rem}html[data-netbox-color-mode=dark] .list-group-numbered{list-style-type:none;counter-reset:section}html[data-netbox-color-mode=dark] .list-group-numbered>li:before{content:counters(section,".") ". ";counter-increment:section}html[data-netbox-color-mode=dark] .list-group-item-action{width:100%;color:#dee2e6;text-align:inherit}html[data-netbox-color-mode=dark] .list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-action:focus{z-index:1;color:#fff;text-decoration:none;background-color:#f8f9fa26}html[data-netbox-color-mode=dark] .list-group-item-action:active{color:#fff;background-color:#dee2e620}html[data-netbox-color-mode=dark] .list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#fff;text-decoration:none;background-color:#212529;border:1px solid rgba(255,255,255,.125)}html[data-netbox-color-mode=dark] .list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}html[data-netbox-color-mode=dark] .list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}html[data-netbox-color-mode=dark] .list-group-item.disabled,html[data-netbox-color-mode=dark] .list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#212529}html[data-netbox-color-mode=dark] .list-group-item.active{z-index:2;color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item{border-top-width:0}html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item.active{margin-top:-1px;border-top-width:1px}html[data-netbox-color-mode=dark] .list-group-horizontal{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){html[data-netbox-color-mode=dark] .list-group-horizontal-sm{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .list-group-horizontal-md{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .list-group-horizontal-lg{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .list-group-horizontal-xl{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .list-group-horizontal-xxl{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}html[data-netbox-color-mode=dark] .list-group-flush{border-radius:0}html[data-netbox-color-mode=dark] .list-group-flush>.list-group-item{border-width:0 0 1px}html[data-netbox-color-mode=dark] .list-group-flush>.list-group-item:last-child{border-bottom-width:0}html[data-netbox-color-mode=dark] .list-group-item-primary{color:#426598;background-color:#e2eeff}html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action:focus{color:#426598;background-color:#cbd6e6}html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#426598;border-color:#426598}html[data-netbox-color-mode=dark] .list-group-item-secondary{color:#686d71;background-color:#eff0f2}html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}html[data-netbox-color-mode=dark] .list-group-item-success{color:#466e5b;background-color:#e3f1ea}html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action:focus{color:#466e5b;background-color:#ccd9d3}html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action.active{color:#fff;background-color:#466e5b;border-color:#466e5b}html[data-netbox-color-mode=dark] .list-group-item-info{color:#2c5962;background-color:#e2f9fd}html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action:focus{color:#2c5962;background-color:#cbe0e4}html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action.active{color:#fff;background-color:#2c5962;border-color:#2c5962}html[data-netbox-color-mode=dark] .list-group-item-warning{color:#66572a;background-color:#fff8e1}html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action:focus{color:#66572a;background-color:#e6dfcb}html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#66572a;border-color:#66572a}html[data-netbox-color-mode=dark] .list-group-item-danger{color:#8c5056;background-color:#fbe7e9}html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action:focus{color:#8c5056;background-color:#e2d0d2}html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#8c5056;border-color:#8c5056}html[data-netbox-color-mode=dark] .list-group-item-light{color:#595a5c;background-color:#f8f9fa}html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action:focus{color:#595a5c;background-color:#dfe0e1}html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action.active{color:#fff;background-color:#595a5c;border-color:#595a5c}html[data-netbox-color-mode=dark] .list-group-item-dark{color:#686d71;background-color:#eff0f2}html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}html[data-netbox-color-mode=dark] .list-group-item-red{color:#8c5056;background-color:#fbe7e9}html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action:focus{color:#8c5056;background-color:#e2d0d2}html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action.active{color:#fff;background-color:#8c5056;border-color:#8c5056}html[data-netbox-color-mode=dark] .list-group-item-yellow{color:#66572a;background-color:#fff8e1}html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action:focus{color:#66572a;background-color:#e6dfcb}html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action.active{color:#fff;background-color:#66572a;border-color:#66572a}html[data-netbox-color-mode=dark] .list-group-item-green{color:#466e5b;background-color:#e3f1ea}html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action:focus{color:#466e5b;background-color:#ccd9d3}html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action.active{color:#fff;background-color:#466e5b;border-color:#466e5b}html[data-netbox-color-mode=dark] .list-group-item-blue{color:#426598;background-color:#e2eeff}html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action:focus{color:#426598;background-color:#cbd6e6}html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action.active{color:#fff;background-color:#426598;border-color:#426598}html[data-netbox-color-mode=dark] .list-group-item-cyan{color:#2c5962;background-color:#e2f9fd}html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action:focus{color:#2c5962;background-color:#cbe0e4}html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action.active{color:#fff;background-color:#2c5962;border-color:#2c5962}html[data-netbox-color-mode=dark] .list-group-item-indigo{color:#624394;background-color:#ede2fd}html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action:focus{color:#624394;background-color:#d5cbe4}html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action.active{color:#fff;background-color:#624394;border-color:#624394}html[data-netbox-color-mode=dark] .list-group-item-purple{color:#655583;background-color:#eee8f8}html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action:focus{color:#655583;background-color:#d6d1df}html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action.active{color:#fff;background-color:#655583;border-color:#655583}html[data-netbox-color-mode=dark] .list-group-item-pink{color:#8a506d;background-color:#fae7f0}html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action:focus{color:#8a506d;background-color:#e1d0d8}html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action.active{color:#fff;background-color:#8a506d;border-color:#8a506d}html[data-netbox-color-mode=dark] .list-group-item-darker{color:#101314;background-color:#d1d2d3}html[data-netbox-color-mode=dark] .list-group-item-darker.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-darker.list-group-item-action:focus{color:#101314;background-color:#bcbdbe}html[data-netbox-color-mode=dark] .list-group-item-darker.list-group-item-action.active{color:#fff;background-color:#101314;border-color:#101314}html[data-netbox-color-mode=dark] .list-group-item-darkest{color:#0e1011;background-color:#d1d1d2}html[data-netbox-color-mode=dark] .list-group-item-darkest.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-darkest.list-group-item-action:focus{color:#0e1011;background-color:#bcbcbd}html[data-netbox-color-mode=dark] .list-group-item-darkest.list-group-item-action.active{color:#fff;background-color:#0e1011;border-color:#0e1011}html[data-netbox-color-mode=dark] .list-group-item-gray{color:#525557;background-color:#f5f6f8}html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action:focus{color:#525557;background-color:#dddddf}html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action.active{color:#fff;background-color:#525557;border-color:#525557}html[data-netbox-color-mode=dark] .list-group-item-gray-100{color:#636464;background-color:#fefefe}html[data-netbox-color-mode=dark] .list-group-item-gray-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-100.list-group-item-action:focus{color:#636464;background-color:#e5e5e5}html[data-netbox-color-mode=dark] .list-group-item-gray-100.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}html[data-netbox-color-mode=dark] .list-group-item-gray-200{color:#5d5e60;background-color:#fbfbfc}html[data-netbox-color-mode=dark] .list-group-item-gray-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-200.list-group-item-action:focus{color:#5d5e60;background-color:#e2e2e3}html[data-netbox-color-mode=dark] .list-group-item-gray-200.list-group-item-action.active{color:#fff;background-color:#5d5e60;border-color:#5d5e60}html[data-netbox-color-mode=dark] .list-group-item-gray-300{color:#595a5c;background-color:#f8f9fa}html[data-netbox-color-mode=dark] .list-group-item-gray-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-300.list-group-item-action:focus{color:#595a5c;background-color:#dfe0e1}html[data-netbox-color-mode=dark] .list-group-item-gray-300.list-group-item-action.active{color:#fff;background-color:#595a5c;border-color:#595a5c}html[data-netbox-color-mode=dark] .list-group-item-gray-400{color:#525557;background-color:#f5f6f8}html[data-netbox-color-mode=dark] .list-group-item-gray-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-400.list-group-item-action:focus{color:#525557;background-color:#dddddf}html[data-netbox-color-mode=dark] .list-group-item-gray-400.list-group-item-action.active{color:#fff;background-color:#525557;border-color:#525557}html[data-netbox-color-mode=dark] .list-group-item-gray-500{color:#686d71;background-color:#eff0f2}html[data-netbox-color-mode=dark] .list-group-item-gray-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-500.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}html[data-netbox-color-mode=dark] .list-group-item-gray-500.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}html[data-netbox-color-mode=dark] .list-group-item-gray-600{color:#41464b;background-color:#e2e3e5}html[data-netbox-color-mode=dark] .list-group-item-gray-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-600.list-group-item-action:focus{color:#41464b;background-color:#cbccce}html[data-netbox-color-mode=dark] .list-group-item-gray-600.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}html[data-netbox-color-mode=dark] .list-group-item-gray-700{color:#2c3034;background-color:#dbdcdd}html[data-netbox-color-mode=dark] .list-group-item-gray-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-700.list-group-item-action:focus{color:#2c3034;background-color:#c5c6c7}html[data-netbox-color-mode=dark] .list-group-item-gray-700.list-group-item-action.active{color:#fff;background-color:#2c3034;border-color:#2c3034}html[data-netbox-color-mode=dark] .list-group-item-gray-800{color:#1f2326;background-color:#d6d8d9}html[data-netbox-color-mode=dark] .list-group-item-gray-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-800.list-group-item-action:focus{color:#1f2326;background-color:#c1c2c3}html[data-netbox-color-mode=dark] .list-group-item-gray-800.list-group-item-action.active{color:#fff;background-color:#1f2326;border-color:#1f2326}html[data-netbox-color-mode=dark] .list-group-item-gray-900{color:#141619;background-color:#d3d3d4}html[data-netbox-color-mode=dark] .list-group-item-gray-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-900.list-group-item-action:focus{color:#141619;background-color:#bebebf}html[data-netbox-color-mode=dark] .list-group-item-gray-900.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}html[data-netbox-color-mode=dark] .list-group-item-red-100{color:#635657;background-color:#fef7f8}html[data-netbox-color-mode=dark] .list-group-item-red-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-100.list-group-item-action:focus{color:#635657;background-color:#e5dedf}html[data-netbox-color-mode=dark] .list-group-item-red-100.list-group-item-action.active{color:#fff;background-color:#635657;border-color:#635657}html[data-netbox-color-mode=dark] .list-group-item-red-200{color:#604648;background-color:#fceff0}html[data-netbox-color-mode=dark] .list-group-item-red-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-200.list-group-item-action:focus{color:#604648;background-color:#e3d7d8}html[data-netbox-color-mode=dark] .list-group-item-red-200.list-group-item-action.active{color:#fff;background-color:#604648;border-color:#604648}html[data-netbox-color-mode=dark] .list-group-item-red-300{color:#8c5056;background-color:#fbe7e9}html[data-netbox-color-mode=dark] .list-group-item-red-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-300.list-group-item-action:focus{color:#8c5056;background-color:#e2d0d2}html[data-netbox-color-mode=dark] .list-group-item-red-300.list-group-item-action.active{color:#fff;background-color:#8c5056;border-color:#8c5056}html[data-netbox-color-mode=dark] .list-group-item-red-400{color:#883840;background-color:#f9dfe1}html[data-netbox-color-mode=dark] .list-group-item-red-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-400.list-group-item-action:focus{color:#883840;background-color:#e0c9cb}html[data-netbox-color-mode=dark] .list-group-item-red-400.list-group-item-action.active{color:#fff;background-color:#883840;border-color:#883840}html[data-netbox-color-mode=dark] .list-group-item-red-500{color:#842029;background-color:#f8d7da}html[data-netbox-color-mode=dark] .list-group-item-red-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-500.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}html[data-netbox-color-mode=dark] .list-group-item-red-500.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}html[data-netbox-color-mode=dark] .list-group-item-red-600{color:#6a1921;background-color:#efd4d7}html[data-netbox-color-mode=dark] .list-group-item-red-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-600.list-group-item-action:focus{color:#6a1921;background-color:#d7bfc2}html[data-netbox-color-mode=dark] .list-group-item-red-600.list-group-item-action.active{color:#fff;background-color:#6a1921;border-color:#6a1921}html[data-netbox-color-mode=dark] .list-group-item-red-700{color:#4f1319;background-color:#e6d2d4}html[data-netbox-color-mode=dark] .list-group-item-red-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-700.list-group-item-action:focus{color:#4f1319;background-color:#cfbdbf}html[data-netbox-color-mode=dark] .list-group-item-red-700.list-group-item-action.active{color:#fff;background-color:#4f1319;border-color:#4f1319}html[data-netbox-color-mode=dark] .list-group-item-red-800{color:#350d11;background-color:#ded0d2}html[data-netbox-color-mode=dark] .list-group-item-red-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-800.list-group-item-action:focus{color:#350d11;background-color:#c8bbbd}html[data-netbox-color-mode=dark] .list-group-item-red-800.list-group-item-action.active{color:#fff;background-color:#350d11;border-color:#350d11}html[data-netbox-color-mode=dark] .list-group-item-red-900{color:#1a0708;background-color:#d5cecf}html[data-netbox-color-mode=dark] .list-group-item-red-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-900.list-group-item-action:focus{color:#1a0708;background-color:#c0b9ba}html[data-netbox-color-mode=dark] .list-group-item-red-900.list-group-item-action.active{color:#fff;background-color:#1a0708;border-color:#1a0708}html[data-netbox-color-mode=dark] .list-group-item-yellow-100{color:#666152;background-color:#fffdf5}html[data-netbox-color-mode=dark] .list-group-item-yellow-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-100.list-group-item-action:focus{color:#666152;background-color:#e6e4dd}html[data-netbox-color-mode=dark] .list-group-item-yellow-100.list-group-item-action.active{color:#fff;background-color:#666152;border-color:#666152}html[data-netbox-color-mode=dark] .list-group-item-yellow-200{color:#665c3e;background-color:#fffaeb}html[data-netbox-color-mode=dark] .list-group-item-yellow-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-200.list-group-item-action:focus{color:#665c3e;background-color:#e6e1d4}html[data-netbox-color-mode=dark] .list-group-item-yellow-200.list-group-item-action.active{color:#fff;background-color:#665c3e;border-color:#665c3e}html[data-netbox-color-mode=dark] .list-group-item-yellow-300{color:#66572a;background-color:#fff8e1}html[data-netbox-color-mode=dark] .list-group-item-yellow-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-300.list-group-item-action:focus{color:#66572a;background-color:#e6dfcb}html[data-netbox-color-mode=dark] .list-group-item-yellow-300.list-group-item-action.active{color:#fff;background-color:#66572a;border-color:#66572a}html[data-netbox-color-mode=dark] .list-group-item-yellow-400{color:#665217;background-color:#fff5d7}html[data-netbox-color-mode=dark] .list-group-item-yellow-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-400.list-group-item-action:focus{color:#665217;background-color:#e6ddc2}html[data-netbox-color-mode=dark] .list-group-item-yellow-400.list-group-item-action.active{color:#fff;background-color:#665217;border-color:#665217}html[data-netbox-color-mode=dark] .list-group-item-yellow-500{color:#664d03;background-color:#fff3cd}html[data-netbox-color-mode=dark] .list-group-item-yellow-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-500.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}html[data-netbox-color-mode=dark] .list-group-item-yellow-500.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}html[data-netbox-color-mode=dark] .list-group-item-yellow-600{color:#7a5c04;background-color:#f5ebcd}html[data-netbox-color-mode=dark] .list-group-item-yellow-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-600.list-group-item-action:focus{color:#7a5c04;background-color:#ddd4b9}html[data-netbox-color-mode=dark] .list-group-item-yellow-600.list-group-item-action.active{color:#fff;background-color:#7a5c04;border-color:#7a5c04}html[data-netbox-color-mode=dark] .list-group-item-yellow-700{color:#5c4602;background-color:#ebe3cd}html[data-netbox-color-mode=dark] .list-group-item-yellow-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-700.list-group-item-action:focus{color:#5c4602;background-color:#d4ccb9}html[data-netbox-color-mode=dark] .list-group-item-yellow-700.list-group-item-action.active{color:#fff;background-color:#5c4602;border-color:#5c4602}html[data-netbox-color-mode=dark] .list-group-item-yellow-800{color:#3d2e02;background-color:#e0dbcd}html[data-netbox-color-mode=dark] .list-group-item-yellow-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-800.list-group-item-action:focus{color:#3d2e02;background-color:#cac5b9}html[data-netbox-color-mode=dark] .list-group-item-yellow-800.list-group-item-action.active{color:#fff;background-color:#3d2e02;border-color:#3d2e02}html[data-netbox-color-mode=dark] .list-group-item-yellow-900{color:#1f1701;background-color:#d6d4cc}html[data-netbox-color-mode=dark] .list-group-item-yellow-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-900.list-group-item-action:focus{color:#1f1701;background-color:#c1bfb8}html[data-netbox-color-mode=dark] .list-group-item-yellow-900.list-group-item-action.active{color:#fff;background-color:#1f1701;border-color:#1f1701}html[data-netbox-color-mode=dark] .list-group-item-green-100{color:#545c58;background-color:#f6faf8}html[data-netbox-color-mode=dark] .list-group-item-green-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-100.list-group-item-action:focus{color:#545c58;background-color:#dde1df}html[data-netbox-color-mode=dark] .list-group-item-green-100.list-group-item-action.active{color:#fff;background-color:#545c58;border-color:#545c58}html[data-netbox-color-mode=dark] .list-group-item-green-200{color:#41534b;background-color:#edf5f1}html[data-netbox-color-mode=dark] .list-group-item-green-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-200.list-group-item-action:focus{color:#41534b;background-color:#d5ddd9}html[data-netbox-color-mode=dark] .list-group-item-green-200.list-group-item-action.active{color:#fff;background-color:#41534b;border-color:#41534b}html[data-netbox-color-mode=dark] .list-group-item-green-300{color:#466e5b;background-color:#e3f1ea}html[data-netbox-color-mode=dark] .list-group-item-green-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-300.list-group-item-action:focus{color:#466e5b;background-color:#ccd9d3}html[data-netbox-color-mode=dark] .list-group-item-green-300.list-group-item-action.active{color:#fff;background-color:#466e5b;border-color:#466e5b}html[data-netbox-color-mode=dark] .list-group-item-green-400{color:#2b5f47;background-color:#daece4}html[data-netbox-color-mode=dark] .list-group-item-green-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-400.list-group-item-action:focus{color:#2b5f47;background-color:#c4d4cd}html[data-netbox-color-mode=dark] .list-group-item-green-400.list-group-item-action.active{color:#fff;background-color:#2b5f47;border-color:#2b5f47}html[data-netbox-color-mode=dark] .list-group-item-green-500{color:#0f5132;background-color:#d1e7dd}html[data-netbox-color-mode=dark] .list-group-item-green-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-500.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}html[data-netbox-color-mode=dark] .list-group-item-green-500.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}html[data-netbox-color-mode=dark] .list-group-item-green-600{color:#0c4128;background-color:#d0e2d9}html[data-netbox-color-mode=dark] .list-group-item-green-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-600.list-group-item-action:focus{color:#0c4128;background-color:#bbcbc3}html[data-netbox-color-mode=dark] .list-group-item-green-600.list-group-item-action.active{color:#fff;background-color:#0c4128;border-color:#0c4128}html[data-netbox-color-mode=dark] .list-group-item-green-700{color:#09311e;background-color:#cfdcd6}html[data-netbox-color-mode=dark] .list-group-item-green-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-700.list-group-item-action:focus{color:#09311e;background-color:#bac6c1}html[data-netbox-color-mode=dark] .list-group-item-green-700.list-group-item-action.active{color:#fff;background-color:#09311e;border-color:#09311e}html[data-netbox-color-mode=dark] .list-group-item-green-800{color:#062014;background-color:#ced7d3}html[data-netbox-color-mode=dark] .list-group-item-green-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-800.list-group-item-action:focus{color:#062014;background-color:#b9c2be}html[data-netbox-color-mode=dark] .list-group-item-green-800.list-group-item-action.active{color:#fff;background-color:#062014;border-color:#062014}html[data-netbox-color-mode=dark] .list-group-item-green-900{color:#03100a;background-color:#cdd1cf}html[data-netbox-color-mode=dark] .list-group-item-green-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-900.list-group-item-action:focus{color:#03100a;background-color:#b9bcba}html[data-netbox-color-mode=dark] .list-group-item-green-900.list-group-item-action.active{color:#fff;background-color:#03100a;border-color:#03100a}html[data-netbox-color-mode=dark] .list-group-item-blue-100{color:#535a66;background-color:#f5f9ff}html[data-netbox-color-mode=dark] .list-group-item-blue-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-100.list-group-item-action:focus{color:#535a66;background-color:#dde0e6}html[data-netbox-color-mode=dark] .list-group-item-blue-100.list-group-item-action.active{color:#fff;background-color:#535a66;border-color:#535a66}html[data-netbox-color-mode=dark] .list-group-item-blue-200{color:#3f4f66;background-color:#ecf3ff}html[data-netbox-color-mode=dark] .list-group-item-blue-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-200.list-group-item-action:focus{color:#3f4f66;background-color:#d4dbe6}html[data-netbox-color-mode=dark] .list-group-item-blue-200.list-group-item-action.active{color:#fff;background-color:#3f4f66;border-color:#3f4f66}html[data-netbox-color-mode=dark] .list-group-item-blue-300{color:#426598;background-color:#e2eeff}html[data-netbox-color-mode=dark] .list-group-item-blue-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-300.list-group-item-action:focus{color:#426598;background-color:#cbd6e6}html[data-netbox-color-mode=dark] .list-group-item-blue-300.list-group-item-action.active{color:#fff;background-color:#426598;border-color:#426598}html[data-netbox-color-mode=dark] .list-group-item-blue-400{color:#255398;background-color:#d8e8ff}html[data-netbox-color-mode=dark] .list-group-item-blue-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-400.list-group-item-action:focus{color:#255398;background-color:#c2d1e6}html[data-netbox-color-mode=dark] .list-group-item-blue-400.list-group-item-action.active{color:#fff;background-color:#255398;border-color:#255398}html[data-netbox-color-mode=dark] .list-group-item-blue-500{color:#084298;background-color:#cfe2ff}html[data-netbox-color-mode=dark] .list-group-item-blue-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-500.list-group-item-action:focus{color:#084298;background-color:#bacbe6}html[data-netbox-color-mode=dark] .list-group-item-blue-500.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}html[data-netbox-color-mode=dark] .list-group-item-blue-600{color:#063579;background-color:#cedef4}html[data-netbox-color-mode=dark] .list-group-item-blue-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-600.list-group-item-action:focus{color:#063579;background-color:#b9c8dc}html[data-netbox-color-mode=dark] .list-group-item-blue-600.list-group-item-action.active{color:#fff;background-color:#063579;border-color:#063579}html[data-netbox-color-mode=dark] .list-group-item-blue-700{color:#05285b;background-color:#ced9ea}html[data-netbox-color-mode=dark] .list-group-item-blue-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-700.list-group-item-action:focus{color:#05285b;background-color:#b9c3d3}html[data-netbox-color-mode=dark] .list-group-item-blue-700.list-group-item-action.active{color:#fff;background-color:#05285b;border-color:#05285b}html[data-netbox-color-mode=dark] .list-group-item-blue-800{color:#031a3d;background-color:#cdd5e0}html[data-netbox-color-mode=dark] .list-group-item-blue-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-800.list-group-item-action:focus{color:#031a3d;background-color:#b9c0ca}html[data-netbox-color-mode=dark] .list-group-item-blue-800.list-group-item-action.active{color:#fff;background-color:#031a3d;border-color:#031a3d}html[data-netbox-color-mode=dark] .list-group-item-blue-900{color:#020d1f;background-color:#cdd0d6}html[data-netbox-color-mode=dark] .list-group-item-blue-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-900.list-group-item-action:focus{color:#020d1f;background-color:#b9bbc1}html[data-netbox-color-mode=dark] .list-group-item-blue-900.list-group-item-action.active{color:#fff;background-color:#020d1f;border-color:#020d1f}html[data-netbox-color-mode=dark] .list-group-item-cyan-100{color:#536265;background-color:#f5fdfe}html[data-netbox-color-mode=dark] .list-group-item-cyan-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-100.list-group-item-action:focus{color:#536265;background-color:#dde4e5}html[data-netbox-color-mode=dark] .list-group-item-cyan-100.list-group-item-action.active{color:#fff;background-color:#536265;border-color:#536265}html[data-netbox-color-mode=dark] .list-group-item-cyan-200{color:#3f5e64;background-color:#ecfbfe}html[data-netbox-color-mode=dark] .list-group-item-cyan-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-200.list-group-item-action:focus{color:#3f5e64;background-color:#d4e2e5}html[data-netbox-color-mode=dark] .list-group-item-cyan-200.list-group-item-action.active{color:#fff;background-color:#3f5e64;border-color:#3f5e64}html[data-netbox-color-mode=dark] .list-group-item-cyan-300{color:#2c5962;background-color:#e2f9fd}html[data-netbox-color-mode=dark] .list-group-item-cyan-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-300.list-group-item-action:focus{color:#2c5962;background-color:#cbe0e4}html[data-netbox-color-mode=dark] .list-group-item-cyan-300.list-group-item-action.active{color:#fff;background-color:#2c5962;border-color:#2c5962}html[data-netbox-color-mode=dark] .list-group-item-cyan-400{color:#185561;background-color:#d8f7fd}html[data-netbox-color-mode=dark] .list-group-item-cyan-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-400.list-group-item-action:focus{color:#185561;background-color:#c2dee4}html[data-netbox-color-mode=dark] .list-group-item-cyan-400.list-group-item-action.active{color:#fff;background-color:#185561;border-color:#185561}html[data-netbox-color-mode=dark] .list-group-item-cyan-500{color:#055160;background-color:#cff4fc}html[data-netbox-color-mode=dark] .list-group-item-cyan-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-500.list-group-item-action:focus{color:#055160;background-color:#badce3}html[data-netbox-color-mode=dark] .list-group-item-cyan-500.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}html[data-netbox-color-mode=dark] .list-group-item-cyan-600{color:#066173;background-color:#ceecf2}html[data-netbox-color-mode=dark] .list-group-item-cyan-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-600.list-group-item-action:focus{color:#066173;background-color:#b9d4da}html[data-netbox-color-mode=dark] .list-group-item-cyan-600.list-group-item-action.active{color:#fff;background-color:#066173;border-color:#066173}html[data-netbox-color-mode=dark] .list-group-item-cyan-700{color:#054956;background-color:#cee4e9}html[data-netbox-color-mode=dark] .list-group-item-cyan-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-700.list-group-item-action:focus{color:#054956;background-color:#b9cdd2}html[data-netbox-color-mode=dark] .list-group-item-cyan-700.list-group-item-action.active{color:#fff;background-color:#054956;border-color:#054956}html[data-netbox-color-mode=dark] .list-group-item-cyan-800{color:#03313a;background-color:#cddcdf}html[data-netbox-color-mode=dark] .list-group-item-cyan-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-800.list-group-item-action:focus{color:#03313a;background-color:#b9c6c9}html[data-netbox-color-mode=dark] .list-group-item-cyan-800.list-group-item-action.active{color:#fff;background-color:#03313a;border-color:#03313a}html[data-netbox-color-mode=dark] .list-group-item-cyan-900{color:#02181d;background-color:#cdd4d6}html[data-netbox-color-mode=dark] .list-group-item-cyan-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-900.list-group-item-action:focus{color:#02181d;background-color:#b9bfc1}html[data-netbox-color-mode=dark] .list-group-item-cyan-900.list-group-item-action.active{color:#fff;background-color:#02181d;border-color:#02181d}html[data-netbox-color-mode=dark] .list-group-item-indigo-100{color:#5a5365;background-color:#f9f5fe}html[data-netbox-color-mode=dark] .list-group-item-indigo-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-100.list-group-item-action:focus{color:#5a5365;background-color:#e0dde5}html[data-netbox-color-mode=dark] .list-group-item-indigo-100.list-group-item-action.active{color:#fff;background-color:#5a5365;border-color:#5a5365}html[data-netbox-color-mode=dark] .list-group-item-indigo-200{color:#745f96;background-color:#f3ecfe}html[data-netbox-color-mode=dark] .list-group-item-indigo-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-200.list-group-item-action:focus{color:#745f96;background-color:#dbd4e5}html[data-netbox-color-mode=dark] .list-group-item-indigo-200.list-group-item-action.active{color:#fff;background-color:#745f96;border-color:#745f96}html[data-netbox-color-mode=dark] .list-group-item-indigo-300{color:#624394;background-color:#ede2fd}html[data-netbox-color-mode=dark] .list-group-item-indigo-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-300.list-group-item-action:focus{color:#624394;background-color:#d5cbe4}html[data-netbox-color-mode=dark] .list-group-item-indigo-300.list-group-item-action.active{color:#fff;background-color:#624394;border-color:#624394}html[data-netbox-color-mode=dark] .list-group-item-indigo-400{color:#502693;background-color:#e7d9fd}html[data-netbox-color-mode=dark] .list-group-item-indigo-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-400.list-group-item-action:focus{color:#502693;background-color:#d0c3e4}html[data-netbox-color-mode=dark] .list-group-item-indigo-400.list-group-item-action.active{color:#fff;background-color:#502693;border-color:#502693}html[data-netbox-color-mode=dark] .list-group-item-indigo-500{color:#3d0a91;background-color:#e0cffc}html[data-netbox-color-mode=dark] .list-group-item-indigo-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-500.list-group-item-action:focus{color:#3d0a91;background-color:#cabae3}html[data-netbox-color-mode=dark] .list-group-item-indigo-500.list-group-item-action.active{color:#fff;background-color:#3d0a91;border-color:#3d0a91}html[data-netbox-color-mode=dark] .list-group-item-indigo-600{color:#310874;background-color:#dccff3}html[data-netbox-color-mode=dark] .list-group-item-indigo-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-600.list-group-item-action:focus{color:#310874;background-color:#c6badb}html[data-netbox-color-mode=dark] .list-group-item-indigo-600.list-group-item-action.active{color:#fff;background-color:#310874;border-color:#310874}html[data-netbox-color-mode=dark] .list-group-item-indigo-700{color:#250657;background-color:#d8cee9}html[data-netbox-color-mode=dark] .list-group-item-indigo-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-700.list-group-item-action:focus{color:#250657;background-color:#c2b9d2}html[data-netbox-color-mode=dark] .list-group-item-indigo-700.list-group-item-action.active{color:#fff;background-color:#250657;border-color:#250657}html[data-netbox-color-mode=dark] .list-group-item-indigo-800{color:#19043a;background-color:#d4cddf}html[data-netbox-color-mode=dark] .list-group-item-indigo-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-800.list-group-item-action:focus{color:#19043a;background-color:#bfb9c9}html[data-netbox-color-mode=dark] .list-group-item-indigo-800.list-group-item-action.active{color:#fff;background-color:#19043a;border-color:#19043a}html[data-netbox-color-mode=dark] .list-group-item-indigo-900{color:#0c021d;background-color:#d0cdd6}html[data-netbox-color-mode=dark] .list-group-item-indigo-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-900.list-group-item-action:focus{color:#0c021d;background-color:#bbb9c1}html[data-netbox-color-mode=dark] .list-group-item-indigo-900.list-group-item-action.active{color:#fff;background-color:#0c021d;border-color:#0c021d}html[data-netbox-color-mode=dark] .list-group-item-purple-100{color:#5a5761;background-color:#f9f7fd}html[data-netbox-color-mode=dark] .list-group-item-purple-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-100.list-group-item-action:focus{color:#5a5761;background-color:#e0dee4}html[data-netbox-color-mode=dark] .list-group-item-purple-100.list-group-item-action.active{color:#fff;background-color:#5a5761;border-color:#5a5761}html[data-netbox-color-mode=dark] .list-group-item-purple-200{color:#4f485c;background-color:#f3f0fa}html[data-netbox-color-mode=dark] .list-group-item-purple-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-200.list-group-item-action:focus{color:#4f485c;background-color:#dbd8e1}html[data-netbox-color-mode=dark] .list-group-item-purple-200.list-group-item-action.active{color:#fff;background-color:#4f485c;border-color:#4f485c}html[data-netbox-color-mode=dark] .list-group-item-purple-300{color:#655583;background-color:#eee8f8}html[data-netbox-color-mode=dark] .list-group-item-purple-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-300.list-group-item-action:focus{color:#655583;background-color:#d6d1df}html[data-netbox-color-mode=dark] .list-group-item-purple-300.list-group-item-action.active{color:#fff;background-color:#655583;border-color:#655583}html[data-netbox-color-mode=dark] .list-group-item-purple-400{color:#543e7b;background-color:#e8e1f5}html[data-netbox-color-mode=dark] .list-group-item-purple-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-400.list-group-item-action:focus{color:#543e7b;background-color:#d1cbdd}html[data-netbox-color-mode=dark] .list-group-item-purple-400.list-group-item-action.active{color:#fff;background-color:#543e7b;border-color:#543e7b}html[data-netbox-color-mode=dark] .list-group-item-purple-500{color:#432874;background-color:#e2d9f3}html[data-netbox-color-mode=dark] .list-group-item-purple-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-500.list-group-item-action:focus{color:#432874;background-color:#cbc3db}html[data-netbox-color-mode=dark] .list-group-item-purple-500.list-group-item-action.active{color:#fff;background-color:#432874;border-color:#432874}html[data-netbox-color-mode=dark] .list-group-item-purple-600{color:#35205c;background-color:#ded7eb}html[data-netbox-color-mode=dark] .list-group-item-purple-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-600.list-group-item-action:focus{color:#35205c;background-color:#c8c2d4}html[data-netbox-color-mode=dark] .list-group-item-purple-600.list-group-item-action.active{color:#fff;background-color:#35205c;border-color:#35205c}html[data-netbox-color-mode=dark] .list-group-item-purple-700{color:#281846;background-color:#d9d4e3}html[data-netbox-color-mode=dark] .list-group-item-purple-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-700.list-group-item-action:focus{color:#281846;background-color:#c3bfcc}html[data-netbox-color-mode=dark] .list-group-item-purple-700.list-group-item-action.active{color:#fff;background-color:#281846;border-color:#281846}html[data-netbox-color-mode=dark] .list-group-item-purple-800{color:#1a102e;background-color:#d5d1db}html[data-netbox-color-mode=dark] .list-group-item-purple-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-800.list-group-item-action:focus{color:#1a102e;background-color:#c0bcc5}html[data-netbox-color-mode=dark] .list-group-item-purple-800.list-group-item-action.active{color:#fff;background-color:#1a102e;border-color:#1a102e}html[data-netbox-color-mode=dark] .list-group-item-purple-900{color:#0d0817;background-color:#d0cfd4}html[data-netbox-color-mode=dark] .list-group-item-purple-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-900.list-group-item-action:focus{color:#0d0817;background-color:#bbbabf}html[data-netbox-color-mode=dark] .list-group-item-purple-900.list-group-item-action.active{color:#fff;background-color:#0d0817;border-color:#0d0817}html[data-netbox-color-mode=dark] .list-group-item-pink-100{color:#63565c;background-color:#fdf7fa}html[data-netbox-color-mode=dark] .list-group-item-pink-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-100.list-group-item-action:focus{color:#63565c;background-color:#e4dee1}html[data-netbox-color-mode=dark] .list-group-item-pink-100.list-group-item-action.active{color:#fff;background-color:#63565c;border-color:#63565c}html[data-netbox-color-mode=dark] .list-group-item-pink-200{color:#604552;background-color:#fceff5}html[data-netbox-color-mode=dark] .list-group-item-pink-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-200.list-group-item-action:focus{color:#604552;background-color:#e3d7dd}html[data-netbox-color-mode=dark] .list-group-item-pink-200.list-group-item-action.active{color:#fff;background-color:#604552;border-color:#604552}html[data-netbox-color-mode=dark] .list-group-item-pink-300{color:#8a506d;background-color:#fae7f0}html[data-netbox-color-mode=dark] .list-group-item-pink-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-300.list-group-item-action:focus{color:#8a506d;background-color:#e1d0d8}html[data-netbox-color-mode=dark] .list-group-item-pink-300.list-group-item-action.active{color:#fff;background-color:#8a506d;border-color:#8a506d}html[data-netbox-color-mode=dark] .list-group-item-pink-400{color:#85375e;background-color:#f8deeb}html[data-netbox-color-mode=dark] .list-group-item-pink-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-400.list-group-item-action:focus{color:#85375e;background-color:#dfc8d4}html[data-netbox-color-mode=dark] .list-group-item-pink-400.list-group-item-action.active{color:#fff;background-color:#85375e;border-color:#85375e}html[data-netbox-color-mode=dark] .list-group-item-pink-500{color:#801f4f;background-color:#f7d6e6}html[data-netbox-color-mode=dark] .list-group-item-pink-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-500.list-group-item-action:focus{color:#801f4f;background-color:#dec1cf}html[data-netbox-color-mode=dark] .list-group-item-pink-500.list-group-item-action.active{color:#fff;background-color:#801f4f;border-color:#801f4f}html[data-netbox-color-mode=dark] .list-group-item-pink-600{color:#671940;background-color:#eed4e1}html[data-netbox-color-mode=dark] .list-group-item-pink-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-600.list-group-item-action:focus{color:#671940;background-color:#d6bfcb}html[data-netbox-color-mode=dark] .list-group-item-pink-600.list-group-item-action.active{color:#fff;background-color:#671940;border-color:#671940}html[data-netbox-color-mode=dark] .list-group-item-pink-700{color:#4d132f;background-color:#e6d2dc}html[data-netbox-color-mode=dark] .list-group-item-pink-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-700.list-group-item-action:focus{color:#4d132f;background-color:#cfbdc6}html[data-netbox-color-mode=dark] .list-group-item-pink-700.list-group-item-action.active{color:#fff;background-color:#4d132f;border-color:#4d132f}html[data-netbox-color-mode=dark] .list-group-item-pink-800{color:#340c20;background-color:#ddd0d7}html[data-netbox-color-mode=dark] .list-group-item-pink-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-800.list-group-item-action:focus{color:#340c20;background-color:#c7bbc2}html[data-netbox-color-mode=dark] .list-group-item-pink-800.list-group-item-action.active{color:#fff;background-color:#340c20;border-color:#340c20}html[data-netbox-color-mode=dark] .list-group-item-pink-900{color:#1a0610;background-color:#d5ced1}html[data-netbox-color-mode=dark] .list-group-item-pink-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-900.list-group-item-action:focus{color:#1a0610;background-color:#c0b9bc}html[data-netbox-color-mode=dark] .list-group-item-pink-900.list-group-item-action.active{color:#fff;background-color:#1a0610;border-color:#1a0610}html[data-netbox-color-mode=dark] .btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#fff;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}html[data-netbox-color-mode=dark] .btn-close:hover{color:#fff;text-decoration:none;opacity:.75}html[data-netbox-color-mode=dark] .btn-close:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40;opacity:1}html[data-netbox-color-mode=dark] .btn-close:disabled,html[data-netbox-color-mode=dark] .btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}html[data-netbox-color-mode=dark] .btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}html[data-netbox-color-mode=dark] .toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:#ffffffd9;background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem #00000026;border-radius:.375rem}html[data-netbox-color-mode=dark] .toast:not(.showing):not(.show){opacity:0}html[data-netbox-color-mode=dark] .toast.hide{display:none}html[data-netbox-color-mode=dark] .toast-container{width:max-content;max-width:100%;pointer-events:none}html[data-netbox-color-mode=dark] .toast-container>:not(:last-child){margin-bottom:.75rem}html[data-netbox-color-mode=dark] .toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:#ffffffd9;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}html[data-netbox-color-mode=dark] .toast-body{padding:.75rem;word-wrap:break-word}html[data-netbox-color-mode=dark] .modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}html[data-netbox-color-mode=dark] .modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade html[data-netbox-color-mode=dark] .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion: reduce){.modal.fade html[data-netbox-color-mode=dark] .modal-dialog{transition:none}}.modal.show html[data-netbox-color-mode=dark] .modal-dialog{transform:none}.modal.modal-static html[data-netbox-color-mode=dark] .modal-dialog{transform:scale(1.02)}html[data-netbox-color-mode=dark] .modal-dialog-scrollable{height:calc(100% - 1rem)}html[data-netbox-color-mode=dark] .modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}html[data-netbox-color-mode=dark] .modal-dialog-scrollable .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}html[data-netbox-color-mode=dark] .modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#343a40;background-clip:padding-box;border:1px solid rgba(255,255,255,.2);border-radius:.75rem;outline:0}html[data-netbox-color-mode=dark] .modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}html[data-netbox-color-mode=dark] .modal-backdrop.fade{opacity:0}html[data-netbox-color-mode=dark] .modal-backdrop.show{opacity:.5}html[data-netbox-color-mode=dark] .modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem;border-bottom:1px solid #495057;border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}html[data-netbox-color-mode=dark] .modal-header .btn-close{padding:.5rem;margin:-.5rem -.5rem -.5rem auto}html[data-netbox-color-mode=dark] .modal-title{margin-bottom:0;line-height:1.5}html[data-netbox-color-mode=dark] .modal-body{position:relative;flex:1 1 auto;padding:1rem}html[data-netbox-color-mode=dark] .modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #495057;border-bottom-right-radius:calc(.75rem - 1px);border-bottom-left-radius:calc(.75rem - 1px)}html[data-netbox-color-mode=dark] .modal-footer>*{margin:.25rem}@media (min-width: 576px){html[data-netbox-color-mode=dark] .modal-dialog{max-width:500px;margin:1.75rem auto}html[data-netbox-color-mode=dark] .modal-dialog-scrollable{height:calc(100% - 3.5rem)}html[data-netbox-color-mode=dark] .modal-dialog-centered{min-height:calc(100% - 3.5rem)}html[data-netbox-color-mode=dark] .modal-sm{max-width:300px}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .modal-lg,html[data-netbox-color-mode=dark] .modal-xl{max-width:800px}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .modal-xl{max-width:1140px}}html[data-netbox-color-mode=dark] .modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen .modal-footer{border-radius:0}@media (max-width: 575.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width: 767.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width: 1199.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width: 1399.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-footer{border-radius:0}}html[data-netbox-color-mode=dark] .tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}html[data-netbox-color-mode=dark] .tooltip.show{opacity:.9}html[data-netbox-color-mode=dark] .tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}html[data-netbox-color-mode=dark] .tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}html[data-netbox-color-mode=dark] .bs-tooltip-top,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}html[data-netbox-color-mode=dark] .bs-tooltip-top .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}html[data-netbox-color-mode=dark] .bs-tooltip-top .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#495057}html[data-netbox-color-mode=dark] .bs-tooltip-end,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}html[data-netbox-color-mode=dark] .bs-tooltip-end .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}html[data-netbox-color-mode=dark] .bs-tooltip-end .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#495057}html[data-netbox-color-mode=dark] .bs-tooltip-bottom,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}html[data-netbox-color-mode=dark] .bs-tooltip-bottom .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}html[data-netbox-color-mode=dark] .bs-tooltip-bottom .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#495057}html[data-netbox-color-mode=dark] .bs-tooltip-start,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}html[data-netbox-color-mode=dark] .bs-tooltip-start .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}html[data-netbox-color-mode=dark] .bs-tooltip-start .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#495057}html[data-netbox-color-mode=dark] .tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#495057;border-radius:.375rem}html[data-netbox-color-mode=dark] .popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#495057;background-clip:padding-box;border:1px solid rgba(255,255,255,.2);border-radius:.75rem}html[data-netbox-color-mode=dark] .popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}html[data-netbox-color-mode=dark] .popover .popover-arrow:before,html[data-netbox-color-mode=dark] .popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-.5rem - 1px)}html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#ffffff40}html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#495057}html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#ffffff40}html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#495057}html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-.5rem - 1px)}html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#ffffff40}html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#495057}html[data-netbox-color-mode=dark] .bs-popover-bottom .popover-header:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #454b52}html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#ffffff40}html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#495057}html[data-netbox-color-mode=dark] .popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#454b52;border-bottom:1px solid rgba(255,255,255,.2);border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}html[data-netbox-color-mode=dark] .popover-header:empty{display:none}html[data-netbox-color-mode=dark] .popover-body{padding:1rem;color:#fff}html[data-netbox-color-mode=dark] .carousel{position:relative}html[data-netbox-color-mode=dark] .carousel.pointer-event{touch-action:pan-y}html[data-netbox-color-mode=dark] .carousel-inner{position:relative;width:100%;overflow:hidden}html[data-netbox-color-mode=dark] .carousel-inner:after{display:block;clear:both;content:""}html[data-netbox-color-mode=dark] .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){html[data-netbox-color-mode=dark] .carousel-item{transition:none}}html[data-netbox-color-mode=dark] .carousel-item.active,html[data-netbox-color-mode=dark] .carousel-item-next,html[data-netbox-color-mode=dark] .carousel-item-prev{display:block}html[data-netbox-color-mode=dark] .carousel-item-next:not(.carousel-item-start),html[data-netbox-color-mode=dark] .active.carousel-item-end{transform:translate(100%)}html[data-netbox-color-mode=dark] .carousel-item-prev:not(.carousel-item-end),html[data-netbox-color-mode=dark] .active.carousel-item-start{transform:translate(-100%)}html[data-netbox-color-mode=dark] .carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}html[data-netbox-color-mode=dark] .carousel-fade .carousel-item.active,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item-next.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-end{transition:none}}html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-next{transition:none}}html[data-netbox-color-mode=dark] .carousel-control-prev:hover,html[data-netbox-color-mode=dark] .carousel-control-prev:focus,html[data-netbox-color-mode=dark] .carousel-control-next:hover,html[data-netbox-color-mode=dark] .carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}html[data-netbox-color-mode=dark] .carousel-control-prev{left:0}html[data-netbox-color-mode=dark] .carousel-control-next{right:0}html[data-netbox-color-mode=dark] .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}html[data-netbox-color-mode=dark] .carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .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%;list-style:none}html[data-netbox-color-mode=dark] .carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .carousel-indicators [data-bs-target]{transition:none}}html[data-netbox-color-mode=dark] .carousel-indicators .active{opacity:1}html[data-netbox-color-mode=dark] .carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}html[data-netbox-color-mode=dark] .carousel-dark .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}html[data-netbox-color-mode=dark] .carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}html[data-netbox-color-mode=dark] .carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg)}}html[data-netbox-color-mode=dark] .spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}html[data-netbox-color-mode=dark] .spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}html[data-netbox-color-mode=dark] .spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}html[data-netbox-color-mode=dark] .spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .spinner-border,html[data-netbox-color-mode=dark] .spinner-grow{animation-duration:1.5s}}html[data-netbox-color-mode=dark] .clearfix:after{display:block;clear:both;content:""}html[data-netbox-color-mode=dark] .link-primary{color:#6ea8fe}html[data-netbox-color-mode=dark] .link-primary:hover,html[data-netbox-color-mode=dark] .link-primary:focus{color:#8bb9fe}html[data-netbox-color-mode=dark] .link-secondary{color:#adb5bd}html[data-netbox-color-mode=dark] .link-secondary:hover,html[data-netbox-color-mode=dark] .link-secondary:focus{color:#bdc4ca}html[data-netbox-color-mode=dark] .link-success{color:#75b798}html[data-netbox-color-mode=dark] .link-success:hover,html[data-netbox-color-mode=dark] .link-success:focus{color:#91c5ad}html[data-netbox-color-mode=dark] .link-info{color:#6edff6}html[data-netbox-color-mode=dark] .link-info:hover,html[data-netbox-color-mode=dark] .link-info:focus{color:#8be5f8}html[data-netbox-color-mode=dark] .link-warning{color:#ffda6a}html[data-netbox-color-mode=dark] .link-warning:hover,html[data-netbox-color-mode=dark] .link-warning:focus{color:#ffe188}html[data-netbox-color-mode=dark] .link-danger{color:#ea868f}html[data-netbox-color-mode=dark] .link-danger:hover,html[data-netbox-color-mode=dark] .link-danger:focus{color:#ee9ea5}html[data-netbox-color-mode=dark] .link-light{color:#dee2e6}html[data-netbox-color-mode=dark] .link-light:hover,html[data-netbox-color-mode=dark] .link-light:focus{color:#e5e8eb}html[data-netbox-color-mode=dark] .link-dark{color:#adb5bd}html[data-netbox-color-mode=dark] .link-dark:hover,html[data-netbox-color-mode=dark] .link-dark:focus{color:#bdc4ca}html[data-netbox-color-mode=dark] .link-red{color:#ea868f}html[data-netbox-color-mode=dark] .link-red:hover,html[data-netbox-color-mode=dark] .link-red:focus{color:#ee9ea5}html[data-netbox-color-mode=dark] .link-yellow{color:#ffda6a}html[data-netbox-color-mode=dark] .link-yellow:hover,html[data-netbox-color-mode=dark] .link-yellow:focus{color:#ffe188}html[data-netbox-color-mode=dark] .link-green{color:#75b798}html[data-netbox-color-mode=dark] .link-green:hover,html[data-netbox-color-mode=dark] .link-green:focus{color:#91c5ad}html[data-netbox-color-mode=dark] .link-blue{color:#6ea8fe}html[data-netbox-color-mode=dark] .link-blue:hover,html[data-netbox-color-mode=dark] .link-blue:focus{color:#8bb9fe}html[data-netbox-color-mode=dark] .link-cyan{color:#6edff6}html[data-netbox-color-mode=dark] .link-cyan:hover,html[data-netbox-color-mode=dark] .link-cyan:focus{color:#8be5f8}html[data-netbox-color-mode=dark] .link-indigo{color:#a370f7}html[data-netbox-color-mode=dark] .link-indigo:hover,html[data-netbox-color-mode=dark] .link-indigo:focus{color:#b58df9}html[data-netbox-color-mode=dark] .link-purple{color:#a98eda}html[data-netbox-color-mode=dark] .link-purple:hover,html[data-netbox-color-mode=dark] .link-purple:focus{color:#baa5e1}html[data-netbox-color-mode=dark] .link-pink{color:#e685b5}html[data-netbox-color-mode=dark] .link-pink:hover,html[data-netbox-color-mode=dark] .link-pink:focus{color:#eb9dc4}html[data-netbox-color-mode=dark] .link-darker{color:#1b1f22}html[data-netbox-color-mode=dark] .link-darker:hover,html[data-netbox-color-mode=dark] .link-darker:focus{color:#16191b}html[data-netbox-color-mode=dark] .link-darkest{color:#171b1d}html[data-netbox-color-mode=dark] .link-darkest:hover,html[data-netbox-color-mode=dark] .link-darkest:focus{color:#121617}html[data-netbox-color-mode=dark] .link-gray{color:#ced4da}html[data-netbox-color-mode=dark] .link-gray:hover,html[data-netbox-color-mode=dark] .link-gray:focus{color:#d8dde1}html[data-netbox-color-mode=dark] .link-gray-100{color:#f8f9fa}html[data-netbox-color-mode=dark] .link-gray-100:hover,html[data-netbox-color-mode=dark] .link-gray-100:focus{color:#f9fafb}html[data-netbox-color-mode=dark] .link-gray-200{color:#e9ecef}html[data-netbox-color-mode=dark] .link-gray-200:hover,html[data-netbox-color-mode=dark] .link-gray-200:focus{color:#edf0f2}html[data-netbox-color-mode=dark] .link-gray-300{color:#dee2e6}html[data-netbox-color-mode=dark] .link-gray-300:hover,html[data-netbox-color-mode=dark] .link-gray-300:focus{color:#e5e8eb}html[data-netbox-color-mode=dark] .link-gray-400{color:#ced4da}html[data-netbox-color-mode=dark] .link-gray-400:hover,html[data-netbox-color-mode=dark] .link-gray-400:focus{color:#d8dde1}html[data-netbox-color-mode=dark] .link-gray-500{color:#adb5bd}html[data-netbox-color-mode=dark] .link-gray-500:hover,html[data-netbox-color-mode=dark] .link-gray-500:focus{color:#bdc4ca}html[data-netbox-color-mode=dark] .link-gray-600{color:#6c757d}html[data-netbox-color-mode=dark] .link-gray-600:hover,html[data-netbox-color-mode=dark] .link-gray-600:focus{color:#565e64}html[data-netbox-color-mode=dark] .link-gray-700{color:#495057}html[data-netbox-color-mode=dark] .link-gray-700:hover,html[data-netbox-color-mode=dark] .link-gray-700:focus{color:#3a4046}html[data-netbox-color-mode=dark] .link-gray-800{color:#343a40}html[data-netbox-color-mode=dark] .link-gray-800:hover,html[data-netbox-color-mode=dark] .link-gray-800:focus{color:#2a2e33}html[data-netbox-color-mode=dark] .link-gray-900{color:#212529}html[data-netbox-color-mode=dark] .link-gray-900:hover,html[data-netbox-color-mode=dark] .link-gray-900:focus{color:#1a1e21}html[data-netbox-color-mode=dark] .link-red-100{color:#f8d7da}html[data-netbox-color-mode=dark] .link-red-100:hover,html[data-netbox-color-mode=dark] .link-red-100:focus{color:#f9dfe1}html[data-netbox-color-mode=dark] .link-red-200{color:#f1aeb5}html[data-netbox-color-mode=dark] .link-red-200:hover,html[data-netbox-color-mode=dark] .link-red-200:focus{color:#f4bec4}html[data-netbox-color-mode=dark] .link-red-300{color:#ea868f}html[data-netbox-color-mode=dark] .link-red-300:hover,html[data-netbox-color-mode=dark] .link-red-300:focus{color:#ee9ea5}html[data-netbox-color-mode=dark] .link-red-400{color:#e35d6a}html[data-netbox-color-mode=dark] .link-red-400:hover,html[data-netbox-color-mode=dark] .link-red-400:focus{color:#e97d88}html[data-netbox-color-mode=dark] .link-red-500{color:#dc3545}html[data-netbox-color-mode=dark] .link-red-500:hover,html[data-netbox-color-mode=dark] .link-red-500:focus{color:#b02a37}html[data-netbox-color-mode=dark] .link-red-600{color:#b02a37}html[data-netbox-color-mode=dark] .link-red-600:hover,html[data-netbox-color-mode=dark] .link-red-600:focus{color:#8d222c}html[data-netbox-color-mode=dark] .link-red-700{color:#842029}html[data-netbox-color-mode=dark] .link-red-700:hover,html[data-netbox-color-mode=dark] .link-red-700:focus{color:#6a1a21}html[data-netbox-color-mode=dark] .link-red-800{color:#58151c}html[data-netbox-color-mode=dark] .link-red-800:hover,html[data-netbox-color-mode=dark] .link-red-800:focus{color:#461116}html[data-netbox-color-mode=dark] .link-red-900{color:#2c0b0e}html[data-netbox-color-mode=dark] .link-red-900:hover,html[data-netbox-color-mode=dark] .link-red-900:focus{color:#23090b}html[data-netbox-color-mode=dark] .link-yellow-100{color:#fff3cd}html[data-netbox-color-mode=dark] .link-yellow-100:hover,html[data-netbox-color-mode=dark] .link-yellow-100:focus{color:#fff5d7}html[data-netbox-color-mode=dark] .link-yellow-200{color:#ffe69c}html[data-netbox-color-mode=dark] .link-yellow-200:hover,html[data-netbox-color-mode=dark] .link-yellow-200:focus{color:#ffebb0}html[data-netbox-color-mode=dark] .link-yellow-300{color:#ffda6a}html[data-netbox-color-mode=dark] .link-yellow-300:hover,html[data-netbox-color-mode=dark] .link-yellow-300:focus{color:#ffe188}html[data-netbox-color-mode=dark] .link-yellow-400{color:#ffcd39}html[data-netbox-color-mode=dark] .link-yellow-400:hover,html[data-netbox-color-mode=dark] .link-yellow-400:focus{color:#ffd761}html[data-netbox-color-mode=dark] .link-yellow-500{color:#ffc107}html[data-netbox-color-mode=dark] .link-yellow-500:hover,html[data-netbox-color-mode=dark] .link-yellow-500:focus{color:#ffcd39}html[data-netbox-color-mode=dark] .link-yellow-600{color:#cc9a06}html[data-netbox-color-mode=dark] .link-yellow-600:hover,html[data-netbox-color-mode=dark] .link-yellow-600:focus{color:#d6ae38}html[data-netbox-color-mode=dark] .link-yellow-700{color:#997404}html[data-netbox-color-mode=dark] .link-yellow-700:hover,html[data-netbox-color-mode=dark] .link-yellow-700:focus{color:#ad9036}html[data-netbox-color-mode=dark] .link-yellow-800{color:#664d03}html[data-netbox-color-mode=dark] .link-yellow-800:hover,html[data-netbox-color-mode=dark] .link-yellow-800:focus{color:#523e02}html[data-netbox-color-mode=dark] .link-yellow-900{color:#332701}html[data-netbox-color-mode=dark] .link-yellow-900:hover,html[data-netbox-color-mode=dark] .link-yellow-900:focus{color:#291f01}html[data-netbox-color-mode=dark] .link-green-100{color:#d1e7dd}html[data-netbox-color-mode=dark] .link-green-100:hover,html[data-netbox-color-mode=dark] .link-green-100:focus{color:#daece4}html[data-netbox-color-mode=dark] .link-green-200{color:#a3cfbb}html[data-netbox-color-mode=dark] .link-green-200:hover,html[data-netbox-color-mode=dark] .link-green-200:focus{color:#b5d9c9}html[data-netbox-color-mode=dark] .link-green-300{color:#75b798}html[data-netbox-color-mode=dark] .link-green-300:hover,html[data-netbox-color-mode=dark] .link-green-300:focus{color:#91c5ad}html[data-netbox-color-mode=dark] .link-green-400{color:#479f76}html[data-netbox-color-mode=dark] .link-green-400:hover,html[data-netbox-color-mode=dark] .link-green-400:focus{color:#6cb291}html[data-netbox-color-mode=dark] .link-green-500{color:#198754}html[data-netbox-color-mode=dark] .link-green-500:hover,html[data-netbox-color-mode=dark] .link-green-500:focus{color:#146c43}html[data-netbox-color-mode=dark] .link-green-600{color:#146c43}html[data-netbox-color-mode=dark] .link-green-600:hover,html[data-netbox-color-mode=dark] .link-green-600:focus{color:#105636}html[data-netbox-color-mode=dark] .link-green-700{color:#0f5132}html[data-netbox-color-mode=dark] .link-green-700:hover,html[data-netbox-color-mode=dark] .link-green-700:focus{color:#0c4128}html[data-netbox-color-mode=dark] .link-green-800{color:#0a3622}html[data-netbox-color-mode=dark] .link-green-800:hover,html[data-netbox-color-mode=dark] .link-green-800:focus{color:#082b1b}html[data-netbox-color-mode=dark] .link-green-900{color:#051b11}html[data-netbox-color-mode=dark] .link-green-900:hover,html[data-netbox-color-mode=dark] .link-green-900:focus{color:#04160e}html[data-netbox-color-mode=dark] .link-blue-100{color:#cfe2ff}html[data-netbox-color-mode=dark] .link-blue-100:hover,html[data-netbox-color-mode=dark] .link-blue-100:focus{color:#d9e8ff}html[data-netbox-color-mode=dark] .link-blue-200{color:#9ec5fe}html[data-netbox-color-mode=dark] .link-blue-200:hover,html[data-netbox-color-mode=dark] .link-blue-200:focus{color:#b1d1fe}html[data-netbox-color-mode=dark] .link-blue-300{color:#6ea8fe}html[data-netbox-color-mode=dark] .link-blue-300:hover,html[data-netbox-color-mode=dark] .link-blue-300:focus{color:#8bb9fe}html[data-netbox-color-mode=dark] .link-blue-400{color:#3d8bfd}html[data-netbox-color-mode=dark] .link-blue-400:hover,html[data-netbox-color-mode=dark] .link-blue-400:focus{color:#64a2fd}html[data-netbox-color-mode=dark] .link-blue-500{color:#0d6efd}html[data-netbox-color-mode=dark] .link-blue-500:hover,html[data-netbox-color-mode=dark] .link-blue-500:focus{color:#0a58ca}html[data-netbox-color-mode=dark] .link-blue-600{color:#0a58ca}html[data-netbox-color-mode=dark] .link-blue-600:hover,html[data-netbox-color-mode=dark] .link-blue-600:focus{color:#0846a2}html[data-netbox-color-mode=dark] .link-blue-700{color:#084298}html[data-netbox-color-mode=dark] .link-blue-700:hover,html[data-netbox-color-mode=dark] .link-blue-700:focus{color:#06357a}html[data-netbox-color-mode=dark] .link-blue-800{color:#052c65}html[data-netbox-color-mode=dark] .link-blue-800:hover,html[data-netbox-color-mode=dark] .link-blue-800:focus{color:#042351}html[data-netbox-color-mode=dark] .link-blue-900{color:#031633}html[data-netbox-color-mode=dark] .link-blue-900:hover,html[data-netbox-color-mode=dark] .link-blue-900:focus{color:#021229}html[data-netbox-color-mode=dark] .link-cyan-100{color:#cff4fc}html[data-netbox-color-mode=dark] .link-cyan-100:hover,html[data-netbox-color-mode=dark] .link-cyan-100:focus{color:#d9f6fd}html[data-netbox-color-mode=dark] .link-cyan-200{color:#9eeaf9}html[data-netbox-color-mode=dark] .link-cyan-200:hover,html[data-netbox-color-mode=dark] .link-cyan-200:focus{color:#b1eefa}html[data-netbox-color-mode=dark] .link-cyan-300{color:#6edff6}html[data-netbox-color-mode=dark] .link-cyan-300:hover,html[data-netbox-color-mode=dark] .link-cyan-300:focus{color:#8be5f8}html[data-netbox-color-mode=dark] .link-cyan-400{color:#3dd5f3}html[data-netbox-color-mode=dark] .link-cyan-400:hover,html[data-netbox-color-mode=dark] .link-cyan-400:focus{color:#64ddf5}html[data-netbox-color-mode=dark] .link-cyan-500{color:#0dcaf0}html[data-netbox-color-mode=dark] .link-cyan-500:hover,html[data-netbox-color-mode=dark] .link-cyan-500:focus{color:#3dd5f3}html[data-netbox-color-mode=dark] .link-cyan-600{color:#0aa2c0}html[data-netbox-color-mode=dark] .link-cyan-600:hover,html[data-netbox-color-mode=dark] .link-cyan-600:focus{color:#3bb5cd}html[data-netbox-color-mode=dark] .link-cyan-700{color:#087990}html[data-netbox-color-mode=dark] .link-cyan-700:hover,html[data-netbox-color-mode=dark] .link-cyan-700:focus{color:#066173}html[data-netbox-color-mode=dark] .link-cyan-800{color:#055160}html[data-netbox-color-mode=dark] .link-cyan-800:hover,html[data-netbox-color-mode=dark] .link-cyan-800:focus{color:#04414d}html[data-netbox-color-mode=dark] .link-cyan-900{color:#032830}html[data-netbox-color-mode=dark] .link-cyan-900:hover,html[data-netbox-color-mode=dark] .link-cyan-900:focus{color:#022026}html[data-netbox-color-mode=dark] .link-indigo-100{color:#e0cffc}html[data-netbox-color-mode=dark] .link-indigo-100:hover,html[data-netbox-color-mode=dark] .link-indigo-100:focus{color:#e6d9fd}html[data-netbox-color-mode=dark] .link-indigo-200{color:#c29ffa}html[data-netbox-color-mode=dark] .link-indigo-200:hover,html[data-netbox-color-mode=dark] .link-indigo-200:focus{color:#ceb2fb}html[data-netbox-color-mode=dark] .link-indigo-300{color:#a370f7}html[data-netbox-color-mode=dark] .link-indigo-300:hover,html[data-netbox-color-mode=dark] .link-indigo-300:focus{color:#b58df9}html[data-netbox-color-mode=dark] .link-indigo-400{color:#8540f5}html[data-netbox-color-mode=dark] .link-indigo-400:hover,html[data-netbox-color-mode=dark] .link-indigo-400:focus{color:#6a33c4}html[data-netbox-color-mode=dark] .link-indigo-500{color:#6610f2}html[data-netbox-color-mode=dark] .link-indigo-500:hover,html[data-netbox-color-mode=dark] .link-indigo-500:focus{color:#520dc2}html[data-netbox-color-mode=dark] .link-indigo-600{color:#520dc2}html[data-netbox-color-mode=dark] .link-indigo-600:hover,html[data-netbox-color-mode=dark] .link-indigo-600:focus{color:#420a9b}html[data-netbox-color-mode=dark] .link-indigo-700{color:#3d0a91}html[data-netbox-color-mode=dark] .link-indigo-700:hover,html[data-netbox-color-mode=dark] .link-indigo-700:focus{color:#310874}html[data-netbox-color-mode=dark] .link-indigo-800{color:#290661}html[data-netbox-color-mode=dark] .link-indigo-800:hover,html[data-netbox-color-mode=dark] .link-indigo-800:focus{color:#21054e}html[data-netbox-color-mode=dark] .link-indigo-900{color:#140330}html[data-netbox-color-mode=dark] .link-indigo-900:hover,html[data-netbox-color-mode=dark] .link-indigo-900:focus{color:#100226}html[data-netbox-color-mode=dark] .link-purple-100{color:#e2d9f3}html[data-netbox-color-mode=dark] .link-purple-100:hover,html[data-netbox-color-mode=dark] .link-purple-100:focus{color:#e8e1f5}html[data-netbox-color-mode=dark] .link-purple-200{color:#c5b3e6}html[data-netbox-color-mode=dark] .link-purple-200:hover,html[data-netbox-color-mode=dark] .link-purple-200:focus{color:#d1c2eb}html[data-netbox-color-mode=dark] .link-purple-300{color:#a98eda}html[data-netbox-color-mode=dark] .link-purple-300:hover,html[data-netbox-color-mode=dark] .link-purple-300:focus{color:#baa5e1}html[data-netbox-color-mode=dark] .link-purple-400{color:#8c68cd}html[data-netbox-color-mode=dark] .link-purple-400:hover,html[data-netbox-color-mode=dark] .link-purple-400:focus{color:#a386d7}html[data-netbox-color-mode=dark] .link-purple-500{color:#6f42c1}html[data-netbox-color-mode=dark] .link-purple-500:hover,html[data-netbox-color-mode=dark] .link-purple-500:focus{color:#59359a}html[data-netbox-color-mode=dark] .link-purple-600{color:#59359a}html[data-netbox-color-mode=dark] .link-purple-600:hover,html[data-netbox-color-mode=dark] .link-purple-600:focus{color:#472a7b}html[data-netbox-color-mode=dark] .link-purple-700{color:#432874}html[data-netbox-color-mode=dark] .link-purple-700:hover,html[data-netbox-color-mode=dark] .link-purple-700:focus{color:#36205d}html[data-netbox-color-mode=dark] .link-purple-800{color:#2c1a4d}html[data-netbox-color-mode=dark] .link-purple-800:hover,html[data-netbox-color-mode=dark] .link-purple-800:focus{color:#23153e}html[data-netbox-color-mode=dark] .link-purple-900{color:#160d27}html[data-netbox-color-mode=dark] .link-purple-900:hover,html[data-netbox-color-mode=dark] .link-purple-900:focus{color:#120a1f}html[data-netbox-color-mode=dark] .link-pink-100{color:#f7d6e6}html[data-netbox-color-mode=dark] .link-pink-100:hover,html[data-netbox-color-mode=dark] .link-pink-100:focus{color:#f9deeb}html[data-netbox-color-mode=dark] .link-pink-200{color:#efadce}html[data-netbox-color-mode=dark] .link-pink-200:hover,html[data-netbox-color-mode=dark] .link-pink-200:focus{color:#f2bdd8}html[data-netbox-color-mode=dark] .link-pink-300{color:#e685b5}html[data-netbox-color-mode=dark] .link-pink-300:hover,html[data-netbox-color-mode=dark] .link-pink-300:focus{color:#eb9dc4}html[data-netbox-color-mode=dark] .link-pink-400{color:#de5c9d}html[data-netbox-color-mode=dark] .link-pink-400:hover,html[data-netbox-color-mode=dark] .link-pink-400:focus{color:#e57db1}html[data-netbox-color-mode=dark] .link-pink-500{color:#d63384}html[data-netbox-color-mode=dark] .link-pink-500:hover,html[data-netbox-color-mode=dark] .link-pink-500:focus{color:#ab296a}html[data-netbox-color-mode=dark] .link-pink-600{color:#ab296a}html[data-netbox-color-mode=dark] .link-pink-600:hover,html[data-netbox-color-mode=dark] .link-pink-600:focus{color:#892155}html[data-netbox-color-mode=dark] .link-pink-700{color:#801f4f}html[data-netbox-color-mode=dark] .link-pink-700:hover,html[data-netbox-color-mode=dark] .link-pink-700:focus{color:#66193f}html[data-netbox-color-mode=dark] .link-pink-800{color:#561435}html[data-netbox-color-mode=dark] .link-pink-800:hover,html[data-netbox-color-mode=dark] .link-pink-800:focus{color:#45102a}html[data-netbox-color-mode=dark] .link-pink-900{color:#2b0a1a}html[data-netbox-color-mode=dark] .link-pink-900:hover,html[data-netbox-color-mode=dark] .link-pink-900:focus{color:#220815}html[data-netbox-color-mode=dark] .ratio{position:relative;width:100%}html[data-netbox-color-mode=dark] .ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}html[data-netbox-color-mode=dark] .ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}html[data-netbox-color-mode=dark] .ratio-1x1{--bs-aspect-ratio: 100%}html[data-netbox-color-mode=dark] .ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}html[data-netbox-color-mode=dark] .ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}html[data-netbox-color-mode=dark] .ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}html[data-netbox-color-mode=dark] .fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}html[data-netbox-color-mode=dark] .fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}html[data-netbox-color-mode=dark] .sticky-top{position:sticky;top:0;z-index:1020}@media (min-width: 576px){html[data-netbox-color-mode=dark] .sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .sticky-xxl-top{position:sticky;top:0;z-index:1020}}html[data-netbox-color-mode=dark] .visually-hidden,html[data-netbox-color-mode=dark] .visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;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}html[data-netbox-color-mode=dark] .stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}html[data-netbox-color-mode=dark] .text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}html[data-netbox-color-mode=dark] .align-baseline{vertical-align:baseline!important}html[data-netbox-color-mode=dark] .align-top{vertical-align:top!important}html[data-netbox-color-mode=dark] .align-middle{vertical-align:middle!important}html[data-netbox-color-mode=dark] .align-bottom{vertical-align:bottom!important}html[data-netbox-color-mode=dark] .align-text-bottom{vertical-align:text-bottom!important}html[data-netbox-color-mode=dark] .align-text-top{vertical-align:text-top!important}html[data-netbox-color-mode=dark] .float-start{float:left!important}html[data-netbox-color-mode=dark] .float-end{float:right!important}html[data-netbox-color-mode=dark] .float-none{float:none!important}html[data-netbox-color-mode=dark] .overflow-auto{overflow:auto!important}html[data-netbox-color-mode=dark] .overflow-hidden{overflow:hidden!important}html[data-netbox-color-mode=dark] .overflow-visible{overflow:visible!important}html[data-netbox-color-mode=dark] .overflow-scroll{overflow:scroll!important}html[data-netbox-color-mode=dark] .d-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-block{display:block!important}html[data-netbox-color-mode=dark] .d-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-table{display:table!important}html[data-netbox-color-mode=dark] .d-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-none{display:none!important}html[data-netbox-color-mode=dark] .shadow{box-shadow:0 .5rem 1rem #00000026!important}html[data-netbox-color-mode=dark] .shadow-sm{box-shadow:0 .125rem .25rem #00000013!important}html[data-netbox-color-mode=dark] .shadow-lg{box-shadow:0 1rem 3rem #0000002d!important}html[data-netbox-color-mode=dark] .shadow-none{box-shadow:none!important}html[data-netbox-color-mode=dark] .position-static{position:static!important}html[data-netbox-color-mode=dark] .position-relative{position:relative!important}html[data-netbox-color-mode=dark] .position-absolute{position:absolute!important}html[data-netbox-color-mode=dark] .position-fixed{position:fixed!important}html[data-netbox-color-mode=dark] .position-sticky{position:sticky!important}html[data-netbox-color-mode=dark] .top-0{top:0!important}html[data-netbox-color-mode=dark] .top-50{top:50%!important}html[data-netbox-color-mode=dark] .top-100{top:100%!important}html[data-netbox-color-mode=dark] .bottom-0{bottom:0!important}html[data-netbox-color-mode=dark] .bottom-50{bottom:50%!important}html[data-netbox-color-mode=dark] .bottom-100{bottom:100%!important}html[data-netbox-color-mode=dark] .start-0{left:0!important}html[data-netbox-color-mode=dark] .start-50{left:50%!important}html[data-netbox-color-mode=dark] .start-100{left:100%!important}html[data-netbox-color-mode=dark] .end-0{right:0!important}html[data-netbox-color-mode=dark] .end-50{right:50%!important}html[data-netbox-color-mode=dark] .end-100{right:100%!important}html[data-netbox-color-mode=dark] .translate-middle{transform:translate(-50%,-50%)!important}html[data-netbox-color-mode=dark] .translate-middle-x{transform:translate(-50%)!important}html[data-netbox-color-mode=dark] .translate-middle-y{transform:translateY(-50%)!important}html[data-netbox-color-mode=dark] .border{border:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-0{border:0!important}html[data-netbox-color-mode=dark] .border-top{border-top:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-top-0{border-top:0!important}html[data-netbox-color-mode=dark] .border-end{border-right:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-end-0{border-right:0!important}html[data-netbox-color-mode=dark] .border-bottom{border-bottom:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-bottom-0{border-bottom:0!important}html[data-netbox-color-mode=dark] .border-start{border-left:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-start-0{border-left:0!important}html[data-netbox-color-mode=dark] .border-primary{border-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .border-secondary{border-color:#adb5bd!important}html[data-netbox-color-mode=dark] .border-success{border-color:#75b798!important}html[data-netbox-color-mode=dark] .border-info{border-color:#6edff6!important}html[data-netbox-color-mode=dark] .border-warning{border-color:#ffda6a!important}html[data-netbox-color-mode=dark] .border-danger{border-color:#ea868f!important}html[data-netbox-color-mode=dark] .border-light{border-color:#dee2e6!important}html[data-netbox-color-mode=dark] .border-dark{border-color:#adb5bd!important}html[data-netbox-color-mode=dark] .border-red{border-color:#ea868f!important}html[data-netbox-color-mode=dark] .border-yellow{border-color:#ffda6a!important}html[data-netbox-color-mode=dark] .border-green{border-color:#75b798!important}html[data-netbox-color-mode=dark] .border-blue{border-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .border-cyan{border-color:#6edff6!important}html[data-netbox-color-mode=dark] .border-indigo{border-color:#a370f7!important}html[data-netbox-color-mode=dark] .border-purple{border-color:#a98eda!important}html[data-netbox-color-mode=dark] .border-pink{border-color:#e685b5!important}html[data-netbox-color-mode=dark] .border-darker{border-color:#1b1f22!important}html[data-netbox-color-mode=dark] .border-darkest{border-color:#171b1d!important}html[data-netbox-color-mode=dark] .border-gray{border-color:#ced4da!important}html[data-netbox-color-mode=dark] .border-gray-100{border-color:#f8f9fa!important}html[data-netbox-color-mode=dark] .border-gray-200{border-color:#e9ecef!important}html[data-netbox-color-mode=dark] .border-gray-300{border-color:#dee2e6!important}html[data-netbox-color-mode=dark] .border-gray-400{border-color:#ced4da!important}html[data-netbox-color-mode=dark] .border-gray-500{border-color:#adb5bd!important}html[data-netbox-color-mode=dark] .border-gray-600{border-color:#6c757d!important}html[data-netbox-color-mode=dark] .border-gray-700{border-color:#495057!important}html[data-netbox-color-mode=dark] .border-gray-800{border-color:#343a40!important}html[data-netbox-color-mode=dark] .border-gray-900{border-color:#212529!important}html[data-netbox-color-mode=dark] .border-red-100{border-color:#f8d7da!important}html[data-netbox-color-mode=dark] .border-red-200{border-color:#f1aeb5!important}html[data-netbox-color-mode=dark] .border-red-300{border-color:#ea868f!important}html[data-netbox-color-mode=dark] .border-red-400{border-color:#e35d6a!important}html[data-netbox-color-mode=dark] .border-red-500{border-color:#dc3545!important}html[data-netbox-color-mode=dark] .border-red-600{border-color:#b02a37!important}html[data-netbox-color-mode=dark] .border-red-700{border-color:#842029!important}html[data-netbox-color-mode=dark] .border-red-800{border-color:#58151c!important}html[data-netbox-color-mode=dark] .border-red-900{border-color:#2c0b0e!important}html[data-netbox-color-mode=dark] .border-yellow-100{border-color:#fff3cd!important}html[data-netbox-color-mode=dark] .border-yellow-200{border-color:#ffe69c!important}html[data-netbox-color-mode=dark] .border-yellow-300{border-color:#ffda6a!important}html[data-netbox-color-mode=dark] .border-yellow-400{border-color:#ffcd39!important}html[data-netbox-color-mode=dark] .border-yellow-500{border-color:#ffc107!important}html[data-netbox-color-mode=dark] .border-yellow-600{border-color:#cc9a06!important}html[data-netbox-color-mode=dark] .border-yellow-700{border-color:#997404!important}html[data-netbox-color-mode=dark] .border-yellow-800{border-color:#664d03!important}html[data-netbox-color-mode=dark] .border-yellow-900{border-color:#332701!important}html[data-netbox-color-mode=dark] .border-green-100{border-color:#d1e7dd!important}html[data-netbox-color-mode=dark] .border-green-200{border-color:#a3cfbb!important}html[data-netbox-color-mode=dark] .border-green-300{border-color:#75b798!important}html[data-netbox-color-mode=dark] .border-green-400{border-color:#479f76!important}html[data-netbox-color-mode=dark] .border-green-500{border-color:#198754!important}html[data-netbox-color-mode=dark] .border-green-600{border-color:#146c43!important}html[data-netbox-color-mode=dark] .border-green-700{border-color:#0f5132!important}html[data-netbox-color-mode=dark] .border-green-800{border-color:#0a3622!important}html[data-netbox-color-mode=dark] .border-green-900{border-color:#051b11!important}html[data-netbox-color-mode=dark] .border-blue-100{border-color:#cfe2ff!important}html[data-netbox-color-mode=dark] .border-blue-200{border-color:#9ec5fe!important}html[data-netbox-color-mode=dark] .border-blue-300{border-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .border-blue-400{border-color:#3d8bfd!important}html[data-netbox-color-mode=dark] .border-blue-500{border-color:#0d6efd!important}html[data-netbox-color-mode=dark] .border-blue-600{border-color:#0a58ca!important}html[data-netbox-color-mode=dark] .border-blue-700{border-color:#084298!important}html[data-netbox-color-mode=dark] .border-blue-800{border-color:#052c65!important}html[data-netbox-color-mode=dark] .border-blue-900{border-color:#031633!important}html[data-netbox-color-mode=dark] .border-cyan-100{border-color:#cff4fc!important}html[data-netbox-color-mode=dark] .border-cyan-200{border-color:#9eeaf9!important}html[data-netbox-color-mode=dark] .border-cyan-300{border-color:#6edff6!important}html[data-netbox-color-mode=dark] .border-cyan-400{border-color:#3dd5f3!important}html[data-netbox-color-mode=dark] .border-cyan-500{border-color:#0dcaf0!important}html[data-netbox-color-mode=dark] .border-cyan-600{border-color:#0aa2c0!important}html[data-netbox-color-mode=dark] .border-cyan-700{border-color:#087990!important}html[data-netbox-color-mode=dark] .border-cyan-800{border-color:#055160!important}html[data-netbox-color-mode=dark] .border-cyan-900{border-color:#032830!important}html[data-netbox-color-mode=dark] .border-indigo-100{border-color:#e0cffc!important}html[data-netbox-color-mode=dark] .border-indigo-200{border-color:#c29ffa!important}html[data-netbox-color-mode=dark] .border-indigo-300{border-color:#a370f7!important}html[data-netbox-color-mode=dark] .border-indigo-400{border-color:#8540f5!important}html[data-netbox-color-mode=dark] .border-indigo-500{border-color:#6610f2!important}html[data-netbox-color-mode=dark] .border-indigo-600{border-color:#520dc2!important}html[data-netbox-color-mode=dark] .border-indigo-700{border-color:#3d0a91!important}html[data-netbox-color-mode=dark] .border-indigo-800{border-color:#290661!important}html[data-netbox-color-mode=dark] .border-indigo-900{border-color:#140330!important}html[data-netbox-color-mode=dark] .border-purple-100{border-color:#e2d9f3!important}html[data-netbox-color-mode=dark] .border-purple-200{border-color:#c5b3e6!important}html[data-netbox-color-mode=dark] .border-purple-300{border-color:#a98eda!important}html[data-netbox-color-mode=dark] .border-purple-400{border-color:#8c68cd!important}html[data-netbox-color-mode=dark] .border-purple-500{border-color:#6f42c1!important}html[data-netbox-color-mode=dark] .border-purple-600{border-color:#59359a!important}html[data-netbox-color-mode=dark] .border-purple-700{border-color:#432874!important}html[data-netbox-color-mode=dark] .border-purple-800{border-color:#2c1a4d!important}html[data-netbox-color-mode=dark] .border-purple-900{border-color:#160d27!important}html[data-netbox-color-mode=dark] .border-pink-100{border-color:#f7d6e6!important}html[data-netbox-color-mode=dark] .border-pink-200{border-color:#efadce!important}html[data-netbox-color-mode=dark] .border-pink-300{border-color:#e685b5!important}html[data-netbox-color-mode=dark] .border-pink-400{border-color:#de5c9d!important}html[data-netbox-color-mode=dark] .border-pink-500{border-color:#d63384!important}html[data-netbox-color-mode=dark] .border-pink-600{border-color:#ab296a!important}html[data-netbox-color-mode=dark] .border-pink-700{border-color:#801f4f!important}html[data-netbox-color-mode=dark] .border-pink-800{border-color:#561435!important}html[data-netbox-color-mode=dark] .border-pink-900{border-color:#2b0a1a!important}html[data-netbox-color-mode=dark] .border-white{border-color:#fff!important}html[data-netbox-color-mode=dark] .border-1{border-width:1px!important}html[data-netbox-color-mode=dark] .border-2{border-width:2px!important}html[data-netbox-color-mode=dark] .border-3{border-width:3px!important}html[data-netbox-color-mode=dark] .border-4{border-width:4px!important}html[data-netbox-color-mode=dark] .border-5{border-width:5px!important}html[data-netbox-color-mode=dark] .w-25{width:25%!important}html[data-netbox-color-mode=dark] .w-50{width:50%!important}html[data-netbox-color-mode=dark] .w-75{width:75%!important}html[data-netbox-color-mode=dark] .w-100{width:100%!important}html[data-netbox-color-mode=dark] .w-auto{width:auto!important}html[data-netbox-color-mode=dark] .mw-100{max-width:100%!important}html[data-netbox-color-mode=dark] .vw-100{width:100vw!important}html[data-netbox-color-mode=dark] .min-vw-100{min-width:100vw!important}html[data-netbox-color-mode=dark] .h-25{height:25%!important}html[data-netbox-color-mode=dark] .h-50{height:50%!important}html[data-netbox-color-mode=dark] .h-75{height:75%!important}html[data-netbox-color-mode=dark] .h-100{height:100%!important}html[data-netbox-color-mode=dark] .h-auto{height:auto!important}html[data-netbox-color-mode=dark] .mh-100{max-height:100%!important}html[data-netbox-color-mode=dark] .vh-100{height:100vh!important}html[data-netbox-color-mode=dark] .min-vh-100{min-height:100vh!important}html[data-netbox-color-mode=dark] .flex-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-first{order:-1!important}html[data-netbox-color-mode=dark] .order-0{order:0!important}html[data-netbox-color-mode=dark] .order-1{order:1!important}html[data-netbox-color-mode=dark] .order-2{order:2!important}html[data-netbox-color-mode=dark] .order-3{order:3!important}html[data-netbox-color-mode=dark] .order-4{order:4!important}html[data-netbox-color-mode=dark] .order-5{order:5!important}html[data-netbox-color-mode=dark] .order-last{order:6!important}html[data-netbox-color-mode=dark] .m-0{margin:0!important}html[data-netbox-color-mode=dark] .m-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-0{padding:0!important}html[data-netbox-color-mode=dark] .p-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .font-monospace{font-family:var(--bs-font-monospace)!important}html[data-netbox-color-mode=dark] .fs-1{font-size:calc(1.375rem + 1.5vw)!important}html[data-netbox-color-mode=dark] .fs-2{font-size:calc(1.325rem + .9vw)!important}html[data-netbox-color-mode=dark] .fs-3{font-size:calc(1.3rem + .6vw)!important}html[data-netbox-color-mode=dark] .fs-4{font-size:calc(1.275rem + .3vw)!important}html[data-netbox-color-mode=dark] .fs-5{font-size:1.25rem!important}html[data-netbox-color-mode=dark] .fs-6{font-size:1rem!important}html[data-netbox-color-mode=dark] .fst-italic{font-style:italic!important}html[data-netbox-color-mode=dark] .fst-normal{font-style:normal!important}html[data-netbox-color-mode=dark] .fw-light{font-weight:300!important}html[data-netbox-color-mode=dark] .fw-lighter{font-weight:200!important}html[data-netbox-color-mode=dark] .fw-normal{font-weight:400!important}html[data-netbox-color-mode=dark] .fw-bold{font-weight:700!important}html[data-netbox-color-mode=dark] .fw-bolder{font-weight:800!important}html[data-netbox-color-mode=dark] .lh-1{line-height:1!important}html[data-netbox-color-mode=dark] .lh-sm{line-height:1.25!important}html[data-netbox-color-mode=dark] .lh-base{line-height:1.5!important}html[data-netbox-color-mode=dark] .lh-lg{line-height:1.75!important}html[data-netbox-color-mode=dark] .text-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-center{text-align:center!important}html[data-netbox-color-mode=dark] .text-decoration-none{text-decoration:none!important}html[data-netbox-color-mode=dark] .text-decoration-underline{text-decoration:underline!important}html[data-netbox-color-mode=dark] .text-decoration-line-through{text-decoration:line-through!important}html[data-netbox-color-mode=dark] .text-lowercase{text-transform:lowercase!important}html[data-netbox-color-mode=dark] .text-uppercase{text-transform:uppercase!important}html[data-netbox-color-mode=dark] .text-capitalize{text-transform:capitalize!important}html[data-netbox-color-mode=dark] .text-wrap{white-space:normal!important}html[data-netbox-color-mode=dark] .text-nowrap{white-space:nowrap!important}html[data-netbox-color-mode=dark] .text-break{word-wrap:break-word!important;word-break:break-word!important}html[data-netbox-color-mode=dark] .text-primary{color:#6ea8fe!important}html[data-netbox-color-mode=dark] .text-secondary{color:#adb5bd!important}html[data-netbox-color-mode=dark] .text-success{color:#75b798!important}html[data-netbox-color-mode=dark] .text-info{color:#6edff6!important}html[data-netbox-color-mode=dark] .text-warning{color:#ffda6a!important}html[data-netbox-color-mode=dark] .text-danger{color:#ea868f!important}html[data-netbox-color-mode=dark] .text-light{color:#dee2e6!important}html[data-netbox-color-mode=dark] .text-dark{color:#adb5bd!important}html[data-netbox-color-mode=dark] .text-red{color:#ea868f!important}html[data-netbox-color-mode=dark] .text-yellow{color:#ffda6a!important}html[data-netbox-color-mode=dark] .text-green{color:#75b798!important}html[data-netbox-color-mode=dark] .text-blue{color:#6ea8fe!important}html[data-netbox-color-mode=dark] .text-cyan{color:#6edff6!important}html[data-netbox-color-mode=dark] .text-indigo{color:#a370f7!important}html[data-netbox-color-mode=dark] .text-purple{color:#a98eda!important}html[data-netbox-color-mode=dark] .text-pink{color:#e685b5!important}html[data-netbox-color-mode=dark] .text-darker{color:#1b1f22!important}html[data-netbox-color-mode=dark] .text-darkest{color:#171b1d!important}html[data-netbox-color-mode=dark] .text-gray{color:#ced4da!important}html[data-netbox-color-mode=dark] .text-gray-100{color:#f8f9fa!important}html[data-netbox-color-mode=dark] .text-gray-200{color:#e9ecef!important}html[data-netbox-color-mode=dark] .text-gray-300{color:#dee2e6!important}html[data-netbox-color-mode=dark] .text-gray-400{color:#ced4da!important}html[data-netbox-color-mode=dark] .text-gray-500{color:#adb5bd!important}html[data-netbox-color-mode=dark] .text-gray-600{color:#6c757d!important}html[data-netbox-color-mode=dark] .text-gray-700{color:#495057!important}html[data-netbox-color-mode=dark] .text-gray-800{color:#343a40!important}html[data-netbox-color-mode=dark] .text-gray-900{color:#212529!important}html[data-netbox-color-mode=dark] .text-red-100{color:#f8d7da!important}html[data-netbox-color-mode=dark] .text-red-200{color:#f1aeb5!important}html[data-netbox-color-mode=dark] .text-red-300{color:#ea868f!important}html[data-netbox-color-mode=dark] .text-red-400{color:#e35d6a!important}html[data-netbox-color-mode=dark] .text-red-500{color:#dc3545!important}html[data-netbox-color-mode=dark] .text-red-600{color:#b02a37!important}html[data-netbox-color-mode=dark] .text-red-700{color:#842029!important}html[data-netbox-color-mode=dark] .text-red-800{color:#58151c!important}html[data-netbox-color-mode=dark] .text-red-900{color:#2c0b0e!important}html[data-netbox-color-mode=dark] .text-yellow-100{color:#fff3cd!important}html[data-netbox-color-mode=dark] .text-yellow-200{color:#ffe69c!important}html[data-netbox-color-mode=dark] .text-yellow-300{color:#ffda6a!important}html[data-netbox-color-mode=dark] .text-yellow-400{color:#ffcd39!important}html[data-netbox-color-mode=dark] .text-yellow-500{color:#ffc107!important}html[data-netbox-color-mode=dark] .text-yellow-600{color:#cc9a06!important}html[data-netbox-color-mode=dark] .text-yellow-700{color:#997404!important}html[data-netbox-color-mode=dark] .text-yellow-800{color:#664d03!important}html[data-netbox-color-mode=dark] .text-yellow-900{color:#332701!important}html[data-netbox-color-mode=dark] .text-green-100{color:#d1e7dd!important}html[data-netbox-color-mode=dark] .text-green-200{color:#a3cfbb!important}html[data-netbox-color-mode=dark] .text-green-300{color:#75b798!important}html[data-netbox-color-mode=dark] .text-green-400{color:#479f76!important}html[data-netbox-color-mode=dark] .text-green-500{color:#198754!important}html[data-netbox-color-mode=dark] .text-green-600{color:#146c43!important}html[data-netbox-color-mode=dark] .text-green-700{color:#0f5132!important}html[data-netbox-color-mode=dark] .text-green-800{color:#0a3622!important}html[data-netbox-color-mode=dark] .text-green-900{color:#051b11!important}html[data-netbox-color-mode=dark] .text-blue-100{color:#cfe2ff!important}html[data-netbox-color-mode=dark] .text-blue-200{color:#9ec5fe!important}html[data-netbox-color-mode=dark] .text-blue-300{color:#6ea8fe!important}html[data-netbox-color-mode=dark] .text-blue-400{color:#3d8bfd!important}html[data-netbox-color-mode=dark] .text-blue-500{color:#0d6efd!important}html[data-netbox-color-mode=dark] .text-blue-600{color:#0a58ca!important}html[data-netbox-color-mode=dark] .text-blue-700{color:#084298!important}html[data-netbox-color-mode=dark] .text-blue-800{color:#052c65!important}html[data-netbox-color-mode=dark] .text-blue-900{color:#031633!important}html[data-netbox-color-mode=dark] .text-cyan-100{color:#cff4fc!important}html[data-netbox-color-mode=dark] .text-cyan-200{color:#9eeaf9!important}html[data-netbox-color-mode=dark] .text-cyan-300{color:#6edff6!important}html[data-netbox-color-mode=dark] .text-cyan-400{color:#3dd5f3!important}html[data-netbox-color-mode=dark] .text-cyan-500{color:#0dcaf0!important}html[data-netbox-color-mode=dark] .text-cyan-600{color:#0aa2c0!important}html[data-netbox-color-mode=dark] .text-cyan-700{color:#087990!important}html[data-netbox-color-mode=dark] .text-cyan-800{color:#055160!important}html[data-netbox-color-mode=dark] .text-cyan-900{color:#032830!important}html[data-netbox-color-mode=dark] .text-indigo-100{color:#e0cffc!important}html[data-netbox-color-mode=dark] .text-indigo-200{color:#c29ffa!important}html[data-netbox-color-mode=dark] .text-indigo-300{color:#a370f7!important}html[data-netbox-color-mode=dark] .text-indigo-400{color:#8540f5!important}html[data-netbox-color-mode=dark] .text-indigo-500{color:#6610f2!important}html[data-netbox-color-mode=dark] .text-indigo-600{color:#520dc2!important}html[data-netbox-color-mode=dark] .text-indigo-700{color:#3d0a91!important}html[data-netbox-color-mode=dark] .text-indigo-800{color:#290661!important}html[data-netbox-color-mode=dark] .text-indigo-900{color:#140330!important}html[data-netbox-color-mode=dark] .text-purple-100{color:#e2d9f3!important}html[data-netbox-color-mode=dark] .text-purple-200{color:#c5b3e6!important}html[data-netbox-color-mode=dark] .text-purple-300{color:#a98eda!important}html[data-netbox-color-mode=dark] .text-purple-400{color:#8c68cd!important}html[data-netbox-color-mode=dark] .text-purple-500{color:#6f42c1!important}html[data-netbox-color-mode=dark] .text-purple-600{color:#59359a!important}html[data-netbox-color-mode=dark] .text-purple-700{color:#432874!important}html[data-netbox-color-mode=dark] .text-purple-800{color:#2c1a4d!important}html[data-netbox-color-mode=dark] .text-purple-900{color:#160d27!important}html[data-netbox-color-mode=dark] .text-pink-100{color:#f7d6e6!important}html[data-netbox-color-mode=dark] .text-pink-200{color:#efadce!important}html[data-netbox-color-mode=dark] .text-pink-300{color:#e685b5!important}html[data-netbox-color-mode=dark] .text-pink-400{color:#de5c9d!important}html[data-netbox-color-mode=dark] .text-pink-500{color:#d63384!important}html[data-netbox-color-mode=dark] .text-pink-600{color:#ab296a!important}html[data-netbox-color-mode=dark] .text-pink-700{color:#801f4f!important}html[data-netbox-color-mode=dark] .text-pink-800{color:#561435!important}html[data-netbox-color-mode=dark] .text-pink-900{color:#2b0a1a!important}html[data-netbox-color-mode=dark] .text-white{color:#fff!important}html[data-netbox-color-mode=dark] .text-body{color:#fff!important}html[data-netbox-color-mode=dark] .text-muted{color:#ced4da!important}html[data-netbox-color-mode=dark] .text-black-50{color:#00000080!important}html[data-netbox-color-mode=dark] .text-white-50{color:#ffffff80!important}html[data-netbox-color-mode=dark] .text-reset{color:inherit!important}html[data-netbox-color-mode=dark] .bg-primary{background-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .bg-secondary{background-color:#adb5bd!important}html[data-netbox-color-mode=dark] .bg-success{background-color:#75b798!important}html[data-netbox-color-mode=dark] .bg-info{background-color:#6edff6!important}html[data-netbox-color-mode=dark] .bg-warning{background-color:#ffda6a!important}html[data-netbox-color-mode=dark] .bg-danger{background-color:#ea868f!important}html[data-netbox-color-mode=dark] .bg-light{background-color:#dee2e6!important}html[data-netbox-color-mode=dark] .bg-dark{background-color:#adb5bd!important}html[data-netbox-color-mode=dark] .bg-red{background-color:#ea868f!important}html[data-netbox-color-mode=dark] .bg-yellow{background-color:#ffda6a!important}html[data-netbox-color-mode=dark] .bg-green{background-color:#75b798!important}html[data-netbox-color-mode=dark] .bg-blue{background-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .bg-cyan{background-color:#6edff6!important}html[data-netbox-color-mode=dark] .bg-indigo{background-color:#a370f7!important}html[data-netbox-color-mode=dark] .bg-purple{background-color:#a98eda!important}html[data-netbox-color-mode=dark] .bg-pink{background-color:#e685b5!important}html[data-netbox-color-mode=dark] .bg-darker{background-color:#1b1f22!important}html[data-netbox-color-mode=dark] .bg-darkest{background-color:#171b1d!important}html[data-netbox-color-mode=dark] .bg-gray{background-color:#ced4da!important}html[data-netbox-color-mode=dark] .bg-gray-100{background-color:#f8f9fa!important}html[data-netbox-color-mode=dark] .bg-gray-200{background-color:#e9ecef!important}html[data-netbox-color-mode=dark] .bg-gray-300{background-color:#dee2e6!important}html[data-netbox-color-mode=dark] .bg-gray-400{background-color:#ced4da!important}html[data-netbox-color-mode=dark] .bg-gray-500{background-color:#adb5bd!important}html[data-netbox-color-mode=dark] .bg-gray-600{background-color:#6c757d!important}html[data-netbox-color-mode=dark] .bg-gray-700{background-color:#495057!important}html[data-netbox-color-mode=dark] .bg-gray-800{background-color:#343a40!important}html[data-netbox-color-mode=dark] .bg-gray-900{background-color:#212529!important}html[data-netbox-color-mode=dark] .bg-red-100{background-color:#f8d7da!important}html[data-netbox-color-mode=dark] .bg-red-200{background-color:#f1aeb5!important}html[data-netbox-color-mode=dark] .bg-red-300{background-color:#ea868f!important}html[data-netbox-color-mode=dark] .bg-red-400{background-color:#e35d6a!important}html[data-netbox-color-mode=dark] .bg-red-500{background-color:#dc3545!important}html[data-netbox-color-mode=dark] .bg-red-600{background-color:#b02a37!important}html[data-netbox-color-mode=dark] .bg-red-700{background-color:#842029!important}html[data-netbox-color-mode=dark] .bg-red-800{background-color:#58151c!important}html[data-netbox-color-mode=dark] .bg-red-900{background-color:#2c0b0e!important}html[data-netbox-color-mode=dark] .bg-yellow-100{background-color:#fff3cd!important}html[data-netbox-color-mode=dark] .bg-yellow-200{background-color:#ffe69c!important}html[data-netbox-color-mode=dark] .bg-yellow-300{background-color:#ffda6a!important}html[data-netbox-color-mode=dark] .bg-yellow-400{background-color:#ffcd39!important}html[data-netbox-color-mode=dark] .bg-yellow-500{background-color:#ffc107!important}html[data-netbox-color-mode=dark] .bg-yellow-600{background-color:#cc9a06!important}html[data-netbox-color-mode=dark] .bg-yellow-700{background-color:#997404!important}html[data-netbox-color-mode=dark] .bg-yellow-800{background-color:#664d03!important}html[data-netbox-color-mode=dark] .bg-yellow-900{background-color:#332701!important}html[data-netbox-color-mode=dark] .bg-green-100{background-color:#d1e7dd!important}html[data-netbox-color-mode=dark] .bg-green-200{background-color:#a3cfbb!important}html[data-netbox-color-mode=dark] .bg-green-300{background-color:#75b798!important}html[data-netbox-color-mode=dark] .bg-green-400{background-color:#479f76!important}html[data-netbox-color-mode=dark] .bg-green-500{background-color:#198754!important}html[data-netbox-color-mode=dark] .bg-green-600{background-color:#146c43!important}html[data-netbox-color-mode=dark] .bg-green-700{background-color:#0f5132!important}html[data-netbox-color-mode=dark] .bg-green-800{background-color:#0a3622!important}html[data-netbox-color-mode=dark] .bg-green-900{background-color:#051b11!important}html[data-netbox-color-mode=dark] .bg-blue-100{background-color:#cfe2ff!important}html[data-netbox-color-mode=dark] .bg-blue-200{background-color:#9ec5fe!important}html[data-netbox-color-mode=dark] .bg-blue-300{background-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .bg-blue-400{background-color:#3d8bfd!important}html[data-netbox-color-mode=dark] .bg-blue-500{background-color:#0d6efd!important}html[data-netbox-color-mode=dark] .bg-blue-600{background-color:#0a58ca!important}html[data-netbox-color-mode=dark] .bg-blue-700{background-color:#084298!important}html[data-netbox-color-mode=dark] .bg-blue-800{background-color:#052c65!important}html[data-netbox-color-mode=dark] .bg-blue-900{background-color:#031633!important}html[data-netbox-color-mode=dark] .bg-cyan-100{background-color:#cff4fc!important}html[data-netbox-color-mode=dark] .bg-cyan-200{background-color:#9eeaf9!important}html[data-netbox-color-mode=dark] .bg-cyan-300{background-color:#6edff6!important}html[data-netbox-color-mode=dark] .bg-cyan-400{background-color:#3dd5f3!important}html[data-netbox-color-mode=dark] .bg-cyan-500{background-color:#0dcaf0!important}html[data-netbox-color-mode=dark] .bg-cyan-600{background-color:#0aa2c0!important}html[data-netbox-color-mode=dark] .bg-cyan-700{background-color:#087990!important}html[data-netbox-color-mode=dark] .bg-cyan-800{background-color:#055160!important}html[data-netbox-color-mode=dark] .bg-cyan-900{background-color:#032830!important}html[data-netbox-color-mode=dark] .bg-indigo-100{background-color:#e0cffc!important}html[data-netbox-color-mode=dark] .bg-indigo-200{background-color:#c29ffa!important}html[data-netbox-color-mode=dark] .bg-indigo-300{background-color:#a370f7!important}html[data-netbox-color-mode=dark] .bg-indigo-400{background-color:#8540f5!important}html[data-netbox-color-mode=dark] .bg-indigo-500{background-color:#6610f2!important}html[data-netbox-color-mode=dark] .bg-indigo-600{background-color:#520dc2!important}html[data-netbox-color-mode=dark] .bg-indigo-700{background-color:#3d0a91!important}html[data-netbox-color-mode=dark] .bg-indigo-800{background-color:#290661!important}html[data-netbox-color-mode=dark] .bg-indigo-900{background-color:#140330!important}html[data-netbox-color-mode=dark] .bg-purple-100{background-color:#e2d9f3!important}html[data-netbox-color-mode=dark] .bg-purple-200{background-color:#c5b3e6!important}html[data-netbox-color-mode=dark] .bg-purple-300{background-color:#a98eda!important}html[data-netbox-color-mode=dark] .bg-purple-400{background-color:#8c68cd!important}html[data-netbox-color-mode=dark] .bg-purple-500{background-color:#6f42c1!important}html[data-netbox-color-mode=dark] .bg-purple-600{background-color:#59359a!important}html[data-netbox-color-mode=dark] .bg-purple-700{background-color:#432874!important}html[data-netbox-color-mode=dark] .bg-purple-800{background-color:#2c1a4d!important}html[data-netbox-color-mode=dark] .bg-purple-900{background-color:#160d27!important}html[data-netbox-color-mode=dark] .bg-pink-100{background-color:#f7d6e6!important}html[data-netbox-color-mode=dark] .bg-pink-200{background-color:#efadce!important}html[data-netbox-color-mode=dark] .bg-pink-300{background-color:#e685b5!important}html[data-netbox-color-mode=dark] .bg-pink-400{background-color:#de5c9d!important}html[data-netbox-color-mode=dark] .bg-pink-500{background-color:#d63384!important}html[data-netbox-color-mode=dark] .bg-pink-600{background-color:#ab296a!important}html[data-netbox-color-mode=dark] .bg-pink-700{background-color:#801f4f!important}html[data-netbox-color-mode=dark] .bg-pink-800{background-color:#561435!important}html[data-netbox-color-mode=dark] .bg-pink-900{background-color:#2b0a1a!important}html[data-netbox-color-mode=dark] .bg-body{background-color:#1b1f22!important}html[data-netbox-color-mode=dark] .bg-white{background-color:#fff!important}html[data-netbox-color-mode=dark] .bg-transparent{background-color:transparent!important}html[data-netbox-color-mode=dark] .bg-gradient{background-image:var(--bs-gradient)!important}html[data-netbox-color-mode=dark] .user-select-all{user-select:all!important}html[data-netbox-color-mode=dark] .user-select-auto{user-select:auto!important}html[data-netbox-color-mode=dark] .user-select-none{user-select:none!important}html[data-netbox-color-mode=dark] .pe-none{pointer-events:none!important}html[data-netbox-color-mode=dark] .pe-auto{pointer-events:auto!important}html[data-netbox-color-mode=dark] .rounded{border-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-0{border-radius:0!important}html[data-netbox-color-mode=dark] .rounded-1{border-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-2{border-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-3{border-radius:.75rem!important}html[data-netbox-color-mode=dark] .rounded-circle{border-radius:50%!important}html[data-netbox-color-mode=dark] .rounded-pill{border-radius:50rem!important}html[data-netbox-color-mode=dark] .rounded-top{border-top-left-radius:.375rem!important;border-top-right-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-end{border-top-right-radius:.375rem!important;border-bottom-right-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-bottom{border-bottom-right-radius:.375rem!important;border-bottom-left-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-start{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}html[data-netbox-color-mode=dark] .visible{visibility:visible!important}html[data-netbox-color-mode=dark] .invisible{visibility:hidden!important}@media (min-width: 576px){html[data-netbox-color-mode=dark] .float-sm-start{float:left!important}html[data-netbox-color-mode=dark] .float-sm-end{float:right!important}html[data-netbox-color-mode=dark] .float-sm-none{float:none!important}html[data-netbox-color-mode=dark] .d-sm-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-sm-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-sm-block{display:block!important}html[data-netbox-color-mode=dark] .d-sm-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-sm-table{display:table!important}html[data-netbox-color-mode=dark] .d-sm-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-sm-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-sm-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-sm-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-sm-none{display:none!important}html[data-netbox-color-mode=dark] .flex-sm-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-sm-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-sm-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-sm-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-sm-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-sm-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-sm-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-sm-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-sm-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-sm-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-sm-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-sm-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-sm-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-sm-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-sm-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-sm-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-sm-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-sm-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-sm-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-sm-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-sm-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-sm-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-sm-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-sm-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-sm-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-sm-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-sm-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-sm-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-sm-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-sm-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-sm-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-sm-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-sm-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-sm-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-sm-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-sm-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-sm-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-sm-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-sm-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-sm-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-sm-first{order:-1!important}html[data-netbox-color-mode=dark] .order-sm-0{order:0!important}html[data-netbox-color-mode=dark] .order-sm-1{order:1!important}html[data-netbox-color-mode=dark] .order-sm-2{order:2!important}html[data-netbox-color-mode=dark] .order-sm-3{order:3!important}html[data-netbox-color-mode=dark] .order-sm-4{order:4!important}html[data-netbox-color-mode=dark] .order-sm-5{order:5!important}html[data-netbox-color-mode=dark] .order-sm-last{order:6!important}html[data-netbox-color-mode=dark] .m-sm-0{margin:0!important}html[data-netbox-color-mode=dark] .m-sm-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-sm-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-sm-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-sm-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-sm-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-sm-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-sm-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-sm-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-sm-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-sm-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-sm-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-sm-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-sm-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-sm-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-sm-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-sm-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-sm-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-sm-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-sm-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-sm-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-sm-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-sm-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-sm-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-sm-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-sm-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-sm-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-sm-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-sm-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-sm-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-sm-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-sm-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-sm-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-sm-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-sm-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-sm-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-sm-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-sm-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-sm-0{padding:0!important}html[data-netbox-color-mode=dark] .p-sm-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-sm-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-sm-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-sm-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-sm-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-sm-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-sm-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-sm-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-sm-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-sm-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-sm-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-sm-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-sm-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-sm-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-sm-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-sm-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-sm-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-sm-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-sm-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-sm-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-sm-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-sm-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-sm-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-sm-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-sm-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-sm-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-sm-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-sm-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-sm-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-sm-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-sm-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-sm-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-sm-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-sm-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-sm-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-sm-center{text-align:center!important}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .float-md-start{float:left!important}html[data-netbox-color-mode=dark] .float-md-end{float:right!important}html[data-netbox-color-mode=dark] .float-md-none{float:none!important}html[data-netbox-color-mode=dark] .d-md-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-md-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-md-block{display:block!important}html[data-netbox-color-mode=dark] .d-md-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-md-table{display:table!important}html[data-netbox-color-mode=dark] .d-md-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-md-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-md-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-md-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-md-none{display:none!important}html[data-netbox-color-mode=dark] .flex-md-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-md-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-md-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-md-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-md-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-md-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-md-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-md-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-md-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-md-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-md-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-md-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-md-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-md-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-md-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-md-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-md-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-md-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-md-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-md-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-md-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-md-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-md-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-md-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-md-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-md-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-md-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-md-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-md-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-md-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-md-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-md-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-md-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-md-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-md-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-md-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-md-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-md-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-md-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-md-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-md-first{order:-1!important}html[data-netbox-color-mode=dark] .order-md-0{order:0!important}html[data-netbox-color-mode=dark] .order-md-1{order:1!important}html[data-netbox-color-mode=dark] .order-md-2{order:2!important}html[data-netbox-color-mode=dark] .order-md-3{order:3!important}html[data-netbox-color-mode=dark] .order-md-4{order:4!important}html[data-netbox-color-mode=dark] .order-md-5{order:5!important}html[data-netbox-color-mode=dark] .order-md-last{order:6!important}html[data-netbox-color-mode=dark] .m-md-0{margin:0!important}html[data-netbox-color-mode=dark] .m-md-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-md-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-md-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-md-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-md-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-md-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-md-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-md-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-md-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-md-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-md-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-md-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-md-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-md-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-md-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-md-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-md-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-md-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-md-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-md-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-md-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-md-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-md-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-md-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-md-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-md-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-md-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-md-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-md-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-md-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-md-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-md-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-md-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-md-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-md-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-md-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-md-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-md-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-md-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-md-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-md-0{padding:0!important}html[data-netbox-color-mode=dark] .p-md-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-md-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-md-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-md-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-md-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-md-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-md-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-md-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-md-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-md-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-md-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-md-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-md-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-md-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-md-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-md-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-md-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-md-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-md-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-md-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-md-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-md-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-md-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-md-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-md-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-md-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-md-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-md-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-md-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-md-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-md-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-md-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-md-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-md-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-md-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-md-center{text-align:center!important}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .float-lg-start{float:left!important}html[data-netbox-color-mode=dark] .float-lg-end{float:right!important}html[data-netbox-color-mode=dark] .float-lg-none{float:none!important}html[data-netbox-color-mode=dark] .d-lg-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-lg-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-lg-block{display:block!important}html[data-netbox-color-mode=dark] .d-lg-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-lg-table{display:table!important}html[data-netbox-color-mode=dark] .d-lg-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-lg-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-lg-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-lg-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-lg-none{display:none!important}html[data-netbox-color-mode=dark] .flex-lg-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-lg-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-lg-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-lg-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-lg-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-lg-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-lg-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-lg-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-lg-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-lg-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-lg-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-lg-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-lg-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-lg-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-lg-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-lg-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-lg-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-lg-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-lg-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-lg-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-lg-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-lg-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-lg-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-lg-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-lg-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-lg-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-lg-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-lg-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-lg-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-lg-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-lg-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-lg-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-lg-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-lg-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-lg-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-lg-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-lg-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-lg-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-lg-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-lg-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-lg-first{order:-1!important}html[data-netbox-color-mode=dark] .order-lg-0{order:0!important}html[data-netbox-color-mode=dark] .order-lg-1{order:1!important}html[data-netbox-color-mode=dark] .order-lg-2{order:2!important}html[data-netbox-color-mode=dark] .order-lg-3{order:3!important}html[data-netbox-color-mode=dark] .order-lg-4{order:4!important}html[data-netbox-color-mode=dark] .order-lg-5{order:5!important}html[data-netbox-color-mode=dark] .order-lg-last{order:6!important}html[data-netbox-color-mode=dark] .m-lg-0{margin:0!important}html[data-netbox-color-mode=dark] .m-lg-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-lg-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-lg-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-lg-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-lg-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-lg-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-lg-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-lg-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-lg-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-lg-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-lg-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-lg-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-lg-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-lg-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-lg-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-lg-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-lg-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-lg-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-lg-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-lg-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-lg-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-lg-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-lg-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-lg-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-lg-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-lg-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-lg-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-lg-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-lg-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-lg-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-lg-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-lg-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-lg-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-lg-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-lg-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-lg-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-lg-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-lg-0{padding:0!important}html[data-netbox-color-mode=dark] .p-lg-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-lg-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-lg-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-lg-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-lg-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-lg-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-lg-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-lg-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-lg-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-lg-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-lg-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-lg-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-lg-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-lg-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-lg-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-lg-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-lg-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-lg-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-lg-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-lg-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-lg-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-lg-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-lg-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-lg-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-lg-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-lg-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-lg-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-lg-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-lg-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-lg-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-lg-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-lg-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-lg-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-lg-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-lg-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-lg-center{text-align:center!important}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .float-xl-start{float:left!important}html[data-netbox-color-mode=dark] .float-xl-end{float:right!important}html[data-netbox-color-mode=dark] .float-xl-none{float:none!important}html[data-netbox-color-mode=dark] .d-xl-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-xl-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-xl-block{display:block!important}html[data-netbox-color-mode=dark] .d-xl-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-xl-table{display:table!important}html[data-netbox-color-mode=dark] .d-xl-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-xl-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-xl-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-xl-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-xl-none{display:none!important}html[data-netbox-color-mode=dark] .flex-xl-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-xl-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-xl-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-xl-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-xl-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-xl-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-xl-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-xl-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-xl-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-xl-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-xl-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-xl-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-xl-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-xl-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-xl-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-xl-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-xl-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-xl-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-xl-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-xl-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-xl-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-xl-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-xl-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-xl-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-xl-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-xl-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-xl-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-xl-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-xl-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-xl-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-xl-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-xl-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-xl-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-xl-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-xl-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-xl-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-xl-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-xl-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-xl-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-xl-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-xl-first{order:-1!important}html[data-netbox-color-mode=dark] .order-xl-0{order:0!important}html[data-netbox-color-mode=dark] .order-xl-1{order:1!important}html[data-netbox-color-mode=dark] .order-xl-2{order:2!important}html[data-netbox-color-mode=dark] .order-xl-3{order:3!important}html[data-netbox-color-mode=dark] .order-xl-4{order:4!important}html[data-netbox-color-mode=dark] .order-xl-5{order:5!important}html[data-netbox-color-mode=dark] .order-xl-last{order:6!important}html[data-netbox-color-mode=dark] .m-xl-0{margin:0!important}html[data-netbox-color-mode=dark] .m-xl-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-xl-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-xl-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-xl-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-xl-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-xl-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-xl-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-xl-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-xl-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-xl-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-xl-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-xl-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-xl-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-xl-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-xl-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-xl-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-xl-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-xl-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-xl-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-xl-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-xl-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-xl-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-xl-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-xl-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-xl-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-xl-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-xl-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-xl-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-xl-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-xl-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-xl-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-xl-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-xl-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-xl-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-xl-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-xl-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-xl-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-xl-0{padding:0!important}html[data-netbox-color-mode=dark] .p-xl-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-xl-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-xl-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-xl-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-xl-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-xl-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-xl-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-xl-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-xl-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-xl-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-xl-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-xl-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-xl-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-xl-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-xl-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-xl-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-xl-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-xl-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-xl-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-xl-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-xl-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-xl-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-xl-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-xl-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-xl-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-xl-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-xl-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-xl-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-xl-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-xl-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-xl-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-xl-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-xl-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-xl-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-xl-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-xl-center{text-align:center!important}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .float-xxl-start{float:left!important}html[data-netbox-color-mode=dark] .float-xxl-end{float:right!important}html[data-netbox-color-mode=dark] .float-xxl-none{float:none!important}html[data-netbox-color-mode=dark] .d-xxl-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-xxl-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-xxl-block{display:block!important}html[data-netbox-color-mode=dark] .d-xxl-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-xxl-table{display:table!important}html[data-netbox-color-mode=dark] .d-xxl-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-xxl-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-xxl-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-xxl-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-xxl-none{display:none!important}html[data-netbox-color-mode=dark] .flex-xxl-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-xxl-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-xxl-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-xxl-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-xxl-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-xxl-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-xxl-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-xxl-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-xxl-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-xxl-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-xxl-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-xxl-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-xxl-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-xxl-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-xxl-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-xxl-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-xxl-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-xxl-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-xxl-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-xxl-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-xxl-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-xxl-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-xxl-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-xxl-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-xxl-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-xxl-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-xxl-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-xxl-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-xxl-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-xxl-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-xxl-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-xxl-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-xxl-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-xxl-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-xxl-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-xxl-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-xxl-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-xxl-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-xxl-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-xxl-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-xxl-first{order:-1!important}html[data-netbox-color-mode=dark] .order-xxl-0{order:0!important}html[data-netbox-color-mode=dark] .order-xxl-1{order:1!important}html[data-netbox-color-mode=dark] .order-xxl-2{order:2!important}html[data-netbox-color-mode=dark] .order-xxl-3{order:3!important}html[data-netbox-color-mode=dark] .order-xxl-4{order:4!important}html[data-netbox-color-mode=dark] .order-xxl-5{order:5!important}html[data-netbox-color-mode=dark] .order-xxl-last{order:6!important}html[data-netbox-color-mode=dark] .m-xxl-0{margin:0!important}html[data-netbox-color-mode=dark] .m-xxl-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-xxl-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-xxl-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-xxl-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-xxl-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-xxl-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-xxl-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-xxl-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-xxl-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-xxl-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-xxl-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-xxl-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-xxl-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-xxl-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-xxl-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-xxl-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-xxl-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-xxl-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-xxl-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-xxl-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-xxl-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-xxl-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-xxl-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-xxl-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-xxl-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-xxl-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-xxl-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-xxl-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-xxl-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-xxl-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-xxl-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-xxl-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-xxl-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-xxl-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-xxl-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-xxl-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-xxl-0{padding:0!important}html[data-netbox-color-mode=dark] .p-xxl-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-xxl-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-xxl-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-xxl-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-xxl-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-xxl-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-xxl-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-xxl-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-xxl-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-xxl-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-xxl-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-xxl-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-xxl-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-xxl-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-xxl-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-xxl-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-xxl-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-xxl-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-xxl-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-xxl-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-xxl-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-xxl-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-xxl-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-xxl-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-xxl-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-xxl-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-xxl-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-xxl-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-xxl-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-xxl-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-xxl-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-xxl-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-xxl-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-xxl-center{text-align:center!important}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .fs-1{font-size:2.5rem!important}html[data-netbox-color-mode=dark] .fs-2{font-size:2rem!important}html[data-netbox-color-mode=dark] .fs-3{font-size:1.75rem!important}html[data-netbox-color-mode=dark] .fs-4{font-size:1.5rem!important}}@media print{html[data-netbox-color-mode=dark] .d-print-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-print-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-print-block{display:block!important}html[data-netbox-color-mode=dark] .d-print-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-print-table{display:table!important}html[data-netbox-color-mode=dark] .d-print-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-print-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-print-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-print-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-print-none{display:none!important}}html[data-netbox-color-mode=dark] :root{--nbx-select-content-bg: #212529;--nbx-select-option-selected-bg: #dee2e6;--nbx-select-option-hover-bg: #0d6efd;--nbx-select-option-hover-color: #fff;--nbx-select-placeholder-color: #adb5bd;--nbx-select-value-color: #fff}html[data-netbox-color-mode=dark] :root[data-netbox-color-mode=dark]{--nbx-select-content-bg: #212529;--nbx-select-option-selected-bg: #adb5bd;--nbx-select-option-hover-bg: #9ec5fe;--nbx-select-option-hover-color: #000;--nbx-select-placeholder-color: #495057;--nbx-select-value-color: #000}html[data-netbox-color-mode=dark] .ss-main{position:relative;display:inline-block;user-select:none;color:#f8f9fa;width:100%}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected{display:flex;cursor:pointer;width:100%;height:calc(1.5em + (.75rem + 2px));padding:.75rem;border:1px solid #495057;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-disabled{background-color:#495057;cursor:not-allowed}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder{display:flex;flex:1 1 100%;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;width:calc(100% - 30px);line-height:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder *{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder .ss-disabled{color:#adb5bd}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-deselect{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem;font-weight:bold}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-deselect.ss-hide{display:none}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span{border:solid #f8f9fa;border-width:0 2px 2px 0;display:inline-block;padding:3px;transition:transform .2s,margin .2s}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span.arrow-up{transform:rotate(-135deg);margin:3px 0 0}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span.arrow-down{transform:rotate(45deg);margin:-3px 0 0}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected{display:flex;flex-direction:row;cursor:pointer;min-height:calc(1.5em + (.75rem + 2px));width:100%;padding:0 0 0 3px;border:1px solid #495057;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled{background-color:#495057;cursor:not-allowed}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled{color:#f8f9fa}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete{cursor:not-allowed}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values{display:flex;flex-wrap:wrap;justify-content:flex-start;flex:1 1 100%;width:calc(100% - 30px)}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-disabled{display:flex;padding:4px 5px;margin:2px 0;line-height:1em;align-items:center;width:100%;color:#adb5bd;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes scaleOut{0%{transform:scale(1);opacity:1}to{transform:scale(0);opacity:0}}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value{display:flex;user-select:none;align-items:center;font-size:12px;padding:3px 5px;margin:3px 5px 3px 0;color:#fff;background-color:#6ea8fe;border-radius:.375rem;animation-name:scaleIn;animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:both}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value.ss-out{animation-name:scaleOut;animation-duration:.2s;animation-timing-function:ease-out}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete{margin:0 0 0 5px;cursor:pointer}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add{display:flex;flex:0 1 3px;margin:9px 12px 0 5px}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus{display:flex;justify-content:center;align-items:center;background:#f8f9fa;position:relative;height:10px;width:2px;transition:transform .2s}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus:after{background:#f8f9fa;content:"";position:absolute;height:2px;width:10px;left:-4px;top:4px}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross{transform:rotate(45deg)}html[data-netbox-color-mode=dark] .ss-content{position:absolute;width:100%;margin:-1px 0 0;box-sizing:border-box;border:solid 1px #495057;z-index:1010;background-color:#fff;transform-origin:center top;transition:transform .2s,opacity .2s;opacity:0;transform:scaleY(0)}html[data-netbox-color-mode=dark] .ss-content.ss-open{display:block;opacity:1;transform:scaleY(1)}html[data-netbox-color-mode=dark] .ss-content .ss-search{display:flex;flex-direction:row;padding:.75rem}html[data-netbox-color-mode=dark] .ss-content .ss-search.ss-hide{height:0px;opacity:0;padding:0;margin:0}html[data-netbox-color-mode=dark] .ss-content .ss-search.ss-hide input{height:0px;opacity:0;padding:0;margin:0}html[data-netbox-color-mode=dark] .ss-content .ss-search input{display:inline-flex;font-size:inherit;line-height:inherit;flex:1 1 auto;width:100%;min-width:0px;height:30px;padding:.75rem;margin:0;border:1px solid #495057;border-radius:.375rem;background-color:#fff;outline:0;text-align:left;box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-appearance:textfield}html[data-netbox-color-mode=dark] .ss-content .ss-search input::placeholder{color:#495057;vertical-align:middle}html[data-netbox-color-mode=dark] .ss-content .ss-search input:focus{box-shadow:0 0 5px #6ea8fe}html[data-netbox-color-mode=dark] .ss-content .ss-search .ss-addable{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;font-size:22px;font-weight:bold;flex:0 0 30px;height:30px;margin:0 0 0 8px;border:1px solid #495057;border-radius:.375rem;box-sizing:border-box}html[data-netbox-color-mode=dark] .ss-content .ss-addable{padding-top:0}html[data-netbox-color-mode=dark] .ss-content .ss-list{max-height:200px;overflow-x:hidden;overflow-y:auto;text-align:left}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup .ss-optgroup-label{padding:6px 10px;font-weight:bold}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup .ss-option{padding:6px 6px 6px 25px}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup-label-selectable{cursor:pointer}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup-label-selectable:hover{color:#fff;background-color:#6ea8fe}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option{padding:6px 10px;cursor:pointer;user-select:none}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option *{display:inline-block}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-highlighted{color:#fff;background-color:#6ea8fe}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-disabled{cursor:not-allowed;color:#adb5bd;background-color:#fff}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected{color:#f8f9fa;background-color:#6ea8fe1a}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-hide{display:none}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option .ss-search-highlight{background-color:#ffc107}html[data-netbox-color-mode=dark] .ss-main{color:#f8f9fa}html[data-netbox-color-mode=dark] .ss-main.is-invalid .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main.is-invalid .ss-multi-selected{border-color:#dc3545}html[data-netbox-color-mode=dark] .ss-main.is-valid .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main.is-valid .ss-multi-selected{border-color:#198754}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected{padding:.375rem .75rem;background-color:#212529;border:1px solid #495057}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected[disabled],html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected[disabled]{color:#adb5bd;background-color:#495057}html[data-netbox-color-mode=dark] .ss-main div.ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main div.ss-single-selected span.placeholder .ss-disabled{color:var(--nbx-select-placeholder-color)}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.ss-arrow span.arrow-down,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.ss-arrow span.arrow-up{border-color:currentColor;color:#ced4da}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder .depth{display:none}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.placeholder>*,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.placeholder{line-height:1.5}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected{align-items:center;padding-right:.75rem;padding-left:.75rem}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-disabled{padding:4px 0}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value{color:var(--nbx-select-value-color);border-radius:.375rem}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value .depth{display:none}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add{margin:0 .75rem}html[data-netbox-color-mode=dark] .ss-main .ss-content{background-color:var(--nbx-select-content-bg);border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-option-selected{color:#fff;background-color:var(--nbx-select-option-selected-bg)}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option:hover{color:var(--nbx-select-option-hover-color);background-color:var(--nbx-select-option-hover-bg)}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option:last-child{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-disabled{background-color:unset}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-disabled:hover{color:#adb5bd}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option .depth{opacity:.3}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar{right:0;width:4px}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar:hover{opacity:.8}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar-track{background:transparent}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar-thumb{right:0;width:2px;background-color:var(--nbx-sidebar-scroll)}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search{padding-right:.5rem}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search button{margin-left:.75rem}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search input[type=search]{color:#f8f9fa;background-color:#212529;border:1px solid #495057}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search input[type=search]:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .flatpickr-calendar{color:#fff;background:#343a40;border-radius:.375rem;box-shadow:1px 0 #495057,-1px 0 #495057,0 1px #495057,0 -1px #495057,0 3px 13px #00000014}html[data-netbox-color-mode=dark] .flatpickr-calendar.arrowTop:before,html[data-netbox-color-mode=dark] .flatpickr-calendar.arrowTop:after{border-bottom-color:#343a40}html[data-netbox-color-mode=dark] .flatpickr-calendar span.flatpickr-weekday{color:#dee2e6}html[data-netbox-color-mode=dark] .flatpickr-calendar .numInputWrapper span.arrowUp:after{border-bottom-color:#f8f9fa}html[data-netbox-color-mode=dark] .flatpickr-calendar .numInputWrapper span.arrowDown:after{border-top-color:#f8f9fa}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-month{color:#fff;fill:#fff}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-next-month,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-prev-month{color:#fff;fill:#fff}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-next-month:hover svg,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-prev-month:hover svg{fill:#ea868f}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-current-month select{background:#343a40}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day{color:#fff}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected.inRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange.inRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange.inRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected:focus,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange:focus,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange:focus,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected.nextMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange.nextMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange.nextMonthDay{color:#000;background:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day:hover{color:#000;background:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.flatpickr-disabled,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.nextMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed.nextMonthDay{color:#adb5bd}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.prevMonthDay:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.nextMonthDay:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed.prevMonthDay:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed.nextMonthDay:hover{color:#000;background:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-time input{color:#f8f9fa;background:#343a40}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-time input:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-time input:active{background:#343a40}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-time .flatpickr-time-separator{color:#adb5bd}html[data-netbox-color-mode=dark] .flatpickr-calendar.showTimeInput.hasTime .flatpickr-time{border-top:1px solid #495057}html[data-netbox-color-mode=dark] .sidenav{position:fixed;top:0;bottom:0;left:0;z-index:1050;display:block;width:100%;max-width:3rem;padding-top:0;padding-right:0;padding-left:0;background-color:var(--nbx-sidebar-bg);border-right:1px solid #495057;transition:all .1s ease-in-out}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] .sidenav{transform:translate(-3rem)}html[data-netbox-color-mode=dark] .sidenav+.content-container[class]{margin-left:0}html[data-netbox-color-mode=dark] .sidenav .profile-button-container[class]{display:block}}html[data-netbox-color-mode=dark] .sidenav .profile-button-container{display:none;padding:.5rem 1rem}html[data-netbox-color-mode=dark] .sidenav+.content-container{margin-left:3rem;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .sidenav-brand{margin-right:0;transition:opacity .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .sidenav-brand-icon{transition:opacity .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .sidenav-inner{padding-right:1.5rem;padding-left:1.5rem}@media (min-width: 768px){html[data-netbox-color-mode=dark] .sidenav .sidenav-inner{padding-right:0;padding-left:0}}html[data-netbox-color-mode=dark] .sidenav .sidenav-brand-img,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand>img{max-width:100%;max-height:calc(16rem - 1rem)}html[data-netbox-color-mode=dark] .sidenav .navbar-heading{padding-top:.5rem;padding-bottom:.5rem;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em}html[data-netbox-color-mode=dark] .sidenav .sidenav-header{position:relative;display:flex;align-items:center;justify-content:space-between;height:78px;padding:1rem;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .sidenav-toggle{position:absolute;display:inline-block;opacity:0;transition:opacity 10ms ease-in-out;transition-delay:.1s}html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse{display:flex;flex:1;flex-direction:column;align-items:stretch;padding-right:1.5rem;padding-left:1.5rem;margin-right:-1.5rem;margin-left:-1.5rem}html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse>*{min-width:100%}@media (min-width: 768px){html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse{margin-right:0;margin-left:0}}html[data-netbox-color-mode=dark] .sidenav .nav-group-header{padding:.25rem 1rem;margin-top:.5rem;margin-bottom:0}html[data-netbox-color-mode=dark] .sidenav .nav .nav-item{display:flex;align-items:center;justify-content:space-between;width:100%}html[data-netbox-color-mode=dark] .sidenav .nav .nav-item.no-buttons{padding-right:5rem}html[data-netbox-color-mode=dark] .sidenav .collapse .nav .nav-item .nav-link{width:100%;padding:.25rem .25rem .25rem 1rem;margin-top:0;margin-bottom:0;border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}html[data-netbox-color-mode=dark] .sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon{width:1rem;text-align:center;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]{width:unset;height:100%;padding-left:.5rem;font-weight:700;color:var(--nbx-sidenav-parent-color)}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{color:#000;background:#6397e5}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after{display:inline-block;margin-left:auto;font-family:"Material Design Icons";font-style:normal;font-weight:700;font-variant:normal;color:#ced4da;text-rendering:auto;-webkit-font-smoothing:antialiased;content:"\f0142";transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after{color:#000}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after{color:#6ea8fe;transform:rotate(90deg)}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text{padding-left:.25rem;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .navbar-nav{flex-direction:column;margin-right:-1.5rem;margin-left:-1.5rem}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item{margin-top:2px}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item.disabled{cursor:not-allowed;opacity:.8}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link{position:relative;display:flex;align-items:center;width:100%;padding:.5rem 1rem;font-size:.875rem;color:var(--nbx-sidenav-link-color);white-space:nowrap;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link.active{background-color:var(--nbx-sidebar-link-active-bg)}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link:hover:not(.active){color:var(--nbx-body-color);background-color:var(--nbx-sidebar-link-hover-bg)}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link>i{min-width:2rem;font-size:calc(45px / 2);text-align:center}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-group-label{display:block;font-size:.75rem;font-weight:700;color:var(--nbx-sidenav-group-color);text-transform:uppercase;white-space:nowrap}html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon{color:var(--nbx-sidenav-pin-color);transform:rotate(90deg)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav+.content-container{margin-left:16rem}}html[data-netbox-color-mode=dark] .g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon{transform:rotate(0)}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav{max-width:16rem}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .navbar-heading,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .navbar-heading{display:block}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand{opacity:1;transform:translate(0)}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand-icon{position:absolute;opacity:0}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav{transform:translate(0)}}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-header,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-header{padding:.5rem}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-brand{position:absolute;opacity:0}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-brand-icon{opacity:1}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-toggle{opacity:0;position:absolute;transition:unset;transition-delay:0ms}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after{content:""}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .nav-item .collapse,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .nav-item .collapse{display:none}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .nav-link-text,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .nav-link-text{opacity:0}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{margin-right:0;margin-left:0;border-radius:unset}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand{display:block}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .collapse{height:auto;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text{opacity:1}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon{opacity:0}@media (min-width: 992px){html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-toggle{position:relative;opacity:1}}html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical{right:0;width:6px;background-color:transparent}html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical .simplebar-scrollbar{transition:none}html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical .simplebar-scrollbar:before{right:0;width:3px;background:var(--nbx-sidebar-scroll);border-radius:.375rem}html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before{width:5px}html[data-netbox-color-mode=dark] body{color:var(--nbx-body-color);background-color:var(--nbx-body-bg);font-size:.875rem}html[data-netbox-color-mode=dark] pre{white-space:pre}html[data-netbox-color-mode=dark] small,html[data-netbox-color-mode=dark] .small{font-size:smaller!important}html[data-netbox-color-mode=dark] a[type=button]{-webkit-appearance:unset!important}html[data-netbox-color-mode=dark] *[data-href]{cursor:pointer}html[data-netbox-color-mode=dark] .form-control:not([type=file]){font-size:inherit}html[data-netbox-color-mode=dark] .badge{font-size:.75rem}html[data-netbox-color-mode=dark] .text-xs{font-size:.75rem!important;line-height:1.25!important}html[data-netbox-color-mode=dark] .border-input{border:1px solid #495057!important}html[data-netbox-color-mode=dark] .ws-nowrap{white-space:nowrap!important}html[data-netbox-color-mode=dark] table tr .vertical-align,html[data-netbox-color-mode=dark] table td .vertical-align{vertical-align:middle}@media print{html[data-netbox-color-mode=dark] .noprint{display:none!important;visibility:hidden!important}}html[data-netbox-color-mode=dark] .printonly{display:none!important;visibility:hidden!important}@media print{html[data-netbox-color-mode=dark] .printonly{display:block!important;visibility:visible!important}}html[data-netbox-color-mode=dark] :root{--nbx-sidebar-bg: #e9ecef;--nbx-sidebar-scroll: #adb5bd;--nbx-sidebar-link-hover-bg: rgba(108, 117, 125, .15);--nbx-sidebar-link-active-bg: #cfe2ff;--nbx-sidebar-title-color: #ced4da;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(0, 0, 0, .25);--nbx-breadcrumb-bg: #dee2e6;--nbx-body-bg: #fff;--nbx-body-color: #343a40;--nbx-pre-bg: #f8f9fa;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(25, 135, 84, .4);--nbx-change-removed: rgba(220, 53, 69, .4);--nbx-cable-node-bg: #f8f9fa;--nbx-cable-node-border-color: #e9ecef;--nbx-cable-termination-bg: #e9ecef;--nbx-cable-termination-border-color: #dee2e6;--nbx-search-filter-border-left-color: #dee2e6;--nbx-color-mode-toggle-color: #6ea8fe;--nbx-sidenav-link-color: #343a40;--nbx-sidenav-pin-color: #fd7e14;--nbx-sidenav-parent-color: #343a40;--nbx-sidenav-group-color: #343a40}html[data-netbox-color-mode=dark] :root[data-netbox-color-mode=dark]{--nbx-sidebar-bg: #212529;--nbx-sidebar-scroll: #495057;--nbx-sidebar-link-active-bg: rgba(110, 168, 254, .25);--nbx-sidebar-link-hover-bg: rgba(173, 181, 189, .15);--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(255, 255, 255, .05);--nbx-breadcrumb-bg: #343a40;--nbx-body-bg: #1b1f22;--nbx-body-color: #f8f9fa;--nbx-pre-bg: #495057;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(117, 183, 152, .4);--nbx-change-removed: rgba(234, 134, 143, .4);--nbx-cable-node-bg: #495057;--nbx-cable-node-border-color: #6c757d;--nbx-cable-termination-bg: #343a40;--nbx-cable-termination-border-color: #495057;--nbx-search-filter-border-left-color: #6c757d;--nbx-color-mode-toggle-color: #ffda6a;--nbx-sidenav-link-color: #e9ecef;--nbx-sidenav-pin-color: #ffc107;--nbx-sidenav-parent-color: #e9ecef;--nbx-sidenav-group-color: #6c757d}html[data-netbox-color-mode=dark] .bg-primary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162233'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-primary{color:#6ea8fe}html[data-netbox-color-mode=dark] .btn.btn-ghost-primary:hover{background-color:#6ea8fe1f}html[data-netbox-color-mode=dark] .alert.alert-primary a:not(.btn),html[data-netbox-color-mode=dark] .table-primary a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .alert.alert-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-primary .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-primary a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .badge.bg-primary,html[data-netbox-color-mode=dark] .toast.bg-primary,html[data-netbox-color-mode=dark] .toast-header.bg-primary,html[data-netbox-color-mode=dark] .progress-bar.bg-primary{color:#000}html[data-netbox-color-mode=dark] .bg-secondary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23232426'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-secondary{color:#adb5bd}html[data-netbox-color-mode=dark] .btn.btn-ghost-secondary:hover{background-color:#adb5bd1f}html[data-netbox-color-mode=dark] .alert.alert-secondary a:not(.btn),html[data-netbox-color-mode=dark] .table-secondary a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .alert.alert-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-secondary .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-secondary a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .badge.bg-secondary,html[data-netbox-color-mode=dark] .toast.bg-secondary,html[data-netbox-color-mode=dark] .toast-header.bg-secondary,html[data-netbox-color-mode=dark] .progress-bar.bg-secondary{color:#000}html[data-netbox-color-mode=dark] .bg-success button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2317251e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-success{color:#75b798}html[data-netbox-color-mode=dark] .btn.btn-ghost-success:hover{background-color:#75b7981f}html[data-netbox-color-mode=dark] .alert.alert-success a:not(.btn),html[data-netbox-color-mode=dark] .table-success a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .alert.alert-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-success .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-success a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .badge.bg-success,html[data-netbox-color-mode=dark] .toast.bg-success,html[data-netbox-color-mode=dark] .toast-header.bg-success,html[data-netbox-color-mode=dark] .progress-bar.bg-success{color:#000}html[data-netbox-color-mode=dark] .bg-info button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162d31'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-info{color:#6edff6}html[data-netbox-color-mode=dark] .btn.btn-ghost-info:hover{background-color:#6edff61f}html[data-netbox-color-mode=dark] .alert.alert-info a:not(.btn),html[data-netbox-color-mode=dark] .table-info a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .alert.alert-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-info .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-info a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .badge.bg-info,html[data-netbox-color-mode=dark] .toast.bg-info,html[data-netbox-color-mode=dark] .toast-header.bg-info,html[data-netbox-color-mode=dark] .progress-bar.bg-info{color:#000}html[data-netbox-color-mode=dark] .bg-warning button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23332c15'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-warning{color:#ffda6a}html[data-netbox-color-mode=dark] .btn.btn-ghost-warning:hover{background-color:#ffda6a1f}html[data-netbox-color-mode=dark] .alert.alert-warning a:not(.btn),html[data-netbox-color-mode=dark] .table-warning a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .alert.alert-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-warning .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-warning a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .badge.bg-warning,html[data-netbox-color-mode=dark] .toast.bg-warning,html[data-netbox-color-mode=dark] .toast-header.bg-warning,html[data-netbox-color-mode=dark] .progress-bar.bg-warning{color:#000}html[data-netbox-color-mode=dark] .bg-danger button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232f1b1d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-danger{color:#ea868f}html[data-netbox-color-mode=dark] .btn.btn-ghost-danger:hover{background-color:#ea868f1f}html[data-netbox-color-mode=dark] .alert.alert-danger a:not(.btn),html[data-netbox-color-mode=dark] .table-danger a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .alert.alert-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-danger .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-danger a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .badge.bg-danger,html[data-netbox-color-mode=dark] .toast.bg-danger,html[data-netbox-color-mode=dark] .toast-header.bg-danger,html[data-netbox-color-mode=dark] .progress-bar.bg-danger{color:#000}html[data-netbox-color-mode=dark] .bg-light button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c2d2e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-light{color:#dee2e6}html[data-netbox-color-mode=dark] .btn.btn-ghost-light:hover{background-color:#dee2e61f}html[data-netbox-color-mode=dark] .alert.alert-light a:not(.btn),html[data-netbox-color-mode=dark] .table-light a:not(.btn){font-weight:700;color:#2c2d2e}html[data-netbox-color-mode=dark] .alert.alert-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-light .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-light a:not(.btn){font-weight:700;color:#2c2d2e}html[data-netbox-color-mode=dark] .badge.bg-light,html[data-netbox-color-mode=dark] .toast.bg-light,html[data-netbox-color-mode=dark] .toast-header.bg-light,html[data-netbox-color-mode=dark] .progress-bar.bg-light{color:#000}html[data-netbox-color-mode=dark] .bg-dark button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23232426'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-dark{color:#adb5bd}html[data-netbox-color-mode=dark] .btn.btn-ghost-dark:hover{background-color:#adb5bd1f}html[data-netbox-color-mode=dark] .alert.alert-dark a:not(.btn),html[data-netbox-color-mode=dark] .table-dark a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .alert.alert-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-dark .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-dark a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .badge.bg-dark,html[data-netbox-color-mode=dark] .toast.bg-dark,html[data-netbox-color-mode=dark] .toast-header.bg-dark,html[data-netbox-color-mode=dark] .progress-bar.bg-dark{color:#000}html[data-netbox-color-mode=dark] .bg-red button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232f1b1d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red{color:#ea868f}html[data-netbox-color-mode=dark] .btn.btn-ghost-red:hover{background-color:#ea868f1f}html[data-netbox-color-mode=dark] .alert.alert-red a:not(.btn),html[data-netbox-color-mode=dark] .table-red a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .alert.alert-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .badge.bg-red,html[data-netbox-color-mode=dark] .toast.bg-red,html[data-netbox-color-mode=dark] .toast-header.bg-red,html[data-netbox-color-mode=dark] .progress-bar.bg-red{color:#000}html[data-netbox-color-mode=dark] .bg-yellow button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23332c15'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow{color:#ffda6a}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow:hover{background-color:#ffda6a1f}html[data-netbox-color-mode=dark] .alert.alert-yellow a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .alert.alert-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .badge.bg-yellow,html[data-netbox-color-mode=dark] .toast.bg-yellow,html[data-netbox-color-mode=dark] .toast-header.bg-yellow,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow{color:#000}html[data-netbox-color-mode=dark] .bg-green button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2317251e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green{color:#75b798}html[data-netbox-color-mode=dark] .btn.btn-ghost-green:hover{background-color:#75b7981f}html[data-netbox-color-mode=dark] .alert.alert-green a:not(.btn),html[data-netbox-color-mode=dark] .table-green a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .alert.alert-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .badge.bg-green,html[data-netbox-color-mode=dark] .toast.bg-green,html[data-netbox-color-mode=dark] .toast-header.bg-green,html[data-netbox-color-mode=dark] .progress-bar.bg-green{color:#000}html[data-netbox-color-mode=dark] .bg-blue button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162233'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue{color:#6ea8fe}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue:hover{background-color:#6ea8fe1f}html[data-netbox-color-mode=dark] .alert.alert-blue a:not(.btn),html[data-netbox-color-mode=dark] .table-blue a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .alert.alert-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .badge.bg-blue,html[data-netbox-color-mode=dark] .toast.bg-blue,html[data-netbox-color-mode=dark] .toast-header.bg-blue,html[data-netbox-color-mode=dark] .progress-bar.bg-blue{color:#000}html[data-netbox-color-mode=dark] .bg-cyan button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162d31'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan{color:#6edff6}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan:hover{background-color:#6edff61f}html[data-netbox-color-mode=dark] .alert.alert-cyan a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .alert.alert-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .badge.bg-cyan,html[data-netbox-color-mode=dark] .toast.bg-cyan,html[data-netbox-color-mode=dark] .toast-header.bg-cyan,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan{color:#000}html[data-netbox-color-mode=dark] .bg-indigo button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23211631'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo{color:#a370f7}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo:hover{background-color:#a370f71f}html[data-netbox-color-mode=dark] .alert.alert-indigo a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo a:not(.btn){font-weight:700;color:#211631}html[data-netbox-color-mode=dark] .alert.alert-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo a:not(.btn){font-weight:700;color:#211631}html[data-netbox-color-mode=dark] .badge.bg-indigo,html[data-netbox-color-mode=dark] .toast.bg-indigo,html[data-netbox-color-mode=dark] .toast-header.bg-indigo,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo{color:#000}html[data-netbox-color-mode=dark] .bg-purple button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23221c2c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple{color:#a98eda}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple:hover{background-color:#a98eda1f}html[data-netbox-color-mode=dark] .alert.alert-purple a:not(.btn),html[data-netbox-color-mode=dark] .table-purple a:not(.btn){font-weight:700;color:#221c2c}html[data-netbox-color-mode=dark] .alert.alert-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple a:not(.btn){font-weight:700;color:#221c2c}html[data-netbox-color-mode=dark] .badge.bg-purple,html[data-netbox-color-mode=dark] .toast.bg-purple,html[data-netbox-color-mode=dark] .toast-header.bg-purple,html[data-netbox-color-mode=dark] .progress-bar.bg-purple{color:#000}html[data-netbox-color-mode=dark] .bg-pink button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232e1b24'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink{color:#e685b5}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink:hover{background-color:#e685b51f}html[data-netbox-color-mode=dark] .alert.alert-pink a:not(.btn),html[data-netbox-color-mode=dark] .table-pink a:not(.btn){font-weight:700;color:#2e1b24}html[data-netbox-color-mode=dark] .alert.alert-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink a:not(.btn){font-weight:700;color:#2e1b24}html[data-netbox-color-mode=dark] .badge.bg-pink,html[data-netbox-color-mode=dark] .toast.bg-pink,html[data-netbox-color-mode=dark] .toast-header.bg-pink,html[data-netbox-color-mode=dark] .progress-bar.bg-pink{color:#000}html[data-netbox-color-mode=dark] .bg-darker button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d1d2d3'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-darker{color:#1b1f22}html[data-netbox-color-mode=dark] .btn.btn-ghost-darker:hover{background-color:#1b1f221f}html[data-netbox-color-mode=dark] .alert.alert-darker a:not(.btn),html[data-netbox-color-mode=dark] .table-darker a:not(.btn){font-weight:700;color:#d1d2d3}html[data-netbox-color-mode=dark] .alert.alert-darker .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-darker .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-darker a:not(.btn){font-weight:700;color:#d1d2d3}html[data-netbox-color-mode=dark] .badge.bg-darker,html[data-netbox-color-mode=dark] .toast.bg-darker,html[data-netbox-color-mode=dark] .toast-header.bg-darker,html[data-netbox-color-mode=dark] .progress-bar.bg-darker{color:#fff}html[data-netbox-color-mode=dark] .bg-darkest button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d1d1d2'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-darkest{color:#171b1d}html[data-netbox-color-mode=dark] .btn.btn-ghost-darkest:hover{background-color:#171b1d1f}html[data-netbox-color-mode=dark] .alert.alert-darkest a:not(.btn),html[data-netbox-color-mode=dark] .table-darkest a:not(.btn){font-weight:700;color:#d1d1d2}html[data-netbox-color-mode=dark] .alert.alert-darkest .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-darkest .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-darkest a:not(.btn){font-weight:700;color:#d1d1d2}html[data-netbox-color-mode=dark] .badge.bg-darkest,html[data-netbox-color-mode=dark] .toast.bg-darkest,html[data-netbox-color-mode=dark] .toast-header.bg-darkest,html[data-netbox-color-mode=dark] .progress-bar.bg-darkest{color:#fff}html[data-netbox-color-mode=dark] .bg-gray button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23292a2c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray{color:#ced4da}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray:hover{background-color:#ced4da1f}html[data-netbox-color-mode=dark] .alert.alert-gray a:not(.btn),html[data-netbox-color-mode=dark] .table-gray a:not(.btn){font-weight:700;color:#292a2c}html[data-netbox-color-mode=dark] .alert.alert-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray a:not(.btn){font-weight:700;color:#292a2c}html[data-netbox-color-mode=dark] .badge.bg-gray,html[data-netbox-color-mode=dark] .toast.bg-gray,html[data-netbox-color-mode=dark] .toast-header.bg-gray,html[data-netbox-color-mode=dark] .progress-bar.bg-gray{color:#000}html[data-netbox-color-mode=dark] .bg-gray-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23323232'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-100{color:#f8f9fa}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-100:hover{background-color:#f8f9fa1f}html[data-netbox-color-mode=dark] .alert.alert-gray-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-100 a:not(.btn){font-weight:700;color:#323232}html[data-netbox-color-mode=dark] .alert.alert-gray-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-100 a:not(.btn){font-weight:700;color:#323232}html[data-netbox-color-mode=dark] .badge.bg-gray-100,html[data-netbox-color-mode=dark] .toast.bg-gray-100,html[data-netbox-color-mode=dark] .toast-header.bg-gray-100,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-100{color:#000}html[data-netbox-color-mode=dark] .bg-gray-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232f2f30'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-200{color:#e9ecef}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-200:hover{background-color:#e9ecef1f}html[data-netbox-color-mode=dark] .alert.alert-gray-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-200 a:not(.btn){font-weight:700;color:#2f2f30}html[data-netbox-color-mode=dark] .alert.alert-gray-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-200 a:not(.btn){font-weight:700;color:#2f2f30}html[data-netbox-color-mode=dark] .badge.bg-gray-200,html[data-netbox-color-mode=dark] .toast.bg-gray-200,html[data-netbox-color-mode=dark] .toast-header.bg-gray-200,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-200{color:#000}html[data-netbox-color-mode=dark] .bg-gray-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c2d2e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-300{color:#dee2e6}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-300:hover{background-color:#dee2e61f}html[data-netbox-color-mode=dark] .alert.alert-gray-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-300 a:not(.btn){font-weight:700;color:#2c2d2e}html[data-netbox-color-mode=dark] .alert.alert-gray-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-300 a:not(.btn){font-weight:700;color:#2c2d2e}html[data-netbox-color-mode=dark] .badge.bg-gray-300,html[data-netbox-color-mode=dark] .toast.bg-gray-300,html[data-netbox-color-mode=dark] .toast-header.bg-gray-300,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-300{color:#000}html[data-netbox-color-mode=dark] .bg-gray-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23292a2c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-400{color:#ced4da}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-400:hover{background-color:#ced4da1f}html[data-netbox-color-mode=dark] .alert.alert-gray-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-400 a:not(.btn){font-weight:700;color:#292a2c}html[data-netbox-color-mode=dark] .alert.alert-gray-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-400 a:not(.btn){font-weight:700;color:#292a2c}html[data-netbox-color-mode=dark] .badge.bg-gray-400,html[data-netbox-color-mode=dark] .toast.bg-gray-400,html[data-netbox-color-mode=dark] .toast-header.bg-gray-400,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-400{color:#000}html[data-netbox-color-mode=dark] .bg-gray-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23232426'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-500{color:#adb5bd}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-500:hover{background-color:#adb5bd1f}html[data-netbox-color-mode=dark] .alert.alert-gray-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-500 a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .alert.alert-gray-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-500 a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .badge.bg-gray-500,html[data-netbox-color-mode=dark] .toast.bg-gray-500,html[data-netbox-color-mode=dark] .toast-header.bg-gray-500,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-500{color:#000}html[data-netbox-color-mode=dark] .bg-gray-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23161719'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-600{color:#6c757d}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-600:hover{background-color:#6c757d1f}html[data-netbox-color-mode=dark] .alert.alert-gray-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-600 a:not(.btn){font-weight:700;color:#161719}html[data-netbox-color-mode=dark] .alert.alert-gray-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-600 a:not(.btn){font-weight:700;color:#e2e3e5}html[data-netbox-color-mode=dark] .badge.bg-gray-600,html[data-netbox-color-mode=dark] .toast.bg-gray-600,html[data-netbox-color-mode=dark] .toast-header.bg-gray-600,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-600{color:#fff}html[data-netbox-color-mode=dark] .bg-gray-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23dbdcdd'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-700{color:#495057}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-700:hover{background-color:#4950571f}html[data-netbox-color-mode=dark] .alert.alert-gray-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-700 a:not(.btn){font-weight:700;color:#dbdcdd}html[data-netbox-color-mode=dark] .alert.alert-gray-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-700 a:not(.btn){font-weight:700;color:#dbdcdd}html[data-netbox-color-mode=dark] .badge.bg-gray-700,html[data-netbox-color-mode=dark] .toast.bg-gray-700,html[data-netbox-color-mode=dark] .toast-header.bg-gray-700,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-700{color:#fff}html[data-netbox-color-mode=dark] .bg-gray-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d6d8d9'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-800{color:#343a40}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-800:hover{background-color:#343a401f}html[data-netbox-color-mode=dark] .alert.alert-gray-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-800 a:not(.btn){font-weight:700;color:#d6d8d9}html[data-netbox-color-mode=dark] .alert.alert-gray-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-800 a:not(.btn){font-weight:700;color:#d6d8d9}html[data-netbox-color-mode=dark] .badge.bg-gray-800,html[data-netbox-color-mode=dark] .toast.bg-gray-800,html[data-netbox-color-mode=dark] .toast-header.bg-gray-800,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-800{color:#fff}html[data-netbox-color-mode=dark] .bg-gray-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d3d3d4'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-900{color:#212529}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-900:hover{background-color:#2125291f}html[data-netbox-color-mode=dark] .alert.alert-gray-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-900 a:not(.btn){font-weight:700;color:#d3d3d4}html[data-netbox-color-mode=dark] .alert.alert-gray-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray-900 a:not(.btn){font-weight:700;color:#d3d3d4}html[data-netbox-color-mode=dark] .badge.bg-gray-900,html[data-netbox-color-mode=dark] .toast.bg-gray-900,html[data-netbox-color-mode=dark] .toast-header.bg-gray-900,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-900{color:#fff}html[data-netbox-color-mode=dark] .bg-red-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23322b2c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-100{color:#f8d7da}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-100:hover{background-color:#f8d7da1f}html[data-netbox-color-mode=dark] .alert.alert-red-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-100 a:not(.btn){font-weight:700;color:#322b2c}html[data-netbox-color-mode=dark] .alert.alert-red-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-100 a:not(.btn){font-weight:700;color:#322b2c}html[data-netbox-color-mode=dark] .badge.bg-red-100,html[data-netbox-color-mode=dark] .toast.bg-red-100,html[data-netbox-color-mode=dark] .toast-header.bg-red-100,html[data-netbox-color-mode=dark] .progress-bar.bg-red-100{color:#000}html[data-netbox-color-mode=dark] .bg-red-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23302324'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-200{color:#f1aeb5}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-200:hover{background-color:#f1aeb51f}html[data-netbox-color-mode=dark] .alert.alert-red-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-200 a:not(.btn){font-weight:700;color:#302324}html[data-netbox-color-mode=dark] .alert.alert-red-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-200 a:not(.btn){font-weight:700;color:#302324}html[data-netbox-color-mode=dark] .badge.bg-red-200,html[data-netbox-color-mode=dark] .toast.bg-red-200,html[data-netbox-color-mode=dark] .toast-header.bg-red-200,html[data-netbox-color-mode=dark] .progress-bar.bg-red-200{color:#000}html[data-netbox-color-mode=dark] .bg-red-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232f1b1d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-300{color:#ea868f}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-300:hover{background-color:#ea868f1f}html[data-netbox-color-mode=dark] .alert.alert-red-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-300 a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .alert.alert-red-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-300 a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .badge.bg-red-300,html[data-netbox-color-mode=dark] .toast.bg-red-300,html[data-netbox-color-mode=dark] .toast-header.bg-red-300,html[data-netbox-color-mode=dark] .progress-bar.bg-red-300{color:#000}html[data-netbox-color-mode=dark] .bg-red-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232d1315'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-400{color:#e35d6a}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-400:hover{background-color:#e35d6a1f}html[data-netbox-color-mode=dark] .alert.alert-red-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-400 a:not(.btn){font-weight:700;color:#2d1315}html[data-netbox-color-mode=dark] .alert.alert-red-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-400 a:not(.btn){font-weight:700;color:#2d1315}html[data-netbox-color-mode=dark] .badge.bg-red-400,html[data-netbox-color-mode=dark] .toast.bg-red-400,html[data-netbox-color-mode=dark] .toast-header.bg-red-400,html[data-netbox-color-mode=dark] .progress-bar.bg-red-400{color:#000}html[data-netbox-color-mode=dark] .bg-red-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c0b0e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-500{color:#dc3545}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-500:hover{background-color:#dc35451f}html[data-netbox-color-mode=dark] .alert.alert-red-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-500 a:not(.btn){font-weight:700;color:#2c0b0e}html[data-netbox-color-mode=dark] .alert.alert-red-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-500 a:not(.btn){font-weight:700;color:#f8d7da}html[data-netbox-color-mode=dark] .badge.bg-red-500,html[data-netbox-color-mode=dark] .toast.bg-red-500,html[data-netbox-color-mode=dark] .toast-header.bg-red-500,html[data-netbox-color-mode=dark] .progress-bar.bg-red-500{color:#fff}html[data-netbox-color-mode=dark] .bg-red-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23efd4d7'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-600{color:#b02a37}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-600:hover{background-color:#b02a371f}html[data-netbox-color-mode=dark] .alert.alert-red-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-600 a:not(.btn){font-weight:700;color:#efd4d7}html[data-netbox-color-mode=dark] .alert.alert-red-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-600 a:not(.btn){font-weight:700;color:#efd4d7}html[data-netbox-color-mode=dark] .badge.bg-red-600,html[data-netbox-color-mode=dark] .toast.bg-red-600,html[data-netbox-color-mode=dark] .toast-header.bg-red-600,html[data-netbox-color-mode=dark] .progress-bar.bg-red-600{color:#fff}html[data-netbox-color-mode=dark] .bg-red-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23e6d2d4'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-700{color:#842029}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-700:hover{background-color:#8420291f}html[data-netbox-color-mode=dark] .alert.alert-red-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-700 a:not(.btn){font-weight:700;color:#e6d2d4}html[data-netbox-color-mode=dark] .alert.alert-red-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-700 a:not(.btn){font-weight:700;color:#e6d2d4}html[data-netbox-color-mode=dark] .badge.bg-red-700,html[data-netbox-color-mode=dark] .toast.bg-red-700,html[data-netbox-color-mode=dark] .toast-header.bg-red-700,html[data-netbox-color-mode=dark] .progress-bar.bg-red-700{color:#fff}html[data-netbox-color-mode=dark] .bg-red-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ded0d2'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-800{color:#58151c}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-800:hover{background-color:#58151c1f}html[data-netbox-color-mode=dark] .alert.alert-red-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-800 a:not(.btn){font-weight:700;color:#ded0d2}html[data-netbox-color-mode=dark] .alert.alert-red-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-800 a:not(.btn){font-weight:700;color:#ded0d2}html[data-netbox-color-mode=dark] .badge.bg-red-800,html[data-netbox-color-mode=dark] .toast.bg-red-800,html[data-netbox-color-mode=dark] .toast-header.bg-red-800,html[data-netbox-color-mode=dark] .progress-bar.bg-red-800{color:#fff}html[data-netbox-color-mode=dark] .bg-red-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d5cecf'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-900{color:#2c0b0e}html[data-netbox-color-mode=dark] .btn.btn-ghost-red-900:hover{background-color:#2c0b0e1f}html[data-netbox-color-mode=dark] .alert.alert-red-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-900 a:not(.btn){font-weight:700;color:#d5cecf}html[data-netbox-color-mode=dark] .alert.alert-red-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red-900 a:not(.btn){font-weight:700;color:#d5cecf}html[data-netbox-color-mode=dark] .badge.bg-red-900,html[data-netbox-color-mode=dark] .toast.bg-red-900,html[data-netbox-color-mode=dark] .toast-header.bg-red-900,html[data-netbox-color-mode=dark] .progress-bar.bg-red-900{color:#fff}html[data-netbox-color-mode=dark] .bg-yellow-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23333129'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-100{color:#fff3cd}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-100:hover{background-color:#fff3cd1f}html[data-netbox-color-mode=dark] .alert.alert-yellow-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-100 a:not(.btn){font-weight:700;color:#333129}html[data-netbox-color-mode=dark] .alert.alert-yellow-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-100 a:not(.btn){font-weight:700;color:#333129}html[data-netbox-color-mode=dark] .badge.bg-yellow-100,html[data-netbox-color-mode=dark] .toast.bg-yellow-100,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-100,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-100{color:#000}html[data-netbox-color-mode=dark] .bg-yellow-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23332e1f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-200{color:#ffe69c}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-200:hover{background-color:#ffe69c1f}html[data-netbox-color-mode=dark] .alert.alert-yellow-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-200 a:not(.btn){font-weight:700;color:#332e1f}html[data-netbox-color-mode=dark] .alert.alert-yellow-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-200 a:not(.btn){font-weight:700;color:#332e1f}html[data-netbox-color-mode=dark] .badge.bg-yellow-200,html[data-netbox-color-mode=dark] .toast.bg-yellow-200,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-200,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-200{color:#000}html[data-netbox-color-mode=dark] .bg-yellow-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23332c15'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-300{color:#ffda6a}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-300:hover{background-color:#ffda6a1f}html[data-netbox-color-mode=dark] .alert.alert-yellow-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-300 a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .alert.alert-yellow-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-300 a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .badge.bg-yellow-300,html[data-netbox-color-mode=dark] .toast.bg-yellow-300,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-300,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-300{color:#000}html[data-netbox-color-mode=dark] .bg-yellow-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2333290b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-400{color:#ffcd39}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-400:hover{background-color:#ffcd391f}html[data-netbox-color-mode=dark] .alert.alert-yellow-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-400 a:not(.btn){font-weight:700;color:#33290b}html[data-netbox-color-mode=dark] .alert.alert-yellow-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-400 a:not(.btn){font-weight:700;color:#33290b}html[data-netbox-color-mode=dark] .badge.bg-yellow-400,html[data-netbox-color-mode=dark] .toast.bg-yellow-400,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-400,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-400{color:#000}html[data-netbox-color-mode=dark] .bg-yellow-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23332701'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-500{color:#ffc107}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-500:hover{background-color:#ffc1071f}html[data-netbox-color-mode=dark] .alert.alert-yellow-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-500 a:not(.btn){font-weight:700;color:#332701}html[data-netbox-color-mode=dark] .alert.alert-yellow-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-500 a:not(.btn){font-weight:700;color:#332701}html[data-netbox-color-mode=dark] .badge.bg-yellow-500,html[data-netbox-color-mode=dark] .toast.bg-yellow-500,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-500,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-500{color:#000}html[data-netbox-color-mode=dark] .bg-yellow-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23291f01'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-600{color:#cc9a06}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-600:hover{background-color:#cc9a061f}html[data-netbox-color-mode=dark] .alert.alert-yellow-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-600 a:not(.btn){font-weight:700;color:#291f01}html[data-netbox-color-mode=dark] .alert.alert-yellow-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-600 a:not(.btn){font-weight:700;color:#291f01}html[data-netbox-color-mode=dark] .badge.bg-yellow-600,html[data-netbox-color-mode=dark] .toast.bg-yellow-600,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-600,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-600{color:#000}html[data-netbox-color-mode=dark] .bg-yellow-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f1701'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-700{color:#997404}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-700:hover{background-color:#9974041f}html[data-netbox-color-mode=dark] .alert.alert-yellow-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-700 a:not(.btn){font-weight:700;color:#1f1701}html[data-netbox-color-mode=dark] .alert.alert-yellow-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-700 a:not(.btn){font-weight:700;color:#1f1701}html[data-netbox-color-mode=dark] .badge.bg-yellow-700,html[data-netbox-color-mode=dark] .toast.bg-yellow-700,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-700,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-700{color:#000}html[data-netbox-color-mode=dark] .bg-yellow-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23e0dbcd'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-800{color:#664d03}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-800:hover{background-color:#664d031f}html[data-netbox-color-mode=dark] .alert.alert-yellow-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-800 a:not(.btn){font-weight:700;color:#e0dbcd}html[data-netbox-color-mode=dark] .alert.alert-yellow-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-800 a:not(.btn){font-weight:700;color:#e0dbcd}html[data-netbox-color-mode=dark] .badge.bg-yellow-800,html[data-netbox-color-mode=dark] .toast.bg-yellow-800,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-800,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-800{color:#fff}html[data-netbox-color-mode=dark] .bg-yellow-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d6d4cc'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-900{color:#332701}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-900:hover{background-color:#3327011f}html[data-netbox-color-mode=dark] .alert.alert-yellow-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-900 a:not(.btn){font-weight:700;color:#d6d4cc}html[data-netbox-color-mode=dark] .alert.alert-yellow-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow-900 a:not(.btn){font-weight:700;color:#d6d4cc}html[data-netbox-color-mode=dark] .badge.bg-yellow-900,html[data-netbox-color-mode=dark] .toast.bg-yellow-900,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-900,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-900{color:#fff}html[data-netbox-color-mode=dark] .bg-green-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232a2e2c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-100{color:#d1e7dd}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-100:hover{background-color:#d1e7dd1f}html[data-netbox-color-mode=dark] .alert.alert-green-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-100 a:not(.btn){font-weight:700;color:#2a2e2c}html[data-netbox-color-mode=dark] .alert.alert-green-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-100 a:not(.btn){font-weight:700;color:#2a2e2c}html[data-netbox-color-mode=dark] .badge.bg-green-100,html[data-netbox-color-mode=dark] .toast.bg-green-100,html[data-netbox-color-mode=dark] .toast-header.bg-green-100,html[data-netbox-color-mode=dark] .progress-bar.bg-green-100{color:#000}html[data-netbox-color-mode=dark] .bg-green-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212925'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-200{color:#a3cfbb}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-200:hover{background-color:#a3cfbb1f}html[data-netbox-color-mode=dark] .alert.alert-green-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-200 a:not(.btn){font-weight:700;color:#212925}html[data-netbox-color-mode=dark] .alert.alert-green-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-200 a:not(.btn){font-weight:700;color:#212925}html[data-netbox-color-mode=dark] .badge.bg-green-200,html[data-netbox-color-mode=dark] .toast.bg-green-200,html[data-netbox-color-mode=dark] .toast-header.bg-green-200,html[data-netbox-color-mode=dark] .progress-bar.bg-green-200{color:#000}html[data-netbox-color-mode=dark] .bg-green-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2317251e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-300{color:#75b798}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-300:hover{background-color:#75b7981f}html[data-netbox-color-mode=dark] .alert.alert-green-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-300 a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .alert.alert-green-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-300 a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .badge.bg-green-300,html[data-netbox-color-mode=dark] .toast.bg-green-300,html[data-netbox-color-mode=dark] .toast-header.bg-green-300,html[data-netbox-color-mode=dark] .progress-bar.bg-green-300{color:#000}html[data-netbox-color-mode=dark] .bg-green-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230e2018'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-400{color:#479f76}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-400:hover{background-color:#479f761f}html[data-netbox-color-mode=dark] .alert.alert-green-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-400 a:not(.btn){font-weight:700;color:#0e2018}html[data-netbox-color-mode=dark] .alert.alert-green-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-400 a:not(.btn){font-weight:700;color:#0e2018}html[data-netbox-color-mode=dark] .badge.bg-green-400,html[data-netbox-color-mode=dark] .toast.bg-green-400,html[data-netbox-color-mode=dark] .toast-header.bg-green-400,html[data-netbox-color-mode=dark] .progress-bar.bg-green-400{color:#000}html[data-netbox-color-mode=dark] .bg-green-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23051b11'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-500{color:#198754}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-500:hover{background-color:#1987541f}html[data-netbox-color-mode=dark] .alert.alert-green-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-500 a:not(.btn){font-weight:700;color:#051b11}html[data-netbox-color-mode=dark] .alert.alert-green-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-500 a:not(.btn){font-weight:700;color:#d1e7dd}html[data-netbox-color-mode=dark] .badge.bg-green-500,html[data-netbox-color-mode=dark] .toast.bg-green-500,html[data-netbox-color-mode=dark] .toast-header.bg-green-500,html[data-netbox-color-mode=dark] .progress-bar.bg-green-500{color:#fff}html[data-netbox-color-mode=dark] .bg-green-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d0e2d9'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-600{color:#146c43}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-600:hover{background-color:#146c431f}html[data-netbox-color-mode=dark] .alert.alert-green-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-600 a:not(.btn){font-weight:700;color:#d0e2d9}html[data-netbox-color-mode=dark] .alert.alert-green-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-600 a:not(.btn){font-weight:700;color:#d0e2d9}html[data-netbox-color-mode=dark] .badge.bg-green-600,html[data-netbox-color-mode=dark] .toast.bg-green-600,html[data-netbox-color-mode=dark] .toast-header.bg-green-600,html[data-netbox-color-mode=dark] .progress-bar.bg-green-600{color:#fff}html[data-netbox-color-mode=dark] .bg-green-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cfdcd6'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-700{color:#0f5132}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-700:hover{background-color:#0f51321f}html[data-netbox-color-mode=dark] .alert.alert-green-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-700 a:not(.btn){font-weight:700;color:#cfdcd6}html[data-netbox-color-mode=dark] .alert.alert-green-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-700 a:not(.btn){font-weight:700;color:#cfdcd6}html[data-netbox-color-mode=dark] .badge.bg-green-700,html[data-netbox-color-mode=dark] .toast.bg-green-700,html[data-netbox-color-mode=dark] .toast-header.bg-green-700,html[data-netbox-color-mode=dark] .progress-bar.bg-green-700{color:#fff}html[data-netbox-color-mode=dark] .bg-green-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ced7d3'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-800{color:#0a3622}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-800:hover{background-color:#0a36221f}html[data-netbox-color-mode=dark] .alert.alert-green-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-800 a:not(.btn){font-weight:700;color:#ced7d3}html[data-netbox-color-mode=dark] .alert.alert-green-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-800 a:not(.btn){font-weight:700;color:#ced7d3}html[data-netbox-color-mode=dark] .badge.bg-green-800,html[data-netbox-color-mode=dark] .toast.bg-green-800,html[data-netbox-color-mode=dark] .toast-header.bg-green-800,html[data-netbox-color-mode=dark] .progress-bar.bg-green-800{color:#fff}html[data-netbox-color-mode=dark] .bg-green-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cdd1cf'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-900{color:#051b11}html[data-netbox-color-mode=dark] .btn.btn-ghost-green-900:hover{background-color:#051b111f}html[data-netbox-color-mode=dark] .alert.alert-green-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-900 a:not(.btn){font-weight:700;color:#cdd1cf}html[data-netbox-color-mode=dark] .alert.alert-green-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green-900 a:not(.btn){font-weight:700;color:#cdd1cf}html[data-netbox-color-mode=dark] .badge.bg-green-900,html[data-netbox-color-mode=dark] .toast.bg-green-900,html[data-netbox-color-mode=dark] .toast-header.bg-green-900,html[data-netbox-color-mode=dark] .progress-bar.bg-green-900{color:#fff}html[data-netbox-color-mode=dark] .bg-blue-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23292d33'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-100{color:#cfe2ff}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-100:hover{background-color:#cfe2ff1f}html[data-netbox-color-mode=dark] .alert.alert-blue-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-100 a:not(.btn){font-weight:700;color:#292d33}html[data-netbox-color-mode=dark] .alert.alert-blue-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-100 a:not(.btn){font-weight:700;color:#292d33}html[data-netbox-color-mode=dark] .badge.bg-blue-100,html[data-netbox-color-mode=dark] .toast.bg-blue-100,html[data-netbox-color-mode=dark] .toast-header.bg-blue-100,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-100{color:#000}html[data-netbox-color-mode=dark] .bg-blue-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23202733'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-200{color:#9ec5fe}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-200:hover{background-color:#9ec5fe1f}html[data-netbox-color-mode=dark] .alert.alert-blue-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-200 a:not(.btn){font-weight:700;color:#202733}html[data-netbox-color-mode=dark] .alert.alert-blue-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-200 a:not(.btn){font-weight:700;color:#202733}html[data-netbox-color-mode=dark] .badge.bg-blue-200,html[data-netbox-color-mode=dark] .toast.bg-blue-200,html[data-netbox-color-mode=dark] .toast-header.bg-blue-200,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-200{color:#000}html[data-netbox-color-mode=dark] .bg-blue-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162233'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-300{color:#6ea8fe}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-300:hover{background-color:#6ea8fe1f}html[data-netbox-color-mode=dark] .alert.alert-blue-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-300 a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .alert.alert-blue-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-300 a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .badge.bg-blue-300,html[data-netbox-color-mode=dark] .toast.bg-blue-300,html[data-netbox-color-mode=dark] .toast-header.bg-blue-300,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-300{color:#000}html[data-netbox-color-mode=dark] .bg-blue-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c1c33'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-400{color:#3d8bfd}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-400:hover{background-color:#3d8bfd1f}html[data-netbox-color-mode=dark] .alert.alert-blue-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-400 a:not(.btn){font-weight:700;color:#0c1c33}html[data-netbox-color-mode=dark] .alert.alert-blue-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-400 a:not(.btn){font-weight:700;color:#0c1c33}html[data-netbox-color-mode=dark] .badge.bg-blue-400,html[data-netbox-color-mode=dark] .toast.bg-blue-400,html[data-netbox-color-mode=dark] .toast-header.bg-blue-400,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-400{color:#000}html[data-netbox-color-mode=dark] .bg-blue-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23031633'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-500{color:#0d6efd}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-500:hover{background-color:#0d6efd1f}html[data-netbox-color-mode=dark] .alert.alert-blue-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-500 a:not(.btn){font-weight:700;color:#031633}html[data-netbox-color-mode=dark] .alert.alert-blue-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-500 a:not(.btn){font-weight:700;color:#cfe2ff}html[data-netbox-color-mode=dark] .badge.bg-blue-500,html[data-netbox-color-mode=dark] .toast.bg-blue-500,html[data-netbox-color-mode=dark] .toast-header.bg-blue-500,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-500{color:#fff}html[data-netbox-color-mode=dark] .bg-blue-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cedef4'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-600{color:#0a58ca}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-600:hover{background-color:#0a58ca1f}html[data-netbox-color-mode=dark] .alert.alert-blue-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-600 a:not(.btn){font-weight:700;color:#cedef4}html[data-netbox-color-mode=dark] .alert.alert-blue-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-600 a:not(.btn){font-weight:700;color:#cedef4}html[data-netbox-color-mode=dark] .badge.bg-blue-600,html[data-netbox-color-mode=dark] .toast.bg-blue-600,html[data-netbox-color-mode=dark] .toast-header.bg-blue-600,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-600{color:#fff}html[data-netbox-color-mode=dark] .bg-blue-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ced9ea'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-700{color:#084298}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-700:hover{background-color:#0842981f}html[data-netbox-color-mode=dark] .alert.alert-blue-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-700 a:not(.btn){font-weight:700;color:#ced9ea}html[data-netbox-color-mode=dark] .alert.alert-blue-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-700 a:not(.btn){font-weight:700;color:#ced9ea}html[data-netbox-color-mode=dark] .badge.bg-blue-700,html[data-netbox-color-mode=dark] .toast.bg-blue-700,html[data-netbox-color-mode=dark] .toast-header.bg-blue-700,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-700{color:#fff}html[data-netbox-color-mode=dark] .bg-blue-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cdd5e0'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-800{color:#052c65}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-800:hover{background-color:#052c651f}html[data-netbox-color-mode=dark] .alert.alert-blue-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-800 a:not(.btn){font-weight:700;color:#cdd5e0}html[data-netbox-color-mode=dark] .alert.alert-blue-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-800 a:not(.btn){font-weight:700;color:#cdd5e0}html[data-netbox-color-mode=dark] .badge.bg-blue-800,html[data-netbox-color-mode=dark] .toast.bg-blue-800,html[data-netbox-color-mode=dark] .toast-header.bg-blue-800,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-800{color:#fff}html[data-netbox-color-mode=dark] .bg-blue-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cdd0d6'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-900{color:#031633}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-900:hover{background-color:#0316331f}html[data-netbox-color-mode=dark] .alert.alert-blue-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-900 a:not(.btn){font-weight:700;color:#cdd0d6}html[data-netbox-color-mode=dark] .alert.alert-blue-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue-900 a:not(.btn){font-weight:700;color:#cdd0d6}html[data-netbox-color-mode=dark] .badge.bg-blue-900,html[data-netbox-color-mode=dark] .toast.bg-blue-900,html[data-netbox-color-mode=dark] .toast-header.bg-blue-900,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-900{color:#fff}html[data-netbox-color-mode=dark] .bg-cyan-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23293132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-100{color:#cff4fc}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-100:hover{background-color:#cff4fc1f}html[data-netbox-color-mode=dark] .alert.alert-cyan-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-100 a:not(.btn){font-weight:700;color:#293132}html[data-netbox-color-mode=dark] .alert.alert-cyan-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-100 a:not(.btn){font-weight:700;color:#293132}html[data-netbox-color-mode=dark] .badge.bg-cyan-100,html[data-netbox-color-mode=dark] .toast.bg-cyan-100,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-100,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-100{color:#000}html[data-netbox-color-mode=dark] .bg-cyan-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23202f32'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-200{color:#9eeaf9}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-200:hover{background-color:#9eeaf91f}html[data-netbox-color-mode=dark] .alert.alert-cyan-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-200 a:not(.btn){font-weight:700;color:#202f32}html[data-netbox-color-mode=dark] .alert.alert-cyan-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-200 a:not(.btn){font-weight:700;color:#202f32}html[data-netbox-color-mode=dark] .badge.bg-cyan-200,html[data-netbox-color-mode=dark] .toast.bg-cyan-200,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-200,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-200{color:#000}html[data-netbox-color-mode=dark] .bg-cyan-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162d31'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-300{color:#6edff6}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-300:hover{background-color:#6edff61f}html[data-netbox-color-mode=dark] .alert.alert-cyan-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-300 a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .alert.alert-cyan-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-300 a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .badge.bg-cyan-300,html[data-netbox-color-mode=dark] .toast.bg-cyan-300,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-300,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-300{color:#000}html[data-netbox-color-mode=dark] .bg-cyan-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c2b31'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-400{color:#3dd5f3}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-400:hover{background-color:#3dd5f31f}html[data-netbox-color-mode=dark] .alert.alert-cyan-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-400 a:not(.btn){font-weight:700;color:#0c2b31}html[data-netbox-color-mode=dark] .alert.alert-cyan-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-400 a:not(.btn){font-weight:700;color:#0c2b31}html[data-netbox-color-mode=dark] .badge.bg-cyan-400,html[data-netbox-color-mode=dark] .toast.bg-cyan-400,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-400,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-400{color:#000}html[data-netbox-color-mode=dark] .bg-cyan-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23032830'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-500{color:#0dcaf0}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-500:hover{background-color:#0dcaf01f}html[data-netbox-color-mode=dark] .alert.alert-cyan-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-500 a:not(.btn){font-weight:700;color:#032830}html[data-netbox-color-mode=dark] .alert.alert-cyan-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-500 a:not(.btn){font-weight:700;color:#032830}html[data-netbox-color-mode=dark] .badge.bg-cyan-500,html[data-netbox-color-mode=dark] .toast.bg-cyan-500,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-500,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-500{color:#000}html[data-netbox-color-mode=dark] .bg-cyan-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23022026'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-600{color:#0aa2c0}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-600:hover{background-color:#0aa2c01f}html[data-netbox-color-mode=dark] .alert.alert-cyan-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-600 a:not(.btn){font-weight:700;color:#022026}html[data-netbox-color-mode=dark] .alert.alert-cyan-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-600 a:not(.btn){font-weight:700;color:#022026}html[data-netbox-color-mode=dark] .badge.bg-cyan-600,html[data-netbox-color-mode=dark] .toast.bg-cyan-600,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-600,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-600{color:#000}html[data-netbox-color-mode=dark] .bg-cyan-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cee4e9'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-700{color:#087990}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-700:hover{background-color:#0879901f}html[data-netbox-color-mode=dark] .alert.alert-cyan-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-700 a:not(.btn){font-weight:700;color:#cee4e9}html[data-netbox-color-mode=dark] .alert.alert-cyan-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-700 a:not(.btn){font-weight:700;color:#cee4e9}html[data-netbox-color-mode=dark] .badge.bg-cyan-700,html[data-netbox-color-mode=dark] .toast.bg-cyan-700,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-700,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-700{color:#fff}html[data-netbox-color-mode=dark] .bg-cyan-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cddcdf'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-800{color:#055160}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-800:hover{background-color:#0551601f}html[data-netbox-color-mode=dark] .alert.alert-cyan-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-800 a:not(.btn){font-weight:700;color:#cddcdf}html[data-netbox-color-mode=dark] .alert.alert-cyan-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-800 a:not(.btn){font-weight:700;color:#cddcdf}html[data-netbox-color-mode=dark] .badge.bg-cyan-800,html[data-netbox-color-mode=dark] .toast.bg-cyan-800,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-800,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-800{color:#fff}html[data-netbox-color-mode=dark] .bg-cyan-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cdd4d6'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-900{color:#032830}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-900:hover{background-color:#0328301f}html[data-netbox-color-mode=dark] .alert.alert-cyan-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-900 a:not(.btn){font-weight:700;color:#cdd4d6}html[data-netbox-color-mode=dark] .alert.alert-cyan-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan-900 a:not(.btn){font-weight:700;color:#cdd4d6}html[data-netbox-color-mode=dark] .badge.bg-cyan-900,html[data-netbox-color-mode=dark] .toast.bg-cyan-900,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-900,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-900{color:#fff}html[data-netbox-color-mode=dark] .bg-indigo-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232d2932'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-100{color:#e0cffc}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-100:hover{background-color:#e0cffc1f}html[data-netbox-color-mode=dark] .alert.alert-indigo-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-100 a:not(.btn){font-weight:700;color:#2d2932}html[data-netbox-color-mode=dark] .alert.alert-indigo-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-100 a:not(.btn){font-weight:700;color:#2d2932}html[data-netbox-color-mode=dark] .badge.bg-indigo-100,html[data-netbox-color-mode=dark] .toast.bg-indigo-100,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-100,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-100{color:#000}html[data-netbox-color-mode=dark] .bg-indigo-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23272032'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-200{color:#c29ffa}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-200:hover{background-color:#c29ffa1f}html[data-netbox-color-mode=dark] .alert.alert-indigo-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-200 a:not(.btn){font-weight:700;color:#272032}html[data-netbox-color-mode=dark] .alert.alert-indigo-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-200 a:not(.btn){font-weight:700;color:#272032}html[data-netbox-color-mode=dark] .badge.bg-indigo-200,html[data-netbox-color-mode=dark] .toast.bg-indigo-200,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-200,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-200{color:#000}html[data-netbox-color-mode=dark] .bg-indigo-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23211631'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-300{color:#a370f7}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-300:hover{background-color:#a370f71f}html[data-netbox-color-mode=dark] .alert.alert-indigo-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-300 a:not(.btn){font-weight:700;color:#211631}html[data-netbox-color-mode=dark] .alert.alert-indigo-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-300 a:not(.btn){font-weight:700;color:#211631}html[data-netbox-color-mode=dark] .badge.bg-indigo-300,html[data-netbox-color-mode=dark] .toast.bg-indigo-300,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-300,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-300{color:#000}html[data-netbox-color-mode=dark] .bg-indigo-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23e7d9fd'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-400{color:#8540f5}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-400:hover{background-color:#8540f51f}html[data-netbox-color-mode=dark] .alert.alert-indigo-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-400 a:not(.btn){font-weight:700;color:#e7d9fd}html[data-netbox-color-mode=dark] .alert.alert-indigo-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-400 a:not(.btn){font-weight:700;color:#e7d9fd}html[data-netbox-color-mode=dark] .badge.bg-indigo-400,html[data-netbox-color-mode=dark] .toast.bg-indigo-400,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-400,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-400{color:#fff}html[data-netbox-color-mode=dark] .bg-indigo-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23e0cffc'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-500{color:#6610f2}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-500:hover{background-color:#6610f21f}html[data-netbox-color-mode=dark] .alert.alert-indigo-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-500 a:not(.btn){font-weight:700;color:#e0cffc}html[data-netbox-color-mode=dark] .alert.alert-indigo-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-500 a:not(.btn){font-weight:700;color:#e0cffc}html[data-netbox-color-mode=dark] .badge.bg-indigo-500,html[data-netbox-color-mode=dark] .toast.bg-indigo-500,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-500,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-500{color:#fff}html[data-netbox-color-mode=dark] .bg-indigo-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23dccff3'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-600{color:#520dc2}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-600:hover{background-color:#520dc21f}html[data-netbox-color-mode=dark] .alert.alert-indigo-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-600 a:not(.btn){font-weight:700;color:#dccff3}html[data-netbox-color-mode=dark] .alert.alert-indigo-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-600 a:not(.btn){font-weight:700;color:#dccff3}html[data-netbox-color-mode=dark] .badge.bg-indigo-600,html[data-netbox-color-mode=dark] .toast.bg-indigo-600,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-600,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-600{color:#fff}html[data-netbox-color-mode=dark] .bg-indigo-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d8cee9'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-700{color:#3d0a91}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-700:hover{background-color:#3d0a911f}html[data-netbox-color-mode=dark] .alert.alert-indigo-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-700 a:not(.btn){font-weight:700;color:#d8cee9}html[data-netbox-color-mode=dark] .alert.alert-indigo-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-700 a:not(.btn){font-weight:700;color:#d8cee9}html[data-netbox-color-mode=dark] .badge.bg-indigo-700,html[data-netbox-color-mode=dark] .toast.bg-indigo-700,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-700,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-700{color:#fff}html[data-netbox-color-mode=dark] .bg-indigo-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d4cddf'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-800{color:#290661}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-800:hover{background-color:#2906611f}html[data-netbox-color-mode=dark] .alert.alert-indigo-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-800 a:not(.btn){font-weight:700;color:#d4cddf}html[data-netbox-color-mode=dark] .alert.alert-indigo-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-800 a:not(.btn){font-weight:700;color:#d4cddf}html[data-netbox-color-mode=dark] .badge.bg-indigo-800,html[data-netbox-color-mode=dark] .toast.bg-indigo-800,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-800,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-800{color:#fff}html[data-netbox-color-mode=dark] .bg-indigo-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d0cdd6'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-900{color:#140330}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-900:hover{background-color:#1403301f}html[data-netbox-color-mode=dark] .alert.alert-indigo-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-900 a:not(.btn){font-weight:700;color:#d0cdd6}html[data-netbox-color-mode=dark] .alert.alert-indigo-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo-900 a:not(.btn){font-weight:700;color:#d0cdd6}html[data-netbox-color-mode=dark] .badge.bg-indigo-900,html[data-netbox-color-mode=dark] .toast.bg-indigo-900,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-900,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-900{color:#fff}html[data-netbox-color-mode=dark] .bg-purple-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232d2b31'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-100{color:#e2d9f3}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-100:hover{background-color:#e2d9f31f}html[data-netbox-color-mode=dark] .alert.alert-purple-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-100 a:not(.btn){font-weight:700;color:#2d2b31}html[data-netbox-color-mode=dark] .alert.alert-purple-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-100 a:not(.btn){font-weight:700;color:#2d2b31}html[data-netbox-color-mode=dark] .badge.bg-purple-100,html[data-netbox-color-mode=dark] .toast.bg-purple-100,html[data-netbox-color-mode=dark] .toast-header.bg-purple-100,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-100{color:#000}html[data-netbox-color-mode=dark] .bg-purple-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2327242e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-200{color:#c5b3e6}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-200:hover{background-color:#c5b3e61f}html[data-netbox-color-mode=dark] .alert.alert-purple-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-200 a:not(.btn){font-weight:700;color:#27242e}html[data-netbox-color-mode=dark] .alert.alert-purple-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-200 a:not(.btn){font-weight:700;color:#27242e}html[data-netbox-color-mode=dark] .badge.bg-purple-200,html[data-netbox-color-mode=dark] .toast.bg-purple-200,html[data-netbox-color-mode=dark] .toast-header.bg-purple-200,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-200{color:#000}html[data-netbox-color-mode=dark] .bg-purple-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23221c2c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-300{color:#a98eda}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-300:hover{background-color:#a98eda1f}html[data-netbox-color-mode=dark] .alert.alert-purple-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-300 a:not(.btn){font-weight:700;color:#221c2c}html[data-netbox-color-mode=dark] .alert.alert-purple-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-300 a:not(.btn){font-weight:700;color:#221c2c}html[data-netbox-color-mode=dark] .badge.bg-purple-300,html[data-netbox-color-mode=dark] .toast.bg-purple-300,html[data-netbox-color-mode=dark] .toast-header.bg-purple-300,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-300{color:#000}html[data-netbox-color-mode=dark] .bg-purple-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231c1529'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-400{color:#8c68cd}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-400:hover{background-color:#8c68cd1f}html[data-netbox-color-mode=dark] .alert.alert-purple-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-400 a:not(.btn){font-weight:700;color:#1c1529}html[data-netbox-color-mode=dark] .alert.alert-purple-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-400 a:not(.btn){font-weight:700;color:#1c1529}html[data-netbox-color-mode=dark] .badge.bg-purple-400,html[data-netbox-color-mode=dark] .toast.bg-purple-400,html[data-netbox-color-mode=dark] .toast-header.bg-purple-400,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-400{color:#000}html[data-netbox-color-mode=dark] .bg-purple-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23e2d9f3'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-500{color:#6f42c1}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-500:hover{background-color:#6f42c11f}html[data-netbox-color-mode=dark] .alert.alert-purple-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-500 a:not(.btn){font-weight:700;color:#e2d9f3}html[data-netbox-color-mode=dark] .alert.alert-purple-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-500 a:not(.btn){font-weight:700;color:#e2d9f3}html[data-netbox-color-mode=dark] .badge.bg-purple-500,html[data-netbox-color-mode=dark] .toast.bg-purple-500,html[data-netbox-color-mode=dark] .toast-header.bg-purple-500,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-500{color:#fff}html[data-netbox-color-mode=dark] .bg-purple-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ded7eb'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-600{color:#59359a}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-600:hover{background-color:#59359a1f}html[data-netbox-color-mode=dark] .alert.alert-purple-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-600 a:not(.btn){font-weight:700;color:#ded7eb}html[data-netbox-color-mode=dark] .alert.alert-purple-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-600 a:not(.btn){font-weight:700;color:#ded7eb}html[data-netbox-color-mode=dark] .badge.bg-purple-600,html[data-netbox-color-mode=dark] .toast.bg-purple-600,html[data-netbox-color-mode=dark] .toast-header.bg-purple-600,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-600{color:#fff}html[data-netbox-color-mode=dark] .bg-purple-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d9d4e3'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-700{color:#432874}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-700:hover{background-color:#4328741f}html[data-netbox-color-mode=dark] .alert.alert-purple-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-700 a:not(.btn){font-weight:700;color:#d9d4e3}html[data-netbox-color-mode=dark] .alert.alert-purple-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-700 a:not(.btn){font-weight:700;color:#d9d4e3}html[data-netbox-color-mode=dark] .badge.bg-purple-700,html[data-netbox-color-mode=dark] .toast.bg-purple-700,html[data-netbox-color-mode=dark] .toast-header.bg-purple-700,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-700{color:#fff}html[data-netbox-color-mode=dark] .bg-purple-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d5d1db'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-800{color:#2c1a4d}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-800:hover{background-color:#2c1a4d1f}html[data-netbox-color-mode=dark] .alert.alert-purple-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-800 a:not(.btn){font-weight:700;color:#d5d1db}html[data-netbox-color-mode=dark] .alert.alert-purple-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-800 a:not(.btn){font-weight:700;color:#d5d1db}html[data-netbox-color-mode=dark] .badge.bg-purple-800,html[data-netbox-color-mode=dark] .toast.bg-purple-800,html[data-netbox-color-mode=dark] .toast-header.bg-purple-800,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-800{color:#fff}html[data-netbox-color-mode=dark] .bg-purple-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d0cfd4'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-900{color:#160d27}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-900:hover{background-color:#160d271f}html[data-netbox-color-mode=dark] .alert.alert-purple-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-900 a:not(.btn){font-weight:700;color:#d0cfd4}html[data-netbox-color-mode=dark] .alert.alert-purple-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple-900 a:not(.btn){font-weight:700;color:#d0cfd4}html[data-netbox-color-mode=dark] .badge.bg-purple-900,html[data-netbox-color-mode=dark] .toast.bg-purple-900,html[data-netbox-color-mode=dark] .toast-header.bg-purple-900,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-900{color:#fff}html[data-netbox-color-mode=dark] .bg-pink-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23312b2e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-100{color:#f7d6e6}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-100:hover{background-color:#f7d6e61f}html[data-netbox-color-mode=dark] .alert.alert-pink-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-100 a:not(.btn){font-weight:700;color:#312b2e}html[data-netbox-color-mode=dark] .alert.alert-pink-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-100 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-100 a:not(.btn){font-weight:700;color:#312b2e}html[data-netbox-color-mode=dark] .badge.bg-pink-100,html[data-netbox-color-mode=dark] .toast.bg-pink-100,html[data-netbox-color-mode=dark] .toast-header.bg-pink-100,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-100{color:#000}html[data-netbox-color-mode=dark] .bg-pink-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23302329'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-200{color:#efadce}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-200:hover{background-color:#efadce1f}html[data-netbox-color-mode=dark] .alert.alert-pink-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-200 a:not(.btn){font-weight:700;color:#302329}html[data-netbox-color-mode=dark] .alert.alert-pink-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-200 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-200 a:not(.btn){font-weight:700;color:#302329}html[data-netbox-color-mode=dark] .badge.bg-pink-200,html[data-netbox-color-mode=dark] .toast.bg-pink-200,html[data-netbox-color-mode=dark] .toast-header.bg-pink-200,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-200{color:#000}html[data-netbox-color-mode=dark] .bg-pink-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232e1b24'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-300{color:#e685b5}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-300:hover{background-color:#e685b51f}html[data-netbox-color-mode=dark] .alert.alert-pink-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-300 a:not(.btn){font-weight:700;color:#2e1b24}html[data-netbox-color-mode=dark] .alert.alert-pink-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-300 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-300 a:not(.btn){font-weight:700;color:#2e1b24}html[data-netbox-color-mode=dark] .badge.bg-pink-300,html[data-netbox-color-mode=dark] .toast.bg-pink-300,html[data-netbox-color-mode=dark] .toast-header.bg-pink-300,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-300{color:#000}html[data-netbox-color-mode=dark] .bg-pink-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c121f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-400{color:#de5c9d}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-400:hover{background-color:#de5c9d1f}html[data-netbox-color-mode=dark] .alert.alert-pink-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-400 a:not(.btn){font-weight:700;color:#2c121f}html[data-netbox-color-mode=dark] .alert.alert-pink-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-400 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-400 a:not(.btn){font-weight:700;color:#2c121f}html[data-netbox-color-mode=dark] .badge.bg-pink-400,html[data-netbox-color-mode=dark] .toast.bg-pink-400,html[data-netbox-color-mode=dark] .toast-header.bg-pink-400,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-400{color:#000}html[data-netbox-color-mode=dark] .bg-pink-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232b0a1a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-500{color:#d63384}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-500:hover{background-color:#d633841f}html[data-netbox-color-mode=dark] .alert.alert-pink-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-500 a:not(.btn){font-weight:700;color:#2b0a1a}html[data-netbox-color-mode=dark] .alert.alert-pink-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-500 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-500 a:not(.btn){font-weight:700;color:#f7d6e6}html[data-netbox-color-mode=dark] .badge.bg-pink-500,html[data-netbox-color-mode=dark] .toast.bg-pink-500,html[data-netbox-color-mode=dark] .toast-header.bg-pink-500,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-500{color:#fff}html[data-netbox-color-mode=dark] .bg-pink-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23eed4e1'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-600{color:#ab296a}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-600:hover{background-color:#ab296a1f}html[data-netbox-color-mode=dark] .alert.alert-pink-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-600 a:not(.btn){font-weight:700;color:#eed4e1}html[data-netbox-color-mode=dark] .alert.alert-pink-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-600 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-600 a:not(.btn){font-weight:700;color:#eed4e1}html[data-netbox-color-mode=dark] .badge.bg-pink-600,html[data-netbox-color-mode=dark] .toast.bg-pink-600,html[data-netbox-color-mode=dark] .toast-header.bg-pink-600,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-600{color:#fff}html[data-netbox-color-mode=dark] .bg-pink-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23e6d2dc'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-700{color:#801f4f}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-700:hover{background-color:#801f4f1f}html[data-netbox-color-mode=dark] .alert.alert-pink-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-700 a:not(.btn){font-weight:700;color:#e6d2dc}html[data-netbox-color-mode=dark] .alert.alert-pink-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-700 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-700 a:not(.btn){font-weight:700;color:#e6d2dc}html[data-netbox-color-mode=dark] .badge.bg-pink-700,html[data-netbox-color-mode=dark] .toast.bg-pink-700,html[data-netbox-color-mode=dark] .toast-header.bg-pink-700,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-700{color:#fff}html[data-netbox-color-mode=dark] .bg-pink-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ddd0d7'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-800{color:#561435}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-800:hover{background-color:#5614351f}html[data-netbox-color-mode=dark] .alert.alert-pink-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-800 a:not(.btn){font-weight:700;color:#ddd0d7}html[data-netbox-color-mode=dark] .alert.alert-pink-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-800 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-800 a:not(.btn){font-weight:700;color:#ddd0d7}html[data-netbox-color-mode=dark] .badge.bg-pink-800,html[data-netbox-color-mode=dark] .toast.bg-pink-800,html[data-netbox-color-mode=dark] .toast-header.bg-pink-800,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-800{color:#fff}html[data-netbox-color-mode=dark] .bg-pink-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23d5ced1'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-900{color:#2b0a1a}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-900:hover{background-color:#2b0a1a1f}html[data-netbox-color-mode=dark] .alert.alert-pink-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-900 a:not(.btn){font-weight:700;color:#d5ced1}html[data-netbox-color-mode=dark] .alert.alert-pink-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-900 .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink-900 a:not(.btn){font-weight:700;color:#d5ced1}html[data-netbox-color-mode=dark] .badge.bg-pink-900,html[data-netbox-color-mode=dark] .toast.bg-pink-900,html[data-netbox-color-mode=dark] .toast-header.bg-pink-900,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-900{color:#fff}html[data-netbox-color-mode=dark] table td>.progress{min-width:6rem}html[data-netbox-color-mode=dark] .small .form-control{font-size:.875rem}html[data-netbox-color-mode=dark] :not(.card-body)>.col:not(:last-child):not(:only-child){margin-bottom:1rem}html[data-netbox-color-mode=dark] .nav-mobile{display:none;flex-direction:column;align-items:center;justify-content:space-between;width:100%}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] .nav-mobile{display:flex}}html[data-netbox-color-mode=dark] .nav-mobile .nav-mobile-top{display:flex;align-items:center;justify-content:space-between;width:100%}html[data-netbox-color-mode=dark] .card>.table.table-flush{margin-bottom:0;overflow:hidden;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .card>.table.table-flush thead th[scope=col]{padding-top:1rem;padding-bottom:1rem;text-transform:uppercase;vertical-align:middle;background-color:#495057;border-top:1px solid rgba(255,255,255,.125);border-bottom-color:#ffffff20}html[data-netbox-color-mode=dark] .card>.table.table-flush th,html[data-netbox-color-mode=dark] .card>.table.table-flush td{padding-right:1.5rem!important;padding-left:1.5rem!important;border-right:0;border-left:0}html[data-netbox-color-mode=dark] .card>.table.table-flush tr[class]{border-color:#ffffff20!important}html[data-netbox-color-mode=dark] .card>.table.table-flush tr[class]:last-of-type{border-bottom-color:transparent!important;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .header-alert-container{display:flex;align-items:center;justify-content:center;padding:0 1rem}html[data-netbox-color-mode=dark] .header-alert-container .alert{width:100%}@media (min-width: 768px){html[data-netbox-color-mode=dark] .header-alert-container .alert{max-width:75%}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .header-alert-container .alert{max-width:50%}}html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu{right:0;left:auto;display:block!important;margin-top:.5rem;box-shadow:0 .5rem 1rem #00000026;transition:opacity .2s ease-in-out}html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu:not(.show){pointer-events:none;opacity:0}html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu.show{pointer-events:auto;opacity:1}html[data-netbox-color-mode=dark] div#advanced-search-content div.card div.card-body div.col:not(:last-child){margin-right:1rem}html[data-netbox-color-mode=dark] table td a{text-decoration:none}html[data-netbox-color-mode=dark] table td a:hover{text-decoration:underline}html[data-netbox-color-mode=dark] table td .dropdown{position:static}html[data-netbox-color-mode=dark] table th a,html[data-netbox-color-mode=dark] table th a:hover{color:#fff;text-decoration:none}html[data-netbox-color-mode=dark] table td,html[data-netbox-color-mode=dark] table th{font-size:.875rem;line-height:1.25;vertical-align:middle}html[data-netbox-color-mode=dark] table td.min-width,html[data-netbox-color-mode=dark] table th.min-width{width:1%}html[data-netbox-color-mode=dark] table td .form-check-input,html[data-netbox-color-mode=dark] table th .form-check-input{margin-top:.125em;font-size:1rem}html[data-netbox-color-mode=dark] table td .btn-sm,html[data-netbox-color-mode=dark] table td .btn-group-sm>.btn,html[data-netbox-color-mode=dark] table th .btn-sm,html[data-netbox-color-mode=dark] table th .btn-group-sm>.btn{line-height:1}html[data-netbox-color-mode=dark] table td p,html[data-netbox-color-mode=dark] table th p{margin-bottom:0}html[data-netbox-color-mode=dark] table th.asc a:after{content:"\f0140";font-family:"Material Design Icons"}html[data-netbox-color-mode=dark] table th.desc a:after{content:"\f0143";font-family:"Material Design Icons"}html[data-netbox-color-mode=dark] table.table>:not(caption)>*>*{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] table.object-list th{font-size:.75rem;line-height:1;vertical-align:bottom}html[data-netbox-color-mode=dark] table.attr-table th{font-weight:normal;width:25%}html[data-netbox-color-mode=dark] div.title-container{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:space-between}@media (min-width: 992px){html[data-netbox-color-mode=dark] div.title-container{flex-direction:row}}html[data-netbox-color-mode=dark] div.title-container #content-title{display:flex;flex:1 0;flex-direction:column;padding-bottom:.5rem}html[data-netbox-color-mode=dark] .controls{margin-bottom:.5rem}@media print{html[data-netbox-color-mode=dark] .controls{display:none!important}}html[data-netbox-color-mode=dark] .controls .control-group{display:flex;flex-wrap:wrap;justify-content:flex-start}@media (min-width: 992px){html[data-netbox-color-mode=dark] .controls .control-group{justify-content:flex-end}}html[data-netbox-color-mode=dark] .controls .control-group>*{margin:.25rem}html[data-netbox-color-mode=dark] .controls .control-group>*:first-child{margin-left:0}html[data-netbox-color-mode=dark] .controls .control-group>*:last-child{margin-right:0}html[data-netbox-color-mode=dark] .object-subtitle{display:block;font-size:.875rem;color:#ced4da}@media (min-width: 768px){html[data-netbox-color-mode=dark] .object-subtitle{display:inline-block}}html[data-netbox-color-mode=dark] .object-subtitle>span{display:block}html[data-netbox-color-mode=dark] .object-subtitle>span.separator{display:none}@media (min-width: 768px){html[data-netbox-color-mode=dark] .object-subtitle>span,html[data-netbox-color-mode=dark] .object-subtitle>span.separator{display:inline-block}}html[data-netbox-color-mode=dark] nav.search{z-index:999;justify-content:center;background-color:var(--nbx-body-bg)}html[data-netbox-color-mode=dark] nav.search .search-container{display:flex;width:100%}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] nav.search .search-container{display:none}}html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selected{border-color:#495057}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle{color:#fff;border-color:#495057;margin-left:0;font-weight:400;line-height:1.5;color:#f8f9fa;background-color:#495057;border:1px solid #495057;border-radius:.375rem;border-left:1px solid var(--nbx-search-filter-border-left-color)}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:hover{color:#fff;background-color:#3e444a;border-color:#3a4046}.btn-check:focus+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus{color:#fff;background-color:#3e444a;border-color:#3a4046;box-shadow:0 0 0 .25rem #646a7080}.btn-check:checked+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,.btn-check:active+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:active,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.active,.show>html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.dropdown-toggle{color:#fff;background-color:#3a4046;border-color:#373c41}.btn-check:checked+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,.btn-check:active+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:active:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.active:focus,.show>html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #646a7080}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:disabled,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.disabled{color:#fff;background-color:#495057;border-color:#495057}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus{box-shadow:unset!important}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:after{display:none}html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector{max-height:70vh;overflow-y:auto}html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-item,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-header{font-size:.875rem}html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-header{text-transform:uppercase}html[data-netbox-color-mode=dark] main.layout{display:flex;flex-wrap:nowrap;height:100vh;height:-webkit-fill-available;max-height:100vh;overflow-x:auto;overflow-y:hidden}@media print{html[data-netbox-color-mode=dark] main.layout{position:static!important;display:block!important;height:100%;overflow-x:visible!important;overflow-y:visible!important}}html[data-netbox-color-mode=dark] main.login-container{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;max-width:100vw;height:calc(100vh - 4rem);padding-top:40px;padding-bottom:40px}html[data-netbox-color-mode=dark] main.login-container+footer.footer button.color-mode-toggle{color:var(--nbx-color-mode-toggle-color)}html[data-netbox-color-mode=dark] .footer{padding:0}html[data-netbox-color-mode=dark] .footer .nav-link{padding:.5rem}@media (max-width: 767.98px){html[data-netbox-color-mode=dark] .footer{margin-bottom:8rem}}html[data-netbox-color-mode=dark] footer.login-footer{height:4rem;margin-top:auto}html[data-netbox-color-mode=dark] footer.login-footer .container-fluid,html[data-netbox-color-mode=dark] footer.login-footer .container-sm,html[data-netbox-color-mode=dark] footer.login-footer .container-md,html[data-netbox-color-mode=dark] footer.login-footer .container-lg,html[data-netbox-color-mode=dark] footer.login-footer .container-xl,html[data-netbox-color-mode=dark] footer.login-footer .container-xxl{display:flex;justify-content:flex-end;padding:.75rem 1.5rem}html[data-netbox-color-mode=dark] h1.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h1,html[data-netbox-color-mode=dark] h2.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h2,html[data-netbox-color-mode=dark] h3.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h3,html[data-netbox-color-mode=dark] h4.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h4,html[data-netbox-color-mode=dark] h5.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h5,html[data-netbox-color-mode=dark] h6.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h6{padding:.25rem .5rem;font-size:.875rem;font-weight:700;color:var(--nbx-sidebar-title-color);text-transform:uppercase}html[data-netbox-color-mode=dark] .form-login{width:100%;max-width:330px;padding:15px}html[data-netbox-color-mode=dark] .form-login input:focus{z-index:1}html[data-netbox-color-mode=dark] .form-login input[type=text]{margin-bottom:-1px;border-bottom-right-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .form-login input[type=password]{margin-bottom:10px;border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .form-login .form-control{position:relative;box-sizing:border-box;height:auto;padding:10px;font-size:16px}html[data-netbox-color-mode=dark] .navbar-brand{padding-top:.75rem;padding-bottom:.75rem;font-size:1rem}html[data-netbox-color-mode=dark] nav.nav.nav-pills .nav-item.nav-link{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html[data-netbox-color-mode=dark] nav.nav.nav-pills .nav-item.nav-link:hover{color:#000;background-color:#6397e5}html[data-netbox-color-mode=dark] div.content-container{position:relative;display:flex;flex-direction:column;width:calc(100% - 3rem);min-height:100vh;overflow-x:hidden;overflow-y:auto}html[data-netbox-color-mode=dark] div.content-container:focus,html[data-netbox-color-mode=dark] div.content-container:focus-visible{outline:0}html[data-netbox-color-mode=dark] div.content-container div.content{flex:1}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] div.content-container{width:100%}}@media print{html[data-netbox-color-mode=dark] div.content-container{width:100%!important;margin-left:0!important}}@media (max-width: 768px){html[data-netbox-color-mode=dark] .sidebar.collapse.show~.content-container>.content{position:fixed;top:0;left:0;overflow-y:hidden}}html[data-netbox-color-mode=dark] .tooltip{pointer-events:none}html[data-netbox-color-mode=dark] span.color-label{display:block;width:5rem;height:1rem;padding:.35em .65em;border:1px solid #303030;border-radius:.375rem;box-shadow:0 .125rem .25rem #00000013}html[data-netbox-color-mode=dark] .btn{white-space:nowrap}html[data-netbox-color-mode=dark] .card{box-shadow:0 .125rem .25rem #00000013}html[data-netbox-color-mode=dark] .card .card-header{padding:1rem;color:var(--nbx-body-color);border-bottom:none}html[data-netbox-color-mode=dark] .card .card-header+.card-body{padding-top:0}html[data-netbox-color-mode=dark] .card .card-body.small .form-control,html[data-netbox-color-mode=dark] .card .card-body.small .form-select{font-size:.875rem}html[data-netbox-color-mode=dark] .card .card-divider{width:100%;height:1px;margin:1rem 0;border-top:1px solid rgba(255,255,255,.125);opacity:.25}@media print{html[data-netbox-color-mode=dark] .card{box-shadow:unset!important}}html[data-netbox-color-mode=dark] .form-floating{position:relative}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}html[data-netbox-color-mode=dark] .form-floating>.input-group>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-floating>.input-group>label{transition:none}}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control::placeholder{color:transparent}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:focus,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select,html[data-netbox-color-mode=dark] .form-floating>.choices>.choices__inner,html[data-netbox-color-mode=dark] .form-floating>.ss-main span.placeholder,html[data-netbox-color-mode=dark] .form-floating>.ss-main div.ss-values{padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:focus~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select~label,html[data-netbox-color-mode=dark] .form-floating>.choices~label,html[data-netbox-color-mode=dark] .form-floating>.ss-main~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem);z-index:4}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:-webkit-autofill~label{z-index:4;opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}html[data-netbox-color-mode=dark] .form-object-edit{margin:0 auto;max-width:800px}html[data-netbox-color-mode=dark] textarea.form-control[rows="10"]{height:18rem}html[data-netbox-color-mode=dark] textarea#id_local_context_data,html[data-netbox-color-mode=dark] textarea.markdown,html[data-netbox-color-mode=dark] textarea#id_public_key,html[data-netbox-color-mode=dark] textarea.form-control[name=csv],html[data-netbox-color-mode=dark] textarea.form-control[name=data]{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}html[data-netbox-color-mode=dark] .card:not(:only-of-type){margin-bottom:1rem}html[data-netbox-color-mode=dark] .stat-btn{min-width:3rem}html[data-netbox-color-mode=dark] nav.breadcrumb-container{width:fit-content;padding:.35em .65em;font-size:.875rem}html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb{margin-bottom:0}html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a{text-decoration:none}html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover{text-decoration:underline}html[data-netbox-color-mode=dark] label.required{font-weight:700}html[data-netbox-color-mode=dark] label.required:after{position:absolute;display:inline-block;margin:0 0 0 2px;font-family:"Material Design Icons";font-size:8px;font-style:normal;font-weight:600;text-decoration:none;content:"\f06c4"}html[data-netbox-color-mode=dark] div.bulk-buttons{display:flex;justify-content:space-between;margin:.5rem 0}html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group{display:flex;flex-wrap:wrap;align-items:flex-start}html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child{margin-left:0}html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child{margin-right:0}html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group>*{margin:.25rem}html[data-netbox-color-mode=dark] table tbody tr.primary{background-color:#6ea8fe26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.secondary{background-color:#adb5bd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.success{background-color:#75b79826;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.info{background-color:#6edff626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.warning{background-color:#ffda6a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.danger{background-color:#ea868f26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.light{background-color:#dee2e626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.dark{background-color:#adb5bd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red{background-color:#ea868f26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow{background-color:#ffda6a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green{background-color:#75b79826;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue{background-color:#6ea8fe26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan{background-color:#6edff626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo{background-color:#a370f726;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple{background-color:#a98eda26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink{background-color:#e685b526;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.darker{background-color:#1b1f2226;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.darkest{background-color:#171b1d26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray{background-color:#ced4da26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-100{background-color:#f8f9fa26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-200{background-color:#e9ecef26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-300{background-color:#dee2e626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-400{background-color:#ced4da26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-500{background-color:#adb5bd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-600{background-color:#6c757d26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-700{background-color:#49505726;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-800{background-color:#343a4026;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray-900{background-color:#21252926;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-100{background-color:#f8d7da26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-200{background-color:#f1aeb526;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-300{background-color:#ea868f26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-400{background-color:#e35d6a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-500{background-color:#dc354526;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-600{background-color:#b02a3726;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-700{background-color:#84202926;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-800{background-color:#58151c26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red-900{background-color:#2c0b0e26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-100{background-color:#fff3cd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-200{background-color:#ffe69c26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-300{background-color:#ffda6a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-400{background-color:#ffcd3926;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-500{background-color:#ffc10726;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-600{background-color:#cc9a0626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-700{background-color:#99740426;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-800{background-color:#664d0326;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow-900{background-color:#33270126;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-100{background-color:#d1e7dd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-200{background-color:#a3cfbb26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-300{background-color:#75b79826;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-400{background-color:#479f7626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-500{background-color:#19875426;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-600{background-color:#146c4326;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-700{background-color:#0f513226;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-800{background-color:#0a362226;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green-900{background-color:#051b1126;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-100{background-color:#cfe2ff26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-200{background-color:#9ec5fe26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-300{background-color:#6ea8fe26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-400{background-color:#3d8bfd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-500{background-color:#0d6efd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-600{background-color:#0a58ca26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-700{background-color:#08429826;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-800{background-color:#052c6526;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue-900{background-color:#03163326;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-100{background-color:#cff4fc26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-200{background-color:#9eeaf926;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-300{background-color:#6edff626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-400{background-color:#3dd5f326;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-500{background-color:#0dcaf026;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-600{background-color:#0aa2c026;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-700{background-color:#08799026;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-800{background-color:#05516026;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan-900{background-color:#03283026;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-100{background-color:#e0cffc26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-200{background-color:#c29ffa26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-300{background-color:#a370f726;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-400{background-color:#8540f526;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-500{background-color:#6610f226;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-600{background-color:#520dc226;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-700{background-color:#3d0a9126;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-800{background-color:#29066126;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo-900{background-color:#14033026;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-100{background-color:#e2d9f326;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-200{background-color:#c5b3e626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-300{background-color:#a98eda26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-400{background-color:#8c68cd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-500{background-color:#6f42c126;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-600{background-color:#59359a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-700{background-color:#43287426;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-800{background-color:#2c1a4d26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple-900{background-color:#160d2726;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-100{background-color:#f7d6e626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-200{background-color:#efadce26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-300{background-color:#e685b526;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-400{background-color:#de5c9d26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-500{background-color:#d6338426;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-600{background-color:#ab296a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-700{background-color:#801f4f26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-800{background-color:#56143526;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink-900{background-color:#2b0a1a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table .table-badge-group .table-badge{display:block;width:min-content;font-size:.875rem;font-weight:400}html[data-netbox-color-mode=dark] table .table-badge-group .table-badge:not(.badge){padding:0 .65em}html[data-netbox-color-mode=dark] table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child){margin-bottom:.25rem}html[data-netbox-color-mode=dark] pre.change-data{padding-right:0;padding-left:0}html[data-netbox-color-mode=dark] pre.change-data>span{display:block;padding-right:1rem;padding-left:1rem}html[data-netbox-color-mode=dark] pre.change-data>span.added{background-color:var(--nbx-change-added)}html[data-netbox-color-mode=dark] pre.change-data>span.removed{background-color:var(--nbx-change-removed)}html[data-netbox-color-mode=dark] pre.change-diff{border-color:transparent}html[data-netbox-color-mode=dark] pre.change-diff.change-removed{background-color:var(--nbx-change-removed)}html[data-netbox-color-mode=dark] pre.change-diff.change-added{background-color:var(--nbx-change-added)}html[data-netbox-color-mode=dark] div.card-overlay{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#ffffffbf;border-radius:.375rem}html[data-netbox-color-mode=dark] div.card-overlay>div.spinner-border{width:6rem;height:6rem;color:#adb5bd}html[data-netbox-color-mode=dark] .table-controls{display:flex}@media (min-width: 768px){html[data-netbox-color-mode=dark] .table-controls{margin-top:0!important;margin-bottom:0!important}}html[data-netbox-color-mode=dark] .table-controls .table-configure{justify-content:flex-start}@media (min-width: 768px){html[data-netbox-color-mode=dark] .table-controls .table-configure{justify-content:flex-end}}html[data-netbox-color-mode=dark] .table-controls .form-switch.form-check-inline{flex:1 0 auto;font-size:.875rem}html[data-netbox-color-mode=dark] .nav-tabs .nav-link:hover{border-bottom-color:transparent}html[data-netbox-color-mode=dark] .nav-tabs .nav-link.active{background-color:#171b1d;border-bottom-color:#171b1d;transform:translateY(1px)}html[data-netbox-color-mode=dark] .tab-content{display:flex;flex-direction:column;padding:1rem;background-color:#171b1d;border-bottom:1px solid #495057}@media print{html[data-netbox-color-mode=dark] .tab-content{background-color:var(--nbx-body-bg)!important;border-bottom:none!important}}@media print{html[data-netbox-color-mode=dark] .masonry{position:static!important;display:block!important;height:unset!important}}@media print{html[data-netbox-color-mode=dark] .masonry .masonry-item{position:static!important;top:unset!important;left:unset!important;display:block!important}}html[data-netbox-color-mode=dark] .record-depth{display:inline;font-size:1rem;user-select:none;opacity:.33}html[data-netbox-color-mode=dark] .record-depth span:only-of-type,html[data-netbox-color-mode=dark] .record-depth span:last-of-type{margin-right:.25rem}html[data-netbox-color-mode=dark] .popover.image-preview-popover{max-width:unset}html[data-netbox-color-mode=dark] .rendered-markdown table{width:100%}html[data-netbox-color-mode=dark] .rendered-markdown th{border-bottom:2px solid #ddd;padding:8px}html[data-netbox-color-mode=dark] .rendered-markdown td{border-top:1px solid #ddd;padding:8px}html[data-netbox-color-mode=dark] td pre{margin-bottom:0}html[data-netbox-color-mode=dark] pre.block{padding:1rem;background-color:var(--nbx-pre-bg);border:1px solid var(--nbx-pre-border-color);border-radius:.375rem}html[data-netbox-color-mode=dark] #django-messages{position:fixed;right:1rem;bottom:0;margin:1rem}html[data-netbox-color-mode=dark] html[data-netbox-url-name=home] .content-container,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home] .search{background-color:#f8f9fa!important}html[data-netbox-color-mode=dark] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search{background-color:#171b1d!important}html[data-netbox-color-mode=dark] html[data-netbox-url-name=login] #django-messages{display:none} +html[data-netbox-color-mode=dark] :root{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #6ea8fe;--bs-secondary: #adb5bd;--bs-success: #75b798;--bs-info: #6edff6;--bs-warning: #ffda6a;--bs-danger: #ea868f;--bs-light: #dee2e6;--bs-dark: #adb5bd;--bs-blue: #6ea8fe;--bs-indigo: #a370f7;--bs-purple: #a98eda;--bs-pink: #e685b5;--bs-red: #ea868f;--bs-orange: #feb272;--bs-yellow: #ffda6a;--bs-green: #75b798;--bs-teal: #79dfc1;--bs-cyan: #6edff6;--bs-gray: #dee2e6;--bs-black: #000;--bs-white: #fff;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0))}html[data-netbox-color-mode=dark] *,html[data-netbox-color-mode=dark] *:before,html[data-netbox-color-mode=dark] *:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){html[data-netbox-color-mode=dark] :root{scroll-behavior:smooth}}html[data-netbox-color-mode=dark] body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#fff;background-color:#1b1f22;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}html[data-netbox-color-mode=dark] hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}html[data-netbox-color-mode=dark] hr:not([size]){height:1px}html[data-netbox-color-mode=dark] h6,html[data-netbox-color-mode=dark] .h6,html[data-netbox-color-mode=dark] h5,html[data-netbox-color-mode=dark] .h5,html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=dark] .h4,html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=dark] .h3,html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=dark] .h2,html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=dark] .h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=dark] .h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=dark] .h1{font-size:2.5rem}}html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=dark] .h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=dark] .h2{font-size:2rem}}html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=dark] .h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=dark] .h3{font-size:1.75rem}}html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=dark] .h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=dark] .h4{font-size:1.5rem}}html[data-netbox-color-mode=dark] h5,html[data-netbox-color-mode=dark] .h5{font-size:1.25rem}html[data-netbox-color-mode=dark] h6,html[data-netbox-color-mode=dark] .h6{font-size:1rem}html[data-netbox-color-mode=dark] p{margin-top:0;margin-bottom:1rem}html[data-netbox-color-mode=dark] abbr[title],html[data-netbox-color-mode=dark] abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}html[data-netbox-color-mode=dark] address{margin-bottom:1rem;font-style:normal;line-height:inherit}html[data-netbox-color-mode=dark] ol,html[data-netbox-color-mode=dark] ul{padding-left:2rem}html[data-netbox-color-mode=dark] ol,html[data-netbox-color-mode=dark] ul,html[data-netbox-color-mode=dark] dl{margin-top:0;margin-bottom:1rem}html[data-netbox-color-mode=dark] ol ol,html[data-netbox-color-mode=dark] ul ul,html[data-netbox-color-mode=dark] ol ul,html[data-netbox-color-mode=dark] ul ol{margin-bottom:0}html[data-netbox-color-mode=dark] dt{font-weight:700}html[data-netbox-color-mode=dark] dd{margin-bottom:.5rem;margin-left:0}html[data-netbox-color-mode=dark] blockquote{margin:0 0 1rem}html[data-netbox-color-mode=dark] b,html[data-netbox-color-mode=dark] strong{font-weight:800}html[data-netbox-color-mode=dark] small,html[data-netbox-color-mode=dark] .small{font-size:.875em}html[data-netbox-color-mode=dark] mark,html[data-netbox-color-mode=dark] .mark{padding:.2em;background-color:#fcf8e3}html[data-netbox-color-mode=dark] sub,html[data-netbox-color-mode=dark] sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}html[data-netbox-color-mode=dark] sub{bottom:-.25em}html[data-netbox-color-mode=dark] sup{top:-.5em}html[data-netbox-color-mode=dark] a{color:#9ec5fe;text-decoration:underline}html[data-netbox-color-mode=dark] a:hover{color:#cfe2ff}html[data-netbox-color-mode=dark] a:not([href]):not([class]),html[data-netbox-color-mode=dark] a:not([href]):not([class]):hover{color:inherit;text-decoration:none}html[data-netbox-color-mode=dark] pre,html[data-netbox-color-mode=dark] code,html[data-netbox-color-mode=dark] kbd,html[data-netbox-color-mode=dark] samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}html[data-netbox-color-mode=dark] pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}html[data-netbox-color-mode=dark] pre code{font-size:inherit;color:inherit;word-break:normal}html[data-netbox-color-mode=dark] code{font-size:.875em;color:#e9ecef;word-wrap:break-word}a>html[data-netbox-color-mode=dark] code{color:inherit}html[data-netbox-color-mode=dark] kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#dee2e6;border-radius:.375rem}html[data-netbox-color-mode=dark] kbd kbd{padding:0;font-size:1em;font-weight:700}html[data-netbox-color-mode=dark] figure{margin:0 0 1rem}html[data-netbox-color-mode=dark] img,html[data-netbox-color-mode=dark] svg{vertical-align:middle}html[data-netbox-color-mode=dark] table{caption-side:bottom;border-collapse:collapse}html[data-netbox-color-mode=dark] caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}html[data-netbox-color-mode=dark] th{text-align:inherit;text-align:-webkit-match-parent}html[data-netbox-color-mode=dark] thead,html[data-netbox-color-mode=dark] tbody,html[data-netbox-color-mode=dark] tfoot,html[data-netbox-color-mode=dark] tr,html[data-netbox-color-mode=dark] td,html[data-netbox-color-mode=dark] th{border-color:inherit;border-style:solid;border-width:0}html[data-netbox-color-mode=dark] label{display:inline-block}html[data-netbox-color-mode=dark] button{border-radius:0}html[data-netbox-color-mode=dark] button:focus:not(:focus-visible){outline:0}html[data-netbox-color-mode=dark] input,html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] select,html[data-netbox-color-mode=dark] optgroup,html[data-netbox-color-mode=dark] textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] select{text-transform:none}html[data-netbox-color-mode=dark] [role=button]{cursor:pointer}html[data-netbox-color-mode=dark] select{word-wrap:normal}html[data-netbox-color-mode=dark] select:disabled{opacity:1}html[data-netbox-color-mode=dark] [list]::-webkit-calendar-picker-indicator{display:none}html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] [type=button],html[data-netbox-color-mode=dark] [type=reset],html[data-netbox-color-mode=dark] [type=submit]{-webkit-appearance:button}html[data-netbox-color-mode=dark] button:not(:disabled),html[data-netbox-color-mode=dark] [type=button]:not(:disabled),html[data-netbox-color-mode=dark] [type=reset]:not(:disabled),html[data-netbox-color-mode=dark] [type=submit]:not(:disabled){cursor:pointer}html[data-netbox-color-mode=dark] ::-moz-focus-inner{padding:0;border-style:none}html[data-netbox-color-mode=dark] textarea{resize:vertical}html[data-netbox-color-mode=dark] fieldset{min-width:0;padding:0;margin:0;border:0}html[data-netbox-color-mode=dark] legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){html[data-netbox-color-mode=dark] legend{font-size:1.5rem}}html[data-netbox-color-mode=dark] legend+*{clear:left}html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-fields-wrapper,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-text,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-minute,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-hour-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-day-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-month-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-year-field{padding:0}html[data-netbox-color-mode=dark] ::-webkit-inner-spin-button{height:auto}html[data-netbox-color-mode=dark] [type=search]{outline-offset:-2px;-webkit-appearance:textfield}html[data-netbox-color-mode=dark] ::-webkit-search-decoration{-webkit-appearance:none}html[data-netbox-color-mode=dark] ::-webkit-color-swatch-wrapper{padding:0}html[data-netbox-color-mode=dark] ::file-selector-button{font:inherit}html[data-netbox-color-mode=dark] ::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}html[data-netbox-color-mode=dark] output{display:inline-block}html[data-netbox-color-mode=dark] iframe{border:0}html[data-netbox-color-mode=dark] summary{display:list-item;cursor:pointer}html[data-netbox-color-mode=dark] progress{vertical-align:baseline}html[data-netbox-color-mode=dark] [hidden]{display:none!important}html[data-netbox-color-mode=dark] .lead{font-size:1.25rem;font-weight:300}html[data-netbox-color-mode=dark] .display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-1{font-size:5rem}}html[data-netbox-color-mode=dark] .display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-2{font-size:4.5rem}}html[data-netbox-color-mode=dark] .display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-3{font-size:4rem}}html[data-netbox-color-mode=dark] .display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-4{font-size:3.5rem}}html[data-netbox-color-mode=dark] .display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-5{font-size:3rem}}html[data-netbox-color-mode=dark] .display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .display-6{font-size:2.5rem}}html[data-netbox-color-mode=dark] .list-unstyled{padding-left:0;list-style:none}html[data-netbox-color-mode=dark] .list-inline{padding-left:0;list-style:none}html[data-netbox-color-mode=dark] .list-inline-item{display:inline-block}html[data-netbox-color-mode=dark] .list-inline-item:not(:last-child){margin-right:.5rem}html[data-netbox-color-mode=dark] .initialism{font-size:.875em;text-transform:uppercase}html[data-netbox-color-mode=dark] .blockquote{margin-bottom:1rem;font-size:1.25rem}html[data-netbox-color-mode=dark] .blockquote>:last-child{margin-bottom:0}html[data-netbox-color-mode=dark] .blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}html[data-netbox-color-mode=dark] .blockquote-footer:before{content:"\2014\a0"}html[data-netbox-color-mode=dark] .img-fluid{max-width:100%;height:auto}html[data-netbox-color-mode=dark] .img-thumbnail{padding:.25rem;background-color:#1b1f22;border:1px solid #dee2e6;border-radius:.375rem;max-width:100%;height:auto}html[data-netbox-color-mode=dark] .figure{display:inline-block}html[data-netbox-color-mode=dark] .figure-img{margin-bottom:.5rem;line-height:1}html[data-netbox-color-mode=dark] .figure-caption{font-size:.875em;color:#6c757d}html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=dark] .container-fluid,html[data-netbox-color-mode=dark] .container-xxl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm{width:100%;padding-right:var(--bs-gutter-x, .75rem);padding-left:var(--bs-gutter-x, .75rem);margin-right:auto;margin-left:auto}@media (min-width: 576px){html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:540px}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:720px}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:960px}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:1140px}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .container-xxl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=dark] .container{max-width:1320px}}html[data-netbox-color-mode=dark] .row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}html[data-netbox-color-mode=dark] .row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}html[data-netbox-color-mode=dark] .col{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-6>*{flex:0 0 auto;width:16.6666666667%}@media (min-width: 576px){html[data-netbox-color-mode=dark] .col-sm{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-sm-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-sm-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-sm-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-sm-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-sm-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .col-md{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-md-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-md-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-md-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-md-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-md-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .col-lg{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-lg-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-lg-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-lg-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-lg-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-lg-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .col-xl{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-xl-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-xl-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-xl-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-xl-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-xl-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .col-xxl{flex:1 0 0%}html[data-netbox-color-mode=dark] .row-cols-xxl-auto>*{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .row-cols-xxl-1>*{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .row-cols-xxl-2>*{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}html[data-netbox-color-mode=dark] .row-cols-xxl-4>*{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .row-cols-xxl-5>*{flex:0 0 auto;width:20%}html[data-netbox-color-mode=dark] .row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}html[data-netbox-color-mode=dark] .col-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-0,html[data-netbox-color-mode=dark] .gx-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-0,html[data-netbox-color-mode=dark] .gy-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-1,html[data-netbox-color-mode=dark] .gx-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-1,html[data-netbox-color-mode=dark] .gy-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-2,html[data-netbox-color-mode=dark] .gx-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-2,html[data-netbox-color-mode=dark] .gy-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-3,html[data-netbox-color-mode=dark] .gx-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-3,html[data-netbox-color-mode=dark] .gy-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-4,html[data-netbox-color-mode=dark] .gx-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-4,html[data-netbox-color-mode=dark] .gy-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-5,html[data-netbox-color-mode=dark] .gx-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-5,html[data-netbox-color-mode=dark] .gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){html[data-netbox-color-mode=dark] .col-sm-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-sm-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-sm-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-sm-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-sm-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-sm-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-sm-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-sm-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-sm-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-sm-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-sm-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-sm-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-sm-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-sm-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-sm-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-sm-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-sm-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-sm-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-sm-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-sm-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-sm-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-sm-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-sm-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-sm-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-sm-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-sm-0,html[data-netbox-color-mode=dark] .gx-sm-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-sm-0,html[data-netbox-color-mode=dark] .gy-sm-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-sm-1,html[data-netbox-color-mode=dark] .gx-sm-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-sm-1,html[data-netbox-color-mode=dark] .gy-sm-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-sm-2,html[data-netbox-color-mode=dark] .gx-sm-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-sm-2,html[data-netbox-color-mode=dark] .gy-sm-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-sm-3,html[data-netbox-color-mode=dark] .gx-sm-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-sm-3,html[data-netbox-color-mode=dark] .gy-sm-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-sm-4,html[data-netbox-color-mode=dark] .gx-sm-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-sm-4,html[data-netbox-color-mode=dark] .gy-sm-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-sm-5,html[data-netbox-color-mode=dark] .gx-sm-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-sm-5,html[data-netbox-color-mode=dark] .gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .col-md-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-md-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-md-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-md-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-md-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-md-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-md-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-md-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-md-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-md-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-md-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-md-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-md-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-md-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-md-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-md-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-md-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-md-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-md-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-md-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-md-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-md-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-md-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-md-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-md-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-md-0,html[data-netbox-color-mode=dark] .gx-md-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-md-0,html[data-netbox-color-mode=dark] .gy-md-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-md-1,html[data-netbox-color-mode=dark] .gx-md-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-md-1,html[data-netbox-color-mode=dark] .gy-md-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-md-2,html[data-netbox-color-mode=dark] .gx-md-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-md-2,html[data-netbox-color-mode=dark] .gy-md-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-md-3,html[data-netbox-color-mode=dark] .gx-md-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-md-3,html[data-netbox-color-mode=dark] .gy-md-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-md-4,html[data-netbox-color-mode=dark] .gx-md-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-md-4,html[data-netbox-color-mode=dark] .gy-md-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-md-5,html[data-netbox-color-mode=dark] .gx-md-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-md-5,html[data-netbox-color-mode=dark] .gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .col-lg-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-lg-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-lg-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-lg-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-lg-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-lg-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-lg-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-lg-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-lg-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-lg-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-lg-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-lg-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-lg-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-lg-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-lg-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-lg-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-lg-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-lg-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-lg-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-lg-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-lg-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-lg-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-lg-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-lg-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-lg-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-lg-0,html[data-netbox-color-mode=dark] .gx-lg-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-lg-0,html[data-netbox-color-mode=dark] .gy-lg-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-lg-1,html[data-netbox-color-mode=dark] .gx-lg-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-lg-1,html[data-netbox-color-mode=dark] .gy-lg-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-lg-2,html[data-netbox-color-mode=dark] .gx-lg-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-lg-2,html[data-netbox-color-mode=dark] .gy-lg-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-lg-3,html[data-netbox-color-mode=dark] .gx-lg-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-lg-3,html[data-netbox-color-mode=dark] .gy-lg-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-lg-4,html[data-netbox-color-mode=dark] .gx-lg-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-lg-4,html[data-netbox-color-mode=dark] .gy-lg-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-lg-5,html[data-netbox-color-mode=dark] .gx-lg-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-lg-5,html[data-netbox-color-mode=dark] .gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .col-xl-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-xl-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-xl-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-xl-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-xl-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-xl-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-xl-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-xl-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-xl-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-xl-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-xl-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-xl-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-xl-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-xl-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-xl-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-xl-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-xl-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-xl-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-xl-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-xl-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-xl-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-xl-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-xl-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-xl-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-xl-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-xl-0,html[data-netbox-color-mode=dark] .gx-xl-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-xl-0,html[data-netbox-color-mode=dark] .gy-xl-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-xl-1,html[data-netbox-color-mode=dark] .gx-xl-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-xl-1,html[data-netbox-color-mode=dark] .gy-xl-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-xl-2,html[data-netbox-color-mode=dark] .gx-xl-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-xl-2,html[data-netbox-color-mode=dark] .gy-xl-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-xl-3,html[data-netbox-color-mode=dark] .gx-xl-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-xl-3,html[data-netbox-color-mode=dark] .gy-xl-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-xl-4,html[data-netbox-color-mode=dark] .gx-xl-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-xl-4,html[data-netbox-color-mode=dark] .gy-xl-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-xl-5,html[data-netbox-color-mode=dark] .gx-xl-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-xl-5,html[data-netbox-color-mode=dark] .gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .col-xxl-auto{flex:0 0 auto;width:auto}html[data-netbox-color-mode=dark] .col-xxl-1{flex:0 0 auto;width:8.33333333%}html[data-netbox-color-mode=dark] .col-xxl-2{flex:0 0 auto;width:16.66666667%}html[data-netbox-color-mode=dark] .col-xxl-3{flex:0 0 auto;width:25%}html[data-netbox-color-mode=dark] .col-xxl-4{flex:0 0 auto;width:33.33333333%}html[data-netbox-color-mode=dark] .col-xxl-5{flex:0 0 auto;width:41.66666667%}html[data-netbox-color-mode=dark] .col-xxl-6{flex:0 0 auto;width:50%}html[data-netbox-color-mode=dark] .col-xxl-7{flex:0 0 auto;width:58.33333333%}html[data-netbox-color-mode=dark] .col-xxl-8{flex:0 0 auto;width:66.66666667%}html[data-netbox-color-mode=dark] .col-xxl-9{flex:0 0 auto;width:75%}html[data-netbox-color-mode=dark] .col-xxl-10{flex:0 0 auto;width:83.33333333%}html[data-netbox-color-mode=dark] .col-xxl-11{flex:0 0 auto;width:91.66666667%}html[data-netbox-color-mode=dark] .col-xxl-12{flex:0 0 auto;width:100%}html[data-netbox-color-mode=dark] .offset-xxl-0{margin-left:0}html[data-netbox-color-mode=dark] .offset-xxl-1{margin-left:8.33333333%}html[data-netbox-color-mode=dark] .offset-xxl-2{margin-left:16.66666667%}html[data-netbox-color-mode=dark] .offset-xxl-3{margin-left:25%}html[data-netbox-color-mode=dark] .offset-xxl-4{margin-left:33.33333333%}html[data-netbox-color-mode=dark] .offset-xxl-5{margin-left:41.66666667%}html[data-netbox-color-mode=dark] .offset-xxl-6{margin-left:50%}html[data-netbox-color-mode=dark] .offset-xxl-7{margin-left:58.33333333%}html[data-netbox-color-mode=dark] .offset-xxl-8{margin-left:66.66666667%}html[data-netbox-color-mode=dark] .offset-xxl-9{margin-left:75%}html[data-netbox-color-mode=dark] .offset-xxl-10{margin-left:83.33333333%}html[data-netbox-color-mode=dark] .offset-xxl-11{margin-left:91.66666667%}html[data-netbox-color-mode=dark] .g-xxl-0,html[data-netbox-color-mode=dark] .gx-xxl-0{--bs-gutter-x: 0}html[data-netbox-color-mode=dark] .g-xxl-0,html[data-netbox-color-mode=dark] .gy-xxl-0{--bs-gutter-y: 0}html[data-netbox-color-mode=dark] .g-xxl-1,html[data-netbox-color-mode=dark] .gx-xxl-1{--bs-gutter-x: .25rem}html[data-netbox-color-mode=dark] .g-xxl-1,html[data-netbox-color-mode=dark] .gy-xxl-1{--bs-gutter-y: .25rem}html[data-netbox-color-mode=dark] .g-xxl-2,html[data-netbox-color-mode=dark] .gx-xxl-2{--bs-gutter-x: .5rem}html[data-netbox-color-mode=dark] .g-xxl-2,html[data-netbox-color-mode=dark] .gy-xxl-2{--bs-gutter-y: .5rem}html[data-netbox-color-mode=dark] .g-xxl-3,html[data-netbox-color-mode=dark] .gx-xxl-3{--bs-gutter-x: 1rem}html[data-netbox-color-mode=dark] .g-xxl-3,html[data-netbox-color-mode=dark] .gy-xxl-3{--bs-gutter-y: 1rem}html[data-netbox-color-mode=dark] .g-xxl-4,html[data-netbox-color-mode=dark] .gx-xxl-4{--bs-gutter-x: 1.5rem}html[data-netbox-color-mode=dark] .g-xxl-4,html[data-netbox-color-mode=dark] .gy-xxl-4{--bs-gutter-y: 1.5rem}html[data-netbox-color-mode=dark] .g-xxl-5,html[data-netbox-color-mode=dark] .gx-xxl-5{--bs-gutter-x: 3rem}html[data-netbox-color-mode=dark] .g-xxl-5,html[data-netbox-color-mode=dark] .gy-xxl-5{--bs-gutter-y: 3rem}}html[data-netbox-color-mode=dark] .table{--bs-table-bg: transparent;--bs-table-accent-bg: transparent;--bs-table-striped-color: #f8f9fa;--bs-table-striped-bg: rgba(255, 255, 255, .05);--bs-table-active-color: #f8f9fa;--bs-table-active-bg: rgba(255, 255, 255, .1);--bs-table-hover-color: #f8f9fa;--bs-table-hover-bg: rgba(255, 255, 255, .075);width:100%;margin-bottom:1rem;color:#f8f9fa;vertical-align:top;border-color:#495057}html[data-netbox-color-mode=dark] .table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}html[data-netbox-color-mode=dark] .table>tbody{vertical-align:inherit}html[data-netbox-color-mode=dark] .table>thead{vertical-align:bottom}html[data-netbox-color-mode=dark] .table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}html[data-netbox-color-mode=dark] .caption-top{caption-side:top}html[data-netbox-color-mode=dark] .table-sm>:not(caption)>*>*{padding:.25rem}html[data-netbox-color-mode=dark] .table-bordered>:not(caption)>*{border-width:1px 0}html[data-netbox-color-mode=dark] .table-bordered>:not(caption)>*>*{border-width:0 1px}html[data-netbox-color-mode=dark] .table-borderless>:not(caption)>*>*{border-bottom-width:0}html[data-netbox-color-mode=dark] .table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}html[data-netbox-color-mode=dark] .table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}html[data-netbox-color-mode=dark] .table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}html[data-netbox-color-mode=dark] .table-primary{--bs-table-bg: #cfe2ff;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:#000;border-color:#bacbe6}html[data-netbox-color-mode=dark] .table-secondary{--bs-table-bg: #e2e3e5;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:#000;border-color:#cbccce}html[data-netbox-color-mode=dark] .table-success{--bs-table-bg: #d1e7dd;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:#000;border-color:#bcd0c7}html[data-netbox-color-mode=dark] .table-info{--bs-table-bg: #cff4fc;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:#000;border-color:#badce3}html[data-netbox-color-mode=dark] .table-warning{--bs-table-bg: #fff3cd;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:#000;border-color:#e6dbb9}html[data-netbox-color-mode=dark] .table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}html[data-netbox-color-mode=dark] .table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}html[data-netbox-color-mode=dark] .table-dark{--bs-table-bg: #212529;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:#fff;border-color:#373b3e}html[data-netbox-color-mode=dark] .table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){html[data-netbox-color-mode=dark] .table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){html[data-netbox-color-mode=dark] .table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] .table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){html[data-netbox-color-mode=dark] .table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){html[data-netbox-color-mode=dark] .table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}html[data-netbox-color-mode=dark] .form-label{margin-bottom:.5rem}html[data-netbox-color-mode=dark] .col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}html[data-netbox-color-mode=dark] .col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}html[data-netbox-color-mode=dark] .col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}html[data-netbox-color-mode=dark] .form-text{margin-top:.25rem;font-size:.875em;color:#ced4da}html[data-netbox-color-mode=dark] .form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#f8f9fa;background-color:#212529;background-clip:padding-box;border:1px solid #495057;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-control{transition:none}}html[data-netbox-color-mode=dark] .form-control[type=file]{overflow:hidden}html[data-netbox-color-mode=dark] .form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}html[data-netbox-color-mode=dark] .form-control:focus{color:#f8f9fa;background-color:#212529;border-color:#7db1fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-control::-webkit-date-and-time-value{height:1.5em}html[data-netbox-color-mode=dark] .form-control::placeholder{color:#495057;opacity:1}html[data-netbox-color-mode=dark] .form-control:disabled,html[data-netbox-color-mode=dark] .form-control[readonly]{background-color:#495057;opacity:1}html[data-netbox-color-mode=dark] .form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#f8f9fa;background-color:#495057;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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){html[data-netbox-color-mode=dark] .form-control::file-selector-button{transition:none}}html[data-netbox-color-mode=dark] .form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#454c53}html[data-netbox-color-mode=dark] .form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#f8f9fa;background-color:#495057;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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){html[data-netbox-color-mode=dark] .form-control::-webkit-file-upload-button{transition:none}}html[data-netbox-color-mode=dark] .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#454c53}html[data-netbox-color-mode=dark] .form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#fff;background-color:transparent;border:solid transparent;border-width:1px 0}html[data-netbox-color-mode=dark] .form-control-plaintext.form-control-sm,html[data-netbox-color-mode=dark] .form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}html[data-netbox-color-mode=dark] .form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html[data-netbox-color-mode=dark] .form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}html[data-netbox-color-mode=dark] .form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}html[data-netbox-color-mode=dark] .form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}html[data-netbox-color-mode=dark] .form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}html[data-netbox-color-mode=dark] .form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}html[data-netbox-color-mode=dark] textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}html[data-netbox-color-mode=dark] textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}html[data-netbox-color-mode=dark] textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}html[data-netbox-color-mode=dark] .form-control-color{max-width:3rem;height:auto;padding:.375rem}html[data-netbox-color-mode=dark] .form-control-color:not(:disabled):not([readonly]){cursor:pointer}html[data-netbox-color-mode=dark] .form-control-color::-moz-color-swatch{height:1.5em;border-radius:.375rem}html[data-netbox-color-mode=dark] .form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.375rem}html[data-netbox-color-mode=dark] .form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#f8f9fa;background-color:#212529;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='%23f8f9fa' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #495057;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-select{transition:none}}html[data-netbox-color-mode=dark] .form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-select[multiple],html[data-netbox-color-mode=dark] .form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}html[data-netbox-color-mode=dark] .form-select:disabled{color:#adb5bd;background-color:#495057}html[data-netbox-color-mode=dark] .form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #f8f9fa}html[data-netbox-color-mode=dark] .form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}html[data-netbox-color-mode=dark] .form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}html[data-netbox-color-mode=dark] .form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}html[data-netbox-color-mode=dark] .form-check .form-check-input{float:left;margin-left:-1.5em}html[data-netbox-color-mode=dark] .form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#212529;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(255,255,255,.25);appearance:none;color-adjust:exact}html[data-netbox-color-mode=dark] .form-check-input[type=checkbox]{border-radius:.25em}html[data-netbox-color-mode=dark] .form-check-input[type=radio]{border-radius:50%}html[data-netbox-color-mode=dark] .form-check-input:active{filter:brightness(90%)}html[data-netbox-color-mode=dark] .form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-check-input:checked{background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-check-input[type=checkbox]:indeterminate{background-color:#6ea8fe;border-color:#6ea8fe;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}html[data-netbox-color-mode=dark] .form-check-input[disabled]~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input:disabled~.form-check-label{opacity:.5}html[data-netbox-color-mode=dark] .form-switch{padding-left:2.5em}html[data-netbox-color-mode=dark] .form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-switch .form-check-input{transition:none}}html[data-netbox-color-mode=dark] .form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .form-check-inline{display:inline-block;margin-right:1rem}html[data-netbox-color-mode=dark] .btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}html[data-netbox-color-mode=dark] .btn-check[disabled]+.btn,html[data-netbox-color-mode=dark] .btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}html[data-netbox-color-mode=dark] .form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}html[data-netbox-color-mode=dark] .form-range:focus{outline:0}html[data-netbox-color-mode=dark] .form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #1b1f22,0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #1b1f22,0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .form-range::-moz-focus-outer{border:0}html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#6ea8fe;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb{transition:none}}html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb:active{background-color:#d4e5ff}html[data-netbox-color-mode=dark] .form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#6ea8fe;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb{transition:none}}html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb:active{background-color:#d4e5ff}html[data-netbox-color-mode=dark] .form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}html[data-netbox-color-mode=dark] .form-range:disabled{pointer-events:none}html[data-netbox-color-mode=dark] .form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}html[data-netbox-color-mode=dark] .form-range:disabled::-moz-range-thumb{background-color:#adb5bd}html[data-netbox-color-mode=dark] .form-floating>.form-control,html[data-netbox-color-mode=dark] .form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}html[data-netbox-color-mode=dark] .form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-floating>label{transition:none}}html[data-netbox-color-mode=dark] .form-floating>.form-control{padding:1rem .75rem}html[data-netbox-color-mode=dark] .form-floating>.form-control::placeholder{color:transparent}html[data-netbox-color-mode=dark] .form-floating>.form-control:focus,html[data-netbox-color-mode=dark] .form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.form-control:focus~label,html[data-netbox-color-mode=dark] .form-floating>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=dark] .form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}html[data-netbox-color-mode=dark] .form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}html[data-netbox-color-mode=dark] .input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}html[data-netbox-color-mode=dark] .input-group>.form-control,html[data-netbox-color-mode=dark] .input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}html[data-netbox-color-mode=dark] .input-group>.form-control:focus,html[data-netbox-color-mode=dark] .input-group>.form-select:focus{z-index:3}html[data-netbox-color-mode=dark] .input-group .btn{position:relative;z-index:2}html[data-netbox-color-mode=dark] .input-group .btn:focus{z-index:3}html[data-netbox-color-mode=dark] .input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#f8f9fa;text-align:center;white-space:nowrap;background-color:#495057;border:1px solid #495057;border-radius:.375rem}html[data-netbox-color-mode=dark] .input-group-lg>.form-control,html[data-netbox-color-mode=dark] .input-group-lg>.form-select,html[data-netbox-color-mode=dark] .input-group-lg>.input-group-text,html[data-netbox-color-mode=dark] .input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}html[data-netbox-color-mode=dark] .input-group-sm>.form-control,html[data-netbox-color-mode=dark] .input-group-sm>.form-select,html[data-netbox-color-mode=dark] .input-group-sm>.input-group-text,html[data-netbox-color-mode=dark] .input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html[data-netbox-color-mode=dark] .input-group-lg>.form-select,html[data-netbox-color-mode=dark] .input-group-sm>.form-select{padding-right:3rem}html[data-netbox-color-mode=dark] .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=dark] .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=dark] .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}html[data-netbox-color-mode=dark] .valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#198754e6;border-radius:.375rem}.was-validated html[data-netbox-color-mode=dark]:valid~.valid-feedback,.was-validated html[data-netbox-color-mode=dark]:valid~.valid-tooltip,html[data-netbox-color-mode=dark].is-valid~.valid-feedback,html[data-netbox-color-mode=dark].is-valid~.valid-tooltip{display:block}.was-validated html[data-netbox-color-mode=dark] .form-control:valid,html[data-netbox-color-mode=dark] .form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html[data-netbox-color-mode=dark] .form-control:valid:focus,html[data-netbox-color-mode=dark] .form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}.was-validated html[data-netbox-color-mode=dark] textarea.form-control:valid,html[data-netbox-color-mode=dark] textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated html[data-netbox-color-mode=dark] .form-select:valid,html[data-netbox-color-mode=dark] .form-select.is-valid{border-color:#198754}.was-validated html[data-netbox-color-mode=dark] .form-select:valid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=dark] .form-select:valid:not([multiple])[size="1"],html[data-netbox-color-mode=dark] .form-select.is-valid:not([multiple]):not([size]),html[data-netbox-color-mode=dark] .form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23f8f9fa' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html[data-netbox-color-mode=dark] .form-select:valid:focus,html[data-netbox-color-mode=dark] .form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid,html[data-netbox-color-mode=dark] .form-check-input.is-valid{border-color:#198754}.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid:checked,html[data-netbox-color-mode=dark] .form-check-input.is-valid:checked{background-color:#198754}.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid:focus,html[data-netbox-color-mode=dark] .form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem #19875440}.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input.is-valid~.form-check-label{color:#198754}html[data-netbox-color-mode=dark] .form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:valid,html[data-netbox-color-mode=dark] .input-group .form-control.is-valid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:valid,html[data-netbox-color-mode=dark] .input-group .form-select.is-valid{z-index:1}.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:valid:focus,html[data-netbox-color-mode=dark] .input-group .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:valid:focus,html[data-netbox-color-mode=dark] .input-group .form-select.is-valid:focus{z-index:3}html[data-netbox-color-mode=dark] .invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}html[data-netbox-color-mode=dark] .invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#dc3545e6;border-radius:.375rem}.was-validated html[data-netbox-color-mode=dark]:invalid~.invalid-feedback,.was-validated html[data-netbox-color-mode=dark]:invalid~.invalid-tooltip,html[data-netbox-color-mode=dark].is-invalid~.invalid-feedback,html[data-netbox-color-mode=dark].is-invalid~.invalid-tooltip{display:block}.was-validated html[data-netbox-color-mode=dark] .form-control:invalid,html[data-netbox-color-mode=dark] .form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html[data-netbox-color-mode=dark] .form-control:invalid:focus,html[data-netbox-color-mode=dark] .form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated html[data-netbox-color-mode=dark] textarea.form-control:invalid,html[data-netbox-color-mode=dark] textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated html[data-netbox-color-mode=dark] .form-select:invalid,html[data-netbox-color-mode=dark] .form-select.is-invalid{border-color:#dc3545}.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:not([multiple])[size="1"],html[data-netbox-color-mode=dark] .form-select.is-invalid:not([multiple]):not([size]),html[data-netbox-color-mode=dark] .form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23f8f9fa' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:focus,html[data-netbox-color-mode=dark] .form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid,html[data-netbox-color-mode=dark] .form-check-input.is-invalid{border-color:#dc3545}.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid:checked,html[data-netbox-color-mode=dark] .form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid:focus,html[data-netbox-color-mode=dark] .form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem #dc354540}.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input.is-invalid~.form-check-label{color:#dc3545}html[data-netbox-color-mode=dark] .form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:invalid,html[data-netbox-color-mode=dark] .input-group .form-control.is-invalid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:invalid,html[data-netbox-color-mode=dark] .input-group .form-select.is-invalid{z-index:2}.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:invalid:focus,html[data-netbox-color-mode=dark] .input-group .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:invalid:focus,html[data-netbox-color-mode=dark] .input-group .form-select.is-invalid:focus{z-index:3}html[data-netbox-color-mode=dark] .btn{display:inline-block;font-weight:400;line-height:1.5;color:#fff;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.375rem;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){html[data-netbox-color-mode=dark] .btn{transition:none}}html[data-netbox-color-mode=dark] .btn:hover{color:#fff}.btn-check:focus+html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=dark] .btn:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .btn:disabled,html[data-netbox-color-mode=dark] .btn.disabled,fieldset:disabled html[data-netbox-color-mode=dark] .btn{pointer-events:none;opacity:.65}html[data-netbox-color-mode=dark] .btn-primary{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-primary:hover{color:#000;background-color:#84b5fe;border-color:#7db1fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=dark] .btn-primary:focus{color:#000;background-color:#84b5fe;border-color:#7db1fe;box-shadow:0 0 0 .25rem #5e8fd880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-primary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=dark] .btn-primary:active,html[data-netbox-color-mode=dark] .btn-primary.active,.show>html[data-netbox-color-mode=dark] .btn-primary.dropdown-toggle{color:#000;background-color:#8bb9fe;border-color:#7db1fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-primary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-primary:focus,html[data-netbox-color-mode=dark] .btn-primary:active:focus,html[data-netbox-color-mode=dark] .btn-primary.active:focus,.show>html[data-netbox-color-mode=dark] .btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5e8fd880}html[data-netbox-color-mode=dark] .btn-primary:disabled,html[data-netbox-color-mode=dark] .btn-primary.disabled{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-secondary{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-secondary:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-secondary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary:active,html[data-netbox-color-mode=dark] .btn-secondary.active,.show>html[data-netbox-color-mode=dark] .btn-secondary.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-secondary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-secondary:focus,html[data-netbox-color-mode=dark] .btn-secondary:active:focus,html[data-netbox-color-mode=dark] .btn-secondary.active:focus,.show>html[data-netbox-color-mode=dark] .btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}html[data-netbox-color-mode=dark] .btn-secondary:disabled,html[data-netbox-color-mode=dark] .btn-secondary.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-success{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-success:hover{color:#000;background-color:#8ac2a7;border-color:#83bea2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=dark] .btn-success:focus{color:#000;background-color:#8ac2a7;border-color:#83bea2;box-shadow:0 0 0 .25rem #639c8180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-success,.btn-check:active+html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=dark] .btn-success:active,html[data-netbox-color-mode=dark] .btn-success.active,.show>html[data-netbox-color-mode=dark] .btn-success.dropdown-toggle{color:#000;background-color:#91c5ad;border-color:#83bea2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-success:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-success:focus,html[data-netbox-color-mode=dark] .btn-success:active:focus,html[data-netbox-color-mode=dark] .btn-success.active:focus,.show>html[data-netbox-color-mode=dark] .btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #639c8180}html[data-netbox-color-mode=dark] .btn-success:disabled,html[data-netbox-color-mode=dark] .btn-success.disabled{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-info{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-info:hover{color:#000;background-color:#84e4f7;border-color:#7de2f7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=dark] .btn-info:focus{color:#000;background-color:#84e4f7;border-color:#7de2f7;box-shadow:0 0 0 .25rem #5ebed180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-info,.btn-check:active+html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=dark] .btn-info:active,html[data-netbox-color-mode=dark] .btn-info.active,.show>html[data-netbox-color-mode=dark] .btn-info.dropdown-toggle{color:#000;background-color:#8be5f8;border-color:#7de2f7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-info:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-info:focus,html[data-netbox-color-mode=dark] .btn-info:active:focus,html[data-netbox-color-mode=dark] .btn-info.active:focus,.show>html[data-netbox-color-mode=dark] .btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5ebed180}html[data-netbox-color-mode=dark] .btn-info:disabled,html[data-netbox-color-mode=dark] .btn-info.disabled{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-warning{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-warning:hover{color:#000;background-color:#ffe080;border-color:#ffde79}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=dark] .btn-warning:focus{color:#000;background-color:#ffe080;border-color:#ffde79;box-shadow:0 0 0 .25rem #d9b95a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-warning,.btn-check:active+html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=dark] .btn-warning:active,html[data-netbox-color-mode=dark] .btn-warning.active,.show>html[data-netbox-color-mode=dark] .btn-warning.dropdown-toggle{color:#000;background-color:#ffe188;border-color:#ffde79}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-warning:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-warning:focus,html[data-netbox-color-mode=dark] .btn-warning:active:focus,html[data-netbox-color-mode=dark] .btn-warning.active:focus,.show>html[data-netbox-color-mode=dark] .btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9b95a80}html[data-netbox-color-mode=dark] .btn-warning:disabled,html[data-netbox-color-mode=dark] .btn-warning.disabled{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-danger{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-danger:hover{color:#000;background-color:#ed98a0;border-color:#ec929a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=dark] .btn-danger:focus{color:#000;background-color:#ed98a0;border-color:#ec929a;box-shadow:0 0 0 .25rem #c7727a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-danger,.btn-check:active+html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=dark] .btn-danger:active,html[data-netbox-color-mode=dark] .btn-danger.active,.show>html[data-netbox-color-mode=dark] .btn-danger.dropdown-toggle{color:#000;background-color:#ee9ea5;border-color:#ec929a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-danger:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-danger:focus,html[data-netbox-color-mode=dark] .btn-danger:active:focus,html[data-netbox-color-mode=dark] .btn-danger.active:focus,.show>html[data-netbox-color-mode=dark] .btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c7727a80}html[data-netbox-color-mode=dark] .btn-danger:disabled,html[data-netbox-color-mode=dark] .btn-danger.disabled{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-light{color:#000;background-color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-light:hover{color:#000;background-color:#e3e6ea;border-color:#e1e5e9}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=dark] .btn-light:focus{color:#000;background-color:#e3e6ea;border-color:#e1e5e9;box-shadow:0 0 0 .25rem #bdc0c480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-light,.btn-check:active+html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=dark] .btn-light:active,html[data-netbox-color-mode=dark] .btn-light.active,.show>html[data-netbox-color-mode=dark] .btn-light.dropdown-toggle{color:#000;background-color:#e5e8eb;border-color:#e1e5e9}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-light:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-light:focus,html[data-netbox-color-mode=dark] .btn-light:active:focus,html[data-netbox-color-mode=dark] .btn-light.active:focus,.show>html[data-netbox-color-mode=dark] .btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bdc0c480}html[data-netbox-color-mode=dark] .btn-light:disabled,html[data-netbox-color-mode=dark] .btn-light.disabled{color:#000;background-color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-dark{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-dark:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=dark] .btn-dark:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-dark,.btn-check:active+html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=dark] .btn-dark:active,html[data-netbox-color-mode=dark] .btn-dark.active,.show>html[data-netbox-color-mode=dark] .btn-dark.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-dark:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-dark:focus,html[data-netbox-color-mode=dark] .btn-dark:active:focus,html[data-netbox-color-mode=dark] .btn-dark.active:focus,.show>html[data-netbox-color-mode=dark] .btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}html[data-netbox-color-mode=dark] .btn-dark:disabled,html[data-netbox-color-mode=dark] .btn-dark.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-blue{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-blue:hover{color:#000;background-color:#84b5fe;border-color:#7db1fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=dark] .btn-blue:focus{color:#000;background-color:#84b5fe;border-color:#7db1fe;box-shadow:0 0 0 .25rem #5e8fd880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=dark] .btn-blue:active,html[data-netbox-color-mode=dark] .btn-blue.active,.show>html[data-netbox-color-mode=dark] .btn-blue.dropdown-toggle{color:#000;background-color:#8bb9fe;border-color:#7db1fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue:focus,html[data-netbox-color-mode=dark] .btn-blue:active:focus,html[data-netbox-color-mode=dark] .btn-blue.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5e8fd880}html[data-netbox-color-mode=dark] .btn-blue:disabled,html[data-netbox-color-mode=dark] .btn-blue.disabled{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-indigo{color:#000;background-color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-indigo:hover{color:#000;background-color:#b185f8;border-color:#ac7ef8}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo:focus{color:#000;background-color:#b185f8;border-color:#ac7ef8;box-shadow:0 0 0 .25rem #8b5fd280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo:active,html[data-netbox-color-mode=dark] .btn-indigo.active,.show>html[data-netbox-color-mode=dark] .btn-indigo.dropdown-toggle{color:#000;background-color:#b58df9;border-color:#ac7ef8}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo:focus,html[data-netbox-color-mode=dark] .btn-indigo:active:focus,html[data-netbox-color-mode=dark] .btn-indigo.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #8b5fd280}html[data-netbox-color-mode=dark] .btn-indigo:disabled,html[data-netbox-color-mode=dark] .btn-indigo.disabled{color:#000;background-color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-purple{color:#000;background-color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-purple:hover{color:#000;background-color:#b69fe0;border-color:#b299de}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=dark] .btn-purple:focus{color:#000;background-color:#b69fe0;border-color:#b299de;box-shadow:0 0 0 .25rem #9079b980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=dark] .btn-purple:active,html[data-netbox-color-mode=dark] .btn-purple.active,.show>html[data-netbox-color-mode=dark] .btn-purple.dropdown-toggle{color:#000;background-color:#baa5e1;border-color:#b299de}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple:focus,html[data-netbox-color-mode=dark] .btn-purple:active:focus,html[data-netbox-color-mode=dark] .btn-purple.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #9079b980}html[data-netbox-color-mode=dark] .btn-purple:disabled,html[data-netbox-color-mode=dark] .btn-purple.disabled{color:#000;background-color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-pink{color:#000;background-color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-pink:hover{color:#000;background-color:#ea97c0;border-color:#e991bc}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=dark] .btn-pink:focus{color:#000;background-color:#ea97c0;border-color:#e991bc;box-shadow:0 0 0 .25rem #c4719a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=dark] .btn-pink:active,html[data-netbox-color-mode=dark] .btn-pink.active,.show>html[data-netbox-color-mode=dark] .btn-pink.dropdown-toggle{color:#000;background-color:#eb9dc4;border-color:#e991bc}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink:focus,html[data-netbox-color-mode=dark] .btn-pink:active:focus,html[data-netbox-color-mode=dark] .btn-pink.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c4719a80}html[data-netbox-color-mode=dark] .btn-pink:disabled,html[data-netbox-color-mode=dark] .btn-pink.disabled{color:#000;background-color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-red{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-red:hover{color:#000;background-color:#ed98a0;border-color:#ec929a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=dark] .btn-red:focus{color:#000;background-color:#ed98a0;border-color:#ec929a;box-shadow:0 0 0 .25rem #c7727a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=dark] .btn-red:active,html[data-netbox-color-mode=dark] .btn-red.active,.show>html[data-netbox-color-mode=dark] .btn-red.dropdown-toggle{color:#000;background-color:#ee9ea5;border-color:#ec929a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red:focus,html[data-netbox-color-mode=dark] .btn-red:active:focus,html[data-netbox-color-mode=dark] .btn-red.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c7727a80}html[data-netbox-color-mode=dark] .btn-red:disabled,html[data-netbox-color-mode=dark] .btn-red.disabled{color:#000;background-color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-orange{color:#000;background-color:#feb272;border-color:#feb272}html[data-netbox-color-mode=dark] .btn-orange:hover{color:#000;background-color:#febe87;border-color:#feba80}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-orange,html[data-netbox-color-mode=dark] .btn-orange:focus{color:#000;background-color:#febe87;border-color:#feba80;box-shadow:0 0 0 .25rem #d8976180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-orange,.btn-check:active+html[data-netbox-color-mode=dark] .btn-orange,html[data-netbox-color-mode=dark] .btn-orange:active,html[data-netbox-color-mode=dark] .btn-orange.active,.show>html[data-netbox-color-mode=dark] .btn-orange.dropdown-toggle{color:#000;background-color:#fec18e;border-color:#feba80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-orange:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-orange:focus,html[data-netbox-color-mode=dark] .btn-orange:active:focus,html[data-netbox-color-mode=dark] .btn-orange.active:focus,.show>html[data-netbox-color-mode=dark] .btn-orange.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d8976180}html[data-netbox-color-mode=dark] .btn-orange:disabled,html[data-netbox-color-mode=dark] .btn-orange.disabled{color:#000;background-color:#feb272;border-color:#feb272}html[data-netbox-color-mode=dark] .btn-yellow{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-yellow:hover{color:#000;background-color:#ffe080;border-color:#ffde79}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow:focus{color:#000;background-color:#ffe080;border-color:#ffde79;box-shadow:0 0 0 .25rem #d9b95a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow:active,html[data-netbox-color-mode=dark] .btn-yellow.active,.show>html[data-netbox-color-mode=dark] .btn-yellow.dropdown-toggle{color:#000;background-color:#ffe188;border-color:#ffde79}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow:focus,html[data-netbox-color-mode=dark] .btn-yellow:active:focus,html[data-netbox-color-mode=dark] .btn-yellow.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9b95a80}html[data-netbox-color-mode=dark] .btn-yellow:disabled,html[data-netbox-color-mode=dark] .btn-yellow.disabled{color:#000;background-color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-green{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-green:hover{color:#000;background-color:#8ac2a7;border-color:#83bea2}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=dark] .btn-green:focus{color:#000;background-color:#8ac2a7;border-color:#83bea2;box-shadow:0 0 0 .25rem #639c8180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=dark] .btn-green:active,html[data-netbox-color-mode=dark] .btn-green.active,.show>html[data-netbox-color-mode=dark] .btn-green.dropdown-toggle{color:#000;background-color:#91c5ad;border-color:#83bea2}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green:focus,html[data-netbox-color-mode=dark] .btn-green:active:focus,html[data-netbox-color-mode=dark] .btn-green.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #639c8180}html[data-netbox-color-mode=dark] .btn-green:disabled,html[data-netbox-color-mode=dark] .btn-green.disabled{color:#000;background-color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-teal{color:#000;background-color:#79dfc1;border-color:#79dfc1}html[data-netbox-color-mode=dark] .btn-teal:hover{color:#000;background-color:#8de4ca;border-color:#86e2c7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-teal,html[data-netbox-color-mode=dark] .btn-teal:focus{color:#000;background-color:#8de4ca;border-color:#86e2c7;box-shadow:0 0 0 .25rem #67bea480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-teal,.btn-check:active+html[data-netbox-color-mode=dark] .btn-teal,html[data-netbox-color-mode=dark] .btn-teal:active,html[data-netbox-color-mode=dark] .btn-teal.active,.show>html[data-netbox-color-mode=dark] .btn-teal.dropdown-toggle{color:#000;background-color:#94e5cd;border-color:#86e2c7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-teal:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-teal:focus,html[data-netbox-color-mode=dark] .btn-teal:active:focus,html[data-netbox-color-mode=dark] .btn-teal.active:focus,.show>html[data-netbox-color-mode=dark] .btn-teal.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #67bea480}html[data-netbox-color-mode=dark] .btn-teal:disabled,html[data-netbox-color-mode=dark] .btn-teal.disabled{color:#000;background-color:#79dfc1;border-color:#79dfc1}html[data-netbox-color-mode=dark] .btn-cyan{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-cyan:hover{color:#000;background-color:#84e4f7;border-color:#7de2f7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan:focus{color:#000;background-color:#84e4f7;border-color:#7de2f7;box-shadow:0 0 0 .25rem #5ebed180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan:active,html[data-netbox-color-mode=dark] .btn-cyan.active,.show>html[data-netbox-color-mode=dark] .btn-cyan.dropdown-toggle{color:#000;background-color:#8be5f8;border-color:#7de2f7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan:focus,html[data-netbox-color-mode=dark] .btn-cyan:active:focus,html[data-netbox-color-mode=dark] .btn-cyan.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5ebed180}html[data-netbox-color-mode=dark] .btn-cyan:disabled,html[data-netbox-color-mode=dark] .btn-cyan.disabled{color:#000;background-color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-gray{color:#000;background-color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-gray:hover{color:#000;background-color:#e3e6ea;border-color:#e1e5e9}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=dark] .btn-gray:focus{color:#000;background-color:#e3e6ea;border-color:#e1e5e9;box-shadow:0 0 0 .25rem #bdc0c480}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=dark] .btn-gray:active,html[data-netbox-color-mode=dark] .btn-gray.active,.show>html[data-netbox-color-mode=dark] .btn-gray.dropdown-toggle{color:#000;background-color:#e5e8eb;border-color:#e1e5e9}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray:focus,html[data-netbox-color-mode=dark] .btn-gray:active:focus,html[data-netbox-color-mode=dark] .btn-gray.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bdc0c480}html[data-netbox-color-mode=dark] .btn-gray:disabled,html[data-netbox-color-mode=dark] .btn-gray.disabled{color:#000;background-color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-black{color:#fff;background-color:#000;border-color:#000}html[data-netbox-color-mode=dark] .btn-black:hover{color:#fff;background-color:#000;border-color:#000}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-black,html[data-netbox-color-mode=dark] .btn-black:focus{color:#fff;background-color:#000;border-color:#000;box-shadow:0 0 0 .25rem #26262680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-black,.btn-check:active+html[data-netbox-color-mode=dark] .btn-black,html[data-netbox-color-mode=dark] .btn-black:active,html[data-netbox-color-mode=dark] .btn-black.active,.show>html[data-netbox-color-mode=dark] .btn-black.dropdown-toggle{color:#fff;background-color:#000;border-color:#000}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-black:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-black:focus,html[data-netbox-color-mode=dark] .btn-black:active:focus,html[data-netbox-color-mode=dark] .btn-black.active:focus,.show>html[data-netbox-color-mode=dark] .btn-black.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #26262680}html[data-netbox-color-mode=dark] .btn-black:disabled,html[data-netbox-color-mode=dark] .btn-black.disabled{color:#fff;background-color:#000;border-color:#000}html[data-netbox-color-mode=dark] .btn-white{color:#000;background-color:#fff;border-color:#fff}html[data-netbox-color-mode=dark] .btn-white:hover{color:#000;background-color:#fff;border-color:#fff}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-white,html[data-netbox-color-mode=dark] .btn-white:focus{color:#000;background-color:#fff;border-color:#fff;box-shadow:0 0 0 .25rem #d9d9d980}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-white,.btn-check:active+html[data-netbox-color-mode=dark] .btn-white,html[data-netbox-color-mode=dark] .btn-white:active,html[data-netbox-color-mode=dark] .btn-white.active,.show>html[data-netbox-color-mode=dark] .btn-white.dropdown-toggle{color:#000;background-color:#fff;border-color:#fff}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-white:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-white:focus,html[data-netbox-color-mode=dark] .btn-white:active:focus,html[data-netbox-color-mode=dark] .btn-white.active:focus,.show>html[data-netbox-color-mode=dark] .btn-white.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9d9d980}html[data-netbox-color-mode=dark] .btn-white:disabled,html[data-netbox-color-mode=dark] .btn-white.disabled{color:#000;background-color:#fff;border-color:#fff}html[data-netbox-color-mode=dark] .btn-outline-primary{color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-outline-primary:hover{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary:focus{box-shadow:0 0 0 .25rem #6ea8fe80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-primary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary:active,html[data-netbox-color-mode=dark] .btn-outline-primary.active,html[data-netbox-color-mode=dark] .btn-outline-primary.dropdown-toggle.show{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-primary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-primary:focus,html[data-netbox-color-mode=dark] .btn-outline-primary:active:focus,html[data-netbox-color-mode=dark] .btn-outline-primary.active:focus,html[data-netbox-color-mode=dark] .btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6ea8fe80}html[data-netbox-color-mode=dark] .btn-outline-primary:disabled,html[data-netbox-color-mode=dark] .btn-outline-primary.disabled{color:#6ea8fe;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-secondary{color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-outline-secondary:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-secondary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary:active,html[data-netbox-color-mode=dark] .btn-outline-secondary.active,html[data-netbox-color-mode=dark] .btn-outline-secondary.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary:active:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary.active:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}html[data-netbox-color-mode=dark] .btn-outline-secondary:disabled,html[data-netbox-color-mode=dark] .btn-outline-secondary.disabled{color:#adb5bd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-success{color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-outline-success:hover{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success:focus{box-shadow:0 0 0 .25rem #75b79880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-success,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success:active,html[data-netbox-color-mode=dark] .btn-outline-success.active,html[data-netbox-color-mode=dark] .btn-outline-success.dropdown-toggle.show{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-success:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-success:focus,html[data-netbox-color-mode=dark] .btn-outline-success:active:focus,html[data-netbox-color-mode=dark] .btn-outline-success.active:focus,html[data-netbox-color-mode=dark] .btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #75b79880}html[data-netbox-color-mode=dark] .btn-outline-success:disabled,html[data-netbox-color-mode=dark] .btn-outline-success.disabled{color:#75b798;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-info{color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-outline-info:hover{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info:focus{box-shadow:0 0 0 .25rem #6edff680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-info,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info:active,html[data-netbox-color-mode=dark] .btn-outline-info.active,html[data-netbox-color-mode=dark] .btn-outline-info.dropdown-toggle.show{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-info:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-info:focus,html[data-netbox-color-mode=dark] .btn-outline-info:active:focus,html[data-netbox-color-mode=dark] .btn-outline-info.active:focus,html[data-netbox-color-mode=dark] .btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6edff680}html[data-netbox-color-mode=dark] .btn-outline-info:disabled,html[data-netbox-color-mode=dark] .btn-outline-info.disabled{color:#6edff6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-warning{color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-outline-warning:hover{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning:focus{box-shadow:0 0 0 .25rem #ffda6a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-warning,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning:active,html[data-netbox-color-mode=dark] .btn-outline-warning.active,html[data-netbox-color-mode=dark] .btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-warning:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-warning:focus,html[data-netbox-color-mode=dark] .btn-outline-warning:active:focus,html[data-netbox-color-mode=dark] .btn-outline-warning.active:focus,html[data-netbox-color-mode=dark] .btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffda6a80}html[data-netbox-color-mode=dark] .btn-outline-warning:disabled,html[data-netbox-color-mode=dark] .btn-outline-warning.disabled{color:#ffda6a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-danger{color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-outline-danger:hover{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger:focus{box-shadow:0 0 0 .25rem #ea868f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-danger,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger:active,html[data-netbox-color-mode=dark] .btn-outline-danger.active,html[data-netbox-color-mode=dark] .btn-outline-danger.dropdown-toggle.show{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-danger:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-danger:focus,html[data-netbox-color-mode=dark] .btn-outline-danger:active:focus,html[data-netbox-color-mode=dark] .btn-outline-danger.active:focus,html[data-netbox-color-mode=dark] .btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ea868f80}html[data-netbox-color-mode=dark] .btn-outline-danger:disabled,html[data-netbox-color-mode=dark] .btn-outline-danger.disabled{color:#ea868f;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-light{color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-outline-light:hover{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light:focus{box-shadow:0 0 0 .25rem #dee2e680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-light,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light:active,html[data-netbox-color-mode=dark] .btn-outline-light.active,html[data-netbox-color-mode=dark] .btn-outline-light.dropdown-toggle.show{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-light:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-light:focus,html[data-netbox-color-mode=dark] .btn-outline-light:active:focus,html[data-netbox-color-mode=dark] .btn-outline-light.active:focus,html[data-netbox-color-mode=dark] .btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dee2e680}html[data-netbox-color-mode=dark] .btn-outline-light:disabled,html[data-netbox-color-mode=dark] .btn-outline-light.disabled{color:#dee2e6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-dark{color:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .btn-outline-dark:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-dark,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark:active,html[data-netbox-color-mode=dark] .btn-outline-dark.active,html[data-netbox-color-mode=dark] .btn-outline-dark.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-dark:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-dark:focus,html[data-netbox-color-mode=dark] .btn-outline-dark:active:focus,html[data-netbox-color-mode=dark] .btn-outline-dark.active:focus,html[data-netbox-color-mode=dark] .btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}html[data-netbox-color-mode=dark] .btn-outline-dark:disabled,html[data-netbox-color-mode=dark] .btn-outline-dark.disabled{color:#adb5bd;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-blue{color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .btn-outline-blue:hover{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue:focus{box-shadow:0 0 0 .25rem #6ea8fe80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue:active,html[data-netbox-color-mode=dark] .btn-outline-blue.active,html[data-netbox-color-mode=dark] .btn-outline-blue.dropdown-toggle.show{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue:focus,html[data-netbox-color-mode=dark] .btn-outline-blue:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6ea8fe80}html[data-netbox-color-mode=dark] .btn-outline-blue:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue.disabled{color:#6ea8fe;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-indigo{color:#a370f7;border-color:#a370f7}html[data-netbox-color-mode=dark] .btn-outline-indigo:hover{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo:focus{box-shadow:0 0 0 .25rem #a370f780}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo:active,html[data-netbox-color-mode=dark] .btn-outline-indigo.active,html[data-netbox-color-mode=dark] .btn-outline-indigo.dropdown-toggle.show{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a370f780}html[data-netbox-color-mode=dark] .btn-outline-indigo:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo.disabled{color:#a370f7;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-purple{color:#a98eda;border-color:#a98eda}html[data-netbox-color-mode=dark] .btn-outline-purple:hover{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple:focus{box-shadow:0 0 0 .25rem #a98eda80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple:active,html[data-netbox-color-mode=dark] .btn-outline-purple.active,html[data-netbox-color-mode=dark] .btn-outline-purple.dropdown-toggle.show{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple:focus,html[data-netbox-color-mode=dark] .btn-outline-purple:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a98eda80}html[data-netbox-color-mode=dark] .btn-outline-purple:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple.disabled{color:#a98eda;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-pink{color:#e685b5;border-color:#e685b5}html[data-netbox-color-mode=dark] .btn-outline-pink:hover{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink:focus{box-shadow:0 0 0 .25rem #e685b580}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink:active,html[data-netbox-color-mode=dark] .btn-outline-pink.active,html[data-netbox-color-mode=dark] .btn-outline-pink.dropdown-toggle.show{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink:focus,html[data-netbox-color-mode=dark] .btn-outline-pink:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e685b580}html[data-netbox-color-mode=dark] .btn-outline-pink:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink.disabled{color:#e685b5;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-red{color:#ea868f;border-color:#ea868f}html[data-netbox-color-mode=dark] .btn-outline-red:hover{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red:focus{box-shadow:0 0 0 .25rem #ea868f80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red:active,html[data-netbox-color-mode=dark] .btn-outline-red.active,html[data-netbox-color-mode=dark] .btn-outline-red.dropdown-toggle.show{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red:focus,html[data-netbox-color-mode=dark] .btn-outline-red:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ea868f80}html[data-netbox-color-mode=dark] .btn-outline-red:disabled,html[data-netbox-color-mode=dark] .btn-outline-red.disabled{color:#ea868f;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-orange{color:#feb272;border-color:#feb272}html[data-netbox-color-mode=dark] .btn-outline-orange:hover{color:#000;background-color:#feb272;border-color:#feb272}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-orange,html[data-netbox-color-mode=dark] .btn-outline-orange:focus{box-shadow:0 0 0 .25rem #feb27280}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-orange,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-orange,html[data-netbox-color-mode=dark] .btn-outline-orange:active,html[data-netbox-color-mode=dark] .btn-outline-orange.active,html[data-netbox-color-mode=dark] .btn-outline-orange.dropdown-toggle.show{color:#000;background-color:#feb272;border-color:#feb272}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-orange:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-orange:focus,html[data-netbox-color-mode=dark] .btn-outline-orange:active:focus,html[data-netbox-color-mode=dark] .btn-outline-orange.active:focus,html[data-netbox-color-mode=dark] .btn-outline-orange.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #feb27280}html[data-netbox-color-mode=dark] .btn-outline-orange:disabled,html[data-netbox-color-mode=dark] .btn-outline-orange.disabled{color:#feb272;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-yellow{color:#ffda6a;border-color:#ffda6a}html[data-netbox-color-mode=dark] .btn-outline-yellow:hover{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow:focus{box-shadow:0 0 0 .25rem #ffda6a80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow:active,html[data-netbox-color-mode=dark] .btn-outline-yellow.active,html[data-netbox-color-mode=dark] .btn-outline-yellow.dropdown-toggle.show{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffda6a80}html[data-netbox-color-mode=dark] .btn-outline-yellow:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow.disabled{color:#ffda6a;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-green{color:#75b798;border-color:#75b798}html[data-netbox-color-mode=dark] .btn-outline-green:hover{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green:focus{box-shadow:0 0 0 .25rem #75b79880}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green:active,html[data-netbox-color-mode=dark] .btn-outline-green.active,html[data-netbox-color-mode=dark] .btn-outline-green.dropdown-toggle.show{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green:focus,html[data-netbox-color-mode=dark] .btn-outline-green:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #75b79880}html[data-netbox-color-mode=dark] .btn-outline-green:disabled,html[data-netbox-color-mode=dark] .btn-outline-green.disabled{color:#75b798;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-teal{color:#79dfc1;border-color:#79dfc1}html[data-netbox-color-mode=dark] .btn-outline-teal:hover{color:#000;background-color:#79dfc1;border-color:#79dfc1}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-teal,html[data-netbox-color-mode=dark] .btn-outline-teal:focus{box-shadow:0 0 0 .25rem #79dfc180}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-teal,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-teal,html[data-netbox-color-mode=dark] .btn-outline-teal:active,html[data-netbox-color-mode=dark] .btn-outline-teal.active,html[data-netbox-color-mode=dark] .btn-outline-teal.dropdown-toggle.show{color:#000;background-color:#79dfc1;border-color:#79dfc1}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-teal:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-teal:focus,html[data-netbox-color-mode=dark] .btn-outline-teal:active:focus,html[data-netbox-color-mode=dark] .btn-outline-teal.active:focus,html[data-netbox-color-mode=dark] .btn-outline-teal.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #79dfc180}html[data-netbox-color-mode=dark] .btn-outline-teal:disabled,html[data-netbox-color-mode=dark] .btn-outline-teal.disabled{color:#79dfc1;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-cyan{color:#6edff6;border-color:#6edff6}html[data-netbox-color-mode=dark] .btn-outline-cyan:hover{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan:focus{box-shadow:0 0 0 .25rem #6edff680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan:active,html[data-netbox-color-mode=dark] .btn-outline-cyan.active,html[data-netbox-color-mode=dark] .btn-outline-cyan.dropdown-toggle.show{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6edff680}html[data-netbox-color-mode=dark] .btn-outline-cyan:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan.disabled{color:#6edff6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-gray{color:#dee2e6;border-color:#dee2e6}html[data-netbox-color-mode=dark] .btn-outline-gray:hover{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray:focus{box-shadow:0 0 0 .25rem #dee2e680}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray:active,html[data-netbox-color-mode=dark] .btn-outline-gray.active,html[data-netbox-color-mode=dark] .btn-outline-gray.dropdown-toggle.show{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray:focus,html[data-netbox-color-mode=dark] .btn-outline-gray:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dee2e680}html[data-netbox-color-mode=dark] .btn-outline-gray:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray.disabled{color:#dee2e6;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-black{color:#000;border-color:#000}html[data-netbox-color-mode=dark] .btn-outline-black:hover{color:#fff;background-color:#000;border-color:#000}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-black,html[data-netbox-color-mode=dark] .btn-outline-black:focus{box-shadow:0 0 0 .25rem #00000080}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-black,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-black,html[data-netbox-color-mode=dark] .btn-outline-black:active,html[data-netbox-color-mode=dark] .btn-outline-black.active,html[data-netbox-color-mode=dark] .btn-outline-black.dropdown-toggle.show{color:#fff;background-color:#000;border-color:#000}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-black:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-black:focus,html[data-netbox-color-mode=dark] .btn-outline-black:active:focus,html[data-netbox-color-mode=dark] .btn-outline-black.active:focus,html[data-netbox-color-mode=dark] .btn-outline-black.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #00000080}html[data-netbox-color-mode=dark] .btn-outline-black:disabled,html[data-netbox-color-mode=dark] .btn-outline-black.disabled{color:#000;background-color:transparent}html[data-netbox-color-mode=dark] .btn-outline-white{color:#fff;border-color:#fff}html[data-netbox-color-mode=dark] .btn-outline-white:hover{color:#000;background-color:#fff;border-color:#fff}.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-white,html[data-netbox-color-mode=dark] .btn-outline-white:focus{box-shadow:0 0 0 .25rem #ffffff80}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-white,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-white,html[data-netbox-color-mode=dark] .btn-outline-white:active,html[data-netbox-color-mode=dark] .btn-outline-white.active,html[data-netbox-color-mode=dark] .btn-outline-white.dropdown-toggle.show{color:#000;background-color:#fff;border-color:#fff}.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-white:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-white:focus,html[data-netbox-color-mode=dark] .btn-outline-white:active:focus,html[data-netbox-color-mode=dark] .btn-outline-white.active:focus,html[data-netbox-color-mode=dark] .btn-outline-white.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffffff80}html[data-netbox-color-mode=dark] .btn-outline-white:disabled,html[data-netbox-color-mode=dark] .btn-outline-white.disabled{color:#fff;background-color:transparent}html[data-netbox-color-mode=dark] .btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}html[data-netbox-color-mode=dark] .btn-link:hover{color:#0a58ca}html[data-netbox-color-mode=dark] .btn-link:disabled,html[data-netbox-color-mode=dark] .btn-link.disabled{color:#dee2e6}html[data-netbox-color-mode=dark] .btn-lg,html[data-netbox-color-mode=dark] .btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}html[data-netbox-color-mode=dark] .btn-sm,html[data-netbox-color-mode=dark] .btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html[data-netbox-color-mode=dark] .fade{transition:opacity .15s linear}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .fade{transition:none}}html[data-netbox-color-mode=dark] .fade:not(.show){opacity:0}html[data-netbox-color-mode=dark] .collapse:not(.show){display:none}html[data-netbox-color-mode=dark] .collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .collapsing{transition:none}}html[data-netbox-color-mode=dark] .dropup,html[data-netbox-color-mode=dark] .dropend,html[data-netbox-color-mode=dark] .dropdown,html[data-netbox-color-mode=dark] .dropstart{position:relative}html[data-netbox-color-mode=dark] .dropdown-toggle{white-space:nowrap}html[data-netbox-color-mode=dark] .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}html[data-netbox-color-mode=dark] .dropdown-toggle:empty:after{margin-left:0}html[data-netbox-color-mode=dark] .dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#fff;text-align:left;list-style:none;background-color:#212529;background-clip:padding-box;border:1px solid rgba(255,255,255,.15);border-radius:.375rem}html[data-netbox-color-mode=dark] .dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}html[data-netbox-color-mode=dark] .dropdown-menu-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width: 576px){html[data-netbox-color-mode=dark] .dropdown-menu-sm-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-sm-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .dropdown-menu-md-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-md-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .dropdown-menu-lg-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-lg-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .dropdown-menu-xl-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-xl-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .dropdown-menu-xxl-start{--bs-position: start}html[data-netbox-color-mode=dark] .dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}html[data-netbox-color-mode=dark] .dropdown-menu-xxl-end{--bs-position: end}html[data-netbox-color-mode=dark] .dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}html[data-netbox-color-mode=dark] .dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}html[data-netbox-color-mode=dark] .dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}html[data-netbox-color-mode=dark] .dropup .dropdown-toggle:empty:after{margin-left:0}html[data-netbox-color-mode=dark] .dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:empty:after{margin-left:0}html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:after{vertical-align:0}html[data-netbox-color-mode=dark] .dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:after{display:none}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:empty:after{margin-left:0}html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:before{vertical-align:0}html[data-netbox-color-mode=dark] .dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}html[data-netbox-color-mode=dark] .dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#f8f9fa;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}html[data-netbox-color-mode=dark] .dropdown-item:hover,html[data-netbox-color-mode=dark] .dropdown-item:focus{color:#fff;background-color:#6c757d}html[data-netbox-color-mode=dark] .dropdown-item.active,html[data-netbox-color-mode=dark] .dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}html[data-netbox-color-mode=dark] .dropdown-item.disabled,html[data-netbox-color-mode=dark] .dropdown-item:disabled{color:#343a40;pointer-events:none;background-color:transparent}html[data-netbox-color-mode=dark] .dropdown-menu.show{display:block}html[data-netbox-color-mode=dark] .dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}html[data-netbox-color-mode=dark] .dropdown-item-text{display:block;padding:.25rem 1rem;color:#f8f9fa}html[data-netbox-color-mode=dark] .dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#00000026}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item{color:#dee2e6}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:hover,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:#ffffff26}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item.active,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item.disabled,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-divider{border-color:#00000026}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item-text{color:#dee2e6}html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-header{color:#adb5bd}html[data-netbox-color-mode=dark] .btn-group,html[data-netbox-color-mode=dark] .btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}html[data-netbox-color-mode=dark] .btn-group>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn{position:relative;flex:1 1 auto}html[data-netbox-color-mode=dark] .btn-group>.btn-check:checked+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn-check:focus+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn:hover,html[data-netbox-color-mode=dark] .btn-group>.btn:focus,html[data-netbox-color-mode=dark] .btn-group>.btn:active,html[data-netbox-color-mode=dark] .btn-group>.btn.active,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-check:checked+.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-check:focus+.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:hover,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:focus,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:active,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn.active{z-index:1}html[data-netbox-color-mode=dark] .btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .btn-toolbar .input-group{width:auto}html[data-netbox-color-mode=dark] .btn-group>.btn:not(:first-child),html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:first-child){margin-left:-1px}html[data-netbox-color-mode=dark] .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .btn-group>.btn:nth-child(n+3),html[data-netbox-color-mode=dark] .btn-group>:not(.btn-check)+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,.dropup html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,.dropend html[data-netbox-color-mode=dark] .dropdown-toggle-split:after{margin-left:0}.dropstart html[data-netbox-color-mode=dark] .dropdown-toggle-split:before{margin-right:0}html[data-netbox-color-mode=dark] .btn-sm+.dropdown-toggle-split,html[data-netbox-color-mode=dark] .btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}html[data-netbox-color-mode=dark] .btn-lg+.dropdown-toggle-split,html[data-netbox-color-mode=dark] .btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}html[data-netbox-color-mode=dark] .btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}html[data-netbox-color-mode=dark] .btn-group-vertical>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group{width:100%}html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:not(:first-child),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .btn-group-vertical>.btn~.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}html[data-netbox-color-mode=dark] .nav-link{display:block;padding:.5rem 1rem;color:#fff;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .nav-link{transition:none}}html[data-netbox-color-mode=dark] .nav-link.disabled{color:#343a40;pointer-events:none;cursor:default}html[data-netbox-color-mode=dark] .nav-tabs{border-bottom:1px solid #495057}html[data-netbox-color-mode=dark] .nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:.375rem;border-top-right-radius:.375rem}html[data-netbox-color-mode=dark] .nav-tabs .nav-link:hover,html[data-netbox-color-mode=dark] .nav-tabs .nav-link:focus{border-color:rgba(52,58,64,.5) rgba(52,58,64,.5) #495057;isolation:isolate}html[data-netbox-color-mode=dark] .nav-tabs .nav-link.disabled{color:#343a40;background-color:transparent;border-color:transparent}html[data-netbox-color-mode=dark] .nav-tabs .nav-link.active,html[data-netbox-color-mode=dark] .nav-tabs .nav-item.show .nav-link{color:#f8f9fa;background-color:#1b1f22;border-color:#343a40 #343a40 #1b1f22}html[data-netbox-color-mode=dark] .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .nav-pills .nav-link{background:none;border:0;border-radius:.375rem}html[data-netbox-color-mode=dark] .nav-pills .nav-link.active,html[data-netbox-color-mode=dark] .nav-pills .show>.nav-link{color:#000;background-color:#6ea8fe}html[data-netbox-color-mode=dark] .nav-fill>.nav-link,html[data-netbox-color-mode=dark] .nav-fill .nav-item{flex:1 1 auto;text-align:center}html[data-netbox-color-mode=dark] .nav-justified>.nav-link,html[data-netbox-color-mode=dark] .nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}html[data-netbox-color-mode=dark] .nav-fill .nav-item .nav-link,html[data-netbox-color-mode=dark] .nav-justified .nav-item .nav-link{width:100%}html[data-netbox-color-mode=dark] .tab-content>.tab-pane{display:none}html[data-netbox-color-mode=dark] .tab-content>.active{display:block}html[data-netbox-color-mode=dark] .navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}html[data-netbox-color-mode=dark] .navbar>.container,html[data-netbox-color-mode=dark] .navbar>.container-fluid,html[data-netbox-color-mode=dark] .navbar>.container-sm,html[data-netbox-color-mode=dark] .navbar>.container-md,html[data-netbox-color-mode=dark] .navbar>.container-lg,html[data-netbox-color-mode=dark] .navbar>.container-xl,html[data-netbox-color-mode=dark] .navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}html[data-netbox-color-mode=dark] .navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}html[data-netbox-color-mode=dark] .navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}html[data-netbox-color-mode=dark] .navbar-nav .nav-link{padding-right:0;padding-left:0}html[data-netbox-color-mode=dark] .navbar-nav .dropdown-menu{position:static}html[data-netbox-color-mode=dark] .navbar-text{padding-top:.5rem;padding-bottom:.5rem}html[data-netbox-color-mode=dark] .navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}html[data-netbox-color-mode=dark] .navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.375rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .navbar-toggler{transition:none}}html[data-netbox-color-mode=dark] .navbar-toggler:hover{text-decoration:none}html[data-netbox-color-mode=dark] .navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}html[data-netbox-color-mode=dark] .navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}html[data-netbox-color-mode=dark] .navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){html[data-netbox-color-mode=dark] .navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-toggler{display:none}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-toggler{display:none}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-toggler{display:none}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-toggler{display:none}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-toggler{display:none}}html[data-netbox-color-mode=dark] .navbar-expand{flex-wrap:nowrap;justify-content:flex-start}html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav{flex-direction:row}html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav .dropdown-menu{position:absolute}html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav-scroll{overflow:visible}html[data-netbox-color-mode=dark] .navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}html[data-netbox-color-mode=dark] .navbar-expand .navbar-toggler{display:none}html[data-netbox-color-mode=dark] .navbar-light .navbar-brand{color:#000000e6}html[data-netbox-color-mode=dark] .navbar-light .navbar-brand:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-brand:focus{color:#000000e6}html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link{color:#adb5bd}html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link:focus{color:#000000b3}html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .show>.nav-link,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link.active{color:#000000e6}html[data-netbox-color-mode=dark] .navbar-light .navbar-toggler{color:#adb5bd;border-color:#495057}html[data-netbox-color-mode=dark] .navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23adb5bd' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .navbar-light .navbar-text{color:#adb5bd}html[data-netbox-color-mode=dark] .navbar-light .navbar-text a,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a:focus{color:#000000e6}html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand{color:#fff}html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand:focus{color:#fff}html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link{color:#ffffff8c}html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link:focus{color:#ffffffbf}html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .show>.nav-link,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link.active{color:#fff}html[data-netbox-color-mode=dark] .navbar-dark .navbar-toggler{color:#ffffff8c;border-color:#ffffff1a}html[data-netbox-color-mode=dark] .navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .navbar-dark .navbar-text{color:#ffffff8c}html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a:focus{color:#fff}html[data-netbox-color-mode=dark] .card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#212529;background-clip:border-box;border:1px solid rgba(255,255,255,.125);border-radius:.375rem}html[data-netbox-color-mode=dark] .card>hr{margin-right:0;margin-left:0}html[data-netbox-color-mode=dark] .card>.list-group{border-top:inherit;border-bottom:inherit}html[data-netbox-color-mode=dark] .card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card>.card-header+.list-group,html[data-netbox-color-mode=dark] .card>.list-group+.card-footer{border-top:0}html[data-netbox-color-mode=dark] .card-body{flex:1 1 auto;padding:1rem}html[data-netbox-color-mode=dark] .card-title{margin-bottom:.5rem}html[data-netbox-color-mode=dark] .card-subtitle{margin-top:-.25rem;margin-bottom:0}html[data-netbox-color-mode=dark] .card-text:last-child{margin-bottom:0}html[data-netbox-color-mode=dark] .card-link:hover{text-decoration:none}html[data-netbox-color-mode=dark] .card-link+.card-link{margin-left:1rem}html[data-netbox-color-mode=dark] .card-header{padding:.5rem 1rem;margin-bottom:0;background-color:"unset";border-bottom:1px solid rgba(255,255,255,.125)}html[data-netbox-color-mode=dark] .card-header:first-child{border-radius:calc(.375rem - 1px) calc(.375rem - 1px) 0 0}html[data-netbox-color-mode=dark] .card-footer{padding:.5rem 1rem;background-color:"unset";border-top:1px solid rgba(255,255,255,.125)}html[data-netbox-color-mode=dark] .card-footer:last-child{border-radius:0 0 calc(.375rem - 1px) calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}html[data-netbox-color-mode=dark] .card-header-tabs .nav-link.active{background-color:#212529;border-bottom-color:#212529}html[data-netbox-color-mode=dark] .card-header-pills{margin-right:-.5rem;margin-left:-.5rem}html[data-netbox-color-mode=dark] .card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-top,html[data-netbox-color-mode=dark] .card-img-bottom{width:100%}html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-top{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-bottom{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .card-group>.card{margin-bottom:.75rem}@media (min-width: 576px){html[data-netbox-color-mode=dark] .card-group{display:flex;flex-flow:row wrap}html[data-netbox-color-mode=dark] .card-group>.card{flex:1 0 0%;margin-bottom:0}html[data-netbox-color-mode=dark] .card-group>.card+.card{margin-left:0;border-left:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-img-top,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-img-bottom,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-img-top,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-img-bottom,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}html[data-netbox-color-mode=dark] .accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#fff;text-align:left;background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .accordion-button{transition:none}}html[data-netbox-color-mode=dark] .accordion-button:not(.collapsed){color:#000;background-color:#6397e5;box-shadow:inset 0 -1px #495057}html[data-netbox-color-mode=dark] .accordion-button:not(.collapsed):after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}html[data-netbox-color-mode=dark] .accordion-button:after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .accordion-button:after{transition:none}}html[data-netbox-color-mode=dark] .accordion-button:hover{z-index:2}html[data-netbox-color-mode=dark] .accordion-button:focus{z-index:3;border-color:#7db1fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .accordion-header{margin-bottom:0}html[data-netbox-color-mode=dark] .accordion-item{background-color:transparent;border:1px solid #495057}html[data-netbox-color-mode=dark] .accordion-item:first-of-type{border-top-left-radius:.375rem;border-top-right-radius:.375rem}html[data-netbox-color-mode=dark] .accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .accordion-item:not(:first-of-type){border-top:0}html[data-netbox-color-mode=dark] .accordion-item:last-of-type{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .accordion-body{padding:1rem 1.25rem}html[data-netbox-color-mode=dark] .accordion-flush .accordion-collapse{border-width:0}html[data-netbox-color-mode=dark] .accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}html[data-netbox-color-mode=dark] .accordion-flush .accordion-item:first-child{border-top:0}html[data-netbox-color-mode=dark] .accordion-flush .accordion-item:last-child{border-bottom:0}html[data-netbox-color-mode=dark] .accordion-flush .accordion-item .accordion-button{border-radius:0}html[data-netbox-color-mode=dark] .breadcrumb{display:flex;flex-wrap:wrap;padding:0;margin-bottom:1rem;list-style:none}html[data-netbox-color-mode=dark] .breadcrumb-item+.breadcrumb-item{padding-left:.5rem}html[data-netbox-color-mode=dark] .breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#f8f9fa;content:var(--bs-breadcrumb-divider, url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='%23f8f9fa'/%3E%3C/svg%3E"))}html[data-netbox-color-mode=dark] .breadcrumb-item.active{color:#fff}html[data-netbox-color-mode=dark] .pagination{display:flex;padding-left:0;list-style:none}html[data-netbox-color-mode=dark] .page-link{position:relative;display:block;color:#9ec5fe;text-decoration:none;background-color:#343a40;border:1px solid #6c757d;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){html[data-netbox-color-mode=dark] .page-link{transition:none}}html[data-netbox-color-mode=dark] .page-link:hover{z-index:2;color:#cfe2ff;background-color:#ced4da;border-color:#adb5bd}html[data-netbox-color-mode=dark] .page-link:focus{z-index:3;color:#cfe2ff;background-color:#ced4da;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .page-item:not(:first-child) .page-link{margin-left:-1px}html[data-netbox-color-mode=dark] .page-item.active .page-link{z-index:3;color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#343a40;border-color:#6c757d}html[data-netbox-color-mode=dark] .page-link{padding:.375rem .75rem}html[data-netbox-color-mode=dark] .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}html[data-netbox-color-mode=dark] .pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}html[data-netbox-color-mode=dark] .pagination-lg .page-item:first-child .page-link{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}html[data-netbox-color-mode=dark] .pagination-lg .page-item:last-child .page-link{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}html[data-netbox-color-mode=dark] .pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}html[data-netbox-color-mode=dark] .pagination-sm .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .pagination-sm .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}html[data-netbox-color-mode=dark] .badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.375rem}html[data-netbox-color-mode=dark] .badge:empty{display:none}html[data-netbox-color-mode=dark] .btn .badge{position:relative;top:-1px}html[data-netbox-color-mode=dark] .alert{position:relative;padding:1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.375rem}html[data-netbox-color-mode=dark] .alert-heading{color:inherit}html[data-netbox-color-mode=dark] .alert-link{font-weight:700}html[data-netbox-color-mode=dark] .alert-dismissible{padding-right:3rem}html[data-netbox-color-mode=dark] .alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}html[data-netbox-color-mode=dark] .alert-primary{color:#162233;background-color:#75acfe;border-color:#8bb9fe}html[data-netbox-color-mode=dark] .alert-primary .alert-link{color:#121b29}html[data-netbox-color-mode=dark] .alert-secondary{color:#232426;background-color:#b1b9c0;border-color:#bdc4ca}html[data-netbox-color-mode=dark] .alert-secondary .alert-link{color:#1c1d1e}html[data-netbox-color-mode=dark] .alert-success{color:#17251e;background-color:#7cbb9d;border-color:#91c5ad}html[data-netbox-color-mode=dark] .alert-success .alert-link{color:#121e18}html[data-netbox-color-mode=dark] .alert-info{color:#162d31;background-color:#75e1f6;border-color:#8be5f8}html[data-netbox-color-mode=dark] .alert-info .alert-link{color:#122427}html[data-netbox-color-mode=dark] .alert-warning{color:#332c15;background-color:#ffdc71;border-color:#ffe188}html[data-netbox-color-mode=dark] .alert-warning .alert-link{color:#292311}html[data-netbox-color-mode=dark] .alert-danger{color:#2f1b1d;background-color:#eb8c95;border-color:#ee9ea5}html[data-netbox-color-mode=dark] .alert-danger .alert-link{color:#261617}html[data-netbox-color-mode=dark] .alert-light{color:#2c2d2e;background-color:#e0e3e7;border-color:#e5e8eb}html[data-netbox-color-mode=dark] .alert-light .alert-link{color:#232425}html[data-netbox-color-mode=dark] .alert-dark{color:#232426;background-color:#b1b9c0;border-color:#bdc4ca}html[data-netbox-color-mode=dark] .alert-dark .alert-link{color:#1c1d1e}html[data-netbox-color-mode=dark] .alert-blue{color:#162233;background-color:#75acfe;border-color:#8bb9fe}html[data-netbox-color-mode=dark] .alert-blue .alert-link{color:#121b29}html[data-netbox-color-mode=dark] .alert-indigo{color:#211631;background-color:#a877f7;border-color:#b58df9}html[data-netbox-color-mode=dark] .alert-indigo .alert-link{color:#1a1227}html[data-netbox-color-mode=dark] .alert-purple{color:#221c2c;background-color:#ad94dc;border-color:#baa5e1}html[data-netbox-color-mode=dark] .alert-purple .alert-link{color:#1b1623}html[data-netbox-color-mode=dark] .alert-pink{color:#2e1b24;background-color:#e78bb9;border-color:#eb9dc4}html[data-netbox-color-mode=dark] .alert-pink .alert-link{color:#25161d}html[data-netbox-color-mode=dark] .alert-red{color:#2f1b1d;background-color:#eb8c95;border-color:#ee9ea5}html[data-netbox-color-mode=dark] .alert-red .alert-link{color:#261617}html[data-netbox-color-mode=dark] .alert-orange{color:#332417;background-color:#feb679;border-color:#fec18e}html[data-netbox-color-mode=dark] .alert-orange .alert-link{color:#291d12}html[data-netbox-color-mode=dark] .alert-yellow{color:#332c15;background-color:#ffdc71;border-color:#ffe188}html[data-netbox-color-mode=dark] .alert-yellow .alert-link{color:#292311}html[data-netbox-color-mode=dark] .alert-green{color:#17251e;background-color:#7cbb9d;border-color:#91c5ad}html[data-netbox-color-mode=dark] .alert-green .alert-link{color:#121e18}html[data-netbox-color-mode=dark] .alert-teal{color:#182d27;background-color:#80e1c4;border-color:#94e5cd}html[data-netbox-color-mode=dark] .alert-teal .alert-link{color:#13241f}html[data-netbox-color-mode=dark] .alert-cyan{color:#162d31;background-color:#75e1f6;border-color:#8be5f8}html[data-netbox-color-mode=dark] .alert-cyan .alert-link{color:#122427}html[data-netbox-color-mode=dark] .alert-gray{color:#2c2d2e;background-color:#e0e3e7;border-color:#e5e8eb}html[data-netbox-color-mode=dark] .alert-gray .alert-link{color:#232425}html[data-netbox-color-mode=dark] .alert-black{color:#ccc;background-color:#0d0d0d;border-color:#333}html[data-netbox-color-mode=dark] .alert-black .alert-link{color:#a3a3a3}html[data-netbox-color-mode=dark] .alert-white{color:#333;background-color:#fff;border-color:#fff}html[data-netbox-color-mode=dark] .alert-white .alert-link{color:#292929}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}html[data-netbox-color-mode=dark] .progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#6c757d;border-radius:.375rem}html[data-netbox-color-mode=dark] .progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#6ea8fe;transition:width .6s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .progress-bar{transition:none}}html[data-netbox-color-mode=dark] .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:1rem 1rem}html[data-netbox-color-mode=dark] .progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .progress-bar-animated{animation:none}}html[data-netbox-color-mode=dark] .list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.375rem}html[data-netbox-color-mode=dark] .list-group-numbered{list-style-type:none;counter-reset:section}html[data-netbox-color-mode=dark] .list-group-numbered>li:before{content:counters(section,".") ". ";counter-increment:section}html[data-netbox-color-mode=dark] .list-group-item-action{width:100%;color:#dee2e6;text-align:inherit}html[data-netbox-color-mode=dark] .list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-action:focus{z-index:1;color:#fff;text-decoration:none;background-color:#f8f9fa26}html[data-netbox-color-mode=dark] .list-group-item-action:active{color:#fff;background-color:#dee2e620}html[data-netbox-color-mode=dark] .list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#fff;text-decoration:none;background-color:#212529;border:1px solid rgba(255,255,255,.125)}html[data-netbox-color-mode=dark] .list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}html[data-netbox-color-mode=dark] .list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}html[data-netbox-color-mode=dark] .list-group-item.disabled,html[data-netbox-color-mode=dark] .list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#212529}html[data-netbox-color-mode=dark] .list-group-item.active{z-index:2;color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item{border-top-width:0}html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item.active{margin-top:-1px;border-top-width:1px}html[data-netbox-color-mode=dark] .list-group-horizontal{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){html[data-netbox-color-mode=dark] .list-group-horizontal-sm{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .list-group-horizontal-md{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .list-group-horizontal-lg{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .list-group-horizontal-xl{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .list-group-horizontal-xxl{flex-direction:row}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item.active{margin-top:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}html[data-netbox-color-mode=dark] .list-group-flush{border-radius:0}html[data-netbox-color-mode=dark] .list-group-flush>.list-group-item{border-width:0 0 1px}html[data-netbox-color-mode=dark] .list-group-flush>.list-group-item:last-child{border-bottom-width:0}html[data-netbox-color-mode=dark] .list-group-item-primary{color:#426598;background-color:#e2eeff}html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action:focus{color:#426598;background-color:#cbd6e6}html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#426598;border-color:#426598}html[data-netbox-color-mode=dark] .list-group-item-secondary{color:#686d71;background-color:#eff0f2}html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}html[data-netbox-color-mode=dark] .list-group-item-success{color:#466e5b;background-color:#e3f1ea}html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action:focus{color:#466e5b;background-color:#ccd9d3}html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action.active{color:#fff;background-color:#466e5b;border-color:#466e5b}html[data-netbox-color-mode=dark] .list-group-item-info{color:#2c5962;background-color:#e2f9fd}html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action:focus{color:#2c5962;background-color:#cbe0e4}html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action.active{color:#fff;background-color:#2c5962;border-color:#2c5962}html[data-netbox-color-mode=dark] .list-group-item-warning{color:#66572a;background-color:#fff8e1}html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action:focus{color:#66572a;background-color:#e6dfcb}html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#66572a;border-color:#66572a}html[data-netbox-color-mode=dark] .list-group-item-danger{color:#8c5056;background-color:#fbe7e9}html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action:focus{color:#8c5056;background-color:#e2d0d2}html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#8c5056;border-color:#8c5056}html[data-netbox-color-mode=dark] .list-group-item-light{color:#595a5c;background-color:#f8f9fa}html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action:focus{color:#595a5c;background-color:#dfe0e1}html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action.active{color:#fff;background-color:#595a5c;border-color:#595a5c}html[data-netbox-color-mode=dark] .list-group-item-dark{color:#686d71;background-color:#eff0f2}html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}html[data-netbox-color-mode=dark] .list-group-item-blue{color:#426598;background-color:#e2eeff}html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action:focus{color:#426598;background-color:#cbd6e6}html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action.active{color:#fff;background-color:#426598;border-color:#426598}html[data-netbox-color-mode=dark] .list-group-item-indigo{color:#624394;background-color:#ede2fd}html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action:focus{color:#624394;background-color:#d5cbe4}html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action.active{color:#fff;background-color:#624394;border-color:#624394}html[data-netbox-color-mode=dark] .list-group-item-purple{color:#655583;background-color:#eee8f8}html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action:focus{color:#655583;background-color:#d6d1df}html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action.active{color:#fff;background-color:#655583;border-color:#655583}html[data-netbox-color-mode=dark] .list-group-item-pink{color:#8a506d;background-color:#fae7f0}html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action:focus{color:#8a506d;background-color:#e1d0d8}html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action.active{color:#fff;background-color:#8a506d;border-color:#8a506d}html[data-netbox-color-mode=dark] .list-group-item-red{color:#8c5056;background-color:#fbe7e9}html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action:focus{color:#8c5056;background-color:#e2d0d2}html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action.active{color:#fff;background-color:#8c5056;border-color:#8c5056}html[data-netbox-color-mode=dark] .list-group-item-orange{color:#66472e;background-color:#fff0e3}html[data-netbox-color-mode=dark] .list-group-item-orange.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-orange.list-group-item-action:focus{color:#66472e;background-color:#e6d8cc}html[data-netbox-color-mode=dark] .list-group-item-orange.list-group-item-action.active{color:#fff;background-color:#66472e;border-color:#66472e}html[data-netbox-color-mode=dark] .list-group-item-yellow{color:#66572a;background-color:#fff8e1}html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action:focus{color:#66572a;background-color:#e6dfcb}html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action.active{color:#fff;background-color:#66572a;border-color:#66572a}html[data-netbox-color-mode=dark] .list-group-item-green{color:#466e5b;background-color:#e3f1ea}html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action:focus{color:#466e5b;background-color:#ccd9d3}html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action.active{color:#fff;background-color:#466e5b;border-color:#466e5b}html[data-netbox-color-mode=dark] .list-group-item-teal{color:#30594d;background-color:#e4f9f3}html[data-netbox-color-mode=dark] .list-group-item-teal.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-teal.list-group-item-action:focus{color:#30594d;background-color:#cde0db}html[data-netbox-color-mode=dark] .list-group-item-teal.list-group-item-action.active{color:#fff;background-color:#30594d;border-color:#30594d}html[data-netbox-color-mode=dark] .list-group-item-cyan{color:#2c5962;background-color:#e2f9fd}html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action:focus{color:#2c5962;background-color:#cbe0e4}html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action.active{color:#fff;background-color:#2c5962;border-color:#2c5962}html[data-netbox-color-mode=dark] .list-group-item-gray{color:#595a5c;background-color:#f8f9fa}html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action:focus{color:#595a5c;background-color:#dfe0e1}html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action.active{color:#fff;background-color:#595a5c;border-color:#595a5c}html[data-netbox-color-mode=dark] .list-group-item-black{color:#000;background-color:#ccc}html[data-netbox-color-mode=dark] .list-group-item-black.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-black.list-group-item-action:focus{color:#000;background-color:#b8b8b8}html[data-netbox-color-mode=dark] .list-group-item-black.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}html[data-netbox-color-mode=dark] .list-group-item-white{color:#666;background-color:#fff}html[data-netbox-color-mode=dark] .list-group-item-white.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-white.list-group-item-action:focus{color:#666;background-color:#e6e6e6}html[data-netbox-color-mode=dark] .list-group-item-white.list-group-item-action.active{color:#fff;background-color:#666;border-color:#666}html[data-netbox-color-mode=dark] .btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#fff;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}html[data-netbox-color-mode=dark] .btn-close:hover{color:#fff;text-decoration:none;opacity:.75}html[data-netbox-color-mode=dark] .btn-close:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40;opacity:1}html[data-netbox-color-mode=dark] .btn-close:disabled,html[data-netbox-color-mode=dark] .btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}html[data-netbox-color-mode=dark] .btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}html[data-netbox-color-mode=dark] .toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:#ffffffd9;background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem #00000026;border-radius:.375rem}html[data-netbox-color-mode=dark] .toast:not(.showing):not(.show){opacity:0}html[data-netbox-color-mode=dark] .toast.hide{display:none}html[data-netbox-color-mode=dark] .toast-container{width:max-content;max-width:100%;pointer-events:none}html[data-netbox-color-mode=dark] .toast-container>:not(:last-child){margin-bottom:.75rem}html[data-netbox-color-mode=dark] .toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:#ffffffd9;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html[data-netbox-color-mode=dark] .toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}html[data-netbox-color-mode=dark] .toast-body{padding:.75rem;word-wrap:break-word}html[data-netbox-color-mode=dark] .modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}html[data-netbox-color-mode=dark] .modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade html[data-netbox-color-mode=dark] .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion: reduce){.modal.fade html[data-netbox-color-mode=dark] .modal-dialog{transition:none}}.modal.show html[data-netbox-color-mode=dark] .modal-dialog{transform:none}.modal.modal-static html[data-netbox-color-mode=dark] .modal-dialog{transform:scale(1.02)}html[data-netbox-color-mode=dark] .modal-dialog-scrollable{height:calc(100% - 1rem)}html[data-netbox-color-mode=dark] .modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}html[data-netbox-color-mode=dark] .modal-dialog-scrollable .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}html[data-netbox-color-mode=dark] .modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#343a40;background-clip:padding-box;border:1px solid rgba(255,255,255,.2);border-radius:.75rem;outline:0}html[data-netbox-color-mode=dark] .modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}html[data-netbox-color-mode=dark] .modal-backdrop.fade{opacity:0}html[data-netbox-color-mode=dark] .modal-backdrop.show{opacity:.5}html[data-netbox-color-mode=dark] .modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem;border-bottom:1px solid #495057;border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}html[data-netbox-color-mode=dark] .modal-header .btn-close{padding:.5rem;margin:-.5rem -.5rem -.5rem auto}html[data-netbox-color-mode=dark] .modal-title{margin-bottom:0;line-height:1.5}html[data-netbox-color-mode=dark] .modal-body{position:relative;flex:1 1 auto;padding:1rem}html[data-netbox-color-mode=dark] .modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #495057;border-bottom-right-radius:calc(.75rem - 1px);border-bottom-left-radius:calc(.75rem - 1px)}html[data-netbox-color-mode=dark] .modal-footer>*{margin:.25rem}@media (min-width: 576px){html[data-netbox-color-mode=dark] .modal-dialog{max-width:500px;margin:1.75rem auto}html[data-netbox-color-mode=dark] .modal-dialog-scrollable{height:calc(100% - 3.5rem)}html[data-netbox-color-mode=dark] .modal-dialog-centered{min-height:calc(100% - 3.5rem)}html[data-netbox-color-mode=dark] .modal-sm{max-width:300px}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .modal-lg,html[data-netbox-color-mode=dark] .modal-xl{max-width:800px}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .modal-xl{max-width:1140px}}html[data-netbox-color-mode=dark] .modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen .modal-footer{border-radius:0}@media (max-width: 575.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width: 767.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width: 1199.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width: 1399.98px){html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-header{border-radius:0}html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-body{overflow-y:auto}html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-footer{border-radius:0}}html[data-netbox-color-mode=dark] .tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}html[data-netbox-color-mode=dark] .tooltip.show{opacity:.9}html[data-netbox-color-mode=dark] .tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}html[data-netbox-color-mode=dark] .tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}html[data-netbox-color-mode=dark] .bs-tooltip-top,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}html[data-netbox-color-mode=dark] .bs-tooltip-top .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}html[data-netbox-color-mode=dark] .bs-tooltip-top .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#495057}html[data-netbox-color-mode=dark] .bs-tooltip-end,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}html[data-netbox-color-mode=dark] .bs-tooltip-end .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}html[data-netbox-color-mode=dark] .bs-tooltip-end .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#495057}html[data-netbox-color-mode=dark] .bs-tooltip-bottom,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}html[data-netbox-color-mode=dark] .bs-tooltip-bottom .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}html[data-netbox-color-mode=dark] .bs-tooltip-bottom .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#495057}html[data-netbox-color-mode=dark] .bs-tooltip-start,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}html[data-netbox-color-mode=dark] .bs-tooltip-start .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}html[data-netbox-color-mode=dark] .bs-tooltip-start .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#495057}html[data-netbox-color-mode=dark] .tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#495057;border-radius:.375rem}html[data-netbox-color-mode=dark] .popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#495057;background-clip:padding-box;border:1px solid rgba(255,255,255,.2);border-radius:.75rem}html[data-netbox-color-mode=dark] .popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}html[data-netbox-color-mode=dark] .popover .popover-arrow:before,html[data-netbox-color-mode=dark] .popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-.5rem - 1px)}html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#ffffff40}html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#495057}html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#ffffff40}html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#495057}html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-.5rem - 1px)}html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#ffffff40}html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#495057}html[data-netbox-color-mode=dark] .bs-popover-bottom .popover-header:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #454b52}html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#ffffff40}html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#495057}html[data-netbox-color-mode=dark] .popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#454b52;border-bottom:1px solid rgba(255,255,255,.2);border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}html[data-netbox-color-mode=dark] .popover-header:empty{display:none}html[data-netbox-color-mode=dark] .popover-body{padding:1rem;color:#fff}html[data-netbox-color-mode=dark] .carousel{position:relative}html[data-netbox-color-mode=dark] .carousel.pointer-event{touch-action:pan-y}html[data-netbox-color-mode=dark] .carousel-inner{position:relative;width:100%;overflow:hidden}html[data-netbox-color-mode=dark] .carousel-inner:after{display:block;clear:both;content:""}html[data-netbox-color-mode=dark] .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){html[data-netbox-color-mode=dark] .carousel-item{transition:none}}html[data-netbox-color-mode=dark] .carousel-item.active,html[data-netbox-color-mode=dark] .carousel-item-next,html[data-netbox-color-mode=dark] .carousel-item-prev{display:block}html[data-netbox-color-mode=dark] .carousel-item-next:not(.carousel-item-start),html[data-netbox-color-mode=dark] .active.carousel-item-end{transform:translate(100%)}html[data-netbox-color-mode=dark] .carousel-item-prev:not(.carousel-item-end),html[data-netbox-color-mode=dark] .active.carousel-item-start{transform:translate(-100%)}html[data-netbox-color-mode=dark] .carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}html[data-netbox-color-mode=dark] .carousel-fade .carousel-item.active,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item-next.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-end{transition:none}}html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-next{transition:none}}html[data-netbox-color-mode=dark] .carousel-control-prev:hover,html[data-netbox-color-mode=dark] .carousel-control-prev:focus,html[data-netbox-color-mode=dark] .carousel-control-next:hover,html[data-netbox-color-mode=dark] .carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}html[data-netbox-color-mode=dark] .carousel-control-prev{left:0}html[data-netbox-color-mode=dark] .carousel-control-next{right:0}html[data-netbox-color-mode=dark] .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}html[data-netbox-color-mode=dark] .carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}html[data-netbox-color-mode=dark] .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%;list-style:none}html[data-netbox-color-mode=dark] .carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .carousel-indicators [data-bs-target]{transition:none}}html[data-netbox-color-mode=dark] .carousel-indicators .active{opacity:1}html[data-netbox-color-mode=dark] .carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}html[data-netbox-color-mode=dark] .carousel-dark .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}html[data-netbox-color-mode=dark] .carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}html[data-netbox-color-mode=dark] .carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg)}}html[data-netbox-color-mode=dark] .spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}html[data-netbox-color-mode=dark] .spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}html[data-netbox-color-mode=dark] .spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}html[data-netbox-color-mode=dark] .spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .spinner-border,html[data-netbox-color-mode=dark] .spinner-grow{animation-duration:1.5s}}html[data-netbox-color-mode=dark] .clearfix:after{display:block;clear:both;content:""}html[data-netbox-color-mode=dark] .link-primary{color:#6ea8fe}html[data-netbox-color-mode=dark] .link-primary:hover,html[data-netbox-color-mode=dark] .link-primary:focus{color:#8bb9fe}html[data-netbox-color-mode=dark] .link-secondary{color:#adb5bd}html[data-netbox-color-mode=dark] .link-secondary:hover,html[data-netbox-color-mode=dark] .link-secondary:focus{color:#bdc4ca}html[data-netbox-color-mode=dark] .link-success{color:#75b798}html[data-netbox-color-mode=dark] .link-success:hover,html[data-netbox-color-mode=dark] .link-success:focus{color:#91c5ad}html[data-netbox-color-mode=dark] .link-info{color:#6edff6}html[data-netbox-color-mode=dark] .link-info:hover,html[data-netbox-color-mode=dark] .link-info:focus{color:#8be5f8}html[data-netbox-color-mode=dark] .link-warning{color:#ffda6a}html[data-netbox-color-mode=dark] .link-warning:hover,html[data-netbox-color-mode=dark] .link-warning:focus{color:#ffe188}html[data-netbox-color-mode=dark] .link-danger{color:#ea868f}html[data-netbox-color-mode=dark] .link-danger:hover,html[data-netbox-color-mode=dark] .link-danger:focus{color:#ee9ea5}html[data-netbox-color-mode=dark] .link-light{color:#dee2e6}html[data-netbox-color-mode=dark] .link-light:hover,html[data-netbox-color-mode=dark] .link-light:focus{color:#e5e8eb}html[data-netbox-color-mode=dark] .link-dark{color:#adb5bd}html[data-netbox-color-mode=dark] .link-dark:hover,html[data-netbox-color-mode=dark] .link-dark:focus{color:#bdc4ca}html[data-netbox-color-mode=dark] .link-blue{color:#6ea8fe}html[data-netbox-color-mode=dark] .link-blue:hover,html[data-netbox-color-mode=dark] .link-blue:focus{color:#8bb9fe}html[data-netbox-color-mode=dark] .link-indigo{color:#a370f7}html[data-netbox-color-mode=dark] .link-indigo:hover,html[data-netbox-color-mode=dark] .link-indigo:focus{color:#b58df9}html[data-netbox-color-mode=dark] .link-purple{color:#a98eda}html[data-netbox-color-mode=dark] .link-purple:hover,html[data-netbox-color-mode=dark] .link-purple:focus{color:#baa5e1}html[data-netbox-color-mode=dark] .link-pink{color:#e685b5}html[data-netbox-color-mode=dark] .link-pink:hover,html[data-netbox-color-mode=dark] .link-pink:focus{color:#eb9dc4}html[data-netbox-color-mode=dark] .link-red{color:#ea868f}html[data-netbox-color-mode=dark] .link-red:hover,html[data-netbox-color-mode=dark] .link-red:focus{color:#ee9ea5}html[data-netbox-color-mode=dark] .link-orange{color:#feb272}html[data-netbox-color-mode=dark] .link-orange:hover,html[data-netbox-color-mode=dark] .link-orange:focus{color:#fec18e}html[data-netbox-color-mode=dark] .link-yellow{color:#ffda6a}html[data-netbox-color-mode=dark] .link-yellow:hover,html[data-netbox-color-mode=dark] .link-yellow:focus{color:#ffe188}html[data-netbox-color-mode=dark] .link-green{color:#75b798}html[data-netbox-color-mode=dark] .link-green:hover,html[data-netbox-color-mode=dark] .link-green:focus{color:#91c5ad}html[data-netbox-color-mode=dark] .link-teal{color:#79dfc1}html[data-netbox-color-mode=dark] .link-teal:hover,html[data-netbox-color-mode=dark] .link-teal:focus{color:#94e5cd}html[data-netbox-color-mode=dark] .link-cyan{color:#6edff6}html[data-netbox-color-mode=dark] .link-cyan:hover,html[data-netbox-color-mode=dark] .link-cyan:focus{color:#8be5f8}html[data-netbox-color-mode=dark] .link-gray{color:#dee2e6}html[data-netbox-color-mode=dark] .link-gray:hover,html[data-netbox-color-mode=dark] .link-gray:focus{color:#e5e8eb}html[data-netbox-color-mode=dark] .link-black{color:#000}html[data-netbox-color-mode=dark] .link-black:hover,html[data-netbox-color-mode=dark] .link-black:focus{color:#000}html[data-netbox-color-mode=dark] .link-white{color:#fff}html[data-netbox-color-mode=dark] .link-white:hover,html[data-netbox-color-mode=dark] .link-white:focus{color:#fff}html[data-netbox-color-mode=dark] .ratio{position:relative;width:100%}html[data-netbox-color-mode=dark] .ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}html[data-netbox-color-mode=dark] .ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}html[data-netbox-color-mode=dark] .ratio-1x1{--bs-aspect-ratio: 100%}html[data-netbox-color-mode=dark] .ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}html[data-netbox-color-mode=dark] .ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}html[data-netbox-color-mode=dark] .ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}html[data-netbox-color-mode=dark] .fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}html[data-netbox-color-mode=dark] .fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}html[data-netbox-color-mode=dark] .sticky-top{position:sticky;top:0;z-index:1020}@media (min-width: 576px){html[data-netbox-color-mode=dark] .sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .sticky-xxl-top{position:sticky;top:0;z-index:1020}}html[data-netbox-color-mode=dark] .visually-hidden,html[data-netbox-color-mode=dark] .visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;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}html[data-netbox-color-mode=dark] .stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}html[data-netbox-color-mode=dark] .text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}html[data-netbox-color-mode=dark] .align-baseline{vertical-align:baseline!important}html[data-netbox-color-mode=dark] .align-top{vertical-align:top!important}html[data-netbox-color-mode=dark] .align-middle{vertical-align:middle!important}html[data-netbox-color-mode=dark] .align-bottom{vertical-align:bottom!important}html[data-netbox-color-mode=dark] .align-text-bottom{vertical-align:text-bottom!important}html[data-netbox-color-mode=dark] .align-text-top{vertical-align:text-top!important}html[data-netbox-color-mode=dark] .float-start{float:left!important}html[data-netbox-color-mode=dark] .float-end{float:right!important}html[data-netbox-color-mode=dark] .float-none{float:none!important}html[data-netbox-color-mode=dark] .overflow-auto{overflow:auto!important}html[data-netbox-color-mode=dark] .overflow-hidden{overflow:hidden!important}html[data-netbox-color-mode=dark] .overflow-visible{overflow:visible!important}html[data-netbox-color-mode=dark] .overflow-scroll{overflow:scroll!important}html[data-netbox-color-mode=dark] .d-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-block{display:block!important}html[data-netbox-color-mode=dark] .d-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-table{display:table!important}html[data-netbox-color-mode=dark] .d-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-none{display:none!important}html[data-netbox-color-mode=dark] .shadow{box-shadow:0 .5rem 1rem #00000026!important}html[data-netbox-color-mode=dark] .shadow-sm{box-shadow:0 .125rem .25rem #00000013!important}html[data-netbox-color-mode=dark] .shadow-lg{box-shadow:0 1rem 3rem #0000002d!important}html[data-netbox-color-mode=dark] .shadow-none{box-shadow:none!important}html[data-netbox-color-mode=dark] .position-static{position:static!important}html[data-netbox-color-mode=dark] .position-relative{position:relative!important}html[data-netbox-color-mode=dark] .position-absolute{position:absolute!important}html[data-netbox-color-mode=dark] .position-fixed{position:fixed!important}html[data-netbox-color-mode=dark] .position-sticky{position:sticky!important}html[data-netbox-color-mode=dark] .top-0{top:0!important}html[data-netbox-color-mode=dark] .top-50{top:50%!important}html[data-netbox-color-mode=dark] .top-100{top:100%!important}html[data-netbox-color-mode=dark] .bottom-0{bottom:0!important}html[data-netbox-color-mode=dark] .bottom-50{bottom:50%!important}html[data-netbox-color-mode=dark] .bottom-100{bottom:100%!important}html[data-netbox-color-mode=dark] .start-0{left:0!important}html[data-netbox-color-mode=dark] .start-50{left:50%!important}html[data-netbox-color-mode=dark] .start-100{left:100%!important}html[data-netbox-color-mode=dark] .end-0{right:0!important}html[data-netbox-color-mode=dark] .end-50{right:50%!important}html[data-netbox-color-mode=dark] .end-100{right:100%!important}html[data-netbox-color-mode=dark] .translate-middle{transform:translate(-50%,-50%)!important}html[data-netbox-color-mode=dark] .translate-middle-x{transform:translate(-50%)!important}html[data-netbox-color-mode=dark] .translate-middle-y{transform:translateY(-50%)!important}html[data-netbox-color-mode=dark] .border{border:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-0{border:0!important}html[data-netbox-color-mode=dark] .border-top{border-top:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-top-0{border-top:0!important}html[data-netbox-color-mode=dark] .border-end{border-right:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-end-0{border-right:0!important}html[data-netbox-color-mode=dark] .border-bottom{border-bottom:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-bottom-0{border-bottom:0!important}html[data-netbox-color-mode=dark] .border-start{border-left:1px solid #495057!important}html[data-netbox-color-mode=dark] .border-start-0{border-left:0!important}html[data-netbox-color-mode=dark] .border-primary{border-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .border-secondary{border-color:#adb5bd!important}html[data-netbox-color-mode=dark] .border-success{border-color:#75b798!important}html[data-netbox-color-mode=dark] .border-info{border-color:#6edff6!important}html[data-netbox-color-mode=dark] .border-warning{border-color:#ffda6a!important}html[data-netbox-color-mode=dark] .border-danger{border-color:#ea868f!important}html[data-netbox-color-mode=dark] .border-light{border-color:#dee2e6!important}html[data-netbox-color-mode=dark] .border-dark{border-color:#adb5bd!important}html[data-netbox-color-mode=dark] .border-blue{border-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .border-indigo{border-color:#a370f7!important}html[data-netbox-color-mode=dark] .border-purple{border-color:#a98eda!important}html[data-netbox-color-mode=dark] .border-pink{border-color:#e685b5!important}html[data-netbox-color-mode=dark] .border-red{border-color:#ea868f!important}html[data-netbox-color-mode=dark] .border-orange{border-color:#feb272!important}html[data-netbox-color-mode=dark] .border-yellow{border-color:#ffda6a!important}html[data-netbox-color-mode=dark] .border-green{border-color:#75b798!important}html[data-netbox-color-mode=dark] .border-teal{border-color:#79dfc1!important}html[data-netbox-color-mode=dark] .border-cyan{border-color:#6edff6!important}html[data-netbox-color-mode=dark] .border-gray{border-color:#dee2e6!important}html[data-netbox-color-mode=dark] .border-black{border-color:#000!important}html[data-netbox-color-mode=dark] .border-white{border-color:#fff!important}html[data-netbox-color-mode=dark] .border-1{border-width:1px!important}html[data-netbox-color-mode=dark] .border-2{border-width:2px!important}html[data-netbox-color-mode=dark] .border-3{border-width:3px!important}html[data-netbox-color-mode=dark] .border-4{border-width:4px!important}html[data-netbox-color-mode=dark] .border-5{border-width:5px!important}html[data-netbox-color-mode=dark] .w-25{width:25%!important}html[data-netbox-color-mode=dark] .w-50{width:50%!important}html[data-netbox-color-mode=dark] .w-75{width:75%!important}html[data-netbox-color-mode=dark] .w-100{width:100%!important}html[data-netbox-color-mode=dark] .w-auto{width:auto!important}html[data-netbox-color-mode=dark] .mw-100{max-width:100%!important}html[data-netbox-color-mode=dark] .vw-100{width:100vw!important}html[data-netbox-color-mode=dark] .min-vw-100{min-width:100vw!important}html[data-netbox-color-mode=dark] .h-25{height:25%!important}html[data-netbox-color-mode=dark] .h-50{height:50%!important}html[data-netbox-color-mode=dark] .h-75{height:75%!important}html[data-netbox-color-mode=dark] .h-100{height:100%!important}html[data-netbox-color-mode=dark] .h-auto{height:auto!important}html[data-netbox-color-mode=dark] .mh-100{max-height:100%!important}html[data-netbox-color-mode=dark] .vh-100{height:100vh!important}html[data-netbox-color-mode=dark] .min-vh-100{min-height:100vh!important}html[data-netbox-color-mode=dark] .flex-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-first{order:-1!important}html[data-netbox-color-mode=dark] .order-0{order:0!important}html[data-netbox-color-mode=dark] .order-1{order:1!important}html[data-netbox-color-mode=dark] .order-2{order:2!important}html[data-netbox-color-mode=dark] .order-3{order:3!important}html[data-netbox-color-mode=dark] .order-4{order:4!important}html[data-netbox-color-mode=dark] .order-5{order:5!important}html[data-netbox-color-mode=dark] .order-last{order:6!important}html[data-netbox-color-mode=dark] .m-0{margin:0!important}html[data-netbox-color-mode=dark] .m-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-0{padding:0!important}html[data-netbox-color-mode=dark] .p-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .font-monospace{font-family:var(--bs-font-monospace)!important}html[data-netbox-color-mode=dark] .fs-1{font-size:calc(1.375rem + 1.5vw)!important}html[data-netbox-color-mode=dark] .fs-2{font-size:calc(1.325rem + .9vw)!important}html[data-netbox-color-mode=dark] .fs-3{font-size:calc(1.3rem + .6vw)!important}html[data-netbox-color-mode=dark] .fs-4{font-size:calc(1.275rem + .3vw)!important}html[data-netbox-color-mode=dark] .fs-5{font-size:1.25rem!important}html[data-netbox-color-mode=dark] .fs-6{font-size:1rem!important}html[data-netbox-color-mode=dark] .fst-italic{font-style:italic!important}html[data-netbox-color-mode=dark] .fst-normal{font-style:normal!important}html[data-netbox-color-mode=dark] .fw-light{font-weight:300!important}html[data-netbox-color-mode=dark] .fw-lighter{font-weight:200!important}html[data-netbox-color-mode=dark] .fw-normal{font-weight:400!important}html[data-netbox-color-mode=dark] .fw-bold{font-weight:700!important}html[data-netbox-color-mode=dark] .fw-bolder{font-weight:800!important}html[data-netbox-color-mode=dark] .lh-1{line-height:1!important}html[data-netbox-color-mode=dark] .lh-sm{line-height:1.25!important}html[data-netbox-color-mode=dark] .lh-base{line-height:1.5!important}html[data-netbox-color-mode=dark] .lh-lg{line-height:1.75!important}html[data-netbox-color-mode=dark] .text-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-center{text-align:center!important}html[data-netbox-color-mode=dark] .text-decoration-none{text-decoration:none!important}html[data-netbox-color-mode=dark] .text-decoration-underline{text-decoration:underline!important}html[data-netbox-color-mode=dark] .text-decoration-line-through{text-decoration:line-through!important}html[data-netbox-color-mode=dark] .text-lowercase{text-transform:lowercase!important}html[data-netbox-color-mode=dark] .text-uppercase{text-transform:uppercase!important}html[data-netbox-color-mode=dark] .text-capitalize{text-transform:capitalize!important}html[data-netbox-color-mode=dark] .text-wrap{white-space:normal!important}html[data-netbox-color-mode=dark] .text-nowrap{white-space:nowrap!important}html[data-netbox-color-mode=dark] .text-break{word-wrap:break-word!important;word-break:break-word!important}html[data-netbox-color-mode=dark] .text-primary{color:#6ea8fe!important}html[data-netbox-color-mode=dark] .text-secondary{color:#adb5bd!important}html[data-netbox-color-mode=dark] .text-success{color:#75b798!important}html[data-netbox-color-mode=dark] .text-info{color:#6edff6!important}html[data-netbox-color-mode=dark] .text-warning{color:#ffda6a!important}html[data-netbox-color-mode=dark] .text-danger{color:#ea868f!important}html[data-netbox-color-mode=dark] .text-light{color:#dee2e6!important}html[data-netbox-color-mode=dark] .text-dark{color:#adb5bd!important}html[data-netbox-color-mode=dark] .text-blue{color:#6ea8fe!important}html[data-netbox-color-mode=dark] .text-indigo{color:#a370f7!important}html[data-netbox-color-mode=dark] .text-purple{color:#a98eda!important}html[data-netbox-color-mode=dark] .text-pink{color:#e685b5!important}html[data-netbox-color-mode=dark] .text-red{color:#ea868f!important}html[data-netbox-color-mode=dark] .text-orange{color:#feb272!important}html[data-netbox-color-mode=dark] .text-yellow{color:#ffda6a!important}html[data-netbox-color-mode=dark] .text-green{color:#75b798!important}html[data-netbox-color-mode=dark] .text-teal{color:#79dfc1!important}html[data-netbox-color-mode=dark] .text-cyan{color:#6edff6!important}html[data-netbox-color-mode=dark] .text-gray{color:#dee2e6!important}html[data-netbox-color-mode=dark] .text-black{color:#000!important}html[data-netbox-color-mode=dark] .text-white{color:#fff!important}html[data-netbox-color-mode=dark] .text-body{color:#fff!important}html[data-netbox-color-mode=dark] .text-muted{color:#ced4da!important}html[data-netbox-color-mode=dark] .text-black-50{color:#00000080!important}html[data-netbox-color-mode=dark] .text-white-50{color:#ffffff80!important}html[data-netbox-color-mode=dark] .text-reset{color:inherit!important}html[data-netbox-color-mode=dark] .bg-primary{background-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .bg-secondary{background-color:#adb5bd!important}html[data-netbox-color-mode=dark] .bg-success{background-color:#75b798!important}html[data-netbox-color-mode=dark] .bg-info{background-color:#6edff6!important}html[data-netbox-color-mode=dark] .bg-warning{background-color:#ffda6a!important}html[data-netbox-color-mode=dark] .bg-danger{background-color:#ea868f!important}html[data-netbox-color-mode=dark] .bg-light{background-color:#dee2e6!important}html[data-netbox-color-mode=dark] .bg-dark{background-color:#adb5bd!important}html[data-netbox-color-mode=dark] .bg-blue{background-color:#6ea8fe!important}html[data-netbox-color-mode=dark] .bg-indigo{background-color:#a370f7!important}html[data-netbox-color-mode=dark] .bg-purple{background-color:#a98eda!important}html[data-netbox-color-mode=dark] .bg-pink{background-color:#e685b5!important}html[data-netbox-color-mode=dark] .bg-red{background-color:#ea868f!important}html[data-netbox-color-mode=dark] .bg-orange{background-color:#feb272!important}html[data-netbox-color-mode=dark] .bg-yellow{background-color:#ffda6a!important}html[data-netbox-color-mode=dark] .bg-green{background-color:#75b798!important}html[data-netbox-color-mode=dark] .bg-teal{background-color:#79dfc1!important}html[data-netbox-color-mode=dark] .bg-cyan{background-color:#6edff6!important}html[data-netbox-color-mode=dark] .bg-gray{background-color:#dee2e6!important}html[data-netbox-color-mode=dark] .bg-black{background-color:#000!important}html[data-netbox-color-mode=dark] .bg-white{background-color:#fff!important}html[data-netbox-color-mode=dark] .bg-body{background-color:#1b1f22!important}html[data-netbox-color-mode=dark] .bg-transparent{background-color:transparent!important}html[data-netbox-color-mode=dark] .bg-gradient{background-image:var(--bs-gradient)!important}html[data-netbox-color-mode=dark] .user-select-all{user-select:all!important}html[data-netbox-color-mode=dark] .user-select-auto{user-select:auto!important}html[data-netbox-color-mode=dark] .user-select-none{user-select:none!important}html[data-netbox-color-mode=dark] .pe-none{pointer-events:none!important}html[data-netbox-color-mode=dark] .pe-auto{pointer-events:auto!important}html[data-netbox-color-mode=dark] .rounded{border-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-0{border-radius:0!important}html[data-netbox-color-mode=dark] .rounded-1{border-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-2{border-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-3{border-radius:.75rem!important}html[data-netbox-color-mode=dark] .rounded-circle{border-radius:50%!important}html[data-netbox-color-mode=dark] .rounded-pill{border-radius:50rem!important}html[data-netbox-color-mode=dark] .rounded-top{border-top-left-radius:.375rem!important;border-top-right-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-end{border-top-right-radius:.375rem!important;border-bottom-right-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-bottom{border-bottom-right-radius:.375rem!important;border-bottom-left-radius:.375rem!important}html[data-netbox-color-mode=dark] .rounded-start{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}html[data-netbox-color-mode=dark] .visible{visibility:visible!important}html[data-netbox-color-mode=dark] .invisible{visibility:hidden!important}@media (min-width: 576px){html[data-netbox-color-mode=dark] .float-sm-start{float:left!important}html[data-netbox-color-mode=dark] .float-sm-end{float:right!important}html[data-netbox-color-mode=dark] .float-sm-none{float:none!important}html[data-netbox-color-mode=dark] .d-sm-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-sm-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-sm-block{display:block!important}html[data-netbox-color-mode=dark] .d-sm-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-sm-table{display:table!important}html[data-netbox-color-mode=dark] .d-sm-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-sm-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-sm-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-sm-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-sm-none{display:none!important}html[data-netbox-color-mode=dark] .flex-sm-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-sm-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-sm-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-sm-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-sm-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-sm-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-sm-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-sm-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-sm-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-sm-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-sm-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-sm-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-sm-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-sm-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-sm-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-sm-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-sm-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-sm-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-sm-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-sm-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-sm-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-sm-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-sm-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-sm-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-sm-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-sm-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-sm-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-sm-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-sm-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-sm-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-sm-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-sm-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-sm-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-sm-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-sm-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-sm-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-sm-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-sm-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-sm-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-sm-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-sm-first{order:-1!important}html[data-netbox-color-mode=dark] .order-sm-0{order:0!important}html[data-netbox-color-mode=dark] .order-sm-1{order:1!important}html[data-netbox-color-mode=dark] .order-sm-2{order:2!important}html[data-netbox-color-mode=dark] .order-sm-3{order:3!important}html[data-netbox-color-mode=dark] .order-sm-4{order:4!important}html[data-netbox-color-mode=dark] .order-sm-5{order:5!important}html[data-netbox-color-mode=dark] .order-sm-last{order:6!important}html[data-netbox-color-mode=dark] .m-sm-0{margin:0!important}html[data-netbox-color-mode=dark] .m-sm-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-sm-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-sm-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-sm-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-sm-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-sm-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-sm-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-sm-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-sm-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-sm-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-sm-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-sm-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-sm-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-sm-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-sm-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-sm-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-sm-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-sm-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-sm-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-sm-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-sm-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-sm-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-sm-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-sm-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-sm-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-sm-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-sm-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-sm-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-sm-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-sm-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-sm-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-sm-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-sm-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-sm-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-sm-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-sm-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-sm-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-sm-0{padding:0!important}html[data-netbox-color-mode=dark] .p-sm-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-sm-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-sm-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-sm-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-sm-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-sm-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-sm-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-sm-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-sm-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-sm-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-sm-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-sm-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-sm-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-sm-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-sm-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-sm-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-sm-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-sm-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-sm-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-sm-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-sm-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-sm-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-sm-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-sm-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-sm-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-sm-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-sm-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-sm-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-sm-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-sm-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-sm-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-sm-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-sm-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-sm-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-sm-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-sm-center{text-align:center!important}}@media (min-width: 768px){html[data-netbox-color-mode=dark] .float-md-start{float:left!important}html[data-netbox-color-mode=dark] .float-md-end{float:right!important}html[data-netbox-color-mode=dark] .float-md-none{float:none!important}html[data-netbox-color-mode=dark] .d-md-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-md-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-md-block{display:block!important}html[data-netbox-color-mode=dark] .d-md-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-md-table{display:table!important}html[data-netbox-color-mode=dark] .d-md-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-md-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-md-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-md-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-md-none{display:none!important}html[data-netbox-color-mode=dark] .flex-md-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-md-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-md-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-md-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-md-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-md-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-md-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-md-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-md-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-md-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-md-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-md-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-md-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-md-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-md-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-md-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-md-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-md-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-md-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-md-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-md-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-md-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-md-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-md-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-md-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-md-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-md-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-md-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-md-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-md-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-md-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-md-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-md-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-md-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-md-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-md-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-md-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-md-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-md-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-md-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-md-first{order:-1!important}html[data-netbox-color-mode=dark] .order-md-0{order:0!important}html[data-netbox-color-mode=dark] .order-md-1{order:1!important}html[data-netbox-color-mode=dark] .order-md-2{order:2!important}html[data-netbox-color-mode=dark] .order-md-3{order:3!important}html[data-netbox-color-mode=dark] .order-md-4{order:4!important}html[data-netbox-color-mode=dark] .order-md-5{order:5!important}html[data-netbox-color-mode=dark] .order-md-last{order:6!important}html[data-netbox-color-mode=dark] .m-md-0{margin:0!important}html[data-netbox-color-mode=dark] .m-md-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-md-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-md-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-md-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-md-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-md-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-md-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-md-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-md-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-md-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-md-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-md-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-md-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-md-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-md-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-md-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-md-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-md-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-md-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-md-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-md-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-md-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-md-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-md-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-md-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-md-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-md-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-md-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-md-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-md-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-md-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-md-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-md-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-md-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-md-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-md-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-md-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-md-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-md-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-md-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-md-0{padding:0!important}html[data-netbox-color-mode=dark] .p-md-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-md-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-md-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-md-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-md-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-md-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-md-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-md-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-md-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-md-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-md-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-md-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-md-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-md-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-md-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-md-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-md-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-md-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-md-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-md-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-md-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-md-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-md-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-md-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-md-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-md-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-md-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-md-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-md-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-md-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-md-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-md-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-md-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-md-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-md-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-md-center{text-align:center!important}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .float-lg-start{float:left!important}html[data-netbox-color-mode=dark] .float-lg-end{float:right!important}html[data-netbox-color-mode=dark] .float-lg-none{float:none!important}html[data-netbox-color-mode=dark] .d-lg-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-lg-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-lg-block{display:block!important}html[data-netbox-color-mode=dark] .d-lg-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-lg-table{display:table!important}html[data-netbox-color-mode=dark] .d-lg-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-lg-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-lg-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-lg-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-lg-none{display:none!important}html[data-netbox-color-mode=dark] .flex-lg-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-lg-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-lg-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-lg-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-lg-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-lg-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-lg-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-lg-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-lg-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-lg-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-lg-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-lg-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-lg-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-lg-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-lg-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-lg-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-lg-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-lg-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-lg-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-lg-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-lg-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-lg-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-lg-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-lg-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-lg-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-lg-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-lg-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-lg-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-lg-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-lg-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-lg-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-lg-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-lg-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-lg-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-lg-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-lg-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-lg-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-lg-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-lg-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-lg-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-lg-first{order:-1!important}html[data-netbox-color-mode=dark] .order-lg-0{order:0!important}html[data-netbox-color-mode=dark] .order-lg-1{order:1!important}html[data-netbox-color-mode=dark] .order-lg-2{order:2!important}html[data-netbox-color-mode=dark] .order-lg-3{order:3!important}html[data-netbox-color-mode=dark] .order-lg-4{order:4!important}html[data-netbox-color-mode=dark] .order-lg-5{order:5!important}html[data-netbox-color-mode=dark] .order-lg-last{order:6!important}html[data-netbox-color-mode=dark] .m-lg-0{margin:0!important}html[data-netbox-color-mode=dark] .m-lg-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-lg-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-lg-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-lg-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-lg-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-lg-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-lg-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-lg-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-lg-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-lg-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-lg-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-lg-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-lg-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-lg-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-lg-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-lg-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-lg-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-lg-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-lg-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-lg-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-lg-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-lg-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-lg-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-lg-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-lg-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-lg-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-lg-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-lg-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-lg-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-lg-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-lg-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-lg-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-lg-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-lg-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-lg-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-lg-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-lg-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-lg-0{padding:0!important}html[data-netbox-color-mode=dark] .p-lg-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-lg-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-lg-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-lg-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-lg-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-lg-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-lg-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-lg-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-lg-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-lg-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-lg-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-lg-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-lg-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-lg-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-lg-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-lg-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-lg-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-lg-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-lg-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-lg-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-lg-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-lg-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-lg-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-lg-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-lg-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-lg-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-lg-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-lg-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-lg-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-lg-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-lg-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-lg-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-lg-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-lg-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-lg-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-lg-center{text-align:center!important}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .float-xl-start{float:left!important}html[data-netbox-color-mode=dark] .float-xl-end{float:right!important}html[data-netbox-color-mode=dark] .float-xl-none{float:none!important}html[data-netbox-color-mode=dark] .d-xl-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-xl-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-xl-block{display:block!important}html[data-netbox-color-mode=dark] .d-xl-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-xl-table{display:table!important}html[data-netbox-color-mode=dark] .d-xl-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-xl-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-xl-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-xl-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-xl-none{display:none!important}html[data-netbox-color-mode=dark] .flex-xl-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-xl-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-xl-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-xl-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-xl-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-xl-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-xl-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-xl-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-xl-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-xl-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-xl-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-xl-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-xl-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-xl-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-xl-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-xl-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-xl-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-xl-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-xl-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-xl-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-xl-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-xl-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-xl-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-xl-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-xl-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-xl-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-xl-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-xl-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-xl-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-xl-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-xl-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-xl-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-xl-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-xl-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-xl-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-xl-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-xl-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-xl-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-xl-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-xl-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-xl-first{order:-1!important}html[data-netbox-color-mode=dark] .order-xl-0{order:0!important}html[data-netbox-color-mode=dark] .order-xl-1{order:1!important}html[data-netbox-color-mode=dark] .order-xl-2{order:2!important}html[data-netbox-color-mode=dark] .order-xl-3{order:3!important}html[data-netbox-color-mode=dark] .order-xl-4{order:4!important}html[data-netbox-color-mode=dark] .order-xl-5{order:5!important}html[data-netbox-color-mode=dark] .order-xl-last{order:6!important}html[data-netbox-color-mode=dark] .m-xl-0{margin:0!important}html[data-netbox-color-mode=dark] .m-xl-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-xl-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-xl-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-xl-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-xl-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-xl-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-xl-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-xl-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-xl-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-xl-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-xl-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-xl-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-xl-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-xl-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-xl-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-xl-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-xl-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-xl-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-xl-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-xl-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-xl-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-xl-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-xl-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-xl-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-xl-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-xl-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-xl-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-xl-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-xl-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-xl-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-xl-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-xl-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-xl-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-xl-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-xl-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-xl-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-xl-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-xl-0{padding:0!important}html[data-netbox-color-mode=dark] .p-xl-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-xl-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-xl-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-xl-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-xl-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-xl-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-xl-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-xl-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-xl-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-xl-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-xl-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-xl-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-xl-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-xl-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-xl-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-xl-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-xl-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-xl-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-xl-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-xl-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-xl-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-xl-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-xl-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-xl-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-xl-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-xl-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-xl-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-xl-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-xl-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-xl-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-xl-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-xl-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-xl-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-xl-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-xl-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-xl-center{text-align:center!important}}@media (min-width: 1400px){html[data-netbox-color-mode=dark] .float-xxl-start{float:left!important}html[data-netbox-color-mode=dark] .float-xxl-end{float:right!important}html[data-netbox-color-mode=dark] .float-xxl-none{float:none!important}html[data-netbox-color-mode=dark] .d-xxl-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-xxl-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-xxl-block{display:block!important}html[data-netbox-color-mode=dark] .d-xxl-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-xxl-table{display:table!important}html[data-netbox-color-mode=dark] .d-xxl-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-xxl-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-xxl-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-xxl-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-xxl-none{display:none!important}html[data-netbox-color-mode=dark] .flex-xxl-fill{flex:1 1 auto!important}html[data-netbox-color-mode=dark] .flex-xxl-row{flex-direction:row!important}html[data-netbox-color-mode=dark] .flex-xxl-column{flex-direction:column!important}html[data-netbox-color-mode=dark] .flex-xxl-row-reverse{flex-direction:row-reverse!important}html[data-netbox-color-mode=dark] .flex-xxl-column-reverse{flex-direction:column-reverse!important}html[data-netbox-color-mode=dark] .flex-xxl-grow-0{flex-grow:0!important}html[data-netbox-color-mode=dark] .flex-xxl-grow-1{flex-grow:1!important}html[data-netbox-color-mode=dark] .flex-xxl-shrink-0{flex-shrink:0!important}html[data-netbox-color-mode=dark] .flex-xxl-shrink-1{flex-shrink:1!important}html[data-netbox-color-mode=dark] .flex-xxl-wrap{flex-wrap:wrap!important}html[data-netbox-color-mode=dark] .flex-xxl-nowrap{flex-wrap:nowrap!important}html[data-netbox-color-mode=dark] .flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}html[data-netbox-color-mode=dark] .gap-xxl-0{gap:0!important}html[data-netbox-color-mode=dark] .gap-xxl-1{gap:.25rem!important}html[data-netbox-color-mode=dark] .gap-xxl-2{gap:.5rem!important}html[data-netbox-color-mode=dark] .gap-xxl-3{gap:1rem!important}html[data-netbox-color-mode=dark] .gap-xxl-4{gap:1.5rem!important}html[data-netbox-color-mode=dark] .gap-xxl-5{gap:3rem!important}html[data-netbox-color-mode=dark] .justify-content-xxl-start{justify-content:flex-start!important}html[data-netbox-color-mode=dark] .justify-content-xxl-end{justify-content:flex-end!important}html[data-netbox-color-mode=dark] .justify-content-xxl-center{justify-content:center!important}html[data-netbox-color-mode=dark] .justify-content-xxl-between{justify-content:space-between!important}html[data-netbox-color-mode=dark] .justify-content-xxl-around{justify-content:space-around!important}html[data-netbox-color-mode=dark] .justify-content-xxl-evenly{justify-content:space-evenly!important}html[data-netbox-color-mode=dark] .align-items-xxl-start{align-items:flex-start!important}html[data-netbox-color-mode=dark] .align-items-xxl-end{align-items:flex-end!important}html[data-netbox-color-mode=dark] .align-items-xxl-center{align-items:center!important}html[data-netbox-color-mode=dark] .align-items-xxl-baseline{align-items:baseline!important}html[data-netbox-color-mode=dark] .align-items-xxl-stretch{align-items:stretch!important}html[data-netbox-color-mode=dark] .align-content-xxl-start{align-content:flex-start!important}html[data-netbox-color-mode=dark] .align-content-xxl-end{align-content:flex-end!important}html[data-netbox-color-mode=dark] .align-content-xxl-center{align-content:center!important}html[data-netbox-color-mode=dark] .align-content-xxl-between{align-content:space-between!important}html[data-netbox-color-mode=dark] .align-content-xxl-around{align-content:space-around!important}html[data-netbox-color-mode=dark] .align-content-xxl-stretch{align-content:stretch!important}html[data-netbox-color-mode=dark] .align-self-xxl-auto{align-self:auto!important}html[data-netbox-color-mode=dark] .align-self-xxl-start{align-self:flex-start!important}html[data-netbox-color-mode=dark] .align-self-xxl-end{align-self:flex-end!important}html[data-netbox-color-mode=dark] .align-self-xxl-center{align-self:center!important}html[data-netbox-color-mode=dark] .align-self-xxl-baseline{align-self:baseline!important}html[data-netbox-color-mode=dark] .align-self-xxl-stretch{align-self:stretch!important}html[data-netbox-color-mode=dark] .order-xxl-first{order:-1!important}html[data-netbox-color-mode=dark] .order-xxl-0{order:0!important}html[data-netbox-color-mode=dark] .order-xxl-1{order:1!important}html[data-netbox-color-mode=dark] .order-xxl-2{order:2!important}html[data-netbox-color-mode=dark] .order-xxl-3{order:3!important}html[data-netbox-color-mode=dark] .order-xxl-4{order:4!important}html[data-netbox-color-mode=dark] .order-xxl-5{order:5!important}html[data-netbox-color-mode=dark] .order-xxl-last{order:6!important}html[data-netbox-color-mode=dark] .m-xxl-0{margin:0!important}html[data-netbox-color-mode=dark] .m-xxl-1{margin:.25rem!important}html[data-netbox-color-mode=dark] .m-xxl-2{margin:.5rem!important}html[data-netbox-color-mode=dark] .m-xxl-3{margin:1rem!important}html[data-netbox-color-mode=dark] .m-xxl-4{margin:1.5rem!important}html[data-netbox-color-mode=dark] .m-xxl-5{margin:3rem!important}html[data-netbox-color-mode=dark] .m-xxl-auto{margin:auto!important}html[data-netbox-color-mode=dark] .mx-xxl-0{margin-right:0!important;margin-left:0!important}html[data-netbox-color-mode=dark] .mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}html[data-netbox-color-mode=dark] .mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}html[data-netbox-color-mode=dark] .mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}html[data-netbox-color-mode=dark] .mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}html[data-netbox-color-mode=dark] .mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}html[data-netbox-color-mode=dark] .my-xxl-0{margin-top:0!important;margin-bottom:0!important}html[data-netbox-color-mode=dark] .my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}html[data-netbox-color-mode=dark] .mt-xxl-0{margin-top:0!important}html[data-netbox-color-mode=dark] .mt-xxl-1{margin-top:.25rem!important}html[data-netbox-color-mode=dark] .mt-xxl-2{margin-top:.5rem!important}html[data-netbox-color-mode=dark] .mt-xxl-3{margin-top:1rem!important}html[data-netbox-color-mode=dark] .mt-xxl-4{margin-top:1.5rem!important}html[data-netbox-color-mode=dark] .mt-xxl-5{margin-top:3rem!important}html[data-netbox-color-mode=dark] .mt-xxl-auto{margin-top:auto!important}html[data-netbox-color-mode=dark] .me-xxl-0{margin-right:0!important}html[data-netbox-color-mode=dark] .me-xxl-1{margin-right:.25rem!important}html[data-netbox-color-mode=dark] .me-xxl-2{margin-right:.5rem!important}html[data-netbox-color-mode=dark] .me-xxl-3{margin-right:1rem!important}html[data-netbox-color-mode=dark] .me-xxl-4{margin-right:1.5rem!important}html[data-netbox-color-mode=dark] .me-xxl-5{margin-right:3rem!important}html[data-netbox-color-mode=dark] .me-xxl-auto{margin-right:auto!important}html[data-netbox-color-mode=dark] .mb-xxl-0{margin-bottom:0!important}html[data-netbox-color-mode=dark] .mb-xxl-1{margin-bottom:.25rem!important}html[data-netbox-color-mode=dark] .mb-xxl-2{margin-bottom:.5rem!important}html[data-netbox-color-mode=dark] .mb-xxl-3{margin-bottom:1rem!important}html[data-netbox-color-mode=dark] .mb-xxl-4{margin-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .mb-xxl-5{margin-bottom:3rem!important}html[data-netbox-color-mode=dark] .mb-xxl-auto{margin-bottom:auto!important}html[data-netbox-color-mode=dark] .ms-xxl-0{margin-left:0!important}html[data-netbox-color-mode=dark] .ms-xxl-1{margin-left:.25rem!important}html[data-netbox-color-mode=dark] .ms-xxl-2{margin-left:.5rem!important}html[data-netbox-color-mode=dark] .ms-xxl-3{margin-left:1rem!important}html[data-netbox-color-mode=dark] .ms-xxl-4{margin-left:1.5rem!important}html[data-netbox-color-mode=dark] .ms-xxl-5{margin-left:3rem!important}html[data-netbox-color-mode=dark] .ms-xxl-auto{margin-left:auto!important}html[data-netbox-color-mode=dark] .p-xxl-0{padding:0!important}html[data-netbox-color-mode=dark] .p-xxl-1{padding:.25rem!important}html[data-netbox-color-mode=dark] .p-xxl-2{padding:.5rem!important}html[data-netbox-color-mode=dark] .p-xxl-3{padding:1rem!important}html[data-netbox-color-mode=dark] .p-xxl-4{padding:1.5rem!important}html[data-netbox-color-mode=dark] .p-xxl-5{padding:3rem!important}html[data-netbox-color-mode=dark] .px-xxl-0{padding-right:0!important;padding-left:0!important}html[data-netbox-color-mode=dark] .px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] .px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}html[data-netbox-color-mode=dark] .px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}html[data-netbox-color-mode=dark] .px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}html[data-netbox-color-mode=dark] .py-xxl-0{padding-top:0!important;padding-bottom:0!important}html[data-netbox-color-mode=dark] .py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .pt-xxl-0{padding-top:0!important}html[data-netbox-color-mode=dark] .pt-xxl-1{padding-top:.25rem!important}html[data-netbox-color-mode=dark] .pt-xxl-2{padding-top:.5rem!important}html[data-netbox-color-mode=dark] .pt-xxl-3{padding-top:1rem!important}html[data-netbox-color-mode=dark] .pt-xxl-4{padding-top:1.5rem!important}html[data-netbox-color-mode=dark] .pt-xxl-5{padding-top:3rem!important}html[data-netbox-color-mode=dark] .pe-xxl-0{padding-right:0!important}html[data-netbox-color-mode=dark] .pe-xxl-1{padding-right:.25rem!important}html[data-netbox-color-mode=dark] .pe-xxl-2{padding-right:.5rem!important}html[data-netbox-color-mode=dark] .pe-xxl-3{padding-right:1rem!important}html[data-netbox-color-mode=dark] .pe-xxl-4{padding-right:1.5rem!important}html[data-netbox-color-mode=dark] .pe-xxl-5{padding-right:3rem!important}html[data-netbox-color-mode=dark] .pb-xxl-0{padding-bottom:0!important}html[data-netbox-color-mode=dark] .pb-xxl-1{padding-bottom:.25rem!important}html[data-netbox-color-mode=dark] .pb-xxl-2{padding-bottom:.5rem!important}html[data-netbox-color-mode=dark] .pb-xxl-3{padding-bottom:1rem!important}html[data-netbox-color-mode=dark] .pb-xxl-4{padding-bottom:1.5rem!important}html[data-netbox-color-mode=dark] .pb-xxl-5{padding-bottom:3rem!important}html[data-netbox-color-mode=dark] .ps-xxl-0{padding-left:0!important}html[data-netbox-color-mode=dark] .ps-xxl-1{padding-left:.25rem!important}html[data-netbox-color-mode=dark] .ps-xxl-2{padding-left:.5rem!important}html[data-netbox-color-mode=dark] .ps-xxl-3{padding-left:1rem!important}html[data-netbox-color-mode=dark] .ps-xxl-4{padding-left:1.5rem!important}html[data-netbox-color-mode=dark] .ps-xxl-5{padding-left:3rem!important}html[data-netbox-color-mode=dark] .text-xxl-start{text-align:left!important}html[data-netbox-color-mode=dark] .text-xxl-end{text-align:right!important}html[data-netbox-color-mode=dark] .text-xxl-center{text-align:center!important}}@media (min-width: 1200px){html[data-netbox-color-mode=dark] .fs-1{font-size:2.5rem!important}html[data-netbox-color-mode=dark] .fs-2{font-size:2rem!important}html[data-netbox-color-mode=dark] .fs-3{font-size:1.75rem!important}html[data-netbox-color-mode=dark] .fs-4{font-size:1.5rem!important}}@media print{html[data-netbox-color-mode=dark] .d-print-inline{display:inline!important}html[data-netbox-color-mode=dark] .d-print-inline-block{display:inline-block!important}html[data-netbox-color-mode=dark] .d-print-block{display:block!important}html[data-netbox-color-mode=dark] .d-print-grid{display:grid!important}html[data-netbox-color-mode=dark] .d-print-table{display:table!important}html[data-netbox-color-mode=dark] .d-print-table-row{display:table-row!important}html[data-netbox-color-mode=dark] .d-print-table-cell{display:table-cell!important}html[data-netbox-color-mode=dark] .d-print-flex{display:flex!important}html[data-netbox-color-mode=dark] .d-print-inline-flex{display:inline-flex!important}html[data-netbox-color-mode=dark] .d-print-none{display:none!important}}html[data-netbox-color-mode=dark] :root{--nbx-select-content-bg: #212529;--nbx-select-option-selected-bg: #dee2e6;--nbx-select-option-hover-bg: #0d6efd;--nbx-select-option-hover-color: #fff;--nbx-select-placeholder-color: #adb5bd;--nbx-select-value-color: #fff}html[data-netbox-color-mode=dark] :root[data-netbox-color-mode=dark]{--nbx-select-content-bg: #212529;--nbx-select-option-selected-bg: #adb5bd;--nbx-select-option-hover-bg: #9ec5fe;--nbx-select-option-hover-color: #000;--nbx-select-placeholder-color: #495057;--nbx-select-value-color: #000}html[data-netbox-color-mode=dark] .ss-main{position:relative;display:inline-block;user-select:none;color:#f8f9fa;width:100%}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected{display:flex;cursor:pointer;width:100%;height:calc(1.5em + (.75rem + 2px));padding:.75rem;border:1px solid #495057;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-disabled{background-color:#495057;cursor:not-allowed}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder{display:flex;flex:1 1 100%;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;width:calc(100% - 30px);line-height:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder *{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder .ss-disabled{color:#adb5bd}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-deselect{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem;font-weight:bold}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-deselect.ss-hide{display:none}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span{border:solid #f8f9fa;border-width:0 2px 2px 0;display:inline-block;padding:3px;transition:transform .2s,margin .2s}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span.arrow-up{transform:rotate(-135deg);margin:3px 0 0}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span.arrow-down{transform:rotate(45deg);margin:-3px 0 0}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected{display:flex;flex-direction:row;cursor:pointer;min-height:calc(1.5em + (.75rem + 2px));width:100%;padding:0 0 0 3px;border:1px solid #495057;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled{background-color:#495057;cursor:not-allowed}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled{color:#f8f9fa}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete{cursor:not-allowed}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values{display:flex;flex-wrap:wrap;justify-content:flex-start;flex:1 1 100%;width:calc(100% - 30px)}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-disabled{display:flex;padding:4px 5px;margin:2px 0;line-height:1em;align-items:center;width:100%;color:#adb5bd;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes scaleOut{0%{transform:scale(1);opacity:1}to{transform:scale(0);opacity:0}}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value{display:flex;user-select:none;align-items:center;font-size:12px;padding:3px 5px;margin:3px 5px 3px 0;color:#fff;background-color:#6ea8fe;border-radius:.375rem;animation-name:scaleIn;animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:both}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value.ss-out{animation-name:scaleOut;animation-duration:.2s;animation-timing-function:ease-out}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete{margin:0 0 0 5px;cursor:pointer}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add{display:flex;flex:0 1 3px;margin:9px 12px 0 5px}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus{display:flex;justify-content:center;align-items:center;background:#f8f9fa;position:relative;height:10px;width:2px;transition:transform .2s}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus:after{background:#f8f9fa;content:"";position:absolute;height:2px;width:10px;left:-4px;top:4px}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross{transform:rotate(45deg)}html[data-netbox-color-mode=dark] .ss-content{position:absolute;width:100%;margin:-1px 0 0;box-sizing:border-box;border:solid 1px #495057;z-index:1010;background-color:#fff;transform-origin:center top;transition:transform .2s,opacity .2s;opacity:0;transform:scaleY(0)}html[data-netbox-color-mode=dark] .ss-content.ss-open{display:block;opacity:1;transform:scaleY(1)}html[data-netbox-color-mode=dark] .ss-content .ss-search{display:flex;flex-direction:row;padding:.75rem}html[data-netbox-color-mode=dark] .ss-content .ss-search.ss-hide{height:0px;opacity:0;padding:0;margin:0}html[data-netbox-color-mode=dark] .ss-content .ss-search.ss-hide input{height:0px;opacity:0;padding:0;margin:0}html[data-netbox-color-mode=dark] .ss-content .ss-search input{display:inline-flex;font-size:inherit;line-height:inherit;flex:1 1 auto;width:100%;min-width:0px;height:30px;padding:.75rem;margin:0;border:1px solid #495057;border-radius:.375rem;background-color:#fff;outline:0;text-align:left;box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-appearance:textfield}html[data-netbox-color-mode=dark] .ss-content .ss-search input::placeholder{color:#495057;vertical-align:middle}html[data-netbox-color-mode=dark] .ss-content .ss-search input:focus{box-shadow:0 0 5px #6ea8fe}html[data-netbox-color-mode=dark] .ss-content .ss-search .ss-addable{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;font-size:22px;font-weight:bold;flex:0 0 30px;height:30px;margin:0 0 0 8px;border:1px solid #495057;border-radius:.375rem;box-sizing:border-box}html[data-netbox-color-mode=dark] .ss-content .ss-addable{padding-top:0}html[data-netbox-color-mode=dark] .ss-content .ss-list{max-height:200px;overflow-x:hidden;overflow-y:auto;text-align:left}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup .ss-optgroup-label{padding:6px 10px;font-weight:bold}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup .ss-option{padding:6px 6px 6px 25px}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup-label-selectable{cursor:pointer}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup-label-selectable:hover{color:#fff;background-color:#6ea8fe}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option{padding:6px 10px;cursor:pointer;user-select:none}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option *{display:inline-block}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-highlighted{color:#fff;background-color:#6ea8fe}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-disabled{cursor:not-allowed;color:#adb5bd;background-color:#fff}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected{color:#f8f9fa;background-color:#6ea8fe1a}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-hide{display:none}html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option .ss-search-highlight{background-color:#ffc107}html[data-netbox-color-mode=dark] .ss-main{color:#f8f9fa}html[data-netbox-color-mode=dark] .ss-main.is-invalid .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main.is-invalid .ss-multi-selected{border-color:#dc3545}html[data-netbox-color-mode=dark] .ss-main.is-valid .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main.is-valid .ss-multi-selected{border-color:#198754}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected{padding:.375rem .75rem;background-color:#212529;border:1px solid #495057}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected[disabled],html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected[disabled]{color:#adb5bd;background-color:#495057}html[data-netbox-color-mode=dark] .ss-main div.ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main div.ss-single-selected span.placeholder .ss-disabled{color:var(--nbx-select-placeholder-color)}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.ss-arrow span.arrow-down,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.ss-arrow span.arrow-up{border-color:currentColor;color:#ced4da}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder .depth{display:none}html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.placeholder>*,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.placeholder{line-height:1.5}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected{align-items:center;padding-right:.75rem;padding-left:.75rem}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-disabled{padding:4px 0}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value{color:var(--nbx-select-value-color);border-radius:.375rem}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value .depth{display:none}html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add{margin:0 .75rem}html[data-netbox-color-mode=dark] .ss-main .ss-content{background-color:var(--nbx-select-content-bg);border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-option-selected{color:#fff;background-color:var(--nbx-select-option-selected-bg)}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option:hover{color:var(--nbx-select-option-hover-color);background-color:var(--nbx-select-option-hover-bg)}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option:last-child{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-disabled{background-color:unset}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-disabled:hover{color:#adb5bd}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option .depth{opacity:.3}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar{right:0;width:4px}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar:hover{opacity:.8}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar-track{background:transparent}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar-thumb{right:0;width:2px;background-color:var(--nbx-sidebar-scroll)}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search{padding-right:.5rem}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search button{margin-left:.75rem}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search input[type=search]{color:#f8f9fa;background-color:#212529;border:1px solid #495057}html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search input[type=search]:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html[data-netbox-color-mode=dark] .flatpickr-calendar{color:#fff;background:#343a40;border-radius:.375rem;box-shadow:1px 0 #495057,-1px 0 #495057,0 1px #495057,0 -1px #495057,0 3px 13px #00000014}html[data-netbox-color-mode=dark] .flatpickr-calendar.arrowTop:before,html[data-netbox-color-mode=dark] .flatpickr-calendar.arrowTop:after{border-bottom-color:#343a40}html[data-netbox-color-mode=dark] .flatpickr-calendar span.flatpickr-weekday{color:#dee2e6}html[data-netbox-color-mode=dark] .flatpickr-calendar .numInputWrapper span.arrowUp:after{border-bottom-color:#f8f9fa}html[data-netbox-color-mode=dark] .flatpickr-calendar .numInputWrapper span.arrowDown:after{border-top-color:#f8f9fa}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-month{color:#fff;fill:#fff}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-next-month,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-prev-month{color:#fff;fill:#fff}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-next-month:hover svg,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-prev-month:hover svg{fill:#ea868f}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-months .flatpickr-current-month select{background:#343a40}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day{color:#fff}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected.inRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange.inRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange.inRange,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected:focus,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange:focus,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange:focus,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.selected.nextMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.startRange.nextMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.endRange.nextMonthDay{color:#000;background:#6ea8fe;border-color:#6ea8fe}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day:hover{color:#000;background:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.flatpickr-disabled,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.nextMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed.prevMonthDay,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed.nextMonthDay{color:#adb5bd}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.prevMonthDay:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.nextMonthDay:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed.prevMonthDay:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-day.notAllowed.nextMonthDay:hover{color:#000;background:#adb5bd;border-color:#adb5bd}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-time input{color:#f8f9fa;background:#343a40}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-time input:hover,html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-time input:active{background:#343a40}html[data-netbox-color-mode=dark] .flatpickr-calendar .flatpickr-time .flatpickr-time-separator{color:#adb5bd}html[data-netbox-color-mode=dark] .flatpickr-calendar.showTimeInput.hasTime .flatpickr-time{border-top:1px solid #495057}html[data-netbox-color-mode=dark] .sidenav{position:fixed;top:0;bottom:0;left:0;z-index:1050;display:block;width:100%;max-width:3rem;padding-top:0;padding-right:0;padding-left:0;background-color:var(--nbx-sidebar-bg);border-right:1px solid #495057;transition:all .1s ease-in-out}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] .sidenav{transform:translate(-3rem)}html[data-netbox-color-mode=dark] .sidenav+.content-container[class]{margin-left:0}html[data-netbox-color-mode=dark] .sidenav .profile-button-container[class]{display:block}}html[data-netbox-color-mode=dark] .sidenav .profile-button-container{display:none;padding:.5rem 1rem}html[data-netbox-color-mode=dark] .sidenav+.content-container{margin-left:3rem;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .sidenav-brand{margin-right:0;transition:opacity .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .sidenav-brand-icon{transition:opacity .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .sidenav-inner{padding-right:1.5rem;padding-left:1.5rem}@media (min-width: 768px){html[data-netbox-color-mode=dark] .sidenav .sidenav-inner{padding-right:0;padding-left:0}}html[data-netbox-color-mode=dark] .sidenav .sidenav-brand-img,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand>img{max-width:100%;max-height:calc(16rem - 1rem)}html[data-netbox-color-mode=dark] .sidenav .navbar-heading{padding-top:.5rem;padding-bottom:.5rem;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em}html[data-netbox-color-mode=dark] .sidenav .sidenav-header{position:relative;display:flex;align-items:center;justify-content:space-between;height:78px;padding:1rem;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .sidenav-toggle{position:absolute;display:inline-block;opacity:0;transition:opacity 10ms ease-in-out;transition-delay:.1s}html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse{display:flex;flex:1;flex-direction:column;align-items:stretch;padding-right:1.5rem;padding-left:1.5rem;margin-right:-1.5rem;margin-left:-1.5rem}html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse>*{min-width:100%}@media (min-width: 768px){html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse{margin-right:0;margin-left:0}}html[data-netbox-color-mode=dark] .sidenav .nav-group-header{padding:.25rem 1rem;margin-top:.5rem;margin-bottom:0}html[data-netbox-color-mode=dark] .sidenav .nav .nav-item{display:flex;align-items:center;justify-content:space-between;width:100%}html[data-netbox-color-mode=dark] .sidenav .nav .nav-item.no-buttons{padding-right:5rem}html[data-netbox-color-mode=dark] .sidenav .collapse .nav .nav-item .nav-link{width:100%;padding:.25rem .25rem .25rem 1rem;margin-top:0;margin-bottom:0;border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}html[data-netbox-color-mode=dark] .sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon{width:1rem;text-align:center;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]{width:unset;height:100%;padding-left:.5rem;font-weight:700;color:var(--nbx-sidenav-parent-color)}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{color:#000;background:#6397e5}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after{display:inline-block;margin-left:auto;font-family:"Material Design Icons";font-style:normal;font-weight:700;font-variant:normal;color:#ced4da;text-rendering:auto;-webkit-font-smoothing:antialiased;content:"\f0142";transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after{color:#000}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after{color:#6ea8fe;transform:rotate(90deg)}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text{padding-left:.25rem;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .navbar-nav{flex-direction:column;margin-right:-1.5rem;margin-left:-1.5rem}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item{margin-top:2px}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item.disabled{cursor:not-allowed;opacity:.8}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link{position:relative;display:flex;align-items:center;width:100%;padding:.5rem 1rem;font-size:.875rem;color:var(--nbx-sidenav-link-color);white-space:nowrap;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link.active{background-color:var(--nbx-sidebar-link-active-bg)}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link:hover:not(.active){color:var(--nbx-body-color);background-color:var(--nbx-sidebar-link-hover-bg)}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link>i{min-width:2rem;font-size:calc(45px / 2);text-align:center}html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-group-label{display:block;font-size:.75rem;font-weight:700;color:var(--nbx-sidenav-group-color);text-transform:uppercase;white-space:nowrap}html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon{color:var(--nbx-sidenav-pin-color);transform:rotate(90deg)}@media (min-width: 1200px){html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav+.content-container{margin-left:16rem}}html[data-netbox-color-mode=dark] .g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon{transform:rotate(0)}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav{max-width:16rem}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .navbar-heading,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .navbar-heading{display:block}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand{opacity:1;transform:translate(0)}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand-icon{position:absolute;opacity:0}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav{transform:translate(0)}}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-header,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-header{padding:.5rem}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-brand{position:absolute;opacity:0}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-brand-icon{opacity:1}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-toggle{opacity:0;position:absolute;transition:unset;transition-delay:0ms}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after{content:""}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .nav-item .collapse,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .nav-item .collapse{display:none}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .nav-link-text,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .nav-link-text{opacity:0}html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{margin-right:0;margin-left:0;border-radius:unset}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand{display:block}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .collapse{height:auto;transition:all .1s ease-in-out}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text{opacity:1}html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon{opacity:0}@media (min-width: 992px){html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-toggle{position:relative;opacity:1}}html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical{right:0;width:6px;background-color:transparent}html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical .simplebar-scrollbar{transition:none}html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical .simplebar-scrollbar:before{right:0;width:3px;background:var(--nbx-sidebar-scroll);border-radius:.375rem}html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before{width:5px}html[data-netbox-color-mode=dark] body{color:var(--nbx-body-color);background-color:var(--nbx-body-bg);font-size:.875rem}html[data-netbox-color-mode=dark] pre{white-space:pre}html[data-netbox-color-mode=dark] small,html[data-netbox-color-mode=dark] .small{font-size:smaller!important}html[data-netbox-color-mode=dark] a[type=button]{-webkit-appearance:unset!important}html[data-netbox-color-mode=dark] *[data-href]{cursor:pointer}html[data-netbox-color-mode=dark] .form-control:not([type=file]){font-size:inherit}html[data-netbox-color-mode=dark] .badge{font-size:.75rem}html[data-netbox-color-mode=dark] .text-xs{font-size:.75rem!important;line-height:1.25!important}html[data-netbox-color-mode=dark] .border-input{border:1px solid #495057!important}html[data-netbox-color-mode=dark] .ws-nowrap{white-space:nowrap!important}html[data-netbox-color-mode=dark] table tr .vertical-align,html[data-netbox-color-mode=dark] table td .vertical-align{vertical-align:middle}@media print{html[data-netbox-color-mode=dark] .noprint{display:none!important;visibility:hidden!important}}html[data-netbox-color-mode=dark] .printonly{display:none!important;visibility:hidden!important}@media print{html[data-netbox-color-mode=dark] .printonly{display:block!important;visibility:visible!important}}html[data-netbox-color-mode=dark] :root{--nbx-sidebar-bg: #e9ecef;--nbx-sidebar-scroll: #adb5bd;--nbx-sidebar-link-hover-bg: rgba(108, 117, 125, .15);--nbx-sidebar-link-active-bg: #cfe2ff;--nbx-sidebar-title-color: #ced4da;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(0, 0, 0, .25);--nbx-breadcrumb-bg: #dee2e6;--nbx-body-bg: #fff;--nbx-body-color: #343a40;--nbx-pre-bg: #f8f9fa;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(25, 135, 84, .4);--nbx-change-removed: rgba(220, 53, 69, .4);--nbx-cable-node-bg: #f8f9fa;--nbx-cable-node-border-color: #e9ecef;--nbx-cable-termination-bg: #e9ecef;--nbx-cable-termination-border-color: #dee2e6;--nbx-search-filter-border-left-color: #dee2e6;--nbx-color-mode-toggle-color: #6ea8fe;--nbx-sidenav-link-color: #343a40;--nbx-sidenav-pin-color: #fd7e14;--nbx-sidenav-parent-color: #343a40;--nbx-sidenav-group-color: #343a40}html[data-netbox-color-mode=dark] :root[data-netbox-color-mode=dark]{--nbx-sidebar-bg: #212529;--nbx-sidebar-scroll: #495057;--nbx-sidebar-link-active-bg: rgba(110, 168, 254, .25);--nbx-sidebar-link-hover-bg: rgba(173, 181, 189, .15);--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(255, 255, 255, .05);--nbx-breadcrumb-bg: #343a40;--nbx-body-bg: #1b1f22;--nbx-body-color: #f8f9fa;--nbx-pre-bg: #495057;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(117, 183, 152, .4);--nbx-change-removed: rgba(234, 134, 143, .4);--nbx-cable-node-bg: #495057;--nbx-cable-node-border-color: #6c757d;--nbx-cable-termination-bg: #343a40;--nbx-cable-termination-border-color: #495057;--nbx-search-filter-border-left-color: #6c757d;--nbx-color-mode-toggle-color: #ffda6a;--nbx-sidenav-link-color: #e9ecef;--nbx-sidenav-pin-color: #ffc107;--nbx-sidenav-parent-color: #e9ecef;--nbx-sidenav-group-color: #6c757d}html[data-netbox-color-mode=dark] .bg-primary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162233'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-primary{color:#6ea8fe}html[data-netbox-color-mode=dark] .btn.btn-ghost-primary:hover{background-color:#6ea8fe1f}html[data-netbox-color-mode=dark] .alert.alert-primary a:not(.btn),html[data-netbox-color-mode=dark] .table-primary a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .alert.alert-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-primary .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-primary a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .badge.bg-primary,html[data-netbox-color-mode=dark] .toast.bg-primary,html[data-netbox-color-mode=dark] .toast-header.bg-primary,html[data-netbox-color-mode=dark] .progress-bar.bg-primary{color:#000}html[data-netbox-color-mode=dark] .bg-secondary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23232426'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-secondary{color:#adb5bd}html[data-netbox-color-mode=dark] .btn.btn-ghost-secondary:hover{background-color:#adb5bd1f}html[data-netbox-color-mode=dark] .alert.alert-secondary a:not(.btn),html[data-netbox-color-mode=dark] .table-secondary a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .alert.alert-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-secondary .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-secondary a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .badge.bg-secondary,html[data-netbox-color-mode=dark] .toast.bg-secondary,html[data-netbox-color-mode=dark] .toast-header.bg-secondary,html[data-netbox-color-mode=dark] .progress-bar.bg-secondary{color:#000}html[data-netbox-color-mode=dark] .bg-success button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2317251e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-success{color:#75b798}html[data-netbox-color-mode=dark] .btn.btn-ghost-success:hover{background-color:#75b7981f}html[data-netbox-color-mode=dark] .alert.alert-success a:not(.btn),html[data-netbox-color-mode=dark] .table-success a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .alert.alert-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-success .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-success a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .badge.bg-success,html[data-netbox-color-mode=dark] .toast.bg-success,html[data-netbox-color-mode=dark] .toast-header.bg-success,html[data-netbox-color-mode=dark] .progress-bar.bg-success{color:#000}html[data-netbox-color-mode=dark] .bg-info button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162d31'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-info{color:#6edff6}html[data-netbox-color-mode=dark] .btn.btn-ghost-info:hover{background-color:#6edff61f}html[data-netbox-color-mode=dark] .alert.alert-info a:not(.btn),html[data-netbox-color-mode=dark] .table-info a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .alert.alert-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-info .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-info a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .badge.bg-info,html[data-netbox-color-mode=dark] .toast.bg-info,html[data-netbox-color-mode=dark] .toast-header.bg-info,html[data-netbox-color-mode=dark] .progress-bar.bg-info{color:#000}html[data-netbox-color-mode=dark] .bg-warning button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23332c15'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-warning{color:#ffda6a}html[data-netbox-color-mode=dark] .btn.btn-ghost-warning:hover{background-color:#ffda6a1f}html[data-netbox-color-mode=dark] .alert.alert-warning a:not(.btn),html[data-netbox-color-mode=dark] .table-warning a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .alert.alert-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-warning .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-warning a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .badge.bg-warning,html[data-netbox-color-mode=dark] .toast.bg-warning,html[data-netbox-color-mode=dark] .toast-header.bg-warning,html[data-netbox-color-mode=dark] .progress-bar.bg-warning{color:#000}html[data-netbox-color-mode=dark] .bg-danger button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232f1b1d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-danger{color:#ea868f}html[data-netbox-color-mode=dark] .btn.btn-ghost-danger:hover{background-color:#ea868f1f}html[data-netbox-color-mode=dark] .alert.alert-danger a:not(.btn),html[data-netbox-color-mode=dark] .table-danger a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .alert.alert-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-danger .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-danger a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .badge.bg-danger,html[data-netbox-color-mode=dark] .toast.bg-danger,html[data-netbox-color-mode=dark] .toast-header.bg-danger,html[data-netbox-color-mode=dark] .progress-bar.bg-danger{color:#000}html[data-netbox-color-mode=dark] .bg-light button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c2d2e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-light{color:#dee2e6}html[data-netbox-color-mode=dark] .btn.btn-ghost-light:hover{background-color:#dee2e61f}html[data-netbox-color-mode=dark] .alert.alert-light a:not(.btn),html[data-netbox-color-mode=dark] .table-light a:not(.btn){font-weight:700;color:#2c2d2e}html[data-netbox-color-mode=dark] .alert.alert-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-light .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-light a:not(.btn){font-weight:700;color:#2c2d2e}html[data-netbox-color-mode=dark] .badge.bg-light,html[data-netbox-color-mode=dark] .toast.bg-light,html[data-netbox-color-mode=dark] .toast-header.bg-light,html[data-netbox-color-mode=dark] .progress-bar.bg-light{color:#000}html[data-netbox-color-mode=dark] .bg-dark button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23232426'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-dark{color:#adb5bd}html[data-netbox-color-mode=dark] .btn.btn-ghost-dark:hover{background-color:#adb5bd1f}html[data-netbox-color-mode=dark] .alert.alert-dark a:not(.btn),html[data-netbox-color-mode=dark] .table-dark a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .alert.alert-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-dark .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-dark a:not(.btn){font-weight:700;color:#232426}html[data-netbox-color-mode=dark] .badge.bg-dark,html[data-netbox-color-mode=dark] .toast.bg-dark,html[data-netbox-color-mode=dark] .toast-header.bg-dark,html[data-netbox-color-mode=dark] .progress-bar.bg-dark{color:#000}html[data-netbox-color-mode=dark] .bg-blue button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162233'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue{color:#6ea8fe}html[data-netbox-color-mode=dark] .btn.btn-ghost-blue:hover{background-color:#6ea8fe1f}html[data-netbox-color-mode=dark] .alert.alert-blue a:not(.btn),html[data-netbox-color-mode=dark] .table-blue a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .alert.alert-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-blue a:not(.btn){font-weight:700;color:#162233}html[data-netbox-color-mode=dark] .badge.bg-blue,html[data-netbox-color-mode=dark] .toast.bg-blue,html[data-netbox-color-mode=dark] .toast-header.bg-blue,html[data-netbox-color-mode=dark] .progress-bar.bg-blue{color:#000}html[data-netbox-color-mode=dark] .bg-indigo button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23211631'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo{color:#a370f7}html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo:hover{background-color:#a370f71f}html[data-netbox-color-mode=dark] .alert.alert-indigo a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo a:not(.btn){font-weight:700;color:#211631}html[data-netbox-color-mode=dark] .alert.alert-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-indigo a:not(.btn){font-weight:700;color:#211631}html[data-netbox-color-mode=dark] .badge.bg-indigo,html[data-netbox-color-mode=dark] .toast.bg-indigo,html[data-netbox-color-mode=dark] .toast-header.bg-indigo,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo{color:#000}html[data-netbox-color-mode=dark] .bg-purple button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23221c2c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple{color:#a98eda}html[data-netbox-color-mode=dark] .btn.btn-ghost-purple:hover{background-color:#a98eda1f}html[data-netbox-color-mode=dark] .alert.alert-purple a:not(.btn),html[data-netbox-color-mode=dark] .table-purple a:not(.btn){font-weight:700;color:#221c2c}html[data-netbox-color-mode=dark] .alert.alert-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-purple a:not(.btn){font-weight:700;color:#221c2c}html[data-netbox-color-mode=dark] .badge.bg-purple,html[data-netbox-color-mode=dark] .toast.bg-purple,html[data-netbox-color-mode=dark] .toast-header.bg-purple,html[data-netbox-color-mode=dark] .progress-bar.bg-purple{color:#000}html[data-netbox-color-mode=dark] .bg-pink button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232e1b24'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink{color:#e685b5}html[data-netbox-color-mode=dark] .btn.btn-ghost-pink:hover{background-color:#e685b51f}html[data-netbox-color-mode=dark] .alert.alert-pink a:not(.btn),html[data-netbox-color-mode=dark] .table-pink a:not(.btn){font-weight:700;color:#2e1b24}html[data-netbox-color-mode=dark] .alert.alert-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-pink a:not(.btn){font-weight:700;color:#2e1b24}html[data-netbox-color-mode=dark] .badge.bg-pink,html[data-netbox-color-mode=dark] .toast.bg-pink,html[data-netbox-color-mode=dark] .toast-header.bg-pink,html[data-netbox-color-mode=dark] .progress-bar.bg-pink{color:#000}html[data-netbox-color-mode=dark] .bg-red button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232f1b1d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-red{color:#ea868f}html[data-netbox-color-mode=dark] .btn.btn-ghost-red:hover{background-color:#ea868f1f}html[data-netbox-color-mode=dark] .alert.alert-red a:not(.btn),html[data-netbox-color-mode=dark] .table-red a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .alert.alert-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-red a:not(.btn){font-weight:700;color:#2f1b1d}html[data-netbox-color-mode=dark] .badge.bg-red,html[data-netbox-color-mode=dark] .toast.bg-red,html[data-netbox-color-mode=dark] .toast-header.bg-red,html[data-netbox-color-mode=dark] .progress-bar.bg-red{color:#000}html[data-netbox-color-mode=dark] .bg-orange button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23332417'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-orange{color:#feb272}html[data-netbox-color-mode=dark] .btn.btn-ghost-orange:hover{background-color:#feb2721f}html[data-netbox-color-mode=dark] .alert.alert-orange a:not(.btn),html[data-netbox-color-mode=dark] .table-orange a:not(.btn){font-weight:700;color:#332417}html[data-netbox-color-mode=dark] .alert.alert-orange .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-orange .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-orange a:not(.btn){font-weight:700;color:#332417}html[data-netbox-color-mode=dark] .badge.bg-orange,html[data-netbox-color-mode=dark] .toast.bg-orange,html[data-netbox-color-mode=dark] .toast-header.bg-orange,html[data-netbox-color-mode=dark] .progress-bar.bg-orange{color:#000}html[data-netbox-color-mode=dark] .bg-yellow button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23332c15'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow{color:#ffda6a}html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow:hover{background-color:#ffda6a1f}html[data-netbox-color-mode=dark] .alert.alert-yellow a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .alert.alert-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-yellow a:not(.btn){font-weight:700;color:#332c15}html[data-netbox-color-mode=dark] .badge.bg-yellow,html[data-netbox-color-mode=dark] .toast.bg-yellow,html[data-netbox-color-mode=dark] .toast-header.bg-yellow,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow{color:#000}html[data-netbox-color-mode=dark] .bg-green button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2317251e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-green{color:#75b798}html[data-netbox-color-mode=dark] .btn.btn-ghost-green:hover{background-color:#75b7981f}html[data-netbox-color-mode=dark] .alert.alert-green a:not(.btn),html[data-netbox-color-mode=dark] .table-green a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .alert.alert-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-green a:not(.btn){font-weight:700;color:#17251e}html[data-netbox-color-mode=dark] .badge.bg-green,html[data-netbox-color-mode=dark] .toast.bg-green,html[data-netbox-color-mode=dark] .toast-header.bg-green,html[data-netbox-color-mode=dark] .progress-bar.bg-green{color:#000}html[data-netbox-color-mode=dark] .bg-teal button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23182d27'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-teal{color:#79dfc1}html[data-netbox-color-mode=dark] .btn.btn-ghost-teal:hover{background-color:#79dfc11f}html[data-netbox-color-mode=dark] .alert.alert-teal a:not(.btn),html[data-netbox-color-mode=dark] .table-teal a:not(.btn){font-weight:700;color:#182d27}html[data-netbox-color-mode=dark] .alert.alert-teal .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-teal .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-teal a:not(.btn){font-weight:700;color:#182d27}html[data-netbox-color-mode=dark] .badge.bg-teal,html[data-netbox-color-mode=dark] .toast.bg-teal,html[data-netbox-color-mode=dark] .toast-header.bg-teal,html[data-netbox-color-mode=dark] .progress-bar.bg-teal{color:#000}html[data-netbox-color-mode=dark] .bg-cyan button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162d31'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan{color:#6edff6}html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan:hover{background-color:#6edff61f}html[data-netbox-color-mode=dark] .alert.alert-cyan a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .alert.alert-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-cyan a:not(.btn){font-weight:700;color:#162d31}html[data-netbox-color-mode=dark] .badge.bg-cyan,html[data-netbox-color-mode=dark] .toast.bg-cyan,html[data-netbox-color-mode=dark] .toast-header.bg-cyan,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan{color:#000}html[data-netbox-color-mode=dark] .bg-gray button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c2d2e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray{color:#dee2e6}html[data-netbox-color-mode=dark] .btn.btn-ghost-gray:hover{background-color:#dee2e61f}html[data-netbox-color-mode=dark] .alert.alert-gray a:not(.btn),html[data-netbox-color-mode=dark] .table-gray a:not(.btn){font-weight:700;color:#2c2d2e}html[data-netbox-color-mode=dark] .alert.alert-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-gray a:not(.btn){font-weight:700;color:#2c2d2e}html[data-netbox-color-mode=dark] .badge.bg-gray,html[data-netbox-color-mode=dark] .toast.bg-gray,html[data-netbox-color-mode=dark] .toast-header.bg-gray,html[data-netbox-color-mode=dark] .progress-bar.bg-gray{color:#000}html[data-netbox-color-mode=dark] .bg-black button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23cccccc'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-black{color:#000}html[data-netbox-color-mode=dark] .btn.btn-ghost-black:hover{background-color:#0000001f}html[data-netbox-color-mode=dark] .alert.alert-black a:not(.btn),html[data-netbox-color-mode=dark] .table-black a:not(.btn){font-weight:700;color:#ccc}html[data-netbox-color-mode=dark] .alert.alert-black .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-black .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-black a:not(.btn){font-weight:700;color:#ccc}html[data-netbox-color-mode=dark] .badge.bg-black,html[data-netbox-color-mode=dark] .toast.bg-black,html[data-netbox-color-mode=dark] .toast-header.bg-black,html[data-netbox-color-mode=dark] .progress-bar.bg-black{color:#fff}html[data-netbox-color-mode=dark] .bg-white button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23333333'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}html[data-netbox-color-mode=dark] .btn.btn-ghost-white{color:#fff}html[data-netbox-color-mode=dark] .btn.btn-ghost-white:hover{background-color:#ffffff1f}html[data-netbox-color-mode=dark] .alert.alert-white a:not(.btn),html[data-netbox-color-mode=dark] .table-white a:not(.btn){font-weight:700;color:#333}html[data-netbox-color-mode=dark] .alert.alert-white .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-white .btn:not([class*=btn-outline]){border-color:#495057}html[data-netbox-color-mode=dark] .toast.bg-white a:not(.btn){font-weight:700;color:#333}html[data-netbox-color-mode=dark] .badge.bg-white,html[data-netbox-color-mode=dark] .toast.bg-white,html[data-netbox-color-mode=dark] .toast-header.bg-white,html[data-netbox-color-mode=dark] .progress-bar.bg-white{color:#000}html[data-netbox-color-mode=dark] table td>.progress{min-width:6rem}html[data-netbox-color-mode=dark] .small .form-control{font-size:.875rem}html[data-netbox-color-mode=dark] :not(.card-body)>.col:not(:last-child):not(:only-child){margin-bottom:1rem}html[data-netbox-color-mode=dark] .nav-mobile{display:none;flex-direction:column;align-items:center;justify-content:space-between;width:100%}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] .nav-mobile{display:flex}}html[data-netbox-color-mode=dark] .nav-mobile .nav-mobile-top{display:flex;align-items:center;justify-content:space-between;width:100%}html[data-netbox-color-mode=dark] .card>.table.table-flush{margin-bottom:0;overflow:hidden;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .card>.table.table-flush thead th[scope=col]{padding-top:1rem;padding-bottom:1rem;text-transform:uppercase;vertical-align:middle;background-color:#495057;border-top:1px solid rgba(255,255,255,.125);border-bottom-color:#ffffff20}html[data-netbox-color-mode=dark] .card>.table.table-flush th,html[data-netbox-color-mode=dark] .card>.table.table-flush td{padding-right:1.5rem!important;padding-left:1.5rem!important;border-right:0;border-left:0}html[data-netbox-color-mode=dark] .card>.table.table-flush tr[class]{border-color:#ffffff20!important}html[data-netbox-color-mode=dark] .card>.table.table-flush tr[class]:last-of-type{border-bottom-color:transparent!important;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html[data-netbox-color-mode=dark] .header-alert-container{display:flex;align-items:center;justify-content:center;padding:0 1rem}html[data-netbox-color-mode=dark] .header-alert-container .alert{width:100%}@media (min-width: 768px){html[data-netbox-color-mode=dark] .header-alert-container .alert{max-width:75%}}@media (min-width: 992px){html[data-netbox-color-mode=dark] .header-alert-container .alert{max-width:50%}}html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu{right:0;left:auto;display:block!important;margin-top:.5rem;box-shadow:0 .5rem 1rem #00000026;transition:opacity .2s ease-in-out}html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu:not(.show){pointer-events:none;opacity:0}html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu.show{pointer-events:auto;opacity:1}html[data-netbox-color-mode=dark] div#advanced-search-content div.card div.card-body div.col:not(:last-child){margin-right:1rem}html[data-netbox-color-mode=dark] table td a{text-decoration:none}html[data-netbox-color-mode=dark] table td a:hover{text-decoration:underline}html[data-netbox-color-mode=dark] table td .dropdown{position:static}html[data-netbox-color-mode=dark] table th a,html[data-netbox-color-mode=dark] table th a:hover{color:#fff;text-decoration:none}html[data-netbox-color-mode=dark] table td,html[data-netbox-color-mode=dark] table th{font-size:.875rem;line-height:1.25;vertical-align:middle}html[data-netbox-color-mode=dark] table td.min-width,html[data-netbox-color-mode=dark] table th.min-width{width:1%}html[data-netbox-color-mode=dark] table td .form-check-input,html[data-netbox-color-mode=dark] table th .form-check-input{margin-top:.125em;font-size:1rem}html[data-netbox-color-mode=dark] table td .btn-sm,html[data-netbox-color-mode=dark] table td .btn-group-sm>.btn,html[data-netbox-color-mode=dark] table th .btn-sm,html[data-netbox-color-mode=dark] table th .btn-group-sm>.btn{line-height:1}html[data-netbox-color-mode=dark] table td p,html[data-netbox-color-mode=dark] table th p{margin-bottom:0}html[data-netbox-color-mode=dark] table th.asc a:after{content:"\f0140";font-family:"Material Design Icons"}html[data-netbox-color-mode=dark] table th.desc a:after{content:"\f0143";font-family:"Material Design Icons"}html[data-netbox-color-mode=dark] table.table>:not(caption)>*>*{padding-right:.25rem!important;padding-left:.25rem!important}html[data-netbox-color-mode=dark] table.object-list th{font-size:.75rem;line-height:1;vertical-align:bottom}html[data-netbox-color-mode=dark] table.attr-table th{font-weight:normal;width:25%}html[data-netbox-color-mode=dark] div.title-container{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:space-between}@media (min-width: 992px){html[data-netbox-color-mode=dark] div.title-container{flex-direction:row}}html[data-netbox-color-mode=dark] div.title-container #content-title{display:flex;flex:1 0;flex-direction:column;padding-bottom:.5rem}html[data-netbox-color-mode=dark] .controls{margin-bottom:.5rem}@media print{html[data-netbox-color-mode=dark] .controls{display:none!important}}html[data-netbox-color-mode=dark] .controls .control-group{display:flex;flex-wrap:wrap;justify-content:flex-start}@media (min-width: 992px){html[data-netbox-color-mode=dark] .controls .control-group{justify-content:flex-end}}html[data-netbox-color-mode=dark] .controls .control-group>*{margin:.25rem}html[data-netbox-color-mode=dark] .controls .control-group>*:first-child{margin-left:0}html[data-netbox-color-mode=dark] .controls .control-group>*:last-child{margin-right:0}html[data-netbox-color-mode=dark] .object-subtitle{display:block;font-size:.875rem;color:#ced4da}@media (min-width: 768px){html[data-netbox-color-mode=dark] .object-subtitle{display:inline-block}}html[data-netbox-color-mode=dark] .object-subtitle>span{display:block}html[data-netbox-color-mode=dark] .object-subtitle>span.separator{display:none}@media (min-width: 768px){html[data-netbox-color-mode=dark] .object-subtitle>span,html[data-netbox-color-mode=dark] .object-subtitle>span.separator{display:inline-block}}html[data-netbox-color-mode=dark] nav.search{z-index:999;justify-content:center;background-color:var(--nbx-body-bg)}html[data-netbox-color-mode=dark] nav.search .search-container{display:flex;width:100%}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] nav.search .search-container{display:none}}html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selected{border-color:#495057}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle{color:#fff;border-color:#495057;margin-left:0;font-weight:400;line-height:1.5;color:#f8f9fa;background-color:#495057;border:1px solid #495057;border-radius:.375rem;border-left:1px solid var(--nbx-search-filter-border-left-color)}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:hover{color:#fff;background-color:#3e444a;border-color:#3a4046}.btn-check:focus+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus{color:#fff;background-color:#3e444a;border-color:#3a4046;box-shadow:0 0 0 .25rem #646a7080}.btn-check:checked+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,.btn-check:active+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:active,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.active,.show>html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.dropdown-toggle{color:#fff;background-color:#3a4046;border-color:#373c41}.btn-check:checked+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,.btn-check:active+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:active:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.active:focus,.show>html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #646a7080}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:disabled,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.disabled{color:#fff;background-color:#495057;border-color:#495057}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus{box-shadow:unset!important}html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:after{display:none}html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector{max-height:70vh;overflow-y:auto}html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-item,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-header{font-size:.875rem}html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-header{text-transform:uppercase}html[data-netbox-color-mode=dark] main.layout{display:flex;flex-wrap:nowrap;height:100vh;height:-webkit-fill-available;max-height:100vh;overflow-x:auto;overflow-y:hidden}@media print{html[data-netbox-color-mode=dark] main.layout{position:static!important;display:block!important;height:100%;overflow-x:visible!important;overflow-y:visible!important}}html[data-netbox-color-mode=dark] main.login-container{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;max-width:100vw;height:calc(100vh - 4rem);padding-top:40px;padding-bottom:40px}html[data-netbox-color-mode=dark] main.login-container+footer.footer button.color-mode-toggle{color:var(--nbx-color-mode-toggle-color)}html[data-netbox-color-mode=dark] .footer{padding:0}html[data-netbox-color-mode=dark] .footer .nav-link{padding:.5rem}@media (max-width: 767.98px){html[data-netbox-color-mode=dark] .footer{margin-bottom:8rem}}html[data-netbox-color-mode=dark] footer.login-footer{height:4rem;margin-top:auto}html[data-netbox-color-mode=dark] footer.login-footer .container-fluid,html[data-netbox-color-mode=dark] footer.login-footer .container-sm,html[data-netbox-color-mode=dark] footer.login-footer .container-md,html[data-netbox-color-mode=dark] footer.login-footer .container-lg,html[data-netbox-color-mode=dark] footer.login-footer .container-xl,html[data-netbox-color-mode=dark] footer.login-footer .container-xxl{display:flex;justify-content:flex-end;padding:.75rem 1.5rem}html[data-netbox-color-mode=dark] h1.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h1,html[data-netbox-color-mode=dark] h2.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h2,html[data-netbox-color-mode=dark] h3.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h3,html[data-netbox-color-mode=dark] h4.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h4,html[data-netbox-color-mode=dark] h5.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h5,html[data-netbox-color-mode=dark] h6.accordion-item-title,html[data-netbox-color-mode=dark] .accordion-item-title.h6{padding:.25rem .5rem;font-size:.875rem;font-weight:700;color:var(--nbx-sidebar-title-color);text-transform:uppercase}html[data-netbox-color-mode=dark] .form-login{width:100%;max-width:330px;padding:15px}html[data-netbox-color-mode=dark] .form-login input:focus{z-index:1}html[data-netbox-color-mode=dark] .form-login input[type=text]{margin-bottom:-1px;border-bottom-right-radius:0;border-bottom-left-radius:0}html[data-netbox-color-mode=dark] .form-login input[type=password]{margin-bottom:10px;border-top-left-radius:0;border-top-right-radius:0}html[data-netbox-color-mode=dark] .form-login .form-control{position:relative;box-sizing:border-box;height:auto;padding:10px;font-size:16px}html[data-netbox-color-mode=dark] .navbar-brand{padding-top:.75rem;padding-bottom:.75rem;font-size:1rem}html[data-netbox-color-mode=dark] nav.nav.nav-pills .nav-item.nav-link{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html[data-netbox-color-mode=dark] nav.nav.nav-pills .nav-item.nav-link:hover{color:#000;background-color:#6397e5}html[data-netbox-color-mode=dark] div.content-container{position:relative;display:flex;flex-direction:column;width:calc(100% - 3rem);min-height:100vh;overflow-x:hidden;overflow-y:auto}html[data-netbox-color-mode=dark] div.content-container:focus,html[data-netbox-color-mode=dark] div.content-container:focus-visible{outline:0}html[data-netbox-color-mode=dark] div.content-container div.content{flex:1}@media (max-width: 991.98px){html[data-netbox-color-mode=dark] div.content-container{width:100%}}@media print{html[data-netbox-color-mode=dark] div.content-container{width:100%!important;margin-left:0!important}}@media (max-width: 768px){html[data-netbox-color-mode=dark] .sidebar.collapse.show~.content-container>.content{position:fixed;top:0;left:0;overflow-y:hidden}}html[data-netbox-color-mode=dark] .tooltip{pointer-events:none}html[data-netbox-color-mode=dark] span.color-label{display:block;width:5rem;height:1rem;padding:.35em .65em;border:1px solid #303030;border-radius:.375rem;box-shadow:0 .125rem .25rem #00000013}html[data-netbox-color-mode=dark] .btn{white-space:nowrap}html[data-netbox-color-mode=dark] .card{box-shadow:0 .125rem .25rem #00000013}html[data-netbox-color-mode=dark] .card .card-header{padding:1rem;color:var(--nbx-body-color);border-bottom:none}html[data-netbox-color-mode=dark] .card .card-header+.card-body{padding-top:0}html[data-netbox-color-mode=dark] .card .card-body.small .form-control,html[data-netbox-color-mode=dark] .card .card-body.small .form-select{font-size:.875rem}html[data-netbox-color-mode=dark] .card .card-divider{width:100%;height:1px;margin:1rem 0;border-top:1px solid rgba(255,255,255,.125);opacity:.25}@media print{html[data-netbox-color-mode=dark] .card{box-shadow:unset!important}}html[data-netbox-color-mode=dark] .form-floating{position:relative}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}html[data-netbox-color-mode=dark] .form-floating>.input-group>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){html[data-netbox-color-mode=dark] .form-floating>.input-group>label{transition:none}}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control::placeholder{color:transparent}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:focus,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select,html[data-netbox-color-mode=dark] .form-floating>.choices>.choices__inner,html[data-netbox-color-mode=dark] .form-floating>.ss-main span.placeholder,html[data-netbox-color-mode=dark] .form-floating>.ss-main div.ss-values{padding-top:1.625rem;padding-bottom:.625rem}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:focus~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select~label,html[data-netbox-color-mode=dark] .form-floating>.choices~label,html[data-netbox-color-mode=dark] .form-floating>.ss-main~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem);z-index:4}html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:-webkit-autofill~label{z-index:4;opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}html[data-netbox-color-mode=dark] .form-object-edit{margin:0 auto;max-width:800px}html[data-netbox-color-mode=dark] textarea.form-control[rows="10"]{height:18rem}html[data-netbox-color-mode=dark] textarea#id_local_context_data,html[data-netbox-color-mode=dark] textarea.markdown,html[data-netbox-color-mode=dark] textarea#id_public_key,html[data-netbox-color-mode=dark] textarea.form-control[name=csv],html[data-netbox-color-mode=dark] textarea.form-control[name=data]{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}html[data-netbox-color-mode=dark] .card:not(:only-of-type){margin-bottom:1rem}html[data-netbox-color-mode=dark] .stat-btn{min-width:3rem}html[data-netbox-color-mode=dark] nav.breadcrumb-container{width:fit-content;padding:.35em .65em;font-size:.875rem}html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb{margin-bottom:0}html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a{text-decoration:none}html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover{text-decoration:underline}html[data-netbox-color-mode=dark] label.required{font-weight:700}html[data-netbox-color-mode=dark] label.required:after{position:absolute;display:inline-block;margin:0 0 0 2px;font-family:"Material Design Icons";font-size:8px;font-style:normal;font-weight:600;text-decoration:none;content:"\f06c4"}html[data-netbox-color-mode=dark] div.bulk-buttons{display:flex;justify-content:space-between;margin:.5rem 0}html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group{display:flex;flex-wrap:wrap;align-items:flex-start}html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child{margin-left:0}html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child{margin-right:0}html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group>*{margin:.25rem}html[data-netbox-color-mode=dark] table tbody tr.primary{background-color:#6ea8fe26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.secondary{background-color:#adb5bd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.success{background-color:#75b79826;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.info{background-color:#6edff626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.warning{background-color:#ffda6a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.danger{background-color:#ea868f26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.light{background-color:#dee2e626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.dark{background-color:#adb5bd26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.blue{background-color:#6ea8fe26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.indigo{background-color:#a370f726;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.purple{background-color:#a98eda26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.pink{background-color:#e685b526;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.red{background-color:#ea868f26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.orange{background-color:#feb27226;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.yellow{background-color:#ffda6a26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.green{background-color:#75b79826;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.teal{background-color:#79dfc126;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.cyan{background-color:#6edff626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.gray{background-color:#dee2e626;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.black{background-color:#00000026;border-color:#adb5bd}html[data-netbox-color-mode=dark] table tbody tr.white{background-color:#ffffff26;border-color:#adb5bd}html[data-netbox-color-mode=dark] table .table-badge-group .table-badge{display:block;width:min-content;font-size:.875rem;font-weight:400}html[data-netbox-color-mode=dark] table .table-badge-group .table-badge:not(.badge){padding:0 .65em}html[data-netbox-color-mode=dark] table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child){margin-bottom:.25rem}html[data-netbox-color-mode=dark] pre.change-data{padding-right:0;padding-left:0}html[data-netbox-color-mode=dark] pre.change-data>span{display:block;padding-right:1rem;padding-left:1rem}html[data-netbox-color-mode=dark] pre.change-data>span.added{background-color:var(--nbx-change-added)}html[data-netbox-color-mode=dark] pre.change-data>span.removed{background-color:var(--nbx-change-removed)}html[data-netbox-color-mode=dark] pre.change-diff{border-color:transparent}html[data-netbox-color-mode=dark] pre.change-diff.change-removed{background-color:var(--nbx-change-removed)}html[data-netbox-color-mode=dark] pre.change-diff.change-added{background-color:var(--nbx-change-added)}html[data-netbox-color-mode=dark] div.card-overlay{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#ffffffbf;border-radius:.375rem}html[data-netbox-color-mode=dark] div.card-overlay>div.spinner-border{width:6rem;height:6rem;color:#adb5bd}html[data-netbox-color-mode=dark] .table-controls{display:flex}@media (min-width: 768px){html[data-netbox-color-mode=dark] .table-controls{margin-top:0!important;margin-bottom:0!important}}html[data-netbox-color-mode=dark] .table-controls .table-configure{justify-content:flex-start}@media (min-width: 768px){html[data-netbox-color-mode=dark] .table-controls .table-configure{justify-content:flex-end}}html[data-netbox-color-mode=dark] .table-controls .form-switch.form-check-inline{flex:1 0 auto;font-size:.875rem}html[data-netbox-color-mode=dark] .nav-tabs .nav-link:hover{border-bottom-color:transparent}html[data-netbox-color-mode=dark] .nav-tabs .nav-link.active{background-color:#171b1d;border-bottom-color:#171b1d;transform:translateY(1px)}html[data-netbox-color-mode=dark] .tab-content{display:flex;flex-direction:column;padding:1rem;background-color:#171b1d;border-bottom:1px solid #495057}@media print{html[data-netbox-color-mode=dark] .tab-content{background-color:var(--nbx-body-bg)!important;border-bottom:none!important}}@media print{html[data-netbox-color-mode=dark] .masonry{position:static!important;display:block!important;height:unset!important}}@media print{html[data-netbox-color-mode=dark] .masonry .masonry-item{position:static!important;top:unset!important;left:unset!important;display:block!important}}html[data-netbox-color-mode=dark] .record-depth{display:inline;font-size:1rem;user-select:none;opacity:.33}html[data-netbox-color-mode=dark] .record-depth span:only-of-type,html[data-netbox-color-mode=dark] .record-depth span:last-of-type{margin-right:.25rem}html[data-netbox-color-mode=dark] .popover.image-preview-popover{max-width:unset}html[data-netbox-color-mode=dark] .rendered-markdown table{width:100%}html[data-netbox-color-mode=dark] .rendered-markdown th{border-bottom:2px solid #ddd;padding:8px}html[data-netbox-color-mode=dark] .rendered-markdown td{border-top:1px solid #ddd;padding:8px}html[data-netbox-color-mode=dark] td pre{margin-bottom:0}html[data-netbox-color-mode=dark] pre.block{padding:1rem;background-color:var(--nbx-pre-bg);border:1px solid var(--nbx-pre-border-color);border-radius:.375rem}html[data-netbox-color-mode=dark] #django-messages{position:fixed;right:1rem;bottom:0;margin:1rem}html[data-netbox-color-mode=dark] html[data-netbox-url-name=home] .content-container,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home] .search{background-color:#f8f9fa!important}html[data-netbox-color-mode=dark] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search{background-color:#171b1d!important}html[data-netbox-color-mode=dark] html[data-netbox-url-name=login] #django-messages{display:none} diff --git a/netbox/project-static/dist/netbox-light.css b/netbox/project-static/dist/netbox-light.css index 23dc8d3821e..f8e59ef99ee 100644 --- a/netbox/project-static/dist/netbox-light.css +++ b/netbox/project-static/dist/netbox-light.css @@ -1 +1 @@ -:root{--bs-orange: #fd7e14;--bs-teal: #20c997;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #337ab7;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #54d6f0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-red: #dc3545;--bs-yellow: #ffc107;--bs-green: #198754;--bs-blue: #0d6efd;--bs-cyan: #0dcaf0;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-darker: #1b1f22;--bs-darkest: #171b1d;--bs-gray: #ced4da;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-red-100: #f8d7da;--bs-red-200: #f1aeb5;--bs-red-300: #ea868f;--bs-red-400: #e35d6a;--bs-red-500: #dc3545;--bs-red-600: #b02a37;--bs-red-700: #842029;--bs-red-800: #58151c;--bs-red-900: #2c0b0e;--bs-yellow-100: #fff3cd;--bs-yellow-200: #ffe69c;--bs-yellow-300: #ffda6a;--bs-yellow-400: #ffcd39;--bs-yellow-500: #ffc107;--bs-yellow-600: #cc9a06;--bs-yellow-700: #997404;--bs-yellow-800: #664d03;--bs-yellow-900: #332701;--bs-green-100: #d1e7dd;--bs-green-200: #a3cfbb;--bs-green-300: #75b798;--bs-green-400: #479f76;--bs-green-500: #198754;--bs-green-600: #146c43;--bs-green-700: #0f5132;--bs-green-800: #0a3622;--bs-green-900: #051b11;--bs-blue-100: #cfe2ff;--bs-blue-200: #9ec5fe;--bs-blue-300: #6ea8fe;--bs-blue-400: #3d8bfd;--bs-blue-500: #0d6efd;--bs-blue-600: #0a58ca;--bs-blue-700: #084298;--bs-blue-800: #052c65;--bs-blue-900: #031633;--bs-cyan-100: #cff4fc;--bs-cyan-200: #9eeaf9;--bs-cyan-300: #6edff6;--bs-cyan-400: #3dd5f3;--bs-cyan-500: #0dcaf0;--bs-cyan-600: #0aa2c0;--bs-cyan-700: #087990;--bs-cyan-800: #055160;--bs-cyan-900: #032830;--bs-indigo-100: #e0cffc;--bs-indigo-200: #c29ffa;--bs-indigo-300: #a370f7;--bs-indigo-400: #8540f5;--bs-indigo-500: #6610f2;--bs-indigo-600: #520dc2;--bs-indigo-700: #3d0a91;--bs-indigo-800: #290661;--bs-indigo-900: #140330;--bs-purple-100: #e2d9f3;--bs-purple-200: #c5b3e6;--bs-purple-300: #a98eda;--bs-purple-400: #8c68cd;--bs-purple-500: #6f42c1;--bs-purple-600: #59359a;--bs-purple-700: #432874;--bs-purple-800: #2c1a4d;--bs-purple-900: #160d27;--bs-pink-100: #f7d6e6;--bs-pink-200: #efadce;--bs-pink-300: #e685b5;--bs-pink-400: #de5c9d;--bs-pink-500: #d63384;--bs-pink-600: #ab296a;--bs-pink-700: #801f4f;--bs-pink-800: #561435;--bs-pink-900: #2b0a1a;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0))}*,*:before,*:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-bs-original-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:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:800}small,.small{font-size:.875em}mark,.mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#212529;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.375rem}kbd kbd{padding:0;font-size:1em;font-weight:700}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:#6c757d;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]::-webkit-calendar-picker-indicator{display:none}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;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer:before{content:"\2014\a0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:var(--bs-gutter-x, .75rem);padding-left:var(--bs-gutter-x, .75rem);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}}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.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.6666666667%}@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.3333333333%}.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.6666666667%}}@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.3333333333%}.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.6666666667%}}@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.3333333333%}.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.6666666667%}}@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.3333333333%}.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.6666666667%}}@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.3333333333%}.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.6666666667%}}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: .25rem}.g-1,.gy-1{--bs-gutter-y: .25rem}.g-2,.gx-2{--bs-gutter-x: .5rem}.g-2,.gy-2{--bs-gutter-y: .5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: .25rem}.g-md-1,.gy-md-1{--bs-gutter-y: .25rem}.g-md-2,.gx-md-2{--bs-gutter-x: .5rem}.g-md-2,.gy-md-2{--bs-gutter-y: .5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}.table{--bs-table-bg: transparent;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, .05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, .1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, .075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #cfe2ff;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg: #e2e3e5;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg: #d1e7dd;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg: #cff4fc;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg: #fff3cd;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg: #212529;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #e9ecef;appearance:none;border-radius:.375rem;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:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#adb5bd;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.375rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.375rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#6c757d;background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px 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{padding:1rem .75rem}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){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),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){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:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#198754e6;border-radius:.375rem}.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:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.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"]{padding-right:4.125rem;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem #19875440}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.input-group .form-control.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:1}.was-validated .input-group .form-control:valid:focus,.input-group .form-control.is-valid:focus,.was-validated .input-group .form-select:valid:focus,.input-group .form-select.is-valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#dc3545e6;border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem #dc354540}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.input-group .form-control.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:2}.was-validated .input-group .form-control:invalid:focus,.input-group .form-control.is-invalid:focus,.was-validated .input-group .form-select:invalid:focus,.input-group .form-select.is-invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.375rem;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:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-primary:hover{color:#fff;background-color:#2b689c;border-color:#296292}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#2b689c;border-color:#296292;box-shadow:0 0 0 .25rem #528ec280}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#296292;border-color:#265c89}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #528ec280}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem #828a9180}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #828a9180}.btn-secondary:disabled,.btn-secondary.disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-info:hover{color:#000;background-color:#6edcf2;border-color:#65daf2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#6edcf2;border-color:#65daf2;box-shadow:0 0 0 .25rem #47b6cc80}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#76def3;border-color:#65daf2}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #47b6cc80}.btn-info:disabled,.btn-info.disabled{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}.btn-warning:disabled,.btn-warning.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem #d3d4d580}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3d4d580}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem #42464980}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #42464980}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-red{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-red:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-red,.btn-red:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+.btn-red,.btn-check:active+.btn-red,.btn-red:active,.btn-red.active,.show>.btn-red.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+.btn-red:focus,.btn-check:active+.btn-red:focus,.btn-red:active:focus,.btn-red.active:focus,.show>.btn-red.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}.btn-red:disabled,.btn-red.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-yellow{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-yellow:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-yellow,.btn-yellow:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+.btn-yellow,.btn-check:active+.btn-yellow,.btn-yellow:active,.btn-yellow.active,.show>.btn-yellow.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+.btn-yellow:focus,.btn-check:active+.btn-yellow:focus,.btn-yellow:active:focus,.btn-yellow.active:focus,.show>.btn-yellow.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}.btn-yellow:disabled,.btn-yellow.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-green{color:#fff;background-color:#198754;border-color:#198754}.btn-green:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-green,.btn-green:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+.btn-green,.btn-check:active+.btn-green,.btn-green:active,.btn-green.active,.show>.btn-green.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+.btn-green:focus,.btn-check:active+.btn-green:focus,.btn-green:active:focus,.btn-green.active:focus,.show>.btn-green.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}.btn-green:disabled,.btn-green.disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-blue{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-blue:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-blue,.btn-blue:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem #3184fd80}.btn-check:checked+.btn-blue,.btn-check:active+.btn-blue,.btn-blue:active,.btn-blue.active,.show>.btn-blue.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:checked+.btn-blue:focus,.btn-check:active+.btn-blue:focus,.btn-blue:active:focus,.btn-blue.active:focus,.show>.btn-blue.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3184fd80}.btn-blue:disabled,.btn-blue.disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-cyan{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-cyan:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-cyan,.btn-cyan:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem #0baccc80}.btn-check:checked+.btn-cyan,.btn-check:active+.btn-cyan,.btn-cyan:active,.btn-cyan.active,.show>.btn-cyan.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+.btn-cyan:focus,.btn-check:active+.btn-cyan:focus,.btn-cyan:active:focus,.btn-cyan.active:focus,.show>.btn-cyan.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #0baccc80}.btn-cyan:disabled,.btn-cyan.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-indigo{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-indigo:hover{color:#fff;background-color:#570ece;border-color:#520dc2}.btn-check:focus+.btn-indigo,.btn-indigo:focus{color:#fff;background-color:#570ece;border-color:#520dc2;box-shadow:0 0 0 .25rem #7d34f480}.btn-check:checked+.btn-indigo,.btn-check:active+.btn-indigo,.btn-indigo:active,.btn-indigo.active,.show>.btn-indigo.dropdown-toggle{color:#fff;background-color:#520dc2;border-color:#4d0cb6}.btn-check:checked+.btn-indigo:focus,.btn-check:active+.btn-indigo:focus,.btn-indigo:active:focus,.btn-indigo.active:focus,.show>.btn-indigo.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d34f480}.btn-indigo:disabled,.btn-indigo.disabled{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-purple{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-purple:hover{color:#fff;background-color:#5e38a4;border-color:#59359a}.btn-check:focus+.btn-purple,.btn-purple:focus{color:#fff;background-color:#5e38a4;border-color:#59359a;box-shadow:0 0 0 .25rem #855eca80}.btn-check:checked+.btn-purple,.btn-check:active+.btn-purple,.btn-purple:active,.btn-purple.active,.show>.btn-purple.dropdown-toggle{color:#fff;background-color:#59359a;border-color:#533291}.btn-check:checked+.btn-purple:focus,.btn-check:active+.btn-purple:focus,.btn-purple:active:focus,.btn-purple.active:focus,.show>.btn-purple.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #855eca80}.btn-purple:disabled,.btn-purple.disabled{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-pink{color:#fff;background-color:#d63384;border-color:#d63384}.btn-pink:hover{color:#fff;background-color:#b62b70;border-color:#ab296a}.btn-check:focus+.btn-pink,.btn-pink:focus{color:#fff;background-color:#b62b70;border-color:#ab296a;box-shadow:0 0 0 .25rem #dc529680}.btn-check:checked+.btn-pink,.btn-check:active+.btn-pink,.btn-pink:active,.btn-pink.active,.show>.btn-pink.dropdown-toggle{color:#fff;background-color:#ab296a;border-color:#a12663}.btn-check:checked+.btn-pink:focus,.btn-check:active+.btn-pink:focus,.btn-pink:active:focus,.btn-pink.active:focus,.show>.btn-pink.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #dc529680}.btn-pink:disabled,.btn-pink.disabled{color:#fff;background-color:#d63384;border-color:#d63384}.btn-darker{color:#fff;background-color:#1b1f22;border-color:#1b1f22}.btn-darker:hover{color:#fff;background-color:#171a1d;border-color:#16191b}.btn-check:focus+.btn-darker,.btn-darker:focus{color:#fff;background-color:#171a1d;border-color:#16191b;box-shadow:0 0 0 .25rem #3d414380}.btn-check:checked+.btn-darker,.btn-check:active+.btn-darker,.btn-darker:active,.btn-darker.active,.show>.btn-darker.dropdown-toggle{color:#fff;background-color:#16191b;border-color:#14171a}.btn-check:checked+.btn-darker:focus,.btn-check:active+.btn-darker:focus,.btn-darker:active:focus,.btn-darker.active:focus,.show>.btn-darker.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3d414380}.btn-darker:disabled,.btn-darker.disabled{color:#fff;background-color:#1b1f22;border-color:#1b1f22}.btn-darkest{color:#fff;background-color:#171b1d;border-color:#171b1d}.btn-darkest:hover{color:#fff;background-color:#141719;border-color:#121617}.btn-check:focus+.btn-darkest,.btn-darkest:focus{color:#fff;background-color:#141719;border-color:#121617;box-shadow:0 0 0 .25rem #3a3d3f80}.btn-check:checked+.btn-darkest,.btn-check:active+.btn-darkest,.btn-darkest:active,.btn-darkest.active,.show>.btn-darkest.dropdown-toggle{color:#fff;background-color:#121617;border-color:#111416}.btn-check:checked+.btn-darkest:focus,.btn-check:active+.btn-darkest:focus,.btn-darkest:active:focus,.btn-darkest.active:focus,.show>.btn-darkest.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3a3d3f80}.btn-darkest:disabled,.btn-darkest.disabled{color:#fff;background-color:#171b1d;border-color:#171b1d}.btn-gray{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-gray:hover{color:#000;background-color:#d5dae0;border-color:#d3d8de}.btn-check:focus+.btn-gray,.btn-gray:focus{color:#000;background-color:#d5dae0;border-color:#d3d8de;box-shadow:0 0 0 .25rem #afb4b980}.btn-check:checked+.btn-gray,.btn-check:active+.btn-gray,.btn-gray:active,.btn-gray.active,.show>.btn-gray.dropdown-toggle{color:#000;background-color:#d8dde1;border-color:#d3d8de}.btn-check:checked+.btn-gray:focus,.btn-check:active+.btn-gray:focus,.btn-gray:active:focus,.btn-gray.active:focus,.show>.btn-gray.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #afb4b980}.btn-gray:disabled,.btn-gray.disabled{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-gray-100{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-gray-100:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-gray-100,.btn-gray-100:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem #d3d4d580}.btn-check:checked+.btn-gray-100,.btn-check:active+.btn-gray-100,.btn-gray-100:active,.btn-gray-100.active,.show>.btn-gray-100.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:checked+.btn-gray-100:focus,.btn-check:active+.btn-gray-100:focus,.btn-gray-100:active:focus,.btn-gray-100.active:focus,.show>.btn-gray-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3d4d580}.btn-gray-100:disabled,.btn-gray-100.disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-gray-200{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-gray-200:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}.btn-check:focus+.btn-gray-200,.btn-gray-200:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}.btn-check:checked+.btn-gray-200,.btn-check:active+.btn-gray-200,.btn-gray-200:active,.btn-gray-200.active,.show>.btn-gray-200.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}.btn-check:checked+.btn-gray-200:focus,.btn-check:active+.btn-gray-200:focus,.btn-gray-200:active:focus,.btn-gray-200.active:focus,.show>.btn-gray-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}.btn-gray-200:disabled,.btn-gray-200.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-gray-300{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-gray-300:hover{color:#000;background-color:#e3e6ea;border-color:#e1e5e9}.btn-check:focus+.btn-gray-300,.btn-gray-300:focus{color:#000;background-color:#e3e6ea;border-color:#e1e5e9;box-shadow:0 0 0 .25rem #bdc0c480}.btn-check:checked+.btn-gray-300,.btn-check:active+.btn-gray-300,.btn-gray-300:active,.btn-gray-300.active,.show>.btn-gray-300.dropdown-toggle{color:#000;background-color:#e5e8eb;border-color:#e1e5e9}.btn-check:checked+.btn-gray-300:focus,.btn-check:active+.btn-gray-300:focus,.btn-gray-300:active:focus,.btn-gray-300.active:focus,.show>.btn-gray-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bdc0c480}.btn-gray-300:disabled,.btn-gray-300.disabled{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-gray-400{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-gray-400:hover{color:#000;background-color:#d5dae0;border-color:#d3d8de}.btn-check:focus+.btn-gray-400,.btn-gray-400:focus{color:#000;background-color:#d5dae0;border-color:#d3d8de;box-shadow:0 0 0 .25rem #afb4b980}.btn-check:checked+.btn-gray-400,.btn-check:active+.btn-gray-400,.btn-gray-400:active,.btn-gray-400.active,.show>.btn-gray-400.dropdown-toggle{color:#000;background-color:#d8dde1;border-color:#d3d8de}.btn-check:checked+.btn-gray-400:focus,.btn-check:active+.btn-gray-400:focus,.btn-gray-400:active:focus,.btn-gray-400.active:focus,.show>.btn-gray-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #afb4b980}.btn-gray-400:disabled,.btn-gray-400.disabled{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-gray-500{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-gray-500:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+.btn-gray-500,.btn-gray-500:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+.btn-gray-500,.btn-check:active+.btn-gray-500,.btn-gray-500:active,.btn-gray-500.active,.show>.btn-gray-500.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+.btn-gray-500:focus,.btn-check:active+.btn-gray-500:focus,.btn-gray-500:active:focus,.btn-gray-500.active:focus,.show>.btn-gray-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}.btn-gray-500:disabled,.btn-gray-500.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-gray-600{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-gray-600:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-gray-600,.btn-gray-600:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem #828a9180}.btn-check:checked+.btn-gray-600,.btn-check:active+.btn-gray-600,.btn-gray-600:active,.btn-gray-600.active,.show>.btn-gray-600.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:checked+.btn-gray-600:focus,.btn-check:active+.btn-gray-600:focus,.btn-gray-600:active:focus,.btn-gray-600.active:focus,.show>.btn-gray-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #828a9180}.btn-gray-600:disabled,.btn-gray-600.disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-gray-700{color:#fff;background-color:#495057;border-color:#495057}.btn-gray-700:hover{color:#fff;background-color:#3e444a;border-color:#3a4046}.btn-check:focus+.btn-gray-700,.btn-gray-700:focus{color:#fff;background-color:#3e444a;border-color:#3a4046;box-shadow:0 0 0 .25rem #646a7080}.btn-check:checked+.btn-gray-700,.btn-check:active+.btn-gray-700,.btn-gray-700:active,.btn-gray-700.active,.show>.btn-gray-700.dropdown-toggle{color:#fff;background-color:#3a4046;border-color:#373c41}.btn-check:checked+.btn-gray-700:focus,.btn-check:active+.btn-gray-700:focus,.btn-gray-700:active:focus,.btn-gray-700.active:focus,.show>.btn-gray-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #646a7080}.btn-gray-700:disabled,.btn-gray-700.disabled{color:#fff;background-color:#495057;border-color:#495057}.btn-gray-800{color:#fff;background-color:#343a40;border-color:#343a40}.btn-gray-800:hover{color:#fff;background-color:#2c3136;border-color:#2a2e33}.btn-check:focus+.btn-gray-800,.btn-gray-800:focus{color:#fff;background-color:#2c3136;border-color:#2a2e33;box-shadow:0 0 0 .25rem #52585d80}.btn-check:checked+.btn-gray-800,.btn-check:active+.btn-gray-800,.btn-gray-800:active,.btn-gray-800.active,.show>.btn-gray-800.dropdown-toggle{color:#fff;background-color:#2a2e33;border-color:#272c30}.btn-check:checked+.btn-gray-800:focus,.btn-check:active+.btn-gray-800:focus,.btn-gray-800:active:focus,.btn-gray-800.active:focus,.show>.btn-gray-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52585d80}.btn-gray-800:disabled,.btn-gray-800.disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-gray-900{color:#fff;background-color:#212529;border-color:#212529}.btn-gray-900:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-gray-900,.btn-gray-900:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem #42464980}.btn-check:checked+.btn-gray-900,.btn-check:active+.btn-gray-900,.btn-gray-900:active,.btn-gray-900.active,.show>.btn-gray-900.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:checked+.btn-gray-900:focus,.btn-check:active+.btn-gray-900:focus,.btn-gray-900:active:focus,.btn-gray-900.active:focus,.show>.btn-gray-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #42464980}.btn-gray-900:disabled,.btn-gray-900.disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-red-100{color:#000;background-color:#f8d7da;border-color:#f8d7da}.btn-red-100:hover{color:#000;background-color:#f9dde0;border-color:#f9dbde}.btn-check:focus+.btn-red-100,.btn-red-100:focus{color:#000;background-color:#f9dde0;border-color:#f9dbde;box-shadow:0 0 0 .25rem #d3b7b980}.btn-check:checked+.btn-red-100,.btn-check:active+.btn-red-100,.btn-red-100:active,.btn-red-100.active,.show>.btn-red-100.dropdown-toggle{color:#000;background-color:#f9dfe1;border-color:#f9dbde}.btn-check:checked+.btn-red-100:focus,.btn-check:active+.btn-red-100:focus,.btn-red-100:active:focus,.btn-red-100.active:focus,.show>.btn-red-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3b7b980}.btn-red-100:disabled,.btn-red-100.disabled{color:#000;background-color:#f8d7da;border-color:#f8d7da}.btn-red-200{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}.btn-red-200:hover{color:#000;background-color:#f3bac0;border-color:#f2b6bc}.btn-check:focus+.btn-red-200,.btn-red-200:focus{color:#000;background-color:#f3bac0;border-color:#f2b6bc;box-shadow:0 0 0 .25rem #cd949a80}.btn-check:checked+.btn-red-200,.btn-check:active+.btn-red-200,.btn-red-200:active,.btn-red-200.active,.show>.btn-red-200.dropdown-toggle{color:#000;background-color:#f4bec4;border-color:#f2b6bc}.btn-check:checked+.btn-red-200:focus,.btn-check:active+.btn-red-200:focus,.btn-red-200:active:focus,.btn-red-200.active:focus,.show>.btn-red-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #cd949a80}.btn-red-200:disabled,.btn-red-200.disabled{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}.btn-red-300{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-red-300:hover{color:#000;background-color:#ed98a0;border-color:#ec929a}.btn-check:focus+.btn-red-300,.btn-red-300:focus{color:#000;background-color:#ed98a0;border-color:#ec929a;box-shadow:0 0 0 .25rem #c7727a80}.btn-check:checked+.btn-red-300,.btn-check:active+.btn-red-300,.btn-red-300:active,.btn-red-300.active,.show>.btn-red-300.dropdown-toggle{color:#000;background-color:#ee9ea5;border-color:#ec929a}.btn-check:checked+.btn-red-300:focus,.btn-check:active+.btn-red-300:focus,.btn-red-300:active:focus,.btn-red-300.active:focus,.show>.btn-red-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c7727a80}.btn-red-300:disabled,.btn-red-300.disabled{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-red-400{color:#000;background-color:#e35d6a;border-color:#e35d6a}.btn-red-400:hover{color:#000;background-color:#e77580;border-color:#e66d79}.btn-check:focus+.btn-red-400,.btn-red-400:focus{color:#000;background-color:#e77580;border-color:#e66d79;box-shadow:0 0 0 .25rem #c14f5a80}.btn-check:checked+.btn-red-400,.btn-check:active+.btn-red-400,.btn-red-400:active,.btn-red-400.active,.show>.btn-red-400.dropdown-toggle{color:#000;background-color:#e97d88;border-color:#e66d79}.btn-check:checked+.btn-red-400:focus,.btn-check:active+.btn-red-400:focus,.btn-red-400:active:focus,.btn-red-400.active:focus,.show>.btn-red-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c14f5a80}.btn-red-400:disabled,.btn-red-400.disabled{color:#000;background-color:#e35d6a;border-color:#e35d6a}.btn-red-500{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-red-500:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-red-500,.btn-red-500:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+.btn-red-500,.btn-check:active+.btn-red-500,.btn-red-500:active,.btn-red-500.active,.show>.btn-red-500.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+.btn-red-500:focus,.btn-check:active+.btn-red-500:focus,.btn-red-500:active:focus,.btn-red-500.active:focus,.show>.btn-red-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}.btn-red-500:disabled,.btn-red-500.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-red-600{color:#fff;background-color:#b02a37;border-color:#b02a37}.btn-red-600:hover{color:#fff;background-color:#96242f;border-color:#8d222c}.btn-check:focus+.btn-red-600,.btn-red-600:focus{color:#fff;background-color:#96242f;border-color:#8d222c;box-shadow:0 0 0 .25rem #bc4a5580}.btn-check:checked+.btn-red-600,.btn-check:active+.btn-red-600,.btn-red-600:active,.btn-red-600.active,.show>.btn-red-600.dropdown-toggle{color:#fff;background-color:#8d222c;border-color:#842029}.btn-check:checked+.btn-red-600:focus,.btn-check:active+.btn-red-600:focus,.btn-red-600:active:focus,.btn-red-600.active:focus,.show>.btn-red-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bc4a5580}.btn-red-600:disabled,.btn-red-600.disabled{color:#fff;background-color:#b02a37;border-color:#b02a37}.btn-red-700{color:#fff;background-color:#842029;border-color:#842029}.btn-red-700:hover{color:#fff;background-color:#701b23;border-color:#6a1a21}.btn-check:focus+.btn-red-700,.btn-red-700:focus{color:#fff;background-color:#701b23;border-color:#6a1a21;box-shadow:0 0 0 .25rem #96414980}.btn-check:checked+.btn-red-700,.btn-check:active+.btn-red-700,.btn-red-700:active,.btn-red-700.active,.show>.btn-red-700.dropdown-toggle{color:#fff;background-color:#6a1a21;border-color:#63181f}.btn-check:checked+.btn-red-700:focus,.btn-check:active+.btn-red-700:focus,.btn-red-700:active:focus,.btn-red-700.active:focus,.show>.btn-red-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #96414980}.btn-red-700:disabled,.btn-red-700.disabled{color:#fff;background-color:#842029;border-color:#842029}.btn-red-800{color:#fff;background-color:#58151c;border-color:#58151c}.btn-red-800:hover{color:#fff;background-color:#4b1218;border-color:#461116}.btn-check:focus+.btn-red-800,.btn-red-800:focus{color:#fff;background-color:#4b1218;border-color:#461116;box-shadow:0 0 0 .25rem #71383e80}.btn-check:checked+.btn-red-800,.btn-check:active+.btn-red-800,.btn-red-800:active,.btn-red-800.active,.show>.btn-red-800.dropdown-toggle{color:#fff;background-color:#461116;border-color:#421015}.btn-check:checked+.btn-red-800:focus,.btn-check:active+.btn-red-800:focus,.btn-red-800:active:focus,.btn-red-800.active:focus,.show>.btn-red-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #71383e80}.btn-red-800:disabled,.btn-red-800.disabled{color:#fff;background-color:#58151c;border-color:#58151c}.btn-red-900{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}.btn-red-900:hover{color:#fff;background-color:#25090c;border-color:#23090b}.btn-check:focus+.btn-red-900,.btn-red-900:focus{color:#fff;background-color:#25090c;border-color:#23090b;box-shadow:0 0 0 .25rem #4c303280}.btn-check:checked+.btn-red-900,.btn-check:active+.btn-red-900,.btn-red-900:active,.btn-red-900.active,.show>.btn-red-900.dropdown-toggle{color:#fff;background-color:#23090b;border-color:#21080b}.btn-check:checked+.btn-red-900:focus,.btn-check:active+.btn-red-900:focus,.btn-red-900:active:focus,.btn-red-900.active:focus,.show>.btn-red-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4c303280}.btn-red-900:disabled,.btn-red-900.disabled{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}.btn-yellow-100{color:#000;background-color:#fff3cd;border-color:#fff3cd}.btn-yellow-100:hover{color:#000;background-color:#fff5d5;border-color:#fff4d2}.btn-check:focus+.btn-yellow-100,.btn-yellow-100:focus{color:#000;background-color:#fff5d5;border-color:#fff4d2;box-shadow:0 0 0 .25rem #d9cfae80}.btn-check:checked+.btn-yellow-100,.btn-check:active+.btn-yellow-100,.btn-yellow-100:active,.btn-yellow-100.active,.show>.btn-yellow-100.dropdown-toggle{color:#000;background-color:#fff5d7;border-color:#fff4d2}.btn-check:checked+.btn-yellow-100:focus,.btn-check:active+.btn-yellow-100:focus,.btn-yellow-100:active:focus,.btn-yellow-100.active:focus,.show>.btn-yellow-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9cfae80}.btn-yellow-100:disabled,.btn-yellow-100.disabled{color:#000;background-color:#fff3cd;border-color:#fff3cd}.btn-yellow-200{color:#000;background-color:#ffe69c;border-color:#ffe69c}.btn-yellow-200:hover{color:#000;background-color:#ffeaab;border-color:#ffe9a6}.btn-check:focus+.btn-yellow-200,.btn-yellow-200:focus{color:#000;background-color:#ffeaab;border-color:#ffe9a6;box-shadow:0 0 0 .25rem #d9c48580}.btn-check:checked+.btn-yellow-200,.btn-check:active+.btn-yellow-200,.btn-yellow-200:active,.btn-yellow-200.active,.show>.btn-yellow-200.dropdown-toggle{color:#000;background-color:#ffebb0;border-color:#ffe9a6}.btn-check:checked+.btn-yellow-200:focus,.btn-check:active+.btn-yellow-200:focus,.btn-yellow-200:active:focus,.btn-yellow-200.active:focus,.show>.btn-yellow-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9c48580}.btn-yellow-200:disabled,.btn-yellow-200.disabled{color:#000;background-color:#ffe69c;border-color:#ffe69c}.btn-yellow-300{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-yellow-300:hover{color:#000;background-color:#ffe080;border-color:#ffde79}.btn-check:focus+.btn-yellow-300,.btn-yellow-300:focus{color:#000;background-color:#ffe080;border-color:#ffde79;box-shadow:0 0 0 .25rem #d9b95a80}.btn-check:checked+.btn-yellow-300,.btn-check:active+.btn-yellow-300,.btn-yellow-300:active,.btn-yellow-300.active,.show>.btn-yellow-300.dropdown-toggle{color:#000;background-color:#ffe188;border-color:#ffde79}.btn-check:checked+.btn-yellow-300:focus,.btn-check:active+.btn-yellow-300:focus,.btn-yellow-300:active:focus,.btn-yellow-300.active:focus,.show>.btn-yellow-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9b95a80}.btn-yellow-300:disabled,.btn-yellow-300.disabled{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-yellow-400{color:#000;background-color:#ffcd39;border-color:#ffcd39}.btn-yellow-400:hover{color:#000;background-color:#ffd557;border-color:#ffd24d}.btn-check:focus+.btn-yellow-400,.btn-yellow-400:focus{color:#000;background-color:#ffd557;border-color:#ffd24d;box-shadow:0 0 0 .25rem #d9ae3080}.btn-check:checked+.btn-yellow-400,.btn-check:active+.btn-yellow-400,.btn-yellow-400:active,.btn-yellow-400.active,.show>.btn-yellow-400.dropdown-toggle{color:#000;background-color:#ffd761;border-color:#ffd24d}.btn-check:checked+.btn-yellow-400:focus,.btn-check:active+.btn-yellow-400:focus,.btn-yellow-400:active:focus,.btn-yellow-400.active:focus,.show>.btn-yellow-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9ae3080}.btn-yellow-400:disabled,.btn-yellow-400.disabled{color:#000;background-color:#ffcd39;border-color:#ffcd39}.btn-yellow-500{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-yellow-500:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-yellow-500,.btn-yellow-500:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+.btn-yellow-500,.btn-check:active+.btn-yellow-500,.btn-yellow-500:active,.btn-yellow-500.active,.show>.btn-yellow-500.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+.btn-yellow-500:focus,.btn-check:active+.btn-yellow-500:focus,.btn-yellow-500:active:focus,.btn-yellow-500.active:focus,.show>.btn-yellow-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}.btn-yellow-500:disabled,.btn-yellow-500.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-yellow-600{color:#000;background-color:#cc9a06;border-color:#cc9a06}.btn-yellow-600:hover{color:#000;background-color:#d4a92b;border-color:#d1a41f}.btn-check:focus+.btn-yellow-600,.btn-yellow-600:focus{color:#000;background-color:#d4a92b;border-color:#d1a41f;box-shadow:0 0 0 .25rem #ad830580}.btn-check:checked+.btn-yellow-600,.btn-check:active+.btn-yellow-600,.btn-yellow-600:active,.btn-yellow-600.active,.show>.btn-yellow-600.dropdown-toggle{color:#000;background-color:#d6ae38;border-color:#d1a41f}.btn-check:checked+.btn-yellow-600:focus,.btn-check:active+.btn-yellow-600:focus,.btn-yellow-600:active:focus,.btn-yellow-600.active:focus,.show>.btn-yellow-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #ad830580}.btn-yellow-600:disabled,.btn-yellow-600.disabled{color:#000;background-color:#cc9a06;border-color:#cc9a06}.btn-yellow-700{color:#000;background-color:#997404;border-color:#997404}.btn-yellow-700:hover{color:#000;background-color:#a8892a;border-color:#a3821d}.btn-check:focus+.btn-yellow-700,.btn-yellow-700:focus{color:#000;background-color:#a8892a;border-color:#a3821d;box-shadow:0 0 0 .25rem #82630380}.btn-check:checked+.btn-yellow-700,.btn-check:active+.btn-yellow-700,.btn-yellow-700:active,.btn-yellow-700.active,.show>.btn-yellow-700.dropdown-toggle{color:#000;background-color:#ad9036;border-color:#a3821d}.btn-check:checked+.btn-yellow-700:focus,.btn-check:active+.btn-yellow-700:focus,.btn-yellow-700:active:focus,.btn-yellow-700.active:focus,.show>.btn-yellow-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #82630380}.btn-yellow-700:disabled,.btn-yellow-700.disabled{color:#000;background-color:#997404;border-color:#997404}.btn-yellow-800{color:#fff;background-color:#664d03;border-color:#664d03}.btn-yellow-800:hover{color:#fff;background-color:#574103;border-color:#523e02}.btn-check:focus+.btn-yellow-800,.btn-yellow-800:focus{color:#fff;background-color:#574103;border-color:#523e02;box-shadow:0 0 0 .25rem #7d682980}.btn-check:checked+.btn-yellow-800,.btn-check:active+.btn-yellow-800,.btn-yellow-800:active,.btn-yellow-800.active,.show>.btn-yellow-800.dropdown-toggle{color:#fff;background-color:#523e02;border-color:#4d3a02}.btn-check:checked+.btn-yellow-800:focus,.btn-check:active+.btn-yellow-800:focus,.btn-yellow-800:active:focus,.btn-yellow-800.active:focus,.show>.btn-yellow-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d682980}.btn-yellow-800:disabled,.btn-yellow-800.disabled{color:#fff;background-color:#664d03;border-color:#664d03}.btn-yellow-900{color:#fff;background-color:#332701;border-color:#332701}.btn-yellow-900:hover{color:#fff;background-color:#2b2101;border-color:#291f01}.btn-check:focus+.btn-yellow-900,.btn-yellow-900:focus{color:#fff;background-color:#2b2101;border-color:#291f01;box-shadow:0 0 0 .25rem #52472780}.btn-check:checked+.btn-yellow-900,.btn-check:active+.btn-yellow-900,.btn-yellow-900:active,.btn-yellow-900.active,.show>.btn-yellow-900.dropdown-toggle{color:#fff;background-color:#291f01;border-color:#261d01}.btn-check:checked+.btn-yellow-900:focus,.btn-check:active+.btn-yellow-900:focus,.btn-yellow-900:active:focus,.btn-yellow-900.active:focus,.show>.btn-yellow-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52472780}.btn-yellow-900:disabled,.btn-yellow-900.disabled{color:#fff;background-color:#332701;border-color:#332701}.btn-green-100{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}.btn-green-100:hover{color:#000;background-color:#d8ebe2;border-color:#d6e9e0}.btn-check:focus+.btn-green-100,.btn-green-100:focus{color:#000;background-color:#d8ebe2;border-color:#d6e9e0;box-shadow:0 0 0 .25rem #b2c4bc80}.btn-check:checked+.btn-green-100,.btn-check:active+.btn-green-100,.btn-green-100:active,.btn-green-100.active,.show>.btn-green-100.dropdown-toggle{color:#000;background-color:#daece4;border-color:#d6e9e0}.btn-check:checked+.btn-green-100:focus,.btn-check:active+.btn-green-100:focus,.btn-green-100:active:focus,.btn-green-100.active:focus,.show>.btn-green-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b2c4bc80}.btn-green-100:disabled,.btn-green-100.disabled{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}.btn-green-200{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}.btn-green-200:hover{color:#000;background-color:#b1d6c5;border-color:#acd4c2}.btn-check:focus+.btn-green-200,.btn-green-200:focus{color:#000;background-color:#b1d6c5;border-color:#acd4c2;box-shadow:0 0 0 .25rem #8bb09f80}.btn-check:checked+.btn-green-200,.btn-check:active+.btn-green-200,.btn-green-200:active,.btn-green-200.active,.show>.btn-green-200.dropdown-toggle{color:#000;background-color:#b5d9c9;border-color:#acd4c2}.btn-check:checked+.btn-green-200:focus,.btn-check:active+.btn-green-200:focus,.btn-green-200:active:focus,.btn-green-200.active:focus,.show>.btn-green-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #8bb09f80}.btn-green-200:disabled,.btn-green-200.disabled{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}.btn-green-300{color:#000;background-color:#75b798;border-color:#75b798}.btn-green-300:hover{color:#000;background-color:#8ac2a7;border-color:#83bea2}.btn-check:focus+.btn-green-300,.btn-green-300:focus{color:#000;background-color:#8ac2a7;border-color:#83bea2;box-shadow:0 0 0 .25rem #639c8180}.btn-check:checked+.btn-green-300,.btn-check:active+.btn-green-300,.btn-green-300:active,.btn-green-300.active,.show>.btn-green-300.dropdown-toggle{color:#000;background-color:#91c5ad;border-color:#83bea2}.btn-check:checked+.btn-green-300:focus,.btn-check:active+.btn-green-300:focus,.btn-green-300:active:focus,.btn-green-300.active:focus,.show>.btn-green-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #639c8180}.btn-green-300:disabled,.btn-green-300.disabled{color:#000;background-color:#75b798;border-color:#75b798}.btn-green-400{color:#000;background-color:#479f76;border-color:#479f76}.btn-green-400:hover{color:#000;background-color:#63ad8b;border-color:#59a984}.btn-check:focus+.btn-green-400,.btn-green-400:focus{color:#000;background-color:#63ad8b;border-color:#59a984;box-shadow:0 0 0 .25rem #3c876480}.btn-check:checked+.btn-green-400,.btn-check:active+.btn-green-400,.btn-green-400:active,.btn-green-400.active,.show>.btn-green-400.dropdown-toggle{color:#000;background-color:#6cb291;border-color:#59a984}.btn-check:checked+.btn-green-400:focus,.btn-check:active+.btn-green-400:focus,.btn-green-400:active:focus,.btn-green-400.active:focus,.show>.btn-green-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c876480}.btn-green-400:disabled,.btn-green-400.disabled{color:#000;background-color:#479f76;border-color:#479f76}.btn-green-500{color:#fff;background-color:#198754;border-color:#198754}.btn-green-500:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-green-500,.btn-green-500:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+.btn-green-500,.btn-check:active+.btn-green-500,.btn-green-500:active,.btn-green-500.active,.show>.btn-green-500.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+.btn-green-500:focus,.btn-check:active+.btn-green-500:focus,.btn-green-500:active:focus,.btn-green-500.active:focus,.show>.btn-green-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}.btn-green-500:disabled,.btn-green-500.disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-green-600{color:#fff;background-color:#146c43;border-color:#146c43}.btn-green-600:hover{color:#fff;background-color:#115c39;border-color:#105636}.btn-check:focus+.btn-green-600,.btn-green-600:focus{color:#fff;background-color:#115c39;border-color:#105636;box-shadow:0 0 0 .25rem #37825f80}.btn-check:checked+.btn-green-600,.btn-check:active+.btn-green-600,.btn-green-600:active,.btn-green-600.active,.show>.btn-green-600.dropdown-toggle{color:#fff;background-color:#105636;border-color:#0f5132}.btn-check:checked+.btn-green-600:focus,.btn-check:active+.btn-green-600:focus,.btn-green-600:active:focus,.btn-green-600.active:focus,.show>.btn-green-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #37825f80}.btn-green-600:disabled,.btn-green-600.disabled{color:#fff;background-color:#146c43;border-color:#146c43}.btn-green-700{color:#fff;background-color:#0f5132;border-color:#0f5132}.btn-green-700:hover{color:#fff;background-color:#0d452b;border-color:#0c4128}.btn-check:focus+.btn-green-700,.btn-green-700:focus{color:#fff;background-color:#0d452b;border-color:#0c4128;box-shadow:0 0 0 .25rem #336b5180}.btn-check:checked+.btn-green-700,.btn-check:active+.btn-green-700,.btn-green-700:active,.btn-green-700.active,.show>.btn-green-700.dropdown-toggle{color:#fff;background-color:#0c4128;border-color:#0b3d26}.btn-check:checked+.btn-green-700:focus,.btn-check:active+.btn-green-700:focus,.btn-green-700:active:focus,.btn-green-700.active:focus,.show>.btn-green-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #336b5180}.btn-green-700:disabled,.btn-green-700.disabled{color:#fff;background-color:#0f5132;border-color:#0f5132}.btn-green-800{color:#fff;background-color:#0a3622;border-color:#0a3622}.btn-green-800:hover{color:#fff;background-color:#092e1d;border-color:#082b1b}.btn-check:focus+.btn-green-800,.btn-green-800:focus{color:#fff;background-color:#092e1d;border-color:#082b1b;box-shadow:0 0 0 .25rem #2f544380}.btn-check:checked+.btn-green-800,.btn-check:active+.btn-green-800,.btn-green-800:active,.btn-green-800.active,.show>.btn-green-800.dropdown-toggle{color:#fff;background-color:#082b1b;border-color:#08291a}.btn-check:checked+.btn-green-800:focus,.btn-check:active+.btn-green-800:focus,.btn-green-800:active:focus,.btn-green-800.active:focus,.show>.btn-green-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2f544380}.btn-green-800:disabled,.btn-green-800.disabled{color:#fff;background-color:#0a3622;border-color:#0a3622}.btn-green-900{color:#fff;background-color:#051b11;border-color:#051b11}.btn-green-900:hover{color:#fff;background-color:#04170e;border-color:#04160e}.btn-check:focus+.btn-green-900,.btn-green-900:focus{color:#fff;background-color:#04170e;border-color:#04160e;box-shadow:0 0 0 .25rem #2b3d3580}.btn-check:checked+.btn-green-900,.btn-check:active+.btn-green-900,.btn-green-900:active,.btn-green-900.active,.show>.btn-green-900.dropdown-toggle{color:#fff;background-color:#04160e;border-color:#04140d}.btn-check:checked+.btn-green-900:focus,.btn-check:active+.btn-green-900:focus,.btn-green-900:active:focus,.btn-green-900.active:focus,.show>.btn-green-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b3d3580}.btn-green-900:disabled,.btn-green-900.disabled{color:#fff;background-color:#051b11;border-color:#051b11}.btn-blue-100{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}.btn-blue-100:hover{color:#000;background-color:#d6e6ff;border-color:#d4e5ff}.btn-check:focus+.btn-blue-100,.btn-blue-100:focus{color:#000;background-color:#d6e6ff;border-color:#d4e5ff;box-shadow:0 0 0 .25rem #b0c0d980}.btn-check:checked+.btn-blue-100,.btn-check:active+.btn-blue-100,.btn-blue-100:active,.btn-blue-100.active,.show>.btn-blue-100.dropdown-toggle{color:#000;background-color:#d9e8ff;border-color:#d4e5ff}.btn-check:checked+.btn-blue-100:focus,.btn-check:active+.btn-blue-100:focus,.btn-blue-100:active:focus,.btn-blue-100.active:focus,.show>.btn-blue-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b0c0d980}.btn-blue-100:disabled,.btn-blue-100.disabled{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}.btn-blue-200{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}.btn-blue-200:hover{color:#000;background-color:#adcefe;border-color:#a8cbfe}.btn-check:focus+.btn-blue-200,.btn-blue-200:focus{color:#000;background-color:#adcefe;border-color:#a8cbfe;box-shadow:0 0 0 .25rem #86a7d880}.btn-check:checked+.btn-blue-200,.btn-check:active+.btn-blue-200,.btn-blue-200:active,.btn-blue-200.active,.show>.btn-blue-200.dropdown-toggle{color:#000;background-color:#b1d1fe;border-color:#a8cbfe}.btn-check:checked+.btn-blue-200:focus,.btn-check:active+.btn-blue-200:focus,.btn-blue-200:active:focus,.btn-blue-200.active:focus,.show>.btn-blue-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #86a7d880}.btn-blue-200:disabled,.btn-blue-200.disabled{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}.btn-blue-300{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-blue-300:hover{color:#000;background-color:#84b5fe;border-color:#7db1fe}.btn-check:focus+.btn-blue-300,.btn-blue-300:focus{color:#000;background-color:#84b5fe;border-color:#7db1fe;box-shadow:0 0 0 .25rem #5e8fd880}.btn-check:checked+.btn-blue-300,.btn-check:active+.btn-blue-300,.btn-blue-300:active,.btn-blue-300.active,.show>.btn-blue-300.dropdown-toggle{color:#000;background-color:#8bb9fe;border-color:#7db1fe}.btn-check:checked+.btn-blue-300:focus,.btn-check:active+.btn-blue-300:focus,.btn-blue-300:active:focus,.btn-blue-300.active:focus,.show>.btn-blue-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5e8fd880}.btn-blue-300:disabled,.btn-blue-300.disabled{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-blue-400{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}.btn-blue-400:hover{color:#000;background-color:#5a9cfd;border-color:#5097fd}.btn-check:focus+.btn-blue-400,.btn-blue-400:focus{color:#000;background-color:#5a9cfd;border-color:#5097fd;box-shadow:0 0 0 .25rem #3476d780}.btn-check:checked+.btn-blue-400,.btn-check:active+.btn-blue-400,.btn-blue-400:active,.btn-blue-400.active,.show>.btn-blue-400.dropdown-toggle{color:#000;background-color:#64a2fd;border-color:#5097fd}.btn-check:checked+.btn-blue-400:focus,.btn-check:active+.btn-blue-400:focus,.btn-blue-400:active:focus,.btn-blue-400.active:focus,.show>.btn-blue-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3476d780}.btn-blue-400:disabled,.btn-blue-400.disabled{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}.btn-blue-500{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-blue-500:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-blue-500,.btn-blue-500:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem #3184fd80}.btn-check:checked+.btn-blue-500,.btn-check:active+.btn-blue-500,.btn-blue-500:active,.btn-blue-500.active,.show>.btn-blue-500.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:checked+.btn-blue-500:focus,.btn-check:active+.btn-blue-500:focus,.btn-blue-500:active:focus,.btn-blue-500.active:focus,.show>.btn-blue-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3184fd80}.btn-blue-500:disabled,.btn-blue-500.disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-blue-600{color:#fff;background-color:#0a58ca;border-color:#0a58ca}.btn-blue-600:hover{color:#fff;background-color:#094bac;border-color:#0846a2}.btn-check:focus+.btn-blue-600,.btn-blue-600:focus{color:#fff;background-color:#094bac;border-color:#0846a2;box-shadow:0 0 0 .25rem #2f71d280}.btn-check:checked+.btn-blue-600,.btn-check:active+.btn-blue-600,.btn-blue-600:active,.btn-blue-600.active,.show>.btn-blue-600.dropdown-toggle{color:#fff;background-color:#0846a2;border-color:#084298}.btn-check:checked+.btn-blue-600:focus,.btn-check:active+.btn-blue-600:focus,.btn-blue-600:active:focus,.btn-blue-600.active:focus,.show>.btn-blue-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2f71d280}.btn-blue-600:disabled,.btn-blue-600.disabled{color:#fff;background-color:#0a58ca;border-color:#0a58ca}.btn-blue-700{color:#fff;background-color:#084298;border-color:#084298}.btn-blue-700:hover{color:#fff;background-color:#073881;border-color:#06357a}.btn-check:focus+.btn-blue-700,.btn-blue-700:focus{color:#fff;background-color:#073881;border-color:#06357a;box-shadow:0 0 0 .25rem #2d5ea780}.btn-check:checked+.btn-blue-700,.btn-check:active+.btn-blue-700,.btn-blue-700:active,.btn-blue-700.active,.show>.btn-blue-700.dropdown-toggle{color:#fff;background-color:#06357a;border-color:#063272}.btn-check:checked+.btn-blue-700:focus,.btn-check:active+.btn-blue-700:focus,.btn-blue-700:active:focus,.btn-blue-700.active:focus,.show>.btn-blue-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2d5ea780}.btn-blue-700:disabled,.btn-blue-700.disabled{color:#fff;background-color:#084298;border-color:#084298}.btn-blue-800{color:#fff;background-color:#052c65;border-color:#052c65}.btn-blue-800:hover{color:#fff;background-color:#042556;border-color:#042351}.btn-check:focus+.btn-blue-800,.btn-blue-800:focus{color:#fff;background-color:#042556;border-color:#042351;box-shadow:0 0 0 .25rem #2b4c7c80}.btn-check:checked+.btn-blue-800,.btn-check:active+.btn-blue-800,.btn-blue-800:active,.btn-blue-800.active,.show>.btn-blue-800.dropdown-toggle{color:#fff;background-color:#042351;border-color:#04214c}.btn-check:checked+.btn-blue-800:focus,.btn-check:active+.btn-blue-800:focus,.btn-blue-800:active:focus,.btn-blue-800.active:focus,.show>.btn-blue-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b4c7c80}.btn-blue-800:disabled,.btn-blue-800.disabled{color:#fff;background-color:#052c65;border-color:#052c65}.btn-blue-900{color:#fff;background-color:#031633;border-color:#031633}.btn-blue-900:hover{color:#fff;background-color:#03132b;border-color:#021229}.btn-check:focus+.btn-blue-900,.btn-blue-900:focus{color:#fff;background-color:#03132b;border-color:#021229;box-shadow:0 0 0 .25rem #29395280}.btn-check:checked+.btn-blue-900,.btn-check:active+.btn-blue-900,.btn-blue-900:active,.btn-blue-900.active,.show>.btn-blue-900.dropdown-toggle{color:#fff;background-color:#021229;border-color:#021126}.btn-check:checked+.btn-blue-900:focus,.btn-check:active+.btn-blue-900:focus,.btn-blue-900:active:focus,.btn-blue-900.active:focus,.show>.btn-blue-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #29395280}.btn-blue-900:disabled,.btn-blue-900.disabled{color:#fff;background-color:#031633;border-color:#031633}.btn-cyan-100{color:#000;background-color:#cff4fc;border-color:#cff4fc}.btn-cyan-100:hover{color:#000;background-color:#d6f6fc;border-color:#d4f5fc}.btn-check:focus+.btn-cyan-100,.btn-cyan-100:focus{color:#000;background-color:#d6f6fc;border-color:#d4f5fc;box-shadow:0 0 0 .25rem #b0cfd680}.btn-check:checked+.btn-cyan-100,.btn-check:active+.btn-cyan-100,.btn-cyan-100:active,.btn-cyan-100.active,.show>.btn-cyan-100.dropdown-toggle{color:#000;background-color:#d9f6fd;border-color:#d4f5fc}.btn-check:checked+.btn-cyan-100:focus,.btn-check:active+.btn-cyan-100:focus,.btn-cyan-100:active:focus,.btn-cyan-100.active:focus,.show>.btn-cyan-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b0cfd680}.btn-cyan-100:disabled,.btn-cyan-100.disabled{color:#000;background-color:#cff4fc;border-color:#cff4fc}.btn-cyan-200{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}.btn-cyan-200:hover{color:#000;background-color:#adedfa;border-color:#a8ecfa}.btn-check:focus+.btn-cyan-200,.btn-cyan-200:focus{color:#000;background-color:#adedfa;border-color:#a8ecfa;box-shadow:0 0 0 .25rem #86c7d480}.btn-check:checked+.btn-cyan-200,.btn-check:active+.btn-cyan-200,.btn-cyan-200:active,.btn-cyan-200.active,.show>.btn-cyan-200.dropdown-toggle{color:#000;background-color:#b1eefa;border-color:#a8ecfa}.btn-check:checked+.btn-cyan-200:focus,.btn-check:active+.btn-cyan-200:focus,.btn-cyan-200:active:focus,.btn-cyan-200.active:focus,.show>.btn-cyan-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #86c7d480}.btn-cyan-200:disabled,.btn-cyan-200.disabled{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}.btn-cyan-300{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-cyan-300:hover{color:#000;background-color:#84e4f7;border-color:#7de2f7}.btn-check:focus+.btn-cyan-300,.btn-cyan-300:focus{color:#000;background-color:#84e4f7;border-color:#7de2f7;box-shadow:0 0 0 .25rem #5ebed180}.btn-check:checked+.btn-cyan-300,.btn-check:active+.btn-cyan-300,.btn-cyan-300:active,.btn-cyan-300.active,.show>.btn-cyan-300.dropdown-toggle{color:#000;background-color:#8be5f8;border-color:#7de2f7}.btn-check:checked+.btn-cyan-300:focus,.btn-check:active+.btn-cyan-300:focus,.btn-cyan-300:active:focus,.btn-cyan-300.active:focus,.show>.btn-cyan-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5ebed180}.btn-cyan-300:disabled,.btn-cyan-300.disabled{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-cyan-400{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}.btn-cyan-400:hover{color:#000;background-color:#5adbf5;border-color:#50d9f4}.btn-check:focus+.btn-cyan-400,.btn-cyan-400:focus{color:#000;background-color:#5adbf5;border-color:#50d9f4;box-shadow:0 0 0 .25rem #34b5cf80}.btn-check:checked+.btn-cyan-400,.btn-check:active+.btn-cyan-400,.btn-cyan-400:active,.btn-cyan-400.active,.show>.btn-cyan-400.dropdown-toggle{color:#000;background-color:#64ddf5;border-color:#50d9f4}.btn-check:checked+.btn-cyan-400:focus,.btn-check:active+.btn-cyan-400:focus,.btn-cyan-400:active:focus,.btn-cyan-400.active:focus,.show>.btn-cyan-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #34b5cf80}.btn-cyan-400:disabled,.btn-cyan-400.disabled{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}.btn-cyan-500{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-cyan-500:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-cyan-500,.btn-cyan-500:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem #0baccc80}.btn-check:checked+.btn-cyan-500,.btn-check:active+.btn-cyan-500,.btn-cyan-500:active,.btn-cyan-500.active,.show>.btn-cyan-500.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+.btn-cyan-500:focus,.btn-check:active+.btn-cyan-500:focus,.btn-cyan-500:active:focus,.btn-cyan-500.active:focus,.show>.btn-cyan-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #0baccc80}.btn-cyan-500:disabled,.btn-cyan-500.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-cyan-600{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}.btn-cyan-600:hover{color:#000;background-color:#2fb0c9;border-color:#23abc6}.btn-check:focus+.btn-cyan-600,.btn-cyan-600:focus{color:#000;background-color:#2fb0c9;border-color:#23abc6;box-shadow:0 0 0 .25rem #098aa380}.btn-check:checked+.btn-cyan-600,.btn-check:active+.btn-cyan-600,.btn-cyan-600:active,.btn-cyan-600.active,.show>.btn-cyan-600.dropdown-toggle{color:#000;background-color:#3bb5cd;border-color:#23abc6}.btn-check:checked+.btn-cyan-600:focus,.btn-check:active+.btn-cyan-600:focus,.btn-cyan-600:active:focus,.btn-cyan-600.active:focus,.show>.btn-cyan-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #098aa380}.btn-cyan-600:disabled,.btn-cyan-600.disabled{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}.btn-cyan-700{color:#fff;background-color:#087990;border-color:#087990}.btn-cyan-700:hover{color:#fff;background-color:#07677a;border-color:#066173}.btn-check:focus+.btn-cyan-700,.btn-cyan-700:focus{color:#fff;background-color:#07677a;border-color:#066173;box-shadow:0 0 0 .25rem #2d8da180}.btn-check:checked+.btn-cyan-700,.btn-check:active+.btn-cyan-700,.btn-cyan-700:active,.btn-cyan-700.active,.show>.btn-cyan-700.dropdown-toggle{color:#fff;background-color:#066173;border-color:#065b6c}.btn-check:checked+.btn-cyan-700:focus,.btn-check:active+.btn-cyan-700:focus,.btn-cyan-700:active:focus,.btn-cyan-700.active:focus,.show>.btn-cyan-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2d8da180}.btn-cyan-700:disabled,.btn-cyan-700.disabled{color:#fff;background-color:#087990;border-color:#087990}.btn-cyan-800{color:#fff;background-color:#055160;border-color:#055160}.btn-cyan-800:hover{color:#fff;background-color:#044552;border-color:#04414d}.btn-check:focus+.btn-cyan-800,.btn-cyan-800:focus{color:#fff;background-color:#044552;border-color:#04414d;box-shadow:0 0 0 .25rem #2b6b7880}.btn-check:checked+.btn-cyan-800,.btn-check:active+.btn-cyan-800,.btn-cyan-800:active,.btn-cyan-800.active,.show>.btn-cyan-800.dropdown-toggle{color:#fff;background-color:#04414d;border-color:#043d48}.btn-check:checked+.btn-cyan-800:focus,.btn-check:active+.btn-cyan-800:focus,.btn-cyan-800:active:focus,.btn-cyan-800.active:focus,.show>.btn-cyan-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b6b7880}.btn-cyan-800:disabled,.btn-cyan-800.disabled{color:#fff;background-color:#055160;border-color:#055160}.btn-cyan-900{color:#fff;background-color:#032830;border-color:#032830}.btn-cyan-900:hover{color:#fff;background-color:#032229;border-color:#022026}.btn-check:focus+.btn-cyan-900,.btn-cyan-900:focus{color:#fff;background-color:#032229;border-color:#022026;box-shadow:0 0 0 .25rem #29484f80}.btn-check:checked+.btn-cyan-900,.btn-check:active+.btn-cyan-900,.btn-cyan-900:active,.btn-cyan-900.active,.show>.btn-cyan-900.dropdown-toggle{color:#fff;background-color:#022026;border-color:#021e24}.btn-check:checked+.btn-cyan-900:focus,.btn-check:active+.btn-cyan-900:focus,.btn-cyan-900:active:focus,.btn-cyan-900.active:focus,.show>.btn-cyan-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #29484f80}.btn-cyan-900:disabled,.btn-cyan-900.disabled{color:#fff;background-color:#032830;border-color:#032830}.btn-indigo-100{color:#000;background-color:#e0cffc;border-color:#e0cffc}.btn-indigo-100:hover{color:#000;background-color:#e5d6fc;border-color:#e3d4fc}.btn-check:focus+.btn-indigo-100,.btn-indigo-100:focus{color:#000;background-color:#e5d6fc;border-color:#e3d4fc;box-shadow:0 0 0 .25rem #beb0d680}.btn-check:checked+.btn-indigo-100,.btn-check:active+.btn-indigo-100,.btn-indigo-100:active,.btn-indigo-100.active,.show>.btn-indigo-100.dropdown-toggle{color:#000;background-color:#e6d9fd;border-color:#e3d4fc}.btn-check:checked+.btn-indigo-100:focus,.btn-check:active+.btn-indigo-100:focus,.btn-indigo-100:active:focus,.btn-indigo-100.active:focus,.show>.btn-indigo-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #beb0d680}.btn-indigo-100:disabled,.btn-indigo-100.disabled{color:#000;background-color:#e0cffc;border-color:#e0cffc}.btn-indigo-200{color:#000;background-color:#c29ffa;border-color:#c29ffa}.btn-indigo-200:hover{color:#000;background-color:#cbadfb;border-color:#c8a9fb}.btn-check:focus+.btn-indigo-200,.btn-indigo-200:focus{color:#000;background-color:#cbadfb;border-color:#c8a9fb;box-shadow:0 0 0 .25rem #a587d580}.btn-check:checked+.btn-indigo-200,.btn-check:active+.btn-indigo-200,.btn-indigo-200:active,.btn-indigo-200.active,.show>.btn-indigo-200.dropdown-toggle{color:#000;background-color:#ceb2fb;border-color:#c8a9fb}.btn-check:checked+.btn-indigo-200:focus,.btn-check:active+.btn-indigo-200:focus,.btn-indigo-200:active:focus,.btn-indigo-200.active:focus,.show>.btn-indigo-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #a587d580}.btn-indigo-200:disabled,.btn-indigo-200.disabled{color:#000;background-color:#c29ffa;border-color:#c29ffa}.btn-indigo-300{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-indigo-300:hover{color:#000;background-color:#b185f8;border-color:#ac7ef8}.btn-check:focus+.btn-indigo-300,.btn-indigo-300:focus{color:#000;background-color:#b185f8;border-color:#ac7ef8;box-shadow:0 0 0 .25rem #8b5fd280}.btn-check:checked+.btn-indigo-300,.btn-check:active+.btn-indigo-300,.btn-indigo-300:active,.btn-indigo-300.active,.show>.btn-indigo-300.dropdown-toggle{color:#000;background-color:#b58df9;border-color:#ac7ef8}.btn-check:checked+.btn-indigo-300:focus,.btn-check:active+.btn-indigo-300:focus,.btn-indigo-300:active:focus,.btn-indigo-300.active:focus,.show>.btn-indigo-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #8b5fd280}.btn-indigo-300:disabled,.btn-indigo-300.disabled{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-indigo-400{color:#fff;background-color:#8540f5;border-color:#8540f5}.btn-indigo-400:hover{color:#fff;background-color:#7136d0;border-color:#6a33c4}.btn-check:focus+.btn-indigo-400,.btn-indigo-400:focus{color:#fff;background-color:#7136d0;border-color:#6a33c4;box-shadow:0 0 0 .25rem #975df780}.btn-check:checked+.btn-indigo-400,.btn-check:active+.btn-indigo-400,.btn-indigo-400:active,.btn-indigo-400.active,.show>.btn-indigo-400.dropdown-toggle{color:#fff;background-color:#6a33c4;border-color:#6430b8}.btn-check:checked+.btn-indigo-400:focus,.btn-check:active+.btn-indigo-400:focus,.btn-indigo-400:active:focus,.btn-indigo-400.active:focus,.show>.btn-indigo-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #975df780}.btn-indigo-400:disabled,.btn-indigo-400.disabled{color:#fff;background-color:#8540f5;border-color:#8540f5}.btn-indigo-500{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-indigo-500:hover{color:#fff;background-color:#570ece;border-color:#520dc2}.btn-check:focus+.btn-indigo-500,.btn-indigo-500:focus{color:#fff;background-color:#570ece;border-color:#520dc2;box-shadow:0 0 0 .25rem #7d34f480}.btn-check:checked+.btn-indigo-500,.btn-check:active+.btn-indigo-500,.btn-indigo-500:active,.btn-indigo-500.active,.show>.btn-indigo-500.dropdown-toggle{color:#fff;background-color:#520dc2;border-color:#4d0cb6}.btn-check:checked+.btn-indigo-500:focus,.btn-check:active+.btn-indigo-500:focus,.btn-indigo-500:active:focus,.btn-indigo-500.active:focus,.show>.btn-indigo-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d34f480}.btn-indigo-500:disabled,.btn-indigo-500.disabled{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-indigo-600{color:#fff;background-color:#520dc2;border-color:#520dc2}.btn-indigo-600:hover{color:#fff;background-color:#460ba5;border-color:#420a9b}.btn-check:focus+.btn-indigo-600,.btn-indigo-600:focus{color:#fff;background-color:#460ba5;border-color:#420a9b;box-shadow:0 0 0 .25rem #6c31cb80}.btn-check:checked+.btn-indigo-600,.btn-check:active+.btn-indigo-600,.btn-indigo-600:active,.btn-indigo-600.active,.show>.btn-indigo-600.dropdown-toggle{color:#fff;background-color:#420a9b;border-color:#3e0a92}.btn-check:checked+.btn-indigo-600:focus,.btn-check:active+.btn-indigo-600:focus,.btn-indigo-600:active:focus,.btn-indigo-600.active:focus,.show>.btn-indigo-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #6c31cb80}.btn-indigo-600:disabled,.btn-indigo-600.disabled{color:#fff;background-color:#520dc2;border-color:#520dc2}.btn-indigo-700{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.btn-indigo-700:hover{color:#fff;background-color:#34097b;border-color:#310874}.btn-check:focus+.btn-indigo-700,.btn-indigo-700:focus{color:#fff;background-color:#34097b;border-color:#310874;box-shadow:0 0 0 .25rem #5a2fa280}.btn-check:checked+.btn-indigo-700,.btn-check:active+.btn-indigo-700,.btn-indigo-700:active,.btn-indigo-700.active,.show>.btn-indigo-700.dropdown-toggle{color:#fff;background-color:#310874;border-color:#2e086d}.btn-check:checked+.btn-indigo-700:focus,.btn-check:active+.btn-indigo-700:focus,.btn-indigo-700:active:focus,.btn-indigo-700.active:focus,.show>.btn-indigo-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5a2fa280}.btn-indigo-700:disabled,.btn-indigo-700.disabled{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.btn-indigo-800{color:#fff;background-color:#290661;border-color:#290661}.btn-indigo-800:hover{color:#fff;background-color:#230552;border-color:#21054e}.btn-check:focus+.btn-indigo-800,.btn-indigo-800:focus{color:#fff;background-color:#230552;border-color:#21054e;box-shadow:0 0 0 .25rem #492b7980}.btn-check:checked+.btn-indigo-800,.btn-check:active+.btn-indigo-800,.btn-indigo-800:active,.btn-indigo-800.active,.show>.btn-indigo-800.dropdown-toggle{color:#fff;background-color:#21054e;border-color:#1f0549}.btn-check:checked+.btn-indigo-800:focus,.btn-check:active+.btn-indigo-800:focus,.btn-indigo-800:active:focus,.btn-indigo-800.active:focus,.show>.btn-indigo-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #492b7980}.btn-indigo-800:disabled,.btn-indigo-800.disabled{color:#fff;background-color:#290661;border-color:#290661}.btn-indigo-900{color:#fff;background-color:#140330;border-color:#140330}.btn-indigo-900:hover{color:#fff;background-color:#110329;border-color:#100226}.btn-check:focus+.btn-indigo-900,.btn-indigo-900:focus{color:#fff;background-color:#110329;border-color:#100226;box-shadow:0 0 0 .25rem #37294f80}.btn-check:checked+.btn-indigo-900,.btn-check:active+.btn-indigo-900,.btn-indigo-900:active,.btn-indigo-900.active,.show>.btn-indigo-900.dropdown-toggle{color:#fff;background-color:#100226;border-color:#0f0224}.btn-check:checked+.btn-indigo-900:focus,.btn-check:active+.btn-indigo-900:focus,.btn-indigo-900:active:focus,.btn-indigo-900.active:focus,.show>.btn-indigo-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #37294f80}.btn-indigo-900:disabled,.btn-indigo-900.disabled{color:#fff;background-color:#140330;border-color:#140330}.btn-purple-100{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}.btn-purple-100:hover{color:#000;background-color:#e6dff5;border-color:#e5ddf4}.btn-check:focus+.btn-purple-100,.btn-purple-100:focus{color:#000;background-color:#e6dff5;border-color:#e5ddf4;box-shadow:0 0 0 .25rem #c0b8cf80}.btn-check:checked+.btn-purple-100,.btn-check:active+.btn-purple-100,.btn-purple-100:active,.btn-purple-100.active,.show>.btn-purple-100.dropdown-toggle{color:#000;background-color:#e8e1f5;border-color:#e5ddf4}.btn-check:checked+.btn-purple-100:focus,.btn-check:active+.btn-purple-100:focus,.btn-purple-100:active:focus,.btn-purple-100.active:focus,.show>.btn-purple-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c0b8cf80}.btn-purple-100:disabled,.btn-purple-100.disabled{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}.btn-purple-200{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}.btn-purple-200:hover{color:#000;background-color:#cebeea;border-color:#cbbbe9}.btn-check:focus+.btn-purple-200,.btn-purple-200:focus{color:#000;background-color:#cebeea;border-color:#cbbbe9;box-shadow:0 0 0 .25rem #a798c480}.btn-check:checked+.btn-purple-200,.btn-check:active+.btn-purple-200,.btn-purple-200:active,.btn-purple-200.active,.show>.btn-purple-200.dropdown-toggle{color:#000;background-color:#d1c2eb;border-color:#cbbbe9}.btn-check:checked+.btn-purple-200:focus,.btn-check:active+.btn-purple-200:focus,.btn-purple-200:active:focus,.btn-purple-200.active:focus,.show>.btn-purple-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #a798c480}.btn-purple-200:disabled,.btn-purple-200.disabled{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}.btn-purple-300{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-purple-300:hover{color:#000;background-color:#b69fe0;border-color:#b299de}.btn-check:focus+.btn-purple-300,.btn-purple-300:focus{color:#000;background-color:#b69fe0;border-color:#b299de;box-shadow:0 0 0 .25rem #9079b980}.btn-check:checked+.btn-purple-300,.btn-check:active+.btn-purple-300,.btn-purple-300:active,.btn-purple-300.active,.show>.btn-purple-300.dropdown-toggle{color:#000;background-color:#baa5e1;border-color:#b299de}.btn-check:checked+.btn-purple-300:focus,.btn-check:active+.btn-purple-300:focus,.btn-purple-300:active:focus,.btn-purple-300.active:focus,.show>.btn-purple-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #9079b980}.btn-purple-300:disabled,.btn-purple-300.disabled{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-purple-400{color:#000;background-color:#8c68cd;border-color:#8c68cd}.btn-purple-400:hover{color:#000;background-color:#9d7fd5;border-color:#9877d2}.btn-check:focus+.btn-purple-400,.btn-purple-400:focus{color:#000;background-color:#9d7fd5;border-color:#9877d2;box-shadow:0 0 0 .25rem #7758ae80}.btn-check:checked+.btn-purple-400,.btn-check:active+.btn-purple-400,.btn-purple-400:active,.btn-purple-400.active,.show>.btn-purple-400.dropdown-toggle{color:#000;background-color:#a386d7;border-color:#9877d2}.btn-check:checked+.btn-purple-400:focus,.btn-check:active+.btn-purple-400:focus,.btn-purple-400:active:focus,.btn-purple-400.active:focus,.show>.btn-purple-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7758ae80}.btn-purple-400:disabled,.btn-purple-400.disabled{color:#000;background-color:#8c68cd;border-color:#8c68cd}.btn-purple-500{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-purple-500:hover{color:#fff;background-color:#5e38a4;border-color:#59359a}.btn-check:focus+.btn-purple-500,.btn-purple-500:focus{color:#fff;background-color:#5e38a4;border-color:#59359a;box-shadow:0 0 0 .25rem #855eca80}.btn-check:checked+.btn-purple-500,.btn-check:active+.btn-purple-500,.btn-purple-500:active,.btn-purple-500.active,.show>.btn-purple-500.dropdown-toggle{color:#fff;background-color:#59359a;border-color:#533291}.btn-check:checked+.btn-purple-500:focus,.btn-check:active+.btn-purple-500:focus,.btn-purple-500:active:focus,.btn-purple-500.active:focus,.show>.btn-purple-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #855eca80}.btn-purple-500:disabled,.btn-purple-500.disabled{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-purple-600{color:#fff;background-color:#59359a;border-color:#59359a}.btn-purple-600:hover{color:#fff;background-color:#4c2d83;border-color:#472a7b}.btn-check:focus+.btn-purple-600,.btn-purple-600:focus{color:#fff;background-color:#4c2d83;border-color:#472a7b;box-shadow:0 0 0 .25rem #7253a980}.btn-check:checked+.btn-purple-600,.btn-check:active+.btn-purple-600,.btn-purple-600:active,.btn-purple-600.active,.show>.btn-purple-600.dropdown-toggle{color:#fff;background-color:#472a7b;border-color:#432874}.btn-check:checked+.btn-purple-600:focus,.btn-check:active+.btn-purple-600:focus,.btn-purple-600:active:focus,.btn-purple-600.active:focus,.show>.btn-purple-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7253a980}.btn-purple-600:disabled,.btn-purple-600.disabled{color:#fff;background-color:#59359a;border-color:#59359a}.btn-purple-700{color:#fff;background-color:#432874;border-color:#432874}.btn-purple-700:hover{color:#fff;background-color:#392263;border-color:#36205d}.btn-check:focus+.btn-purple-700,.btn-purple-700:focus{color:#fff;background-color:#392263;border-color:#36205d;box-shadow:0 0 0 .25rem #5f488980}.btn-check:checked+.btn-purple-700,.btn-check:active+.btn-purple-700,.btn-purple-700:active,.btn-purple-700.active,.show>.btn-purple-700.dropdown-toggle{color:#fff;background-color:#36205d;border-color:#321e57}.btn-check:checked+.btn-purple-700:focus,.btn-check:active+.btn-purple-700:focus,.btn-purple-700:active:focus,.btn-purple-700.active:focus,.show>.btn-purple-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5f488980}.btn-purple-700:disabled,.btn-purple-700.disabled{color:#fff;background-color:#432874;border-color:#432874}.btn-purple-800{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}.btn-purple-800:hover{color:#fff;background-color:#251641;border-color:#23153e}.btn-check:focus+.btn-purple-800,.btn-purple-800:focus{color:#fff;background-color:#251641;border-color:#23153e;box-shadow:0 0 0 .25rem #4c3c6880}.btn-check:checked+.btn-purple-800,.btn-check:active+.btn-purple-800,.btn-purple-800:active,.btn-purple-800.active,.show>.btn-purple-800.dropdown-toggle{color:#fff;background-color:#23153e;border-color:#21143a}.btn-check:checked+.btn-purple-800:focus,.btn-check:active+.btn-purple-800:focus,.btn-purple-800:active:focus,.btn-purple-800.active:focus,.show>.btn-purple-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4c3c6880}.btn-purple-800:disabled,.btn-purple-800.disabled{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}.btn-purple-900{color:#fff;background-color:#160d27;border-color:#160d27}.btn-purple-900:hover{color:#fff;background-color:#130b21;border-color:#120a1f}.btn-check:focus+.btn-purple-900,.btn-purple-900:focus{color:#fff;background-color:#130b21;border-color:#120a1f;box-shadow:0 0 0 .25rem #39314780}.btn-check:checked+.btn-purple-900,.btn-check:active+.btn-purple-900,.btn-purple-900:active,.btn-purple-900.active,.show>.btn-purple-900.dropdown-toggle{color:#fff;background-color:#120a1f;border-color:#110a1d}.btn-check:checked+.btn-purple-900:focus,.btn-check:active+.btn-purple-900:focus,.btn-purple-900:active:focus,.btn-purple-900.active:focus,.show>.btn-purple-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #39314780}.btn-purple-900:disabled,.btn-purple-900.disabled{color:#fff;background-color:#160d27;border-color:#160d27}.btn-pink-100{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}.btn-pink-100:hover{color:#000;background-color:#f8dcea;border-color:#f8dae9}.btn-check:focus+.btn-pink-100,.btn-pink-100:focus{color:#000;background-color:#f8dcea;border-color:#f8dae9;box-shadow:0 0 0 .25rem #d2b6c480}.btn-check:checked+.btn-pink-100,.btn-check:active+.btn-pink-100,.btn-pink-100:active,.btn-pink-100.active,.show>.btn-pink-100.dropdown-toggle{color:#000;background-color:#f9deeb;border-color:#f8dae9}.btn-check:checked+.btn-pink-100:focus,.btn-check:active+.btn-pink-100:focus,.btn-pink-100:active:focus,.btn-pink-100.active:focus,.show>.btn-pink-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d2b6c480}.btn-pink-100:disabled,.btn-pink-100.disabled{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}.btn-pink-200{color:#000;background-color:#efadce;border-color:#efadce}.btn-pink-200:hover{color:#000;background-color:#f1b9d5;border-color:#f1b5d3}.btn-check:focus+.btn-pink-200,.btn-pink-200:focus{color:#000;background-color:#f1b9d5;border-color:#f1b5d3;box-shadow:0 0 0 .25rem #cb93af80}.btn-check:checked+.btn-pink-200,.btn-check:active+.btn-pink-200,.btn-pink-200:active,.btn-pink-200.active,.show>.btn-pink-200.dropdown-toggle{color:#000;background-color:#f2bdd8;border-color:#f1b5d3}.btn-check:checked+.btn-pink-200:focus,.btn-check:active+.btn-pink-200:focus,.btn-pink-200:active:focus,.btn-pink-200.active:focus,.show>.btn-pink-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #cb93af80}.btn-pink-200:disabled,.btn-pink-200.disabled{color:#000;background-color:#efadce;border-color:#efadce}.btn-pink-300{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-pink-300:hover{color:#000;background-color:#ea97c0;border-color:#e991bc}.btn-check:focus+.btn-pink-300,.btn-pink-300:focus{color:#000;background-color:#ea97c0;border-color:#e991bc;box-shadow:0 0 0 .25rem #c4719a80}.btn-check:checked+.btn-pink-300,.btn-check:active+.btn-pink-300,.btn-pink-300:active,.btn-pink-300.active,.show>.btn-pink-300.dropdown-toggle{color:#000;background-color:#eb9dc4;border-color:#e991bc}.btn-check:checked+.btn-pink-300:focus,.btn-check:active+.btn-pink-300:focus,.btn-pink-300:active:focus,.btn-pink-300.active:focus,.show>.btn-pink-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c4719a80}.btn-pink-300:disabled,.btn-pink-300.disabled{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-pink-400{color:#000;background-color:#de5c9d;border-color:#de5c9d}.btn-pink-400:hover{color:#000;background-color:#e374ac;border-color:#e16ca7}.btn-check:focus+.btn-pink-400,.btn-pink-400:focus{color:#000;background-color:#e374ac;border-color:#e16ca7;box-shadow:0 0 0 .25rem #bd4e8580}.btn-check:checked+.btn-pink-400,.btn-check:active+.btn-pink-400,.btn-pink-400:active,.btn-pink-400.active,.show>.btn-pink-400.dropdown-toggle{color:#000;background-color:#e57db1;border-color:#e16ca7}.btn-check:checked+.btn-pink-400:focus,.btn-check:active+.btn-pink-400:focus,.btn-pink-400:active:focus,.btn-pink-400.active:focus,.show>.btn-pink-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bd4e8580}.btn-pink-400:disabled,.btn-pink-400.disabled{color:#000;background-color:#de5c9d;border-color:#de5c9d}.btn-pink-500{color:#fff;background-color:#d63384;border-color:#d63384}.btn-pink-500:hover{color:#fff;background-color:#b62b70;border-color:#ab296a}.btn-check:focus+.btn-pink-500,.btn-pink-500:focus{color:#fff;background-color:#b62b70;border-color:#ab296a;box-shadow:0 0 0 .25rem #dc529680}.btn-check:checked+.btn-pink-500,.btn-check:active+.btn-pink-500,.btn-pink-500:active,.btn-pink-500.active,.show>.btn-pink-500.dropdown-toggle{color:#fff;background-color:#ab296a;border-color:#a12663}.btn-check:checked+.btn-pink-500:focus,.btn-check:active+.btn-pink-500:focus,.btn-pink-500:active:focus,.btn-pink-500.active:focus,.show>.btn-pink-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #dc529680}.btn-pink-500:disabled,.btn-pink-500.disabled{color:#fff;background-color:#d63384;border-color:#d63384}.btn-pink-600{color:#fff;background-color:#ab296a;border-color:#ab296a}.btn-pink-600:hover{color:#fff;background-color:#91235a;border-color:#892155}.btn-check:focus+.btn-pink-600,.btn-pink-600:focus{color:#fff;background-color:#91235a;border-color:#892155;box-shadow:0 0 0 .25rem #b8498080}.btn-check:checked+.btn-pink-600,.btn-check:active+.btn-pink-600,.btn-pink-600:active,.btn-pink-600.active,.show>.btn-pink-600.dropdown-toggle{color:#fff;background-color:#892155;border-color:#801f50}.btn-check:checked+.btn-pink-600:focus,.btn-check:active+.btn-pink-600:focus,.btn-pink-600:active:focus,.btn-pink-600.active:focus,.show>.btn-pink-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b8498080}.btn-pink-600:disabled,.btn-pink-600.disabled{color:#fff;background-color:#ab296a;border-color:#ab296a}.btn-pink-700{color:#fff;background-color:#801f4f;border-color:#801f4f}.btn-pink-700:hover{color:#fff;background-color:#6d1a43;border-color:#66193f}.btn-check:focus+.btn-pink-700,.btn-pink-700:focus{color:#fff;background-color:#6d1a43;border-color:#66193f;box-shadow:0 0 0 .25rem #93416980}.btn-check:checked+.btn-pink-700,.btn-check:active+.btn-pink-700,.btn-pink-700:active,.btn-pink-700.active,.show>.btn-pink-700.dropdown-toggle{color:#fff;background-color:#66193f;border-color:#60173b}.btn-check:checked+.btn-pink-700:focus,.btn-check:active+.btn-pink-700:focus,.btn-pink-700:active:focus,.btn-pink-700.active:focus,.show>.btn-pink-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #93416980}.btn-pink-700:disabled,.btn-pink-700.disabled{color:#fff;background-color:#801f4f;border-color:#801f4f}.btn-pink-800{color:#fff;background-color:#561435;border-color:#561435}.btn-pink-800:hover{color:#fff;background-color:#49112d;border-color:#45102a}.btn-check:focus+.btn-pink-800,.btn-pink-800:focus{color:#fff;background-color:#49112d;border-color:#45102a;box-shadow:0 0 0 .25rem #6f375380}.btn-check:checked+.btn-pink-800,.btn-check:active+.btn-pink-800,.btn-pink-800:active,.btn-pink-800.active,.show>.btn-pink-800.dropdown-toggle{color:#fff;background-color:#45102a;border-color:#410f28}.btn-check:checked+.btn-pink-800:focus,.btn-check:active+.btn-pink-800:focus,.btn-pink-800:active:focus,.btn-pink-800.active:focus,.show>.btn-pink-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #6f375380}.btn-pink-800:disabled,.btn-pink-800.disabled{color:#fff;background-color:#561435;border-color:#561435}.btn-pink-900{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}.btn-pink-900:hover{color:#fff;background-color:#250916;border-color:#220815}.btn-check:focus+.btn-pink-900,.btn-pink-900:focus{color:#fff;background-color:#250916;border-color:#220815;box-shadow:0 0 0 .25rem #4b2f3c80}.btn-check:checked+.btn-pink-900,.btn-check:active+.btn-pink-900,.btn-pink-900:active,.btn-pink-900.active,.show>.btn-pink-900.dropdown-toggle{color:#fff;background-color:#220815;border-color:#200814}.btn-check:checked+.btn-pink-900:focus,.btn-check:active+.btn-pink-900:focus,.btn-pink-900:active:focus,.btn-pink-900.active:focus,.show>.btn-pink-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4b2f3c80}.btn-pink-900:disabled,.btn-pink-900.disabled{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}.btn-outline-primary{color:#337ab7;border-color:#337ab7}.btn-outline-primary:hover{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem #337ab780}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #337ab780}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#337ab7;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#54d6f0;border-color:#54d6f0}.btn-outline-info:hover{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem #54d6f080}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #54d6f080}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#54d6f0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem #21252980}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#212529;border-color:#212529}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #21252980}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#212529;background-color:transparent}.btn-outline-red{color:#dc3545;border-color:#dc3545}.btn-outline-red:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-red,.btn-outline-red:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+.btn-outline-red,.btn-check:active+.btn-outline-red,.btn-outline-red:active,.btn-outline-red.active,.btn-outline-red.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+.btn-outline-red:focus,.btn-check:active+.btn-outline-red:focus,.btn-outline-red:active:focus,.btn-outline-red.active:focus,.btn-outline-red.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-outline-red:disabled,.btn-outline-red.disabled{color:#dc3545;background-color:transparent}.btn-outline-yellow{color:#ffc107;border-color:#ffc107}.btn-outline-yellow:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-yellow,.btn-outline-yellow:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+.btn-outline-yellow,.btn-check:active+.btn-outline-yellow,.btn-outline-yellow:active,.btn-outline-yellow.active,.btn-outline-yellow.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+.btn-outline-yellow:focus,.btn-check:active+.btn-outline-yellow:focus,.btn-outline-yellow:active:focus,.btn-outline-yellow.active:focus,.btn-outline-yellow.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-outline-yellow:disabled,.btn-outline-yellow.disabled{color:#ffc107;background-color:transparent}.btn-outline-green{color:#198754;border-color:#198754}.btn-outline-green:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-green,.btn-outline-green:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+.btn-outline-green,.btn-check:active+.btn-outline-green,.btn-outline-green:active,.btn-outline-green.active,.btn-outline-green.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+.btn-outline-green:focus,.btn-check:active+.btn-outline-green:focus,.btn-outline-green:active:focus,.btn-outline-green.active:focus,.btn-outline-green.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}.btn-outline-green:disabled,.btn-outline-green.disabled{color:#198754;background-color:transparent}.btn-outline-blue{color:#0d6efd;border-color:#0d6efd}.btn-outline-blue:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-blue,.btn-outline-blue:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-check:checked+.btn-outline-blue,.btn-check:active+.btn-outline-blue,.btn-outline-blue:active,.btn-outline-blue.active,.btn-outline-blue.dropdown-toggle.show{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:checked+.btn-outline-blue:focus,.btn-check:active+.btn-outline-blue:focus,.btn-outline-blue:active:focus,.btn-outline-blue.active:focus,.btn-outline-blue.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-outline-blue:disabled,.btn-outline-blue.disabled{color:#0d6efd;background-color:transparent}.btn-outline-cyan{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-cyan:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-cyan,.btn-outline-cyan:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-check:checked+.btn-outline-cyan,.btn-check:active+.btn-outline-cyan,.btn-outline-cyan:active,.btn-outline-cyan.active,.btn-outline-cyan.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+.btn-outline-cyan:focus,.btn-check:active+.btn-outline-cyan:focus,.btn-outline-cyan:active:focus,.btn-outline-cyan.active:focus,.btn-outline-cyan.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-outline-cyan:disabled,.btn-outline-cyan.disabled{color:#0dcaf0;background-color:transparent}.btn-outline-indigo{color:#6610f2;border-color:#6610f2}.btn-outline-indigo:hover{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:focus+.btn-outline-indigo,.btn-outline-indigo:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-check:checked+.btn-outline-indigo,.btn-check:active+.btn-outline-indigo,.btn-outline-indigo:active,.btn-outline-indigo.active,.btn-outline-indigo.dropdown-toggle.show{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:checked+.btn-outline-indigo:focus,.btn-check:active+.btn-outline-indigo:focus,.btn-outline-indigo:active:focus,.btn-outline-indigo.active:focus,.btn-outline-indigo.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-outline-indigo:disabled,.btn-outline-indigo.disabled{color:#6610f2;background-color:transparent}.btn-outline-purple{color:#6f42c1;border-color:#6f42c1}.btn-outline-purple:hover{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:focus+.btn-outline-purple,.btn-outline-purple:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-check:checked+.btn-outline-purple,.btn-check:active+.btn-outline-purple,.btn-outline-purple:active,.btn-outline-purple.active,.btn-outline-purple.dropdown-toggle.show{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:checked+.btn-outline-purple:focus,.btn-check:active+.btn-outline-purple:focus,.btn-outline-purple:active:focus,.btn-outline-purple.active:focus,.btn-outline-purple.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-outline-purple:disabled,.btn-outline-purple.disabled{color:#6f42c1;background-color:transparent}.btn-outline-pink{color:#d63384;border-color:#d63384}.btn-outline-pink:hover{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:focus+.btn-outline-pink,.btn-outline-pink:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-check:checked+.btn-outline-pink,.btn-check:active+.btn-outline-pink,.btn-outline-pink:active,.btn-outline-pink.active,.btn-outline-pink.dropdown-toggle.show{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:checked+.btn-outline-pink:focus,.btn-check:active+.btn-outline-pink:focus,.btn-outline-pink:active:focus,.btn-outline-pink.active:focus,.btn-outline-pink.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-outline-pink:disabled,.btn-outline-pink.disabled{color:#d63384;background-color:transparent}.btn-outline-darker{color:#1b1f22;border-color:#1b1f22}.btn-outline-darker:hover{color:#fff;background-color:#1b1f22;border-color:#1b1f22}.btn-check:focus+.btn-outline-darker,.btn-outline-darker:focus{box-shadow:0 0 0 .25rem #1b1f2280}.btn-check:checked+.btn-outline-darker,.btn-check:active+.btn-outline-darker,.btn-outline-darker:active,.btn-outline-darker.active,.btn-outline-darker.dropdown-toggle.show{color:#fff;background-color:#1b1f22;border-color:#1b1f22}.btn-check:checked+.btn-outline-darker:focus,.btn-check:active+.btn-outline-darker:focus,.btn-outline-darker:active:focus,.btn-outline-darker.active:focus,.btn-outline-darker.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #1b1f2280}.btn-outline-darker:disabled,.btn-outline-darker.disabled{color:#1b1f22;background-color:transparent}.btn-outline-darkest{color:#171b1d;border-color:#171b1d}.btn-outline-darkest:hover{color:#fff;background-color:#171b1d;border-color:#171b1d}.btn-check:focus+.btn-outline-darkest,.btn-outline-darkest:focus{box-shadow:0 0 0 .25rem #171b1d80}.btn-check:checked+.btn-outline-darkest,.btn-check:active+.btn-outline-darkest,.btn-outline-darkest:active,.btn-outline-darkest.active,.btn-outline-darkest.dropdown-toggle.show{color:#fff;background-color:#171b1d;border-color:#171b1d}.btn-check:checked+.btn-outline-darkest:focus,.btn-check:active+.btn-outline-darkest:focus,.btn-outline-darkest:active:focus,.btn-outline-darkest.active:focus,.btn-outline-darkest.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #171b1d80}.btn-outline-darkest:disabled,.btn-outline-darkest.disabled{color:#171b1d;background-color:transparent}.btn-outline-gray{color:#ced4da;border-color:#ced4da}.btn-outline-gray:hover{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:focus+.btn-outline-gray,.btn-outline-gray:focus{box-shadow:0 0 0 .25rem #ced4da80}.btn-check:checked+.btn-outline-gray,.btn-check:active+.btn-outline-gray,.btn-outline-gray:active,.btn-outline-gray.active,.btn-outline-gray.dropdown-toggle.show{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:checked+.btn-outline-gray:focus,.btn-check:active+.btn-outline-gray:focus,.btn-outline-gray:active:focus,.btn-outline-gray.active:focus,.btn-outline-gray.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ced4da80}.btn-outline-gray:disabled,.btn-outline-gray.disabled{color:#ced4da;background-color:transparent}.btn-outline-gray-100{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-gray-100:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-gray-100,.btn-outline-gray-100:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-check:checked+.btn-outline-gray-100,.btn-check:active+.btn-outline-gray-100,.btn-outline-gray-100:active,.btn-outline-gray-100.active,.btn-outline-gray-100.dropdown-toggle.show{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:checked+.btn-outline-gray-100:focus,.btn-check:active+.btn-outline-gray-100:focus,.btn-outline-gray-100:active:focus,.btn-outline-gray-100.active:focus,.btn-outline-gray-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-outline-gray-100:disabled,.btn-outline-gray-100.disabled{color:#f8f9fa;background-color:transparent}.btn-outline-gray-200{color:#e9ecef;border-color:#e9ecef}.btn-outline-gray-200:hover{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:focus+.btn-outline-gray-200,.btn-outline-gray-200:focus{box-shadow:0 0 0 .25rem #e9ecef80}.btn-check:checked+.btn-outline-gray-200,.btn-check:active+.btn-outline-gray-200,.btn-outline-gray-200:active,.btn-outline-gray-200.active,.btn-outline-gray-200.dropdown-toggle.show{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:checked+.btn-outline-gray-200:focus,.btn-check:active+.btn-outline-gray-200:focus,.btn-outline-gray-200:active:focus,.btn-outline-gray-200.active:focus,.btn-outline-gray-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e9ecef80}.btn-outline-gray-200:disabled,.btn-outline-gray-200.disabled{color:#e9ecef;background-color:transparent}.btn-outline-gray-300{color:#dee2e6;border-color:#dee2e6}.btn-outline-gray-300:hover{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:focus+.btn-outline-gray-300,.btn-outline-gray-300:focus{box-shadow:0 0 0 .25rem #dee2e680}.btn-check:checked+.btn-outline-gray-300,.btn-check:active+.btn-outline-gray-300,.btn-outline-gray-300:active,.btn-outline-gray-300.active,.btn-outline-gray-300.dropdown-toggle.show{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:checked+.btn-outline-gray-300:focus,.btn-check:active+.btn-outline-gray-300:focus,.btn-outline-gray-300:active:focus,.btn-outline-gray-300.active:focus,.btn-outline-gray-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dee2e680}.btn-outline-gray-300:disabled,.btn-outline-gray-300.disabled{color:#dee2e6;background-color:transparent}.btn-outline-gray-400{color:#ced4da;border-color:#ced4da}.btn-outline-gray-400:hover{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:focus+.btn-outline-gray-400,.btn-outline-gray-400:focus{box-shadow:0 0 0 .25rem #ced4da80}.btn-check:checked+.btn-outline-gray-400,.btn-check:active+.btn-outline-gray-400,.btn-outline-gray-400:active,.btn-outline-gray-400.active,.btn-outline-gray-400.dropdown-toggle.show{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:checked+.btn-outline-gray-400:focus,.btn-check:active+.btn-outline-gray-400:focus,.btn-outline-gray-400:active:focus,.btn-outline-gray-400.active:focus,.btn-outline-gray-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ced4da80}.btn-outline-gray-400:disabled,.btn-outline-gray-400.disabled{color:#ced4da;background-color:transparent}.btn-outline-gray-500{color:#adb5bd;border-color:#adb5bd}.btn-outline-gray-500:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+.btn-outline-gray-500,.btn-outline-gray-500:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+.btn-outline-gray-500,.btn-check:active+.btn-outline-gray-500,.btn-outline-gray-500:active,.btn-outline-gray-500.active,.btn-outline-gray-500.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+.btn-outline-gray-500:focus,.btn-check:active+.btn-outline-gray-500:focus,.btn-outline-gray-500:active:focus,.btn-outline-gray-500.active:focus,.btn-outline-gray-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-outline-gray-500:disabled,.btn-outline-gray-500.disabled{color:#adb5bd;background-color:transparent}.btn-outline-gray-600{color:#6c757d;border-color:#6c757d}.btn-outline-gray-600:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-gray-600,.btn-outline-gray-600:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-check:checked+.btn-outline-gray-600,.btn-check:active+.btn-outline-gray-600,.btn-outline-gray-600:active,.btn-outline-gray-600.active,.btn-outline-gray-600.dropdown-toggle.show{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:checked+.btn-outline-gray-600:focus,.btn-check:active+.btn-outline-gray-600:focus,.btn-outline-gray-600:active:focus,.btn-outline-gray-600.active:focus,.btn-outline-gray-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-outline-gray-600:disabled,.btn-outline-gray-600.disabled{color:#6c757d;background-color:transparent}.btn-outline-gray-700{color:#495057;border-color:#495057}.btn-outline-gray-700:hover{color:#fff;background-color:#495057;border-color:#495057}.btn-check:focus+.btn-outline-gray-700,.btn-outline-gray-700:focus{box-shadow:0 0 0 .25rem #49505780}.btn-check:checked+.btn-outline-gray-700,.btn-check:active+.btn-outline-gray-700,.btn-outline-gray-700:active,.btn-outline-gray-700.active,.btn-outline-gray-700.dropdown-toggle.show{color:#fff;background-color:#495057;border-color:#495057}.btn-check:checked+.btn-outline-gray-700:focus,.btn-check:active+.btn-outline-gray-700:focus,.btn-outline-gray-700:active:focus,.btn-outline-gray-700.active:focus,.btn-outline-gray-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #49505780}.btn-outline-gray-700:disabled,.btn-outline-gray-700.disabled{color:#495057;background-color:transparent}.btn-outline-gray-800{color:#343a40;border-color:#343a40}.btn-outline-gray-800:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:focus+.btn-outline-gray-800,.btn-outline-gray-800:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-check:checked+.btn-outline-gray-800,.btn-check:active+.btn-outline-gray-800,.btn-outline-gray-800:active,.btn-outline-gray-800.active,.btn-outline-gray-800.dropdown-toggle.show{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:checked+.btn-outline-gray-800:focus,.btn-check:active+.btn-outline-gray-800:focus,.btn-outline-gray-800:active:focus,.btn-outline-gray-800.active:focus,.btn-outline-gray-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-outline-gray-800:disabled,.btn-outline-gray-800.disabled{color:#343a40;background-color:transparent}.btn-outline-gray-900{color:#212529;border-color:#212529}.btn-outline-gray-900:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-gray-900,.btn-outline-gray-900:focus{box-shadow:0 0 0 .25rem #21252980}.btn-check:checked+.btn-outline-gray-900,.btn-check:active+.btn-outline-gray-900,.btn-outline-gray-900:active,.btn-outline-gray-900.active,.btn-outline-gray-900.dropdown-toggle.show{color:#fff;background-color:#212529;border-color:#212529}.btn-check:checked+.btn-outline-gray-900:focus,.btn-check:active+.btn-outline-gray-900:focus,.btn-outline-gray-900:active:focus,.btn-outline-gray-900.active:focus,.btn-outline-gray-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #21252980}.btn-outline-gray-900:disabled,.btn-outline-gray-900.disabled{color:#212529;background-color:transparent}.btn-outline-red-100{color:#f8d7da;border-color:#f8d7da}.btn-outline-red-100:hover{color:#000;background-color:#f8d7da;border-color:#f8d7da}.btn-check:focus+.btn-outline-red-100,.btn-outline-red-100:focus{box-shadow:0 0 0 .25rem #f8d7da80}.btn-check:checked+.btn-outline-red-100,.btn-check:active+.btn-outline-red-100,.btn-outline-red-100:active,.btn-outline-red-100.active,.btn-outline-red-100.dropdown-toggle.show{color:#000;background-color:#f8d7da;border-color:#f8d7da}.btn-check:checked+.btn-outline-red-100:focus,.btn-check:active+.btn-outline-red-100:focus,.btn-outline-red-100:active:focus,.btn-outline-red-100.active:focus,.btn-outline-red-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8d7da80}.btn-outline-red-100:disabled,.btn-outline-red-100.disabled{color:#f8d7da;background-color:transparent}.btn-outline-red-200{color:#f1aeb5;border-color:#f1aeb5}.btn-outline-red-200:hover{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}.btn-check:focus+.btn-outline-red-200,.btn-outline-red-200:focus{box-shadow:0 0 0 .25rem #f1aeb580}.btn-check:checked+.btn-outline-red-200,.btn-check:active+.btn-outline-red-200,.btn-outline-red-200:active,.btn-outline-red-200.active,.btn-outline-red-200.dropdown-toggle.show{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}.btn-check:checked+.btn-outline-red-200:focus,.btn-check:active+.btn-outline-red-200:focus,.btn-outline-red-200:active:focus,.btn-outline-red-200.active:focus,.btn-outline-red-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f1aeb580}.btn-outline-red-200:disabled,.btn-outline-red-200.disabled{color:#f1aeb5;background-color:transparent}.btn-outline-red-300{color:#ea868f;border-color:#ea868f}.btn-outline-red-300:hover{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:focus+.btn-outline-red-300,.btn-outline-red-300:focus{box-shadow:0 0 0 .25rem #ea868f80}.btn-check:checked+.btn-outline-red-300,.btn-check:active+.btn-outline-red-300,.btn-outline-red-300:active,.btn-outline-red-300.active,.btn-outline-red-300.dropdown-toggle.show{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:checked+.btn-outline-red-300:focus,.btn-check:active+.btn-outline-red-300:focus,.btn-outline-red-300:active:focus,.btn-outline-red-300.active:focus,.btn-outline-red-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ea868f80}.btn-outline-red-300:disabled,.btn-outline-red-300.disabled{color:#ea868f;background-color:transparent}.btn-outline-red-400{color:#e35d6a;border-color:#e35d6a}.btn-outline-red-400:hover{color:#000;background-color:#e35d6a;border-color:#e35d6a}.btn-check:focus+.btn-outline-red-400,.btn-outline-red-400:focus{box-shadow:0 0 0 .25rem #e35d6a80}.btn-check:checked+.btn-outline-red-400,.btn-check:active+.btn-outline-red-400,.btn-outline-red-400:active,.btn-outline-red-400.active,.btn-outline-red-400.dropdown-toggle.show{color:#000;background-color:#e35d6a;border-color:#e35d6a}.btn-check:checked+.btn-outline-red-400:focus,.btn-check:active+.btn-outline-red-400:focus,.btn-outline-red-400:active:focus,.btn-outline-red-400.active:focus,.btn-outline-red-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e35d6a80}.btn-outline-red-400:disabled,.btn-outline-red-400.disabled{color:#e35d6a;background-color:transparent}.btn-outline-red-500{color:#dc3545;border-color:#dc3545}.btn-outline-red-500:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-red-500,.btn-outline-red-500:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+.btn-outline-red-500,.btn-check:active+.btn-outline-red-500,.btn-outline-red-500:active,.btn-outline-red-500.active,.btn-outline-red-500.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+.btn-outline-red-500:focus,.btn-check:active+.btn-outline-red-500:focus,.btn-outline-red-500:active:focus,.btn-outline-red-500.active:focus,.btn-outline-red-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-outline-red-500:disabled,.btn-outline-red-500.disabled{color:#dc3545;background-color:transparent}.btn-outline-red-600{color:#b02a37;border-color:#b02a37}.btn-outline-red-600:hover{color:#fff;background-color:#b02a37;border-color:#b02a37}.btn-check:focus+.btn-outline-red-600,.btn-outline-red-600:focus{box-shadow:0 0 0 .25rem #b02a3780}.btn-check:checked+.btn-outline-red-600,.btn-check:active+.btn-outline-red-600,.btn-outline-red-600:active,.btn-outline-red-600.active,.btn-outline-red-600.dropdown-toggle.show{color:#fff;background-color:#b02a37;border-color:#b02a37}.btn-check:checked+.btn-outline-red-600:focus,.btn-check:active+.btn-outline-red-600:focus,.btn-outline-red-600:active:focus,.btn-outline-red-600.active:focus,.btn-outline-red-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #b02a3780}.btn-outline-red-600:disabled,.btn-outline-red-600.disabled{color:#b02a37;background-color:transparent}.btn-outline-red-700{color:#842029;border-color:#842029}.btn-outline-red-700:hover{color:#fff;background-color:#842029;border-color:#842029}.btn-check:focus+.btn-outline-red-700,.btn-outline-red-700:focus{box-shadow:0 0 0 .25rem #84202980}.btn-check:checked+.btn-outline-red-700,.btn-check:active+.btn-outline-red-700,.btn-outline-red-700:active,.btn-outline-red-700.active,.btn-outline-red-700.dropdown-toggle.show{color:#fff;background-color:#842029;border-color:#842029}.btn-check:checked+.btn-outline-red-700:focus,.btn-check:active+.btn-outline-red-700:focus,.btn-outline-red-700:active:focus,.btn-outline-red-700.active:focus,.btn-outline-red-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #84202980}.btn-outline-red-700:disabled,.btn-outline-red-700.disabled{color:#842029;background-color:transparent}.btn-outline-red-800{color:#58151c;border-color:#58151c}.btn-outline-red-800:hover{color:#fff;background-color:#58151c;border-color:#58151c}.btn-check:focus+.btn-outline-red-800,.btn-outline-red-800:focus{box-shadow:0 0 0 .25rem #58151c80}.btn-check:checked+.btn-outline-red-800,.btn-check:active+.btn-outline-red-800,.btn-outline-red-800:active,.btn-outline-red-800.active,.btn-outline-red-800.dropdown-toggle.show{color:#fff;background-color:#58151c;border-color:#58151c}.btn-check:checked+.btn-outline-red-800:focus,.btn-check:active+.btn-outline-red-800:focus,.btn-outline-red-800:active:focus,.btn-outline-red-800.active:focus,.btn-outline-red-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #58151c80}.btn-outline-red-800:disabled,.btn-outline-red-800.disabled{color:#58151c;background-color:transparent}.btn-outline-red-900{color:#2c0b0e;border-color:#2c0b0e}.btn-outline-red-900:hover{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}.btn-check:focus+.btn-outline-red-900,.btn-outline-red-900:focus{box-shadow:0 0 0 .25rem #2c0b0e80}.btn-check:checked+.btn-outline-red-900,.btn-check:active+.btn-outline-red-900,.btn-outline-red-900:active,.btn-outline-red-900.active,.btn-outline-red-900.dropdown-toggle.show{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}.btn-check:checked+.btn-outline-red-900:focus,.btn-check:active+.btn-outline-red-900:focus,.btn-outline-red-900:active:focus,.btn-outline-red-900.active:focus,.btn-outline-red-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2c0b0e80}.btn-outline-red-900:disabled,.btn-outline-red-900.disabled{color:#2c0b0e;background-color:transparent}.btn-outline-yellow-100{color:#fff3cd;border-color:#fff3cd}.btn-outline-yellow-100:hover{color:#000;background-color:#fff3cd;border-color:#fff3cd}.btn-check:focus+.btn-outline-yellow-100,.btn-outline-yellow-100:focus{box-shadow:0 0 0 .25rem #fff3cd80}.btn-check:checked+.btn-outline-yellow-100,.btn-check:active+.btn-outline-yellow-100,.btn-outline-yellow-100:active,.btn-outline-yellow-100.active,.btn-outline-yellow-100.dropdown-toggle.show{color:#000;background-color:#fff3cd;border-color:#fff3cd}.btn-check:checked+.btn-outline-yellow-100:focus,.btn-check:active+.btn-outline-yellow-100:focus,.btn-outline-yellow-100:active:focus,.btn-outline-yellow-100.active:focus,.btn-outline-yellow-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #fff3cd80}.btn-outline-yellow-100:disabled,.btn-outline-yellow-100.disabled{color:#fff3cd;background-color:transparent}.btn-outline-yellow-200{color:#ffe69c;border-color:#ffe69c}.btn-outline-yellow-200:hover{color:#000;background-color:#ffe69c;border-color:#ffe69c}.btn-check:focus+.btn-outline-yellow-200,.btn-outline-yellow-200:focus{box-shadow:0 0 0 .25rem #ffe69c80}.btn-check:checked+.btn-outline-yellow-200,.btn-check:active+.btn-outline-yellow-200,.btn-outline-yellow-200:active,.btn-outline-yellow-200.active,.btn-outline-yellow-200.dropdown-toggle.show{color:#000;background-color:#ffe69c;border-color:#ffe69c}.btn-check:checked+.btn-outline-yellow-200:focus,.btn-check:active+.btn-outline-yellow-200:focus,.btn-outline-yellow-200:active:focus,.btn-outline-yellow-200.active:focus,.btn-outline-yellow-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffe69c80}.btn-outline-yellow-200:disabled,.btn-outline-yellow-200.disabled{color:#ffe69c;background-color:transparent}.btn-outline-yellow-300{color:#ffda6a;border-color:#ffda6a}.btn-outline-yellow-300:hover{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:focus+.btn-outline-yellow-300,.btn-outline-yellow-300:focus{box-shadow:0 0 0 .25rem #ffda6a80}.btn-check:checked+.btn-outline-yellow-300,.btn-check:active+.btn-outline-yellow-300,.btn-outline-yellow-300:active,.btn-outline-yellow-300.active,.btn-outline-yellow-300.dropdown-toggle.show{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:checked+.btn-outline-yellow-300:focus,.btn-check:active+.btn-outline-yellow-300:focus,.btn-outline-yellow-300:active:focus,.btn-outline-yellow-300.active:focus,.btn-outline-yellow-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffda6a80}.btn-outline-yellow-300:disabled,.btn-outline-yellow-300.disabled{color:#ffda6a;background-color:transparent}.btn-outline-yellow-400{color:#ffcd39;border-color:#ffcd39}.btn-outline-yellow-400:hover{color:#000;background-color:#ffcd39;border-color:#ffcd39}.btn-check:focus+.btn-outline-yellow-400,.btn-outline-yellow-400:focus{box-shadow:0 0 0 .25rem #ffcd3980}.btn-check:checked+.btn-outline-yellow-400,.btn-check:active+.btn-outline-yellow-400,.btn-outline-yellow-400:active,.btn-outline-yellow-400.active,.btn-outline-yellow-400.dropdown-toggle.show{color:#000;background-color:#ffcd39;border-color:#ffcd39}.btn-check:checked+.btn-outline-yellow-400:focus,.btn-check:active+.btn-outline-yellow-400:focus,.btn-outline-yellow-400:active:focus,.btn-outline-yellow-400.active:focus,.btn-outline-yellow-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffcd3980}.btn-outline-yellow-400:disabled,.btn-outline-yellow-400.disabled{color:#ffcd39;background-color:transparent}.btn-outline-yellow-500{color:#ffc107;border-color:#ffc107}.btn-outline-yellow-500:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-yellow-500,.btn-outline-yellow-500:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+.btn-outline-yellow-500,.btn-check:active+.btn-outline-yellow-500,.btn-outline-yellow-500:active,.btn-outline-yellow-500.active,.btn-outline-yellow-500.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+.btn-outline-yellow-500:focus,.btn-check:active+.btn-outline-yellow-500:focus,.btn-outline-yellow-500:active:focus,.btn-outline-yellow-500.active:focus,.btn-outline-yellow-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-outline-yellow-500:disabled,.btn-outline-yellow-500.disabled{color:#ffc107;background-color:transparent}.btn-outline-yellow-600{color:#cc9a06;border-color:#cc9a06}.btn-outline-yellow-600:hover{color:#000;background-color:#cc9a06;border-color:#cc9a06}.btn-check:focus+.btn-outline-yellow-600,.btn-outline-yellow-600:focus{box-shadow:0 0 0 .25rem #cc9a0680}.btn-check:checked+.btn-outline-yellow-600,.btn-check:active+.btn-outline-yellow-600,.btn-outline-yellow-600:active,.btn-outline-yellow-600.active,.btn-outline-yellow-600.dropdown-toggle.show{color:#000;background-color:#cc9a06;border-color:#cc9a06}.btn-check:checked+.btn-outline-yellow-600:focus,.btn-check:active+.btn-outline-yellow-600:focus,.btn-outline-yellow-600:active:focus,.btn-outline-yellow-600.active:focus,.btn-outline-yellow-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cc9a0680}.btn-outline-yellow-600:disabled,.btn-outline-yellow-600.disabled{color:#cc9a06;background-color:transparent}.btn-outline-yellow-700{color:#997404;border-color:#997404}.btn-outline-yellow-700:hover{color:#000;background-color:#997404;border-color:#997404}.btn-check:focus+.btn-outline-yellow-700,.btn-outline-yellow-700:focus{box-shadow:0 0 0 .25rem #99740480}.btn-check:checked+.btn-outline-yellow-700,.btn-check:active+.btn-outline-yellow-700,.btn-outline-yellow-700:active,.btn-outline-yellow-700.active,.btn-outline-yellow-700.dropdown-toggle.show{color:#000;background-color:#997404;border-color:#997404}.btn-check:checked+.btn-outline-yellow-700:focus,.btn-check:active+.btn-outline-yellow-700:focus,.btn-outline-yellow-700:active:focus,.btn-outline-yellow-700.active:focus,.btn-outline-yellow-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #99740480}.btn-outline-yellow-700:disabled,.btn-outline-yellow-700.disabled{color:#997404;background-color:transparent}.btn-outline-yellow-800{color:#664d03;border-color:#664d03}.btn-outline-yellow-800:hover{color:#fff;background-color:#664d03;border-color:#664d03}.btn-check:focus+.btn-outline-yellow-800,.btn-outline-yellow-800:focus{box-shadow:0 0 0 .25rem #664d0380}.btn-check:checked+.btn-outline-yellow-800,.btn-check:active+.btn-outline-yellow-800,.btn-outline-yellow-800:active,.btn-outline-yellow-800.active,.btn-outline-yellow-800.dropdown-toggle.show{color:#fff;background-color:#664d03;border-color:#664d03}.btn-check:checked+.btn-outline-yellow-800:focus,.btn-check:active+.btn-outline-yellow-800:focus,.btn-outline-yellow-800:active:focus,.btn-outline-yellow-800.active:focus,.btn-outline-yellow-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #664d0380}.btn-outline-yellow-800:disabled,.btn-outline-yellow-800.disabled{color:#664d03;background-color:transparent}.btn-outline-yellow-900{color:#332701;border-color:#332701}.btn-outline-yellow-900:hover{color:#fff;background-color:#332701;border-color:#332701}.btn-check:focus+.btn-outline-yellow-900,.btn-outline-yellow-900:focus{box-shadow:0 0 0 .25rem #33270180}.btn-check:checked+.btn-outline-yellow-900,.btn-check:active+.btn-outline-yellow-900,.btn-outline-yellow-900:active,.btn-outline-yellow-900.active,.btn-outline-yellow-900.dropdown-toggle.show{color:#fff;background-color:#332701;border-color:#332701}.btn-check:checked+.btn-outline-yellow-900:focus,.btn-check:active+.btn-outline-yellow-900:focus,.btn-outline-yellow-900:active:focus,.btn-outline-yellow-900.active:focus,.btn-outline-yellow-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #33270180}.btn-outline-yellow-900:disabled,.btn-outline-yellow-900.disabled{color:#332701;background-color:transparent}.btn-outline-green-100{color:#d1e7dd;border-color:#d1e7dd}.btn-outline-green-100:hover{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}.btn-check:focus+.btn-outline-green-100,.btn-outline-green-100:focus{box-shadow:0 0 0 .25rem #d1e7dd80}.btn-check:checked+.btn-outline-green-100,.btn-check:active+.btn-outline-green-100,.btn-outline-green-100:active,.btn-outline-green-100.active,.btn-outline-green-100.dropdown-toggle.show{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}.btn-check:checked+.btn-outline-green-100:focus,.btn-check:active+.btn-outline-green-100:focus,.btn-outline-green-100:active:focus,.btn-outline-green-100.active:focus,.btn-outline-green-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d1e7dd80}.btn-outline-green-100:disabled,.btn-outline-green-100.disabled{color:#d1e7dd;background-color:transparent}.btn-outline-green-200{color:#a3cfbb;border-color:#a3cfbb}.btn-outline-green-200:hover{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}.btn-check:focus+.btn-outline-green-200,.btn-outline-green-200:focus{box-shadow:0 0 0 .25rem #a3cfbb80}.btn-check:checked+.btn-outline-green-200,.btn-check:active+.btn-outline-green-200,.btn-outline-green-200:active,.btn-outline-green-200.active,.btn-outline-green-200.dropdown-toggle.show{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}.btn-check:checked+.btn-outline-green-200:focus,.btn-check:active+.btn-outline-green-200:focus,.btn-outline-green-200:active:focus,.btn-outline-green-200.active:focus,.btn-outline-green-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a3cfbb80}.btn-outline-green-200:disabled,.btn-outline-green-200.disabled{color:#a3cfbb;background-color:transparent}.btn-outline-green-300{color:#75b798;border-color:#75b798}.btn-outline-green-300:hover{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:focus+.btn-outline-green-300,.btn-outline-green-300:focus{box-shadow:0 0 0 .25rem #75b79880}.btn-check:checked+.btn-outline-green-300,.btn-check:active+.btn-outline-green-300,.btn-outline-green-300:active,.btn-outline-green-300.active,.btn-outline-green-300.dropdown-toggle.show{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:checked+.btn-outline-green-300:focus,.btn-check:active+.btn-outline-green-300:focus,.btn-outline-green-300:active:focus,.btn-outline-green-300.active:focus,.btn-outline-green-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #75b79880}.btn-outline-green-300:disabled,.btn-outline-green-300.disabled{color:#75b798;background-color:transparent}.btn-outline-green-400{color:#479f76;border-color:#479f76}.btn-outline-green-400:hover{color:#000;background-color:#479f76;border-color:#479f76}.btn-check:focus+.btn-outline-green-400,.btn-outline-green-400:focus{box-shadow:0 0 0 .25rem #479f7680}.btn-check:checked+.btn-outline-green-400,.btn-check:active+.btn-outline-green-400,.btn-outline-green-400:active,.btn-outline-green-400.active,.btn-outline-green-400.dropdown-toggle.show{color:#000;background-color:#479f76;border-color:#479f76}.btn-check:checked+.btn-outline-green-400:focus,.btn-check:active+.btn-outline-green-400:focus,.btn-outline-green-400:active:focus,.btn-outline-green-400.active:focus,.btn-outline-green-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #479f7680}.btn-outline-green-400:disabled,.btn-outline-green-400.disabled{color:#479f76;background-color:transparent}.btn-outline-green-500{color:#198754;border-color:#198754}.btn-outline-green-500:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-green-500,.btn-outline-green-500:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+.btn-outline-green-500,.btn-check:active+.btn-outline-green-500,.btn-outline-green-500:active,.btn-outline-green-500.active,.btn-outline-green-500.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+.btn-outline-green-500:focus,.btn-check:active+.btn-outline-green-500:focus,.btn-outline-green-500:active:focus,.btn-outline-green-500.active:focus,.btn-outline-green-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}.btn-outline-green-500:disabled,.btn-outline-green-500.disabled{color:#198754;background-color:transparent}.btn-outline-green-600{color:#146c43;border-color:#146c43}.btn-outline-green-600:hover{color:#fff;background-color:#146c43;border-color:#146c43}.btn-check:focus+.btn-outline-green-600,.btn-outline-green-600:focus{box-shadow:0 0 0 .25rem #146c4380}.btn-check:checked+.btn-outline-green-600,.btn-check:active+.btn-outline-green-600,.btn-outline-green-600:active,.btn-outline-green-600.active,.btn-outline-green-600.dropdown-toggle.show{color:#fff;background-color:#146c43;border-color:#146c43}.btn-check:checked+.btn-outline-green-600:focus,.btn-check:active+.btn-outline-green-600:focus,.btn-outline-green-600:active:focus,.btn-outline-green-600.active:focus,.btn-outline-green-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #146c4380}.btn-outline-green-600:disabled,.btn-outline-green-600.disabled{color:#146c43;background-color:transparent}.btn-outline-green-700{color:#0f5132;border-color:#0f5132}.btn-outline-green-700:hover{color:#fff;background-color:#0f5132;border-color:#0f5132}.btn-check:focus+.btn-outline-green-700,.btn-outline-green-700:focus{box-shadow:0 0 0 .25rem #0f513280}.btn-check:checked+.btn-outline-green-700,.btn-check:active+.btn-outline-green-700,.btn-outline-green-700:active,.btn-outline-green-700.active,.btn-outline-green-700.dropdown-toggle.show{color:#fff;background-color:#0f5132;border-color:#0f5132}.btn-check:checked+.btn-outline-green-700:focus,.btn-check:active+.btn-outline-green-700:focus,.btn-outline-green-700:active:focus,.btn-outline-green-700.active:focus,.btn-outline-green-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0f513280}.btn-outline-green-700:disabled,.btn-outline-green-700.disabled{color:#0f5132;background-color:transparent}.btn-outline-green-800{color:#0a3622;border-color:#0a3622}.btn-outline-green-800:hover{color:#fff;background-color:#0a3622;border-color:#0a3622}.btn-check:focus+.btn-outline-green-800,.btn-outline-green-800:focus{box-shadow:0 0 0 .25rem #0a362280}.btn-check:checked+.btn-outline-green-800,.btn-check:active+.btn-outline-green-800,.btn-outline-green-800:active,.btn-outline-green-800.active,.btn-outline-green-800.dropdown-toggle.show{color:#fff;background-color:#0a3622;border-color:#0a3622}.btn-check:checked+.btn-outline-green-800:focus,.btn-check:active+.btn-outline-green-800:focus,.btn-outline-green-800:active:focus,.btn-outline-green-800.active:focus,.btn-outline-green-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0a362280}.btn-outline-green-800:disabled,.btn-outline-green-800.disabled{color:#0a3622;background-color:transparent}.btn-outline-green-900{color:#051b11;border-color:#051b11}.btn-outline-green-900:hover{color:#fff;background-color:#051b11;border-color:#051b11}.btn-check:focus+.btn-outline-green-900,.btn-outline-green-900:focus{box-shadow:0 0 0 .25rem #051b1180}.btn-check:checked+.btn-outline-green-900,.btn-check:active+.btn-outline-green-900,.btn-outline-green-900:active,.btn-outline-green-900.active,.btn-outline-green-900.dropdown-toggle.show{color:#fff;background-color:#051b11;border-color:#051b11}.btn-check:checked+.btn-outline-green-900:focus,.btn-check:active+.btn-outline-green-900:focus,.btn-outline-green-900:active:focus,.btn-outline-green-900.active:focus,.btn-outline-green-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #051b1180}.btn-outline-green-900:disabled,.btn-outline-green-900.disabled{color:#051b11;background-color:transparent}.btn-outline-blue-100{color:#cfe2ff;border-color:#cfe2ff}.btn-outline-blue-100:hover{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}.btn-check:focus+.btn-outline-blue-100,.btn-outline-blue-100:focus{box-shadow:0 0 0 .25rem #cfe2ff80}.btn-check:checked+.btn-outline-blue-100,.btn-check:active+.btn-outline-blue-100,.btn-outline-blue-100:active,.btn-outline-blue-100.active,.btn-outline-blue-100.dropdown-toggle.show{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}.btn-check:checked+.btn-outline-blue-100:focus,.btn-check:active+.btn-outline-blue-100:focus,.btn-outline-blue-100:active:focus,.btn-outline-blue-100.active:focus,.btn-outline-blue-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cfe2ff80}.btn-outline-blue-100:disabled,.btn-outline-blue-100.disabled{color:#cfe2ff;background-color:transparent}.btn-outline-blue-200{color:#9ec5fe;border-color:#9ec5fe}.btn-outline-blue-200:hover{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}.btn-check:focus+.btn-outline-blue-200,.btn-outline-blue-200:focus{box-shadow:0 0 0 .25rem #9ec5fe80}.btn-check:checked+.btn-outline-blue-200,.btn-check:active+.btn-outline-blue-200,.btn-outline-blue-200:active,.btn-outline-blue-200.active,.btn-outline-blue-200.dropdown-toggle.show{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}.btn-check:checked+.btn-outline-blue-200:focus,.btn-check:active+.btn-outline-blue-200:focus,.btn-outline-blue-200:active:focus,.btn-outline-blue-200.active:focus,.btn-outline-blue-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #9ec5fe80}.btn-outline-blue-200:disabled,.btn-outline-blue-200.disabled{color:#9ec5fe;background-color:transparent}.btn-outline-blue-300{color:#6ea8fe;border-color:#6ea8fe}.btn-outline-blue-300:hover{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:focus+.btn-outline-blue-300,.btn-outline-blue-300:focus{box-shadow:0 0 0 .25rem #6ea8fe80}.btn-check:checked+.btn-outline-blue-300,.btn-check:active+.btn-outline-blue-300,.btn-outline-blue-300:active,.btn-outline-blue-300.active,.btn-outline-blue-300.dropdown-toggle.show{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:checked+.btn-outline-blue-300:focus,.btn-check:active+.btn-outline-blue-300:focus,.btn-outline-blue-300:active:focus,.btn-outline-blue-300.active:focus,.btn-outline-blue-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6ea8fe80}.btn-outline-blue-300:disabled,.btn-outline-blue-300.disabled{color:#6ea8fe;background-color:transparent}.btn-outline-blue-400{color:#3d8bfd;border-color:#3d8bfd}.btn-outline-blue-400:hover{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}.btn-check:focus+.btn-outline-blue-400,.btn-outline-blue-400:focus{box-shadow:0 0 0 .25rem #3d8bfd80}.btn-check:checked+.btn-outline-blue-400,.btn-check:active+.btn-outline-blue-400,.btn-outline-blue-400:active,.btn-outline-blue-400.active,.btn-outline-blue-400.dropdown-toggle.show{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}.btn-check:checked+.btn-outline-blue-400:focus,.btn-check:active+.btn-outline-blue-400:focus,.btn-outline-blue-400:active:focus,.btn-outline-blue-400.active:focus,.btn-outline-blue-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3d8bfd80}.btn-outline-blue-400:disabled,.btn-outline-blue-400.disabled{color:#3d8bfd;background-color:transparent}.btn-outline-blue-500{color:#0d6efd;border-color:#0d6efd}.btn-outline-blue-500:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-blue-500,.btn-outline-blue-500:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-check:checked+.btn-outline-blue-500,.btn-check:active+.btn-outline-blue-500,.btn-outline-blue-500:active,.btn-outline-blue-500.active,.btn-outline-blue-500.dropdown-toggle.show{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:checked+.btn-outline-blue-500:focus,.btn-check:active+.btn-outline-blue-500:focus,.btn-outline-blue-500:active:focus,.btn-outline-blue-500.active:focus,.btn-outline-blue-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-outline-blue-500:disabled,.btn-outline-blue-500.disabled{color:#0d6efd;background-color:transparent}.btn-outline-blue-600{color:#0a58ca;border-color:#0a58ca}.btn-outline-blue-600:hover{color:#fff;background-color:#0a58ca;border-color:#0a58ca}.btn-check:focus+.btn-outline-blue-600,.btn-outline-blue-600:focus{box-shadow:0 0 0 .25rem #0a58ca80}.btn-check:checked+.btn-outline-blue-600,.btn-check:active+.btn-outline-blue-600,.btn-outline-blue-600:active,.btn-outline-blue-600.active,.btn-outline-blue-600.dropdown-toggle.show{color:#fff;background-color:#0a58ca;border-color:#0a58ca}.btn-check:checked+.btn-outline-blue-600:focus,.btn-check:active+.btn-outline-blue-600:focus,.btn-outline-blue-600:active:focus,.btn-outline-blue-600.active:focus,.btn-outline-blue-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0a58ca80}.btn-outline-blue-600:disabled,.btn-outline-blue-600.disabled{color:#0a58ca;background-color:transparent}.btn-outline-blue-700{color:#084298;border-color:#084298}.btn-outline-blue-700:hover{color:#fff;background-color:#084298;border-color:#084298}.btn-check:focus+.btn-outline-blue-700,.btn-outline-blue-700:focus{box-shadow:0 0 0 .25rem #08429880}.btn-check:checked+.btn-outline-blue-700,.btn-check:active+.btn-outline-blue-700,.btn-outline-blue-700:active,.btn-outline-blue-700.active,.btn-outline-blue-700.dropdown-toggle.show{color:#fff;background-color:#084298;border-color:#084298}.btn-check:checked+.btn-outline-blue-700:focus,.btn-check:active+.btn-outline-blue-700:focus,.btn-outline-blue-700:active:focus,.btn-outline-blue-700.active:focus,.btn-outline-blue-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #08429880}.btn-outline-blue-700:disabled,.btn-outline-blue-700.disabled{color:#084298;background-color:transparent}.btn-outline-blue-800{color:#052c65;border-color:#052c65}.btn-outline-blue-800:hover{color:#fff;background-color:#052c65;border-color:#052c65}.btn-check:focus+.btn-outline-blue-800,.btn-outline-blue-800:focus{box-shadow:0 0 0 .25rem #052c6580}.btn-check:checked+.btn-outline-blue-800,.btn-check:active+.btn-outline-blue-800,.btn-outline-blue-800:active,.btn-outline-blue-800.active,.btn-outline-blue-800.dropdown-toggle.show{color:#fff;background-color:#052c65;border-color:#052c65}.btn-check:checked+.btn-outline-blue-800:focus,.btn-check:active+.btn-outline-blue-800:focus,.btn-outline-blue-800:active:focus,.btn-outline-blue-800.active:focus,.btn-outline-blue-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #052c6580}.btn-outline-blue-800:disabled,.btn-outline-blue-800.disabled{color:#052c65;background-color:transparent}.btn-outline-blue-900{color:#031633;border-color:#031633}.btn-outline-blue-900:hover{color:#fff;background-color:#031633;border-color:#031633}.btn-check:focus+.btn-outline-blue-900,.btn-outline-blue-900:focus{box-shadow:0 0 0 .25rem #03163380}.btn-check:checked+.btn-outline-blue-900,.btn-check:active+.btn-outline-blue-900,.btn-outline-blue-900:active,.btn-outline-blue-900.active,.btn-outline-blue-900.dropdown-toggle.show{color:#fff;background-color:#031633;border-color:#031633}.btn-check:checked+.btn-outline-blue-900:focus,.btn-check:active+.btn-outline-blue-900:focus,.btn-outline-blue-900:active:focus,.btn-outline-blue-900.active:focus,.btn-outline-blue-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #03163380}.btn-outline-blue-900:disabled,.btn-outline-blue-900.disabled{color:#031633;background-color:transparent}.btn-outline-cyan-100{color:#cff4fc;border-color:#cff4fc}.btn-outline-cyan-100:hover{color:#000;background-color:#cff4fc;border-color:#cff4fc}.btn-check:focus+.btn-outline-cyan-100,.btn-outline-cyan-100:focus{box-shadow:0 0 0 .25rem #cff4fc80}.btn-check:checked+.btn-outline-cyan-100,.btn-check:active+.btn-outline-cyan-100,.btn-outline-cyan-100:active,.btn-outline-cyan-100.active,.btn-outline-cyan-100.dropdown-toggle.show{color:#000;background-color:#cff4fc;border-color:#cff4fc}.btn-check:checked+.btn-outline-cyan-100:focus,.btn-check:active+.btn-outline-cyan-100:focus,.btn-outline-cyan-100:active:focus,.btn-outline-cyan-100.active:focus,.btn-outline-cyan-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cff4fc80}.btn-outline-cyan-100:disabled,.btn-outline-cyan-100.disabled{color:#cff4fc;background-color:transparent}.btn-outline-cyan-200{color:#9eeaf9;border-color:#9eeaf9}.btn-outline-cyan-200:hover{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}.btn-check:focus+.btn-outline-cyan-200,.btn-outline-cyan-200:focus{box-shadow:0 0 0 .25rem #9eeaf980}.btn-check:checked+.btn-outline-cyan-200,.btn-check:active+.btn-outline-cyan-200,.btn-outline-cyan-200:active,.btn-outline-cyan-200.active,.btn-outline-cyan-200.dropdown-toggle.show{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}.btn-check:checked+.btn-outline-cyan-200:focus,.btn-check:active+.btn-outline-cyan-200:focus,.btn-outline-cyan-200:active:focus,.btn-outline-cyan-200.active:focus,.btn-outline-cyan-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #9eeaf980}.btn-outline-cyan-200:disabled,.btn-outline-cyan-200.disabled{color:#9eeaf9;background-color:transparent}.btn-outline-cyan-300{color:#6edff6;border-color:#6edff6}.btn-outline-cyan-300:hover{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:focus+.btn-outline-cyan-300,.btn-outline-cyan-300:focus{box-shadow:0 0 0 .25rem #6edff680}.btn-check:checked+.btn-outline-cyan-300,.btn-check:active+.btn-outline-cyan-300,.btn-outline-cyan-300:active,.btn-outline-cyan-300.active,.btn-outline-cyan-300.dropdown-toggle.show{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:checked+.btn-outline-cyan-300:focus,.btn-check:active+.btn-outline-cyan-300:focus,.btn-outline-cyan-300:active:focus,.btn-outline-cyan-300.active:focus,.btn-outline-cyan-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6edff680}.btn-outline-cyan-300:disabled,.btn-outline-cyan-300.disabled{color:#6edff6;background-color:transparent}.btn-outline-cyan-400{color:#3dd5f3;border-color:#3dd5f3}.btn-outline-cyan-400:hover{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}.btn-check:focus+.btn-outline-cyan-400,.btn-outline-cyan-400:focus{box-shadow:0 0 0 .25rem #3dd5f380}.btn-check:checked+.btn-outline-cyan-400,.btn-check:active+.btn-outline-cyan-400,.btn-outline-cyan-400:active,.btn-outline-cyan-400.active,.btn-outline-cyan-400.dropdown-toggle.show{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}.btn-check:checked+.btn-outline-cyan-400:focus,.btn-check:active+.btn-outline-cyan-400:focus,.btn-outline-cyan-400:active:focus,.btn-outline-cyan-400.active:focus,.btn-outline-cyan-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3dd5f380}.btn-outline-cyan-400:disabled,.btn-outline-cyan-400.disabled{color:#3dd5f3;background-color:transparent}.btn-outline-cyan-500{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-cyan-500:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-cyan-500,.btn-outline-cyan-500:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-check:checked+.btn-outline-cyan-500,.btn-check:active+.btn-outline-cyan-500,.btn-outline-cyan-500:active,.btn-outline-cyan-500.active,.btn-outline-cyan-500.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+.btn-outline-cyan-500:focus,.btn-check:active+.btn-outline-cyan-500:focus,.btn-outline-cyan-500:active:focus,.btn-outline-cyan-500.active:focus,.btn-outline-cyan-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-outline-cyan-500:disabled,.btn-outline-cyan-500.disabled{color:#0dcaf0;background-color:transparent}.btn-outline-cyan-600{color:#0aa2c0;border-color:#0aa2c0}.btn-outline-cyan-600:hover{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}.btn-check:focus+.btn-outline-cyan-600,.btn-outline-cyan-600:focus{box-shadow:0 0 0 .25rem #0aa2c080}.btn-check:checked+.btn-outline-cyan-600,.btn-check:active+.btn-outline-cyan-600,.btn-outline-cyan-600:active,.btn-outline-cyan-600.active,.btn-outline-cyan-600.dropdown-toggle.show{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}.btn-check:checked+.btn-outline-cyan-600:focus,.btn-check:active+.btn-outline-cyan-600:focus,.btn-outline-cyan-600:active:focus,.btn-outline-cyan-600.active:focus,.btn-outline-cyan-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0aa2c080}.btn-outline-cyan-600:disabled,.btn-outline-cyan-600.disabled{color:#0aa2c0;background-color:transparent}.btn-outline-cyan-700{color:#087990;border-color:#087990}.btn-outline-cyan-700:hover{color:#fff;background-color:#087990;border-color:#087990}.btn-check:focus+.btn-outline-cyan-700,.btn-outline-cyan-700:focus{box-shadow:0 0 0 .25rem #08799080}.btn-check:checked+.btn-outline-cyan-700,.btn-check:active+.btn-outline-cyan-700,.btn-outline-cyan-700:active,.btn-outline-cyan-700.active,.btn-outline-cyan-700.dropdown-toggle.show{color:#fff;background-color:#087990;border-color:#087990}.btn-check:checked+.btn-outline-cyan-700:focus,.btn-check:active+.btn-outline-cyan-700:focus,.btn-outline-cyan-700:active:focus,.btn-outline-cyan-700.active:focus,.btn-outline-cyan-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #08799080}.btn-outline-cyan-700:disabled,.btn-outline-cyan-700.disabled{color:#087990;background-color:transparent}.btn-outline-cyan-800{color:#055160;border-color:#055160}.btn-outline-cyan-800:hover{color:#fff;background-color:#055160;border-color:#055160}.btn-check:focus+.btn-outline-cyan-800,.btn-outline-cyan-800:focus{box-shadow:0 0 0 .25rem #05516080}.btn-check:checked+.btn-outline-cyan-800,.btn-check:active+.btn-outline-cyan-800,.btn-outline-cyan-800:active,.btn-outline-cyan-800.active,.btn-outline-cyan-800.dropdown-toggle.show{color:#fff;background-color:#055160;border-color:#055160}.btn-check:checked+.btn-outline-cyan-800:focus,.btn-check:active+.btn-outline-cyan-800:focus,.btn-outline-cyan-800:active:focus,.btn-outline-cyan-800.active:focus,.btn-outline-cyan-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #05516080}.btn-outline-cyan-800:disabled,.btn-outline-cyan-800.disabled{color:#055160;background-color:transparent}.btn-outline-cyan-900{color:#032830;border-color:#032830}.btn-outline-cyan-900:hover{color:#fff;background-color:#032830;border-color:#032830}.btn-check:focus+.btn-outline-cyan-900,.btn-outline-cyan-900:focus{box-shadow:0 0 0 .25rem #03283080}.btn-check:checked+.btn-outline-cyan-900,.btn-check:active+.btn-outline-cyan-900,.btn-outline-cyan-900:active,.btn-outline-cyan-900.active,.btn-outline-cyan-900.dropdown-toggle.show{color:#fff;background-color:#032830;border-color:#032830}.btn-check:checked+.btn-outline-cyan-900:focus,.btn-check:active+.btn-outline-cyan-900:focus,.btn-outline-cyan-900:active:focus,.btn-outline-cyan-900.active:focus,.btn-outline-cyan-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #03283080}.btn-outline-cyan-900:disabled,.btn-outline-cyan-900.disabled{color:#032830;background-color:transparent}.btn-outline-indigo-100{color:#e0cffc;border-color:#e0cffc}.btn-outline-indigo-100:hover{color:#000;background-color:#e0cffc;border-color:#e0cffc}.btn-check:focus+.btn-outline-indigo-100,.btn-outline-indigo-100:focus{box-shadow:0 0 0 .25rem #e0cffc80}.btn-check:checked+.btn-outline-indigo-100,.btn-check:active+.btn-outline-indigo-100,.btn-outline-indigo-100:active,.btn-outline-indigo-100.active,.btn-outline-indigo-100.dropdown-toggle.show{color:#000;background-color:#e0cffc;border-color:#e0cffc}.btn-check:checked+.btn-outline-indigo-100:focus,.btn-check:active+.btn-outline-indigo-100:focus,.btn-outline-indigo-100:active:focus,.btn-outline-indigo-100.active:focus,.btn-outline-indigo-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e0cffc80}.btn-outline-indigo-100:disabled,.btn-outline-indigo-100.disabled{color:#e0cffc;background-color:transparent}.btn-outline-indigo-200{color:#c29ffa;border-color:#c29ffa}.btn-outline-indigo-200:hover{color:#000;background-color:#c29ffa;border-color:#c29ffa}.btn-check:focus+.btn-outline-indigo-200,.btn-outline-indigo-200:focus{box-shadow:0 0 0 .25rem #c29ffa80}.btn-check:checked+.btn-outline-indigo-200,.btn-check:active+.btn-outline-indigo-200,.btn-outline-indigo-200:active,.btn-outline-indigo-200.active,.btn-outline-indigo-200.dropdown-toggle.show{color:#000;background-color:#c29ffa;border-color:#c29ffa}.btn-check:checked+.btn-outline-indigo-200:focus,.btn-check:active+.btn-outline-indigo-200:focus,.btn-outline-indigo-200:active:focus,.btn-outline-indigo-200.active:focus,.btn-outline-indigo-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #c29ffa80}.btn-outline-indigo-200:disabled,.btn-outline-indigo-200.disabled{color:#c29ffa;background-color:transparent}.btn-outline-indigo-300{color:#a370f7;border-color:#a370f7}.btn-outline-indigo-300:hover{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:focus+.btn-outline-indigo-300,.btn-outline-indigo-300:focus{box-shadow:0 0 0 .25rem #a370f780}.btn-check:checked+.btn-outline-indigo-300,.btn-check:active+.btn-outline-indigo-300,.btn-outline-indigo-300:active,.btn-outline-indigo-300.active,.btn-outline-indigo-300.dropdown-toggle.show{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:checked+.btn-outline-indigo-300:focus,.btn-check:active+.btn-outline-indigo-300:focus,.btn-outline-indigo-300:active:focus,.btn-outline-indigo-300.active:focus,.btn-outline-indigo-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a370f780}.btn-outline-indigo-300:disabled,.btn-outline-indigo-300.disabled{color:#a370f7;background-color:transparent}.btn-outline-indigo-400{color:#8540f5;border-color:#8540f5}.btn-outline-indigo-400:hover{color:#fff;background-color:#8540f5;border-color:#8540f5}.btn-check:focus+.btn-outline-indigo-400,.btn-outline-indigo-400:focus{box-shadow:0 0 0 .25rem #8540f580}.btn-check:checked+.btn-outline-indigo-400,.btn-check:active+.btn-outline-indigo-400,.btn-outline-indigo-400:active,.btn-outline-indigo-400.active,.btn-outline-indigo-400.dropdown-toggle.show{color:#fff;background-color:#8540f5;border-color:#8540f5}.btn-check:checked+.btn-outline-indigo-400:focus,.btn-check:active+.btn-outline-indigo-400:focus,.btn-outline-indigo-400:active:focus,.btn-outline-indigo-400.active:focus,.btn-outline-indigo-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #8540f580}.btn-outline-indigo-400:disabled,.btn-outline-indigo-400.disabled{color:#8540f5;background-color:transparent}.btn-outline-indigo-500{color:#6610f2;border-color:#6610f2}.btn-outline-indigo-500:hover{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:focus+.btn-outline-indigo-500,.btn-outline-indigo-500:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-check:checked+.btn-outline-indigo-500,.btn-check:active+.btn-outline-indigo-500,.btn-outline-indigo-500:active,.btn-outline-indigo-500.active,.btn-outline-indigo-500.dropdown-toggle.show{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:checked+.btn-outline-indigo-500:focus,.btn-check:active+.btn-outline-indigo-500:focus,.btn-outline-indigo-500:active:focus,.btn-outline-indigo-500.active:focus,.btn-outline-indigo-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-outline-indigo-500:disabled,.btn-outline-indigo-500.disabled{color:#6610f2;background-color:transparent}.btn-outline-indigo-600{color:#520dc2;border-color:#520dc2}.btn-outline-indigo-600:hover{color:#fff;background-color:#520dc2;border-color:#520dc2}.btn-check:focus+.btn-outline-indigo-600,.btn-outline-indigo-600:focus{box-shadow:0 0 0 .25rem #520dc280}.btn-check:checked+.btn-outline-indigo-600,.btn-check:active+.btn-outline-indigo-600,.btn-outline-indigo-600:active,.btn-outline-indigo-600.active,.btn-outline-indigo-600.dropdown-toggle.show{color:#fff;background-color:#520dc2;border-color:#520dc2}.btn-check:checked+.btn-outline-indigo-600:focus,.btn-check:active+.btn-outline-indigo-600:focus,.btn-outline-indigo-600:active:focus,.btn-outline-indigo-600.active:focus,.btn-outline-indigo-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #520dc280}.btn-outline-indigo-600:disabled,.btn-outline-indigo-600.disabled{color:#520dc2;background-color:transparent}.btn-outline-indigo-700{color:#3d0a91;border-color:#3d0a91}.btn-outline-indigo-700:hover{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.btn-check:focus+.btn-outline-indigo-700,.btn-outline-indigo-700:focus{box-shadow:0 0 0 .25rem #3d0a9180}.btn-check:checked+.btn-outline-indigo-700,.btn-check:active+.btn-outline-indigo-700,.btn-outline-indigo-700:active,.btn-outline-indigo-700.active,.btn-outline-indigo-700.dropdown-toggle.show{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.btn-check:checked+.btn-outline-indigo-700:focus,.btn-check:active+.btn-outline-indigo-700:focus,.btn-outline-indigo-700:active:focus,.btn-outline-indigo-700.active:focus,.btn-outline-indigo-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3d0a9180}.btn-outline-indigo-700:disabled,.btn-outline-indigo-700.disabled{color:#3d0a91;background-color:transparent}.btn-outline-indigo-800{color:#290661;border-color:#290661}.btn-outline-indigo-800:hover{color:#fff;background-color:#290661;border-color:#290661}.btn-check:focus+.btn-outline-indigo-800,.btn-outline-indigo-800:focus{box-shadow:0 0 0 .25rem #29066180}.btn-check:checked+.btn-outline-indigo-800,.btn-check:active+.btn-outline-indigo-800,.btn-outline-indigo-800:active,.btn-outline-indigo-800.active,.btn-outline-indigo-800.dropdown-toggle.show{color:#fff;background-color:#290661;border-color:#290661}.btn-check:checked+.btn-outline-indigo-800:focus,.btn-check:active+.btn-outline-indigo-800:focus,.btn-outline-indigo-800:active:focus,.btn-outline-indigo-800.active:focus,.btn-outline-indigo-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #29066180}.btn-outline-indigo-800:disabled,.btn-outline-indigo-800.disabled{color:#290661;background-color:transparent}.btn-outline-indigo-900{color:#140330;border-color:#140330}.btn-outline-indigo-900:hover{color:#fff;background-color:#140330;border-color:#140330}.btn-check:focus+.btn-outline-indigo-900,.btn-outline-indigo-900:focus{box-shadow:0 0 0 .25rem #14033080}.btn-check:checked+.btn-outline-indigo-900,.btn-check:active+.btn-outline-indigo-900,.btn-outline-indigo-900:active,.btn-outline-indigo-900.active,.btn-outline-indigo-900.dropdown-toggle.show{color:#fff;background-color:#140330;border-color:#140330}.btn-check:checked+.btn-outline-indigo-900:focus,.btn-check:active+.btn-outline-indigo-900:focus,.btn-outline-indigo-900:active:focus,.btn-outline-indigo-900.active:focus,.btn-outline-indigo-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #14033080}.btn-outline-indigo-900:disabled,.btn-outline-indigo-900.disabled{color:#140330;background-color:transparent}.btn-outline-purple-100{color:#e2d9f3;border-color:#e2d9f3}.btn-outline-purple-100:hover{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}.btn-check:focus+.btn-outline-purple-100,.btn-outline-purple-100:focus{box-shadow:0 0 0 .25rem #e2d9f380}.btn-check:checked+.btn-outline-purple-100,.btn-check:active+.btn-outline-purple-100,.btn-outline-purple-100:active,.btn-outline-purple-100.active,.btn-outline-purple-100.dropdown-toggle.show{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}.btn-check:checked+.btn-outline-purple-100:focus,.btn-check:active+.btn-outline-purple-100:focus,.btn-outline-purple-100:active:focus,.btn-outline-purple-100.active:focus,.btn-outline-purple-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e2d9f380}.btn-outline-purple-100:disabled,.btn-outline-purple-100.disabled{color:#e2d9f3;background-color:transparent}.btn-outline-purple-200{color:#c5b3e6;border-color:#c5b3e6}.btn-outline-purple-200:hover{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}.btn-check:focus+.btn-outline-purple-200,.btn-outline-purple-200:focus{box-shadow:0 0 0 .25rem #c5b3e680}.btn-check:checked+.btn-outline-purple-200,.btn-check:active+.btn-outline-purple-200,.btn-outline-purple-200:active,.btn-outline-purple-200.active,.btn-outline-purple-200.dropdown-toggle.show{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}.btn-check:checked+.btn-outline-purple-200:focus,.btn-check:active+.btn-outline-purple-200:focus,.btn-outline-purple-200:active:focus,.btn-outline-purple-200.active:focus,.btn-outline-purple-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #c5b3e680}.btn-outline-purple-200:disabled,.btn-outline-purple-200.disabled{color:#c5b3e6;background-color:transparent}.btn-outline-purple-300{color:#a98eda;border-color:#a98eda}.btn-outline-purple-300:hover{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:focus+.btn-outline-purple-300,.btn-outline-purple-300:focus{box-shadow:0 0 0 .25rem #a98eda80}.btn-check:checked+.btn-outline-purple-300,.btn-check:active+.btn-outline-purple-300,.btn-outline-purple-300:active,.btn-outline-purple-300.active,.btn-outline-purple-300.dropdown-toggle.show{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:checked+.btn-outline-purple-300:focus,.btn-check:active+.btn-outline-purple-300:focus,.btn-outline-purple-300:active:focus,.btn-outline-purple-300.active:focus,.btn-outline-purple-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a98eda80}.btn-outline-purple-300:disabled,.btn-outline-purple-300.disabled{color:#a98eda;background-color:transparent}.btn-outline-purple-400{color:#8c68cd;border-color:#8c68cd}.btn-outline-purple-400:hover{color:#000;background-color:#8c68cd;border-color:#8c68cd}.btn-check:focus+.btn-outline-purple-400,.btn-outline-purple-400:focus{box-shadow:0 0 0 .25rem #8c68cd80}.btn-check:checked+.btn-outline-purple-400,.btn-check:active+.btn-outline-purple-400,.btn-outline-purple-400:active,.btn-outline-purple-400.active,.btn-outline-purple-400.dropdown-toggle.show{color:#000;background-color:#8c68cd;border-color:#8c68cd}.btn-check:checked+.btn-outline-purple-400:focus,.btn-check:active+.btn-outline-purple-400:focus,.btn-outline-purple-400:active:focus,.btn-outline-purple-400.active:focus,.btn-outline-purple-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #8c68cd80}.btn-outline-purple-400:disabled,.btn-outline-purple-400.disabled{color:#8c68cd;background-color:transparent}.btn-outline-purple-500{color:#6f42c1;border-color:#6f42c1}.btn-outline-purple-500:hover{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:focus+.btn-outline-purple-500,.btn-outline-purple-500:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-check:checked+.btn-outline-purple-500,.btn-check:active+.btn-outline-purple-500,.btn-outline-purple-500:active,.btn-outline-purple-500.active,.btn-outline-purple-500.dropdown-toggle.show{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:checked+.btn-outline-purple-500:focus,.btn-check:active+.btn-outline-purple-500:focus,.btn-outline-purple-500:active:focus,.btn-outline-purple-500.active:focus,.btn-outline-purple-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-outline-purple-500:disabled,.btn-outline-purple-500.disabled{color:#6f42c1;background-color:transparent}.btn-outline-purple-600{color:#59359a;border-color:#59359a}.btn-outline-purple-600:hover{color:#fff;background-color:#59359a;border-color:#59359a}.btn-check:focus+.btn-outline-purple-600,.btn-outline-purple-600:focus{box-shadow:0 0 0 .25rem #59359a80}.btn-check:checked+.btn-outline-purple-600,.btn-check:active+.btn-outline-purple-600,.btn-outline-purple-600:active,.btn-outline-purple-600.active,.btn-outline-purple-600.dropdown-toggle.show{color:#fff;background-color:#59359a;border-color:#59359a}.btn-check:checked+.btn-outline-purple-600:focus,.btn-check:active+.btn-outline-purple-600:focus,.btn-outline-purple-600:active:focus,.btn-outline-purple-600.active:focus,.btn-outline-purple-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #59359a80}.btn-outline-purple-600:disabled,.btn-outline-purple-600.disabled{color:#59359a;background-color:transparent}.btn-outline-purple-700{color:#432874;border-color:#432874}.btn-outline-purple-700:hover{color:#fff;background-color:#432874;border-color:#432874}.btn-check:focus+.btn-outline-purple-700,.btn-outline-purple-700:focus{box-shadow:0 0 0 .25rem #43287480}.btn-check:checked+.btn-outline-purple-700,.btn-check:active+.btn-outline-purple-700,.btn-outline-purple-700:active,.btn-outline-purple-700.active,.btn-outline-purple-700.dropdown-toggle.show{color:#fff;background-color:#432874;border-color:#432874}.btn-check:checked+.btn-outline-purple-700:focus,.btn-check:active+.btn-outline-purple-700:focus,.btn-outline-purple-700:active:focus,.btn-outline-purple-700.active:focus,.btn-outline-purple-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #43287480}.btn-outline-purple-700:disabled,.btn-outline-purple-700.disabled{color:#432874;background-color:transparent}.btn-outline-purple-800{color:#2c1a4d;border-color:#2c1a4d}.btn-outline-purple-800:hover{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}.btn-check:focus+.btn-outline-purple-800,.btn-outline-purple-800:focus{box-shadow:0 0 0 .25rem #2c1a4d80}.btn-check:checked+.btn-outline-purple-800,.btn-check:active+.btn-outline-purple-800,.btn-outline-purple-800:active,.btn-outline-purple-800.active,.btn-outline-purple-800.dropdown-toggle.show{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}.btn-check:checked+.btn-outline-purple-800:focus,.btn-check:active+.btn-outline-purple-800:focus,.btn-outline-purple-800:active:focus,.btn-outline-purple-800.active:focus,.btn-outline-purple-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2c1a4d80}.btn-outline-purple-800:disabled,.btn-outline-purple-800.disabled{color:#2c1a4d;background-color:transparent}.btn-outline-purple-900{color:#160d27;border-color:#160d27}.btn-outline-purple-900:hover{color:#fff;background-color:#160d27;border-color:#160d27}.btn-check:focus+.btn-outline-purple-900,.btn-outline-purple-900:focus{box-shadow:0 0 0 .25rem #160d2780}.btn-check:checked+.btn-outline-purple-900,.btn-check:active+.btn-outline-purple-900,.btn-outline-purple-900:active,.btn-outline-purple-900.active,.btn-outline-purple-900.dropdown-toggle.show{color:#fff;background-color:#160d27;border-color:#160d27}.btn-check:checked+.btn-outline-purple-900:focus,.btn-check:active+.btn-outline-purple-900:focus,.btn-outline-purple-900:active:focus,.btn-outline-purple-900.active:focus,.btn-outline-purple-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #160d2780}.btn-outline-purple-900:disabled,.btn-outline-purple-900.disabled{color:#160d27;background-color:transparent}.btn-outline-pink-100{color:#f7d6e6;border-color:#f7d6e6}.btn-outline-pink-100:hover{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}.btn-check:focus+.btn-outline-pink-100,.btn-outline-pink-100:focus{box-shadow:0 0 0 .25rem #f7d6e680}.btn-check:checked+.btn-outline-pink-100,.btn-check:active+.btn-outline-pink-100,.btn-outline-pink-100:active,.btn-outline-pink-100.active,.btn-outline-pink-100.dropdown-toggle.show{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}.btn-check:checked+.btn-outline-pink-100:focus,.btn-check:active+.btn-outline-pink-100:focus,.btn-outline-pink-100:active:focus,.btn-outline-pink-100.active:focus,.btn-outline-pink-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f7d6e680}.btn-outline-pink-100:disabled,.btn-outline-pink-100.disabled{color:#f7d6e6;background-color:transparent}.btn-outline-pink-200{color:#efadce;border-color:#efadce}.btn-outline-pink-200:hover{color:#000;background-color:#efadce;border-color:#efadce}.btn-check:focus+.btn-outline-pink-200,.btn-outline-pink-200:focus{box-shadow:0 0 0 .25rem #efadce80}.btn-check:checked+.btn-outline-pink-200,.btn-check:active+.btn-outline-pink-200,.btn-outline-pink-200:active,.btn-outline-pink-200.active,.btn-outline-pink-200.dropdown-toggle.show{color:#000;background-color:#efadce;border-color:#efadce}.btn-check:checked+.btn-outline-pink-200:focus,.btn-check:active+.btn-outline-pink-200:focus,.btn-outline-pink-200:active:focus,.btn-outline-pink-200.active:focus,.btn-outline-pink-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #efadce80}.btn-outline-pink-200:disabled,.btn-outline-pink-200.disabled{color:#efadce;background-color:transparent}.btn-outline-pink-300{color:#e685b5;border-color:#e685b5}.btn-outline-pink-300:hover{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:focus+.btn-outline-pink-300,.btn-outline-pink-300:focus{box-shadow:0 0 0 .25rem #e685b580}.btn-check:checked+.btn-outline-pink-300,.btn-check:active+.btn-outline-pink-300,.btn-outline-pink-300:active,.btn-outline-pink-300.active,.btn-outline-pink-300.dropdown-toggle.show{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:checked+.btn-outline-pink-300:focus,.btn-check:active+.btn-outline-pink-300:focus,.btn-outline-pink-300:active:focus,.btn-outline-pink-300.active:focus,.btn-outline-pink-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e685b580}.btn-outline-pink-300:disabled,.btn-outline-pink-300.disabled{color:#e685b5;background-color:transparent}.btn-outline-pink-400{color:#de5c9d;border-color:#de5c9d}.btn-outline-pink-400:hover{color:#000;background-color:#de5c9d;border-color:#de5c9d}.btn-check:focus+.btn-outline-pink-400,.btn-outline-pink-400:focus{box-shadow:0 0 0 .25rem #de5c9d80}.btn-check:checked+.btn-outline-pink-400,.btn-check:active+.btn-outline-pink-400,.btn-outline-pink-400:active,.btn-outline-pink-400.active,.btn-outline-pink-400.dropdown-toggle.show{color:#000;background-color:#de5c9d;border-color:#de5c9d}.btn-check:checked+.btn-outline-pink-400:focus,.btn-check:active+.btn-outline-pink-400:focus,.btn-outline-pink-400:active:focus,.btn-outline-pink-400.active:focus,.btn-outline-pink-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #de5c9d80}.btn-outline-pink-400:disabled,.btn-outline-pink-400.disabled{color:#de5c9d;background-color:transparent}.btn-outline-pink-500{color:#d63384;border-color:#d63384}.btn-outline-pink-500:hover{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:focus+.btn-outline-pink-500,.btn-outline-pink-500:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-check:checked+.btn-outline-pink-500,.btn-check:active+.btn-outline-pink-500,.btn-outline-pink-500:active,.btn-outline-pink-500.active,.btn-outline-pink-500.dropdown-toggle.show{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:checked+.btn-outline-pink-500:focus,.btn-check:active+.btn-outline-pink-500:focus,.btn-outline-pink-500:active:focus,.btn-outline-pink-500.active:focus,.btn-outline-pink-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-outline-pink-500:disabled,.btn-outline-pink-500.disabled{color:#d63384;background-color:transparent}.btn-outline-pink-600{color:#ab296a;border-color:#ab296a}.btn-outline-pink-600:hover{color:#fff;background-color:#ab296a;border-color:#ab296a}.btn-check:focus+.btn-outline-pink-600,.btn-outline-pink-600:focus{box-shadow:0 0 0 .25rem #ab296a80}.btn-check:checked+.btn-outline-pink-600,.btn-check:active+.btn-outline-pink-600,.btn-outline-pink-600:active,.btn-outline-pink-600.active,.btn-outline-pink-600.dropdown-toggle.show{color:#fff;background-color:#ab296a;border-color:#ab296a}.btn-check:checked+.btn-outline-pink-600:focus,.btn-check:active+.btn-outline-pink-600:focus,.btn-outline-pink-600:active:focus,.btn-outline-pink-600.active:focus,.btn-outline-pink-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ab296a80}.btn-outline-pink-600:disabled,.btn-outline-pink-600.disabled{color:#ab296a;background-color:transparent}.btn-outline-pink-700{color:#801f4f;border-color:#801f4f}.btn-outline-pink-700:hover{color:#fff;background-color:#801f4f;border-color:#801f4f}.btn-check:focus+.btn-outline-pink-700,.btn-outline-pink-700:focus{box-shadow:0 0 0 .25rem #801f4f80}.btn-check:checked+.btn-outline-pink-700,.btn-check:active+.btn-outline-pink-700,.btn-outline-pink-700:active,.btn-outline-pink-700.active,.btn-outline-pink-700.dropdown-toggle.show{color:#fff;background-color:#801f4f;border-color:#801f4f}.btn-check:checked+.btn-outline-pink-700:focus,.btn-check:active+.btn-outline-pink-700:focus,.btn-outline-pink-700:active:focus,.btn-outline-pink-700.active:focus,.btn-outline-pink-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #801f4f80}.btn-outline-pink-700:disabled,.btn-outline-pink-700.disabled{color:#801f4f;background-color:transparent}.btn-outline-pink-800{color:#561435;border-color:#561435}.btn-outline-pink-800:hover{color:#fff;background-color:#561435;border-color:#561435}.btn-check:focus+.btn-outline-pink-800,.btn-outline-pink-800:focus{box-shadow:0 0 0 .25rem #56143580}.btn-check:checked+.btn-outline-pink-800,.btn-check:active+.btn-outline-pink-800,.btn-outline-pink-800:active,.btn-outline-pink-800.active,.btn-outline-pink-800.dropdown-toggle.show{color:#fff;background-color:#561435;border-color:#561435}.btn-check:checked+.btn-outline-pink-800:focus,.btn-check:active+.btn-outline-pink-800:focus,.btn-outline-pink-800:active:focus,.btn-outline-pink-800.active:focus,.btn-outline-pink-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #56143580}.btn-outline-pink-800:disabled,.btn-outline-pink-800.disabled{color:#561435;background-color:transparent}.btn-outline-pink-900{color:#2b0a1a;border-color:#2b0a1a}.btn-outline-pink-900:hover{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}.btn-check:focus+.btn-outline-pink-900,.btn-outline-pink-900:focus{box-shadow:0 0 0 .25rem #2b0a1a80}.btn-check:checked+.btn-outline-pink-900,.btn-check:active+.btn-outline-pink-900,.btn-outline-pink-900:active,.btn-outline-pink-900.active,.btn-outline-pink-900.dropdown-toggle.show{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}.btn-check:checked+.btn-outline-pink-900:focus,.btn-check:active+.btn-outline-pink-900:focus,.btn-outline-pink-900:active:focus,.btn-outline-pink-900.active:focus,.btn-outline-pink-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2b0a1a80}.btn-outline-pink-900:disabled,.btn-outline-pink-900.disabled{color:#2b0a1a;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}.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}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.375rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.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:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle:after{display:none}.dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#00000026}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:#ffffff26}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:#00000026}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.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>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.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:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:.375rem;border-top-right-radius:.375rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:.375rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.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:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.375rem;transition:box-shadow .15s ease-in-out}@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 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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{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:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:#000000e6}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:#000000e6}.navbar-light .navbar-nav .nav-link{color:#0000008c}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:#000000b3}.navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:#000000e6}.navbar-light .navbar-toggler{color:#0000008c;border-color:#0000001a}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#0000008c}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:#000000e6}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#ffffff8c}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:#ffffffbf}.navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#ffffff8c;border-color:#ffffff1a}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#ffffff8c}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.375rem}.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:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;color:#343a40;background-color:"unset";border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.375rem - 1px) calc(.375rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;color:#343a40;background-color:"unset";border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.375rem - 1px) calc(.375rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.375rem - 1px)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#343a40;background-color:#cfe2ff;box-shadow:inset 0 -1px #dee2e6}.accordion-button:not(.collapsed):after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button:after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion: reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.accordion-header{margin-bottom:0}.accordion-item{background-color:transparent;border:1px solid #dee2e6}.accordion-item:first-of-type{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.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-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='currentColor'/%3E%3C/svg%3E"))}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.375rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.375rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#1f496e;background-color:#d6e4f1;border-color:#c2d7e9}.alert-primary .alert-link{color:#193a58}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#225660;background-color:#ddf7fc;border-color:#ccf3fb}.alert-info .alert-link{color:#1b454d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}.alert-red{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-red .alert-link{color:#6a1a21}.alert-yellow{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-yellow .alert-link{color:#523e02}.alert-green{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-green .alert-link{color:#0c4128}.alert-blue{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-blue .alert-link{color:#06357a}.alert-cyan{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-cyan .alert-link{color:#04414d}.alert-indigo{color:#3d0a91;background-color:#e0cffc;border-color:#d1b7fb}.alert-indigo .alert-link{color:#310874}.alert-purple{color:#432874;background-color:#e2d9f3;border-color:#d4c6ec}.alert-purple .alert-link{color:#36205d}.alert-pink{color:#801f4f;background-color:#f7d6e6;border-color:#f3c2da}.alert-pink .alert-link{color:#66193f}.alert-darker{color:#101314;background-color:#d1d2d3;border-color:#bbbcbd}.alert-darker .alert-link{color:#0d0f10}.alert-darkest{color:#0e1011;background-color:#d1d1d2;border-color:#b9bbbb}.alert-darkest .alert-link{color:#0b0d0e}.alert-gray{color:#525557;background-color:#f5f6f8;border-color:#f0f2f4}.alert-gray .alert-link{color:#424446}.alert-gray-100{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-gray-100 .alert-link{color:#4f5050}.alert-gray-200{color:#5d5e60;background-color:#fbfbfc;border-color:#f8f9fa}.alert-gray-200 .alert-link{color:#4a4b4d}.alert-gray-300{color:#595a5c;background-color:#f8f9fa;border-color:#f5f6f8}.alert-gray-300 .alert-link{color:#47484a}.alert-gray-400{color:#525557;background-color:#f5f6f8;border-color:#f0f2f4}.alert-gray-400 .alert-link{color:#424446}.alert-gray-500{color:#686d71;background-color:#eff0f2;border-color:#e6e9eb}.alert-gray-500 .alert-link{color:#53575a}.alert-gray-600{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-gray-600 .alert-link{color:#34383c}.alert-gray-700{color:#2c3034;background-color:#dbdcdd;border-color:#c8cbcd}.alert-gray-700 .alert-link{color:#23262a}.alert-gray-800{color:#1f2326;background-color:#d6d8d9;border-color:#c2c4c6}.alert-gray-800 .alert-link{color:#191c1e}.alert-gray-900{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-gray-900 .alert-link{color:#101214}.alert-red-100{color:#635657;background-color:#fef7f8;border-color:#fdf3f4}.alert-red-100 .alert-link{color:#4f4546}.alert-red-200{color:#604648;background-color:#fceff0;border-color:#fbe7e9}.alert-red-200 .alert-link{color:#4d383a}.alert-red-300{color:#8c5056;background-color:#fbe7e9;border-color:#f9dbdd}.alert-red-300 .alert-link{color:#704045}.alert-red-400{color:#883840;background-color:#f9dfe1;border-color:#f7ced2}.alert-red-400 .alert-link{color:#6d2d33}.alert-red-500{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-red-500 .alert-link{color:#6a1a21}.alert-red-600{color:#6a1921;background-color:#efd4d7;border-color:#e7bfc3}.alert-red-600 .alert-link{color:#55141a}.alert-red-700{color:#4f1319;background-color:#e6d2d4;border-color:#dabcbf}.alert-red-700 .alert-link{color:#3f0f14}.alert-red-800{color:#350d11;background-color:#ded0d2;border-color:#cdb9bb}.alert-red-800 .alert-link{color:#2a0a0e}.alert-red-900{color:#1a0708;background-color:#d5cecf;border-color:#c0b6b7}.alert-red-900 .alert-link{color:#150606}.alert-yellow-100{color:#666152;background-color:#fffdf5;border-color:#fffbf0}.alert-yellow-100 .alert-link{color:#524e42}.alert-yellow-200{color:#665c3e;background-color:#fffaeb;border-color:#fff8e1}.alert-yellow-200 .alert-link{color:#524a32}.alert-yellow-300{color:#66572a;background-color:#fff8e1;border-color:#fff4d2}.alert-yellow-300 .alert-link{color:#524622}.alert-yellow-400{color:#665217;background-color:#fff5d7;border-color:#fff0c4}.alert-yellow-400 .alert-link{color:#524212}.alert-yellow-500{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-yellow-500 .alert-link{color:#523e02}.alert-yellow-600{color:#7a5c04;background-color:#f5ebcd;border-color:#f0e1b4}.alert-yellow-600 .alert-link{color:#624a03}.alert-yellow-700{color:#5c4602;background-color:#ebe3cd;border-color:#e0d5b4}.alert-yellow-700 .alert-link{color:#4a3802}.alert-yellow-800{color:#3d2e02;background-color:#e0dbcd;border-color:#d1cab3}.alert-yellow-800 .alert-link{color:#312502}.alert-yellow-900{color:#1f1701;background-color:#d6d4cc;border-color:#c2beb3}.alert-yellow-900 .alert-link{color:#191201}.alert-green-100{color:#545c58;background-color:#f6faf8;border-color:#f1f8f5}.alert-green-100 .alert-link{color:#434a46}.alert-green-200{color:#41534b;background-color:#edf5f1;border-color:#e3f1eb}.alert-green-200 .alert-link{color:#34423c}.alert-green-300{color:#466e5b;background-color:#e3f1ea;border-color:#d6e9e0}.alert-green-300 .alert-link{color:#385849}.alert-green-400{color:#2b5f47;background-color:#daece4;border-color:#c8e2d6}.alert-green-400 .alert-link{color:#224c39}.alert-green-500{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-green-500 .alert-link{color:#0c4128}.alert-green-600{color:#0c4128;background-color:#d0e2d9;border-color:#b9d3c7}.alert-green-600 .alert-link{color:#0a3420}.alert-green-700{color:#09311e;background-color:#cfdcd6;border-color:#b7cbc2}.alert-green-700 .alert-link{color:#072718}.alert-green-800{color:#062014;background-color:#ced7d3;border-color:#b6c3bd}.alert-green-800 .alert-link{color:#051a10}.alert-green-900{color:#03100a;background-color:#cdd1cf;border-color:#b4bbb8}.alert-green-900 .alert-link{color:#020d08}.alert-blue-100{color:#535a66;background-color:#f5f9ff;border-color:#f1f6ff}.alert-blue-100 .alert-link{color:#424852}.alert-blue-200{color:#3f4f66;background-color:#ecf3ff;border-color:#e2eeff}.alert-blue-200 .alert-link{color:#323f52}.alert-blue-300{color:#426598;background-color:#e2eeff;border-color:#d4e5ff}.alert-blue-300 .alert-link{color:#35517a}.alert-blue-400{color:#255398;background-color:#d8e8ff;border-color:#c5dcfe}.alert-blue-400 .alert-link{color:#1e427a}.alert-blue-500{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-blue-500 .alert-link{color:#06357a}.alert-blue-600{color:#063579;background-color:#cedef4;border-color:#b6cdef}.alert-blue-600 .alert-link{color:#052a61}.alert-blue-700{color:#05285b;background-color:#ced9ea;border-color:#b5c6e0}.alert-blue-700 .alert-link{color:#042049}.alert-blue-800{color:#031a3d;background-color:#cdd5e0;border-color:#b4c0d1}.alert-blue-800 .alert-link{color:#021531}.alert-blue-900{color:#020d1f;background-color:#cdd0d6;border-color:#b3b9c2}.alert-blue-900 .alert-link{color:#020a19}.alert-cyan-100{color:#536265;background-color:#f5fdfe;border-color:#f1fcfe}.alert-cyan-100 .alert-link{color:#424e51}.alert-cyan-200{color:#3f5e64;background-color:#ecfbfe;border-color:#e2f9fd}.alert-cyan-200 .alert-link{color:#324b50}.alert-cyan-300{color:#2c5962;background-color:#e2f9fd;border-color:#d4f5fc}.alert-cyan-300 .alert-link{color:#23474e}.alert-cyan-400{color:#185561;background-color:#d8f7fd;border-color:#c5f2fb}.alert-cyan-400 .alert-link{color:#13444e}.alert-cyan-500{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-cyan-500 .alert-link{color:#04414d}.alert-cyan-600{color:#066173;background-color:#ceecf2;border-color:#b6e3ec}.alert-cyan-600 .alert-link{color:#054e5c}.alert-cyan-700{color:#054956;background-color:#cee4e9;border-color:#b5d7de}.alert-cyan-700 .alert-link{color:#043a45}.alert-cyan-800{color:#03313a;background-color:#cddcdf;border-color:#b4cbcf}.alert-cyan-800 .alert-link{color:#02272e}.alert-cyan-900{color:#02181d;background-color:#cdd4d6;border-color:#b3bfc1}.alert-cyan-900 .alert-link{color:#021317}.alert-indigo-100{color:#5a5365;background-color:#f9f5fe;border-color:#f6f1fe}.alert-indigo-100 .alert-link{color:#484251}.alert-indigo-200{color:#745f96;background-color:#f3ecfe;border-color:#ede2fe}.alert-indigo-200 .alert-link{color:#5d4c78}.alert-indigo-300{color:#624394;background-color:#ede2fd;border-color:#e3d4fd}.alert-indigo-300 .alert-link{color:#4e3676}.alert-indigo-400{color:#502693;background-color:#e7d9fd;border-color:#dac6fc}.alert-indigo-400 .alert-link{color:#401e76}.alert-indigo-500{color:#3d0a91;background-color:#e0cffc;border-color:#d1b7fb}.alert-indigo-500 .alert-link{color:#310874}.alert-indigo-600{color:#310874;background-color:#dccff3;border-color:#cbb6ed}.alert-indigo-600 .alert-link{color:#27065d}.alert-indigo-700{color:#250657;background-color:#d8cee9;border-color:#c5b6de}.alert-indigo-700 .alert-link{color:#1e0546}.alert-indigo-800{color:#19043a;background-color:#d4cddf;border-color:#bfb4d0}.alert-indigo-800 .alert-link{color:#14032e}.alert-indigo-900{color:#0c021d;background-color:#d0cdd6;border-color:#b9b3c1}.alert-indigo-900 .alert-link{color:#0a0217}.alert-purple-100{color:#5a5761;background-color:#f9f7fd;border-color:#f6f4fb}.alert-purple-100 .alert-link{color:#48464e}.alert-purple-200{color:#4f485c;background-color:#f3f0fa;border-color:#eee8f8}.alert-purple-200 .alert-link{color:#3f3a4a}.alert-purple-300{color:#655583;background-color:#eee8f8;border-color:#e5ddf4}.alert-purple-300 .alert-link{color:#514469}.alert-purple-400{color:#543e7b;background-color:#e8e1f5;border-color:#ddd2f0}.alert-purple-400 .alert-link{color:#433262}.alert-purple-500{color:#432874;background-color:#e2d9f3;border-color:#d4c6ec}.alert-purple-500 .alert-link{color:#36205d}.alert-purple-600{color:#35205c;background-color:#ded7eb;border-color:#cdc2e1}.alert-purple-600 .alert-link{color:#2a1a4a}.alert-purple-700{color:#281846;background-color:#d9d4e3;border-color:#c7bfd5}.alert-purple-700 .alert-link{color:#201338}.alert-purple-800{color:#1a102e;background-color:#d5d1db;border-color:#c0baca}.alert-purple-800 .alert-link{color:#150d25}.alert-purple-900{color:#0d0817;background-color:#d0cfd4;border-color:#b9b6be}.alert-purple-900 .alert-link{color:#0a0612}.alert-pink-100{color:#63565c;background-color:#fdf7fa;border-color:#fdf3f8}.alert-pink-100 .alert-link{color:#4f454a}.alert-pink-200{color:#604552;background-color:#fceff5;border-color:#fae6f0}.alert-pink-200 .alert-link{color:#4d3742}.alert-pink-300{color:#8a506d;background-color:#fae7f0;border-color:#f8dae9}.alert-pink-300 .alert-link{color:#6e4057}.alert-pink-400{color:#85375e;background-color:#f8deeb;border-color:#f5cee2}.alert-pink-400 .alert-link{color:#6a2c4b}.alert-pink-500{color:#801f4f;background-color:#f7d6e6;border-color:#f3c2da}.alert-pink-500 .alert-link{color:#66193f}.alert-pink-600{color:#671940;background-color:#eed4e1;border-color:#e6bfd2}.alert-pink-600 .alert-link{color:#521433}.alert-pink-700{color:#4d132f;background-color:#e6d2dc;border-color:#d9bcca}.alert-pink-700 .alert-link{color:#3e0f26}.alert-pink-800{color:#340c20;background-color:#ddd0d7;border-color:#ccb9c2}.alert-pink-800 .alert-link{color:#2a0a1a}.alert-pink-900{color:#1a0610;background-color:#d5ced1;border-color:#bfb6ba}.alert-pink-900 .alert-link{color:#15050d}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.375rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@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:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.375rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#495057;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.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:#adb5bd;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#1f496e;background-color:#d6e4f1}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#1f496e;background-color:#c1cdd9}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1f496e;border-color:#1f496e}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#225660;background-color:#ddf7fc}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#225660;background-color:#c7dee3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#225660;border-color:#225660}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.list-group-item-red{color:#842029;background-color:#f8d7da}.list-group-item-red.list-group-item-action:hover,.list-group-item-red.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}.list-group-item-red.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-yellow{color:#664d03;background-color:#fff3cd}.list-group-item-yellow.list-group-item-action:hover,.list-group-item-yellow.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}.list-group-item-yellow.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-green{color:#0f5132;background-color:#d1e7dd}.list-group-item-green.list-group-item-action:hover,.list-group-item-green.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}.list-group-item-green.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-blue{color:#084298;background-color:#cfe2ff}.list-group-item-blue.list-group-item-action:hover,.list-group-item-blue.list-group-item-action:focus{color:#084298;background-color:#bacbe6}.list-group-item-blue.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-cyan{color:#055160;background-color:#cff4fc}.list-group-item-cyan.list-group-item-action:hover,.list-group-item-cyan.list-group-item-action:focus{color:#055160;background-color:#badce3}.list-group-item-cyan.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-indigo{color:#3d0a91;background-color:#e0cffc}.list-group-item-indigo.list-group-item-action:hover,.list-group-item-indigo.list-group-item-action:focus{color:#3d0a91;background-color:#cabae3}.list-group-item-indigo.list-group-item-action.active{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.list-group-item-purple{color:#432874;background-color:#e2d9f3}.list-group-item-purple.list-group-item-action:hover,.list-group-item-purple.list-group-item-action:focus{color:#432874;background-color:#cbc3db}.list-group-item-purple.list-group-item-action.active{color:#fff;background-color:#432874;border-color:#432874}.list-group-item-pink{color:#801f4f;background-color:#f7d6e6}.list-group-item-pink.list-group-item-action:hover,.list-group-item-pink.list-group-item-action:focus{color:#801f4f;background-color:#dec1cf}.list-group-item-pink.list-group-item-action.active{color:#fff;background-color:#801f4f;border-color:#801f4f}.list-group-item-darker{color:#101314;background-color:#d1d2d3}.list-group-item-darker.list-group-item-action:hover,.list-group-item-darker.list-group-item-action:focus{color:#101314;background-color:#bcbdbe}.list-group-item-darker.list-group-item-action.active{color:#fff;background-color:#101314;border-color:#101314}.list-group-item-darkest{color:#0e1011;background-color:#d1d1d2}.list-group-item-darkest.list-group-item-action:hover,.list-group-item-darkest.list-group-item-action:focus{color:#0e1011;background-color:#bcbcbd}.list-group-item-darkest.list-group-item-action.active{color:#fff;background-color:#0e1011;border-color:#0e1011}.list-group-item-gray{color:#525557;background-color:#f5f6f8}.list-group-item-gray.list-group-item-action:hover,.list-group-item-gray.list-group-item-action:focus{color:#525557;background-color:#dddddf}.list-group-item-gray.list-group-item-action.active{color:#fff;background-color:#525557;border-color:#525557}.list-group-item-gray-100{color:#636464;background-color:#fefefe}.list-group-item-gray-100.list-group-item-action:hover,.list-group-item-gray-100.list-group-item-action:focus{color:#636464;background-color:#e5e5e5}.list-group-item-gray-100.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-gray-200{color:#5d5e60;background-color:#fbfbfc}.list-group-item-gray-200.list-group-item-action:hover,.list-group-item-gray-200.list-group-item-action:focus{color:#5d5e60;background-color:#e2e2e3}.list-group-item-gray-200.list-group-item-action.active{color:#fff;background-color:#5d5e60;border-color:#5d5e60}.list-group-item-gray-300{color:#595a5c;background-color:#f8f9fa}.list-group-item-gray-300.list-group-item-action:hover,.list-group-item-gray-300.list-group-item-action:focus{color:#595a5c;background-color:#dfe0e1}.list-group-item-gray-300.list-group-item-action.active{color:#fff;background-color:#595a5c;border-color:#595a5c}.list-group-item-gray-400{color:#525557;background-color:#f5f6f8}.list-group-item-gray-400.list-group-item-action:hover,.list-group-item-gray-400.list-group-item-action:focus{color:#525557;background-color:#dddddf}.list-group-item-gray-400.list-group-item-action.active{color:#fff;background-color:#525557;border-color:#525557}.list-group-item-gray-500{color:#686d71;background-color:#eff0f2}.list-group-item-gray-500.list-group-item-action:hover,.list-group-item-gray-500.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}.list-group-item-gray-500.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}.list-group-item-gray-600{color:#41464b;background-color:#e2e3e5}.list-group-item-gray-600.list-group-item-action:hover,.list-group-item-gray-600.list-group-item-action:focus{color:#41464b;background-color:#cbccce}.list-group-item-gray-600.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-gray-700{color:#2c3034;background-color:#dbdcdd}.list-group-item-gray-700.list-group-item-action:hover,.list-group-item-gray-700.list-group-item-action:focus{color:#2c3034;background-color:#c5c6c7}.list-group-item-gray-700.list-group-item-action.active{color:#fff;background-color:#2c3034;border-color:#2c3034}.list-group-item-gray-800{color:#1f2326;background-color:#d6d8d9}.list-group-item-gray-800.list-group-item-action:hover,.list-group-item-gray-800.list-group-item-action:focus{color:#1f2326;background-color:#c1c2c3}.list-group-item-gray-800.list-group-item-action.active{color:#fff;background-color:#1f2326;border-color:#1f2326}.list-group-item-gray-900{color:#141619;background-color:#d3d3d4}.list-group-item-gray-900.list-group-item-action:hover,.list-group-item-gray-900.list-group-item-action:focus{color:#141619;background-color:#bebebf}.list-group-item-gray-900.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.list-group-item-red-100{color:#635657;background-color:#fef7f8}.list-group-item-red-100.list-group-item-action:hover,.list-group-item-red-100.list-group-item-action:focus{color:#635657;background-color:#e5dedf}.list-group-item-red-100.list-group-item-action.active{color:#fff;background-color:#635657;border-color:#635657}.list-group-item-red-200{color:#604648;background-color:#fceff0}.list-group-item-red-200.list-group-item-action:hover,.list-group-item-red-200.list-group-item-action:focus{color:#604648;background-color:#e3d7d8}.list-group-item-red-200.list-group-item-action.active{color:#fff;background-color:#604648;border-color:#604648}.list-group-item-red-300{color:#8c5056;background-color:#fbe7e9}.list-group-item-red-300.list-group-item-action:hover,.list-group-item-red-300.list-group-item-action:focus{color:#8c5056;background-color:#e2d0d2}.list-group-item-red-300.list-group-item-action.active{color:#fff;background-color:#8c5056;border-color:#8c5056}.list-group-item-red-400{color:#883840;background-color:#f9dfe1}.list-group-item-red-400.list-group-item-action:hover,.list-group-item-red-400.list-group-item-action:focus{color:#883840;background-color:#e0c9cb}.list-group-item-red-400.list-group-item-action.active{color:#fff;background-color:#883840;border-color:#883840}.list-group-item-red-500{color:#842029;background-color:#f8d7da}.list-group-item-red-500.list-group-item-action:hover,.list-group-item-red-500.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}.list-group-item-red-500.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-red-600{color:#6a1921;background-color:#efd4d7}.list-group-item-red-600.list-group-item-action:hover,.list-group-item-red-600.list-group-item-action:focus{color:#6a1921;background-color:#d7bfc2}.list-group-item-red-600.list-group-item-action.active{color:#fff;background-color:#6a1921;border-color:#6a1921}.list-group-item-red-700{color:#4f1319;background-color:#e6d2d4}.list-group-item-red-700.list-group-item-action:hover,.list-group-item-red-700.list-group-item-action:focus{color:#4f1319;background-color:#cfbdbf}.list-group-item-red-700.list-group-item-action.active{color:#fff;background-color:#4f1319;border-color:#4f1319}.list-group-item-red-800{color:#350d11;background-color:#ded0d2}.list-group-item-red-800.list-group-item-action:hover,.list-group-item-red-800.list-group-item-action:focus{color:#350d11;background-color:#c8bbbd}.list-group-item-red-800.list-group-item-action.active{color:#fff;background-color:#350d11;border-color:#350d11}.list-group-item-red-900{color:#1a0708;background-color:#d5cecf}.list-group-item-red-900.list-group-item-action:hover,.list-group-item-red-900.list-group-item-action:focus{color:#1a0708;background-color:#c0b9ba}.list-group-item-red-900.list-group-item-action.active{color:#fff;background-color:#1a0708;border-color:#1a0708}.list-group-item-yellow-100{color:#666152;background-color:#fffdf5}.list-group-item-yellow-100.list-group-item-action:hover,.list-group-item-yellow-100.list-group-item-action:focus{color:#666152;background-color:#e6e4dd}.list-group-item-yellow-100.list-group-item-action.active{color:#fff;background-color:#666152;border-color:#666152}.list-group-item-yellow-200{color:#665c3e;background-color:#fffaeb}.list-group-item-yellow-200.list-group-item-action:hover,.list-group-item-yellow-200.list-group-item-action:focus{color:#665c3e;background-color:#e6e1d4}.list-group-item-yellow-200.list-group-item-action.active{color:#fff;background-color:#665c3e;border-color:#665c3e}.list-group-item-yellow-300{color:#66572a;background-color:#fff8e1}.list-group-item-yellow-300.list-group-item-action:hover,.list-group-item-yellow-300.list-group-item-action:focus{color:#66572a;background-color:#e6dfcb}.list-group-item-yellow-300.list-group-item-action.active{color:#fff;background-color:#66572a;border-color:#66572a}.list-group-item-yellow-400{color:#665217;background-color:#fff5d7}.list-group-item-yellow-400.list-group-item-action:hover,.list-group-item-yellow-400.list-group-item-action:focus{color:#665217;background-color:#e6ddc2}.list-group-item-yellow-400.list-group-item-action.active{color:#fff;background-color:#665217;border-color:#665217}.list-group-item-yellow-500{color:#664d03;background-color:#fff3cd}.list-group-item-yellow-500.list-group-item-action:hover,.list-group-item-yellow-500.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}.list-group-item-yellow-500.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-yellow-600{color:#7a5c04;background-color:#f5ebcd}.list-group-item-yellow-600.list-group-item-action:hover,.list-group-item-yellow-600.list-group-item-action:focus{color:#7a5c04;background-color:#ddd4b9}.list-group-item-yellow-600.list-group-item-action.active{color:#fff;background-color:#7a5c04;border-color:#7a5c04}.list-group-item-yellow-700{color:#5c4602;background-color:#ebe3cd}.list-group-item-yellow-700.list-group-item-action:hover,.list-group-item-yellow-700.list-group-item-action:focus{color:#5c4602;background-color:#d4ccb9}.list-group-item-yellow-700.list-group-item-action.active{color:#fff;background-color:#5c4602;border-color:#5c4602}.list-group-item-yellow-800{color:#3d2e02;background-color:#e0dbcd}.list-group-item-yellow-800.list-group-item-action:hover,.list-group-item-yellow-800.list-group-item-action:focus{color:#3d2e02;background-color:#cac5b9}.list-group-item-yellow-800.list-group-item-action.active{color:#fff;background-color:#3d2e02;border-color:#3d2e02}.list-group-item-yellow-900{color:#1f1701;background-color:#d6d4cc}.list-group-item-yellow-900.list-group-item-action:hover,.list-group-item-yellow-900.list-group-item-action:focus{color:#1f1701;background-color:#c1bfb8}.list-group-item-yellow-900.list-group-item-action.active{color:#fff;background-color:#1f1701;border-color:#1f1701}.list-group-item-green-100{color:#545c58;background-color:#f6faf8}.list-group-item-green-100.list-group-item-action:hover,.list-group-item-green-100.list-group-item-action:focus{color:#545c58;background-color:#dde1df}.list-group-item-green-100.list-group-item-action.active{color:#fff;background-color:#545c58;border-color:#545c58}.list-group-item-green-200{color:#41534b;background-color:#edf5f1}.list-group-item-green-200.list-group-item-action:hover,.list-group-item-green-200.list-group-item-action:focus{color:#41534b;background-color:#d5ddd9}.list-group-item-green-200.list-group-item-action.active{color:#fff;background-color:#41534b;border-color:#41534b}.list-group-item-green-300{color:#466e5b;background-color:#e3f1ea}.list-group-item-green-300.list-group-item-action:hover,.list-group-item-green-300.list-group-item-action:focus{color:#466e5b;background-color:#ccd9d3}.list-group-item-green-300.list-group-item-action.active{color:#fff;background-color:#466e5b;border-color:#466e5b}.list-group-item-green-400{color:#2b5f47;background-color:#daece4}.list-group-item-green-400.list-group-item-action:hover,.list-group-item-green-400.list-group-item-action:focus{color:#2b5f47;background-color:#c4d4cd}.list-group-item-green-400.list-group-item-action.active{color:#fff;background-color:#2b5f47;border-color:#2b5f47}.list-group-item-green-500{color:#0f5132;background-color:#d1e7dd}.list-group-item-green-500.list-group-item-action:hover,.list-group-item-green-500.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}.list-group-item-green-500.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-green-600{color:#0c4128;background-color:#d0e2d9}.list-group-item-green-600.list-group-item-action:hover,.list-group-item-green-600.list-group-item-action:focus{color:#0c4128;background-color:#bbcbc3}.list-group-item-green-600.list-group-item-action.active{color:#fff;background-color:#0c4128;border-color:#0c4128}.list-group-item-green-700{color:#09311e;background-color:#cfdcd6}.list-group-item-green-700.list-group-item-action:hover,.list-group-item-green-700.list-group-item-action:focus{color:#09311e;background-color:#bac6c1}.list-group-item-green-700.list-group-item-action.active{color:#fff;background-color:#09311e;border-color:#09311e}.list-group-item-green-800{color:#062014;background-color:#ced7d3}.list-group-item-green-800.list-group-item-action:hover,.list-group-item-green-800.list-group-item-action:focus{color:#062014;background-color:#b9c2be}.list-group-item-green-800.list-group-item-action.active{color:#fff;background-color:#062014;border-color:#062014}.list-group-item-green-900{color:#03100a;background-color:#cdd1cf}.list-group-item-green-900.list-group-item-action:hover,.list-group-item-green-900.list-group-item-action:focus{color:#03100a;background-color:#b9bcba}.list-group-item-green-900.list-group-item-action.active{color:#fff;background-color:#03100a;border-color:#03100a}.list-group-item-blue-100{color:#535a66;background-color:#f5f9ff}.list-group-item-blue-100.list-group-item-action:hover,.list-group-item-blue-100.list-group-item-action:focus{color:#535a66;background-color:#dde0e6}.list-group-item-blue-100.list-group-item-action.active{color:#fff;background-color:#535a66;border-color:#535a66}.list-group-item-blue-200{color:#3f4f66;background-color:#ecf3ff}.list-group-item-blue-200.list-group-item-action:hover,.list-group-item-blue-200.list-group-item-action:focus{color:#3f4f66;background-color:#d4dbe6}.list-group-item-blue-200.list-group-item-action.active{color:#fff;background-color:#3f4f66;border-color:#3f4f66}.list-group-item-blue-300{color:#426598;background-color:#e2eeff}.list-group-item-blue-300.list-group-item-action:hover,.list-group-item-blue-300.list-group-item-action:focus{color:#426598;background-color:#cbd6e6}.list-group-item-blue-300.list-group-item-action.active{color:#fff;background-color:#426598;border-color:#426598}.list-group-item-blue-400{color:#255398;background-color:#d8e8ff}.list-group-item-blue-400.list-group-item-action:hover,.list-group-item-blue-400.list-group-item-action:focus{color:#255398;background-color:#c2d1e6}.list-group-item-blue-400.list-group-item-action.active{color:#fff;background-color:#255398;border-color:#255398}.list-group-item-blue-500{color:#084298;background-color:#cfe2ff}.list-group-item-blue-500.list-group-item-action:hover,.list-group-item-blue-500.list-group-item-action:focus{color:#084298;background-color:#bacbe6}.list-group-item-blue-500.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-blue-600{color:#063579;background-color:#cedef4}.list-group-item-blue-600.list-group-item-action:hover,.list-group-item-blue-600.list-group-item-action:focus{color:#063579;background-color:#b9c8dc}.list-group-item-blue-600.list-group-item-action.active{color:#fff;background-color:#063579;border-color:#063579}.list-group-item-blue-700{color:#05285b;background-color:#ced9ea}.list-group-item-blue-700.list-group-item-action:hover,.list-group-item-blue-700.list-group-item-action:focus{color:#05285b;background-color:#b9c3d3}.list-group-item-blue-700.list-group-item-action.active{color:#fff;background-color:#05285b;border-color:#05285b}.list-group-item-blue-800{color:#031a3d;background-color:#cdd5e0}.list-group-item-blue-800.list-group-item-action:hover,.list-group-item-blue-800.list-group-item-action:focus{color:#031a3d;background-color:#b9c0ca}.list-group-item-blue-800.list-group-item-action.active{color:#fff;background-color:#031a3d;border-color:#031a3d}.list-group-item-blue-900{color:#020d1f;background-color:#cdd0d6}.list-group-item-blue-900.list-group-item-action:hover,.list-group-item-blue-900.list-group-item-action:focus{color:#020d1f;background-color:#b9bbc1}.list-group-item-blue-900.list-group-item-action.active{color:#fff;background-color:#020d1f;border-color:#020d1f}.list-group-item-cyan-100{color:#536265;background-color:#f5fdfe}.list-group-item-cyan-100.list-group-item-action:hover,.list-group-item-cyan-100.list-group-item-action:focus{color:#536265;background-color:#dde4e5}.list-group-item-cyan-100.list-group-item-action.active{color:#fff;background-color:#536265;border-color:#536265}.list-group-item-cyan-200{color:#3f5e64;background-color:#ecfbfe}.list-group-item-cyan-200.list-group-item-action:hover,.list-group-item-cyan-200.list-group-item-action:focus{color:#3f5e64;background-color:#d4e2e5}.list-group-item-cyan-200.list-group-item-action.active{color:#fff;background-color:#3f5e64;border-color:#3f5e64}.list-group-item-cyan-300{color:#2c5962;background-color:#e2f9fd}.list-group-item-cyan-300.list-group-item-action:hover,.list-group-item-cyan-300.list-group-item-action:focus{color:#2c5962;background-color:#cbe0e4}.list-group-item-cyan-300.list-group-item-action.active{color:#fff;background-color:#2c5962;border-color:#2c5962}.list-group-item-cyan-400{color:#185561;background-color:#d8f7fd}.list-group-item-cyan-400.list-group-item-action:hover,.list-group-item-cyan-400.list-group-item-action:focus{color:#185561;background-color:#c2dee4}.list-group-item-cyan-400.list-group-item-action.active{color:#fff;background-color:#185561;border-color:#185561}.list-group-item-cyan-500{color:#055160;background-color:#cff4fc}.list-group-item-cyan-500.list-group-item-action:hover,.list-group-item-cyan-500.list-group-item-action:focus{color:#055160;background-color:#badce3}.list-group-item-cyan-500.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-cyan-600{color:#066173;background-color:#ceecf2}.list-group-item-cyan-600.list-group-item-action:hover,.list-group-item-cyan-600.list-group-item-action:focus{color:#066173;background-color:#b9d4da}.list-group-item-cyan-600.list-group-item-action.active{color:#fff;background-color:#066173;border-color:#066173}.list-group-item-cyan-700{color:#054956;background-color:#cee4e9}.list-group-item-cyan-700.list-group-item-action:hover,.list-group-item-cyan-700.list-group-item-action:focus{color:#054956;background-color:#b9cdd2}.list-group-item-cyan-700.list-group-item-action.active{color:#fff;background-color:#054956;border-color:#054956}.list-group-item-cyan-800{color:#03313a;background-color:#cddcdf}.list-group-item-cyan-800.list-group-item-action:hover,.list-group-item-cyan-800.list-group-item-action:focus{color:#03313a;background-color:#b9c6c9}.list-group-item-cyan-800.list-group-item-action.active{color:#fff;background-color:#03313a;border-color:#03313a}.list-group-item-cyan-900{color:#02181d;background-color:#cdd4d6}.list-group-item-cyan-900.list-group-item-action:hover,.list-group-item-cyan-900.list-group-item-action:focus{color:#02181d;background-color:#b9bfc1}.list-group-item-cyan-900.list-group-item-action.active{color:#fff;background-color:#02181d;border-color:#02181d}.list-group-item-indigo-100{color:#5a5365;background-color:#f9f5fe}.list-group-item-indigo-100.list-group-item-action:hover,.list-group-item-indigo-100.list-group-item-action:focus{color:#5a5365;background-color:#e0dde5}.list-group-item-indigo-100.list-group-item-action.active{color:#fff;background-color:#5a5365;border-color:#5a5365}.list-group-item-indigo-200{color:#745f96;background-color:#f3ecfe}.list-group-item-indigo-200.list-group-item-action:hover,.list-group-item-indigo-200.list-group-item-action:focus{color:#745f96;background-color:#dbd4e5}.list-group-item-indigo-200.list-group-item-action.active{color:#fff;background-color:#745f96;border-color:#745f96}.list-group-item-indigo-300{color:#624394;background-color:#ede2fd}.list-group-item-indigo-300.list-group-item-action:hover,.list-group-item-indigo-300.list-group-item-action:focus{color:#624394;background-color:#d5cbe4}.list-group-item-indigo-300.list-group-item-action.active{color:#fff;background-color:#624394;border-color:#624394}.list-group-item-indigo-400{color:#502693;background-color:#e7d9fd}.list-group-item-indigo-400.list-group-item-action:hover,.list-group-item-indigo-400.list-group-item-action:focus{color:#502693;background-color:#d0c3e4}.list-group-item-indigo-400.list-group-item-action.active{color:#fff;background-color:#502693;border-color:#502693}.list-group-item-indigo-500{color:#3d0a91;background-color:#e0cffc}.list-group-item-indigo-500.list-group-item-action:hover,.list-group-item-indigo-500.list-group-item-action:focus{color:#3d0a91;background-color:#cabae3}.list-group-item-indigo-500.list-group-item-action.active{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.list-group-item-indigo-600{color:#310874;background-color:#dccff3}.list-group-item-indigo-600.list-group-item-action:hover,.list-group-item-indigo-600.list-group-item-action:focus{color:#310874;background-color:#c6badb}.list-group-item-indigo-600.list-group-item-action.active{color:#fff;background-color:#310874;border-color:#310874}.list-group-item-indigo-700{color:#250657;background-color:#d8cee9}.list-group-item-indigo-700.list-group-item-action:hover,.list-group-item-indigo-700.list-group-item-action:focus{color:#250657;background-color:#c2b9d2}.list-group-item-indigo-700.list-group-item-action.active{color:#fff;background-color:#250657;border-color:#250657}.list-group-item-indigo-800{color:#19043a;background-color:#d4cddf}.list-group-item-indigo-800.list-group-item-action:hover,.list-group-item-indigo-800.list-group-item-action:focus{color:#19043a;background-color:#bfb9c9}.list-group-item-indigo-800.list-group-item-action.active{color:#fff;background-color:#19043a;border-color:#19043a}.list-group-item-indigo-900{color:#0c021d;background-color:#d0cdd6}.list-group-item-indigo-900.list-group-item-action:hover,.list-group-item-indigo-900.list-group-item-action:focus{color:#0c021d;background-color:#bbb9c1}.list-group-item-indigo-900.list-group-item-action.active{color:#fff;background-color:#0c021d;border-color:#0c021d}.list-group-item-purple-100{color:#5a5761;background-color:#f9f7fd}.list-group-item-purple-100.list-group-item-action:hover,.list-group-item-purple-100.list-group-item-action:focus{color:#5a5761;background-color:#e0dee4}.list-group-item-purple-100.list-group-item-action.active{color:#fff;background-color:#5a5761;border-color:#5a5761}.list-group-item-purple-200{color:#4f485c;background-color:#f3f0fa}.list-group-item-purple-200.list-group-item-action:hover,.list-group-item-purple-200.list-group-item-action:focus{color:#4f485c;background-color:#dbd8e1}.list-group-item-purple-200.list-group-item-action.active{color:#fff;background-color:#4f485c;border-color:#4f485c}.list-group-item-purple-300{color:#655583;background-color:#eee8f8}.list-group-item-purple-300.list-group-item-action:hover,.list-group-item-purple-300.list-group-item-action:focus{color:#655583;background-color:#d6d1df}.list-group-item-purple-300.list-group-item-action.active{color:#fff;background-color:#655583;border-color:#655583}.list-group-item-purple-400{color:#543e7b;background-color:#e8e1f5}.list-group-item-purple-400.list-group-item-action:hover,.list-group-item-purple-400.list-group-item-action:focus{color:#543e7b;background-color:#d1cbdd}.list-group-item-purple-400.list-group-item-action.active{color:#fff;background-color:#543e7b;border-color:#543e7b}.list-group-item-purple-500{color:#432874;background-color:#e2d9f3}.list-group-item-purple-500.list-group-item-action:hover,.list-group-item-purple-500.list-group-item-action:focus{color:#432874;background-color:#cbc3db}.list-group-item-purple-500.list-group-item-action.active{color:#fff;background-color:#432874;border-color:#432874}.list-group-item-purple-600{color:#35205c;background-color:#ded7eb}.list-group-item-purple-600.list-group-item-action:hover,.list-group-item-purple-600.list-group-item-action:focus{color:#35205c;background-color:#c8c2d4}.list-group-item-purple-600.list-group-item-action.active{color:#fff;background-color:#35205c;border-color:#35205c}.list-group-item-purple-700{color:#281846;background-color:#d9d4e3}.list-group-item-purple-700.list-group-item-action:hover,.list-group-item-purple-700.list-group-item-action:focus{color:#281846;background-color:#c3bfcc}.list-group-item-purple-700.list-group-item-action.active{color:#fff;background-color:#281846;border-color:#281846}.list-group-item-purple-800{color:#1a102e;background-color:#d5d1db}.list-group-item-purple-800.list-group-item-action:hover,.list-group-item-purple-800.list-group-item-action:focus{color:#1a102e;background-color:#c0bcc5}.list-group-item-purple-800.list-group-item-action.active{color:#fff;background-color:#1a102e;border-color:#1a102e}.list-group-item-purple-900{color:#0d0817;background-color:#d0cfd4}.list-group-item-purple-900.list-group-item-action:hover,.list-group-item-purple-900.list-group-item-action:focus{color:#0d0817;background-color:#bbbabf}.list-group-item-purple-900.list-group-item-action.active{color:#fff;background-color:#0d0817;border-color:#0d0817}.list-group-item-pink-100{color:#63565c;background-color:#fdf7fa}.list-group-item-pink-100.list-group-item-action:hover,.list-group-item-pink-100.list-group-item-action:focus{color:#63565c;background-color:#e4dee1}.list-group-item-pink-100.list-group-item-action.active{color:#fff;background-color:#63565c;border-color:#63565c}.list-group-item-pink-200{color:#604552;background-color:#fceff5}.list-group-item-pink-200.list-group-item-action:hover,.list-group-item-pink-200.list-group-item-action:focus{color:#604552;background-color:#e3d7dd}.list-group-item-pink-200.list-group-item-action.active{color:#fff;background-color:#604552;border-color:#604552}.list-group-item-pink-300{color:#8a506d;background-color:#fae7f0}.list-group-item-pink-300.list-group-item-action:hover,.list-group-item-pink-300.list-group-item-action:focus{color:#8a506d;background-color:#e1d0d8}.list-group-item-pink-300.list-group-item-action.active{color:#fff;background-color:#8a506d;border-color:#8a506d}.list-group-item-pink-400{color:#85375e;background-color:#f8deeb}.list-group-item-pink-400.list-group-item-action:hover,.list-group-item-pink-400.list-group-item-action:focus{color:#85375e;background-color:#dfc8d4}.list-group-item-pink-400.list-group-item-action.active{color:#fff;background-color:#85375e;border-color:#85375e}.list-group-item-pink-500{color:#801f4f;background-color:#f7d6e6}.list-group-item-pink-500.list-group-item-action:hover,.list-group-item-pink-500.list-group-item-action:focus{color:#801f4f;background-color:#dec1cf}.list-group-item-pink-500.list-group-item-action.active{color:#fff;background-color:#801f4f;border-color:#801f4f}.list-group-item-pink-600{color:#671940;background-color:#eed4e1}.list-group-item-pink-600.list-group-item-action:hover,.list-group-item-pink-600.list-group-item-action:focus{color:#671940;background-color:#d6bfcb}.list-group-item-pink-600.list-group-item-action.active{color:#fff;background-color:#671940;border-color:#671940}.list-group-item-pink-700{color:#4d132f;background-color:#e6d2dc}.list-group-item-pink-700.list-group-item-action:hover,.list-group-item-pink-700.list-group-item-action:focus{color:#4d132f;background-color:#cfbdc6}.list-group-item-pink-700.list-group-item-action.active{color:#fff;background-color:#4d132f;border-color:#4d132f}.list-group-item-pink-800{color:#340c20;background-color:#ddd0d7}.list-group-item-pink-800.list-group-item-action:hover,.list-group-item-pink-800.list-group-item-action:focus{color:#340c20;background-color:#c7bbc2}.list-group-item-pink-800.list-group-item-action.active{color:#fff;background-color:#340c20;border-color:#340c20}.list-group-item-pink-900{color:#1a0610;background-color:#d5ced1}.list-group-item-pink-900.list-group-item-action:hover,.list-group-item-pink-900.list-group-item-action:focus{color:#1a0610;background-color:#c0b9bc}.list-group-item-pink-900.list-group-item-action.active{color:#fff;background-color:#1a0610;border-color:#1a0610}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40;opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:#ffffffd9;background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem #00000026;border-radius:.375rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:#ffffffd9;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.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% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.75rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}.modal-header .btn-close{padding:.5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.75rem - 1px);border-bottom-left-radius:calc(.75rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-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{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@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{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@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{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@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{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@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{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@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{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.375rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.75rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow:before,.popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.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:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem;color:#212529}.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;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:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.clearfix:after{display:block;clear:both;content:""}.link-primary{color:#337ab7}.link-primary:hover,.link-primary:focus{color:#296292}.link-secondary{color:#6c757d}.link-secondary:hover,.link-secondary:focus{color:#565e64}.link-success{color:#198754}.link-success:hover,.link-success:focus{color:#146c43}.link-info{color:#54d6f0}.link-info:hover,.link-info:focus{color:#76def3}.link-warning{color:#ffc107}.link-warning:hover,.link-warning:focus{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:hover,.link-danger:focus{color:#b02a37}.link-light{color:#f8f9fa}.link-light:hover,.link-light:focus{color:#f9fafb}.link-dark{color:#212529}.link-dark:hover,.link-dark:focus{color:#1a1e21}.link-red{color:#dc3545}.link-red:hover,.link-red:focus{color:#b02a37}.link-yellow{color:#ffc107}.link-yellow:hover,.link-yellow:focus{color:#ffcd39}.link-green{color:#198754}.link-green:hover,.link-green:focus{color:#146c43}.link-blue{color:#0d6efd}.link-blue:hover,.link-blue:focus{color:#0a58ca}.link-cyan{color:#0dcaf0}.link-cyan:hover,.link-cyan:focus{color:#3dd5f3}.link-indigo{color:#6610f2}.link-indigo:hover,.link-indigo:focus{color:#520dc2}.link-purple{color:#6f42c1}.link-purple:hover,.link-purple:focus{color:#59359a}.link-pink{color:#d63384}.link-pink:hover,.link-pink:focus{color:#ab296a}.link-darker{color:#1b1f22}.link-darker:hover,.link-darker:focus{color:#16191b}.link-darkest{color:#171b1d}.link-darkest:hover,.link-darkest:focus{color:#121617}.link-gray{color:#ced4da}.link-gray:hover,.link-gray:focus{color:#d8dde1}.link-gray-100{color:#f8f9fa}.link-gray-100:hover,.link-gray-100:focus{color:#f9fafb}.link-gray-200{color:#e9ecef}.link-gray-200:hover,.link-gray-200:focus{color:#edf0f2}.link-gray-300{color:#dee2e6}.link-gray-300:hover,.link-gray-300:focus{color:#e5e8eb}.link-gray-400{color:#ced4da}.link-gray-400:hover,.link-gray-400:focus{color:#d8dde1}.link-gray-500{color:#adb5bd}.link-gray-500:hover,.link-gray-500:focus{color:#bdc4ca}.link-gray-600{color:#6c757d}.link-gray-600:hover,.link-gray-600:focus{color:#565e64}.link-gray-700{color:#495057}.link-gray-700:hover,.link-gray-700:focus{color:#3a4046}.link-gray-800{color:#343a40}.link-gray-800:hover,.link-gray-800:focus{color:#2a2e33}.link-gray-900{color:#212529}.link-gray-900:hover,.link-gray-900:focus{color:#1a1e21}.link-red-100{color:#f8d7da}.link-red-100:hover,.link-red-100:focus{color:#f9dfe1}.link-red-200{color:#f1aeb5}.link-red-200:hover,.link-red-200:focus{color:#f4bec4}.link-red-300{color:#ea868f}.link-red-300:hover,.link-red-300:focus{color:#ee9ea5}.link-red-400{color:#e35d6a}.link-red-400:hover,.link-red-400:focus{color:#e97d88}.link-red-500{color:#dc3545}.link-red-500:hover,.link-red-500:focus{color:#b02a37}.link-red-600{color:#b02a37}.link-red-600:hover,.link-red-600:focus{color:#8d222c}.link-red-700{color:#842029}.link-red-700:hover,.link-red-700:focus{color:#6a1a21}.link-red-800{color:#58151c}.link-red-800:hover,.link-red-800:focus{color:#461116}.link-red-900{color:#2c0b0e}.link-red-900:hover,.link-red-900:focus{color:#23090b}.link-yellow-100{color:#fff3cd}.link-yellow-100:hover,.link-yellow-100:focus{color:#fff5d7}.link-yellow-200{color:#ffe69c}.link-yellow-200:hover,.link-yellow-200:focus{color:#ffebb0}.link-yellow-300{color:#ffda6a}.link-yellow-300:hover,.link-yellow-300:focus{color:#ffe188}.link-yellow-400{color:#ffcd39}.link-yellow-400:hover,.link-yellow-400:focus{color:#ffd761}.link-yellow-500{color:#ffc107}.link-yellow-500:hover,.link-yellow-500:focus{color:#ffcd39}.link-yellow-600{color:#cc9a06}.link-yellow-600:hover,.link-yellow-600:focus{color:#d6ae38}.link-yellow-700{color:#997404}.link-yellow-700:hover,.link-yellow-700:focus{color:#ad9036}.link-yellow-800{color:#664d03}.link-yellow-800:hover,.link-yellow-800:focus{color:#523e02}.link-yellow-900{color:#332701}.link-yellow-900:hover,.link-yellow-900:focus{color:#291f01}.link-green-100{color:#d1e7dd}.link-green-100:hover,.link-green-100:focus{color:#daece4}.link-green-200{color:#a3cfbb}.link-green-200:hover,.link-green-200:focus{color:#b5d9c9}.link-green-300{color:#75b798}.link-green-300:hover,.link-green-300:focus{color:#91c5ad}.link-green-400{color:#479f76}.link-green-400:hover,.link-green-400:focus{color:#6cb291}.link-green-500{color:#198754}.link-green-500:hover,.link-green-500:focus{color:#146c43}.link-green-600{color:#146c43}.link-green-600:hover,.link-green-600:focus{color:#105636}.link-green-700{color:#0f5132}.link-green-700:hover,.link-green-700:focus{color:#0c4128}.link-green-800{color:#0a3622}.link-green-800:hover,.link-green-800:focus{color:#082b1b}.link-green-900{color:#051b11}.link-green-900:hover,.link-green-900:focus{color:#04160e}.link-blue-100{color:#cfe2ff}.link-blue-100:hover,.link-blue-100:focus{color:#d9e8ff}.link-blue-200{color:#9ec5fe}.link-blue-200:hover,.link-blue-200:focus{color:#b1d1fe}.link-blue-300{color:#6ea8fe}.link-blue-300:hover,.link-blue-300:focus{color:#8bb9fe}.link-blue-400{color:#3d8bfd}.link-blue-400:hover,.link-blue-400:focus{color:#64a2fd}.link-blue-500{color:#0d6efd}.link-blue-500:hover,.link-blue-500:focus{color:#0a58ca}.link-blue-600{color:#0a58ca}.link-blue-600:hover,.link-blue-600:focus{color:#0846a2}.link-blue-700{color:#084298}.link-blue-700:hover,.link-blue-700:focus{color:#06357a}.link-blue-800{color:#052c65}.link-blue-800:hover,.link-blue-800:focus{color:#042351}.link-blue-900{color:#031633}.link-blue-900:hover,.link-blue-900:focus{color:#021229}.link-cyan-100{color:#cff4fc}.link-cyan-100:hover,.link-cyan-100:focus{color:#d9f6fd}.link-cyan-200{color:#9eeaf9}.link-cyan-200:hover,.link-cyan-200:focus{color:#b1eefa}.link-cyan-300{color:#6edff6}.link-cyan-300:hover,.link-cyan-300:focus{color:#8be5f8}.link-cyan-400{color:#3dd5f3}.link-cyan-400:hover,.link-cyan-400:focus{color:#64ddf5}.link-cyan-500{color:#0dcaf0}.link-cyan-500:hover,.link-cyan-500:focus{color:#3dd5f3}.link-cyan-600{color:#0aa2c0}.link-cyan-600:hover,.link-cyan-600:focus{color:#3bb5cd}.link-cyan-700{color:#087990}.link-cyan-700:hover,.link-cyan-700:focus{color:#066173}.link-cyan-800{color:#055160}.link-cyan-800:hover,.link-cyan-800:focus{color:#04414d}.link-cyan-900{color:#032830}.link-cyan-900:hover,.link-cyan-900:focus{color:#022026}.link-indigo-100{color:#e0cffc}.link-indigo-100:hover,.link-indigo-100:focus{color:#e6d9fd}.link-indigo-200{color:#c29ffa}.link-indigo-200:hover,.link-indigo-200:focus{color:#ceb2fb}.link-indigo-300{color:#a370f7}.link-indigo-300:hover,.link-indigo-300:focus{color:#b58df9}.link-indigo-400{color:#8540f5}.link-indigo-400:hover,.link-indigo-400:focus{color:#6a33c4}.link-indigo-500{color:#6610f2}.link-indigo-500:hover,.link-indigo-500:focus{color:#520dc2}.link-indigo-600{color:#520dc2}.link-indigo-600:hover,.link-indigo-600:focus{color:#420a9b}.link-indigo-700{color:#3d0a91}.link-indigo-700:hover,.link-indigo-700:focus{color:#310874}.link-indigo-800{color:#290661}.link-indigo-800:hover,.link-indigo-800:focus{color:#21054e}.link-indigo-900{color:#140330}.link-indigo-900:hover,.link-indigo-900:focus{color:#100226}.link-purple-100{color:#e2d9f3}.link-purple-100:hover,.link-purple-100:focus{color:#e8e1f5}.link-purple-200{color:#c5b3e6}.link-purple-200:hover,.link-purple-200:focus{color:#d1c2eb}.link-purple-300{color:#a98eda}.link-purple-300:hover,.link-purple-300:focus{color:#baa5e1}.link-purple-400{color:#8c68cd}.link-purple-400:hover,.link-purple-400:focus{color:#a386d7}.link-purple-500{color:#6f42c1}.link-purple-500:hover,.link-purple-500:focus{color:#59359a}.link-purple-600{color:#59359a}.link-purple-600:hover,.link-purple-600:focus{color:#472a7b}.link-purple-700{color:#432874}.link-purple-700:hover,.link-purple-700:focus{color:#36205d}.link-purple-800{color:#2c1a4d}.link-purple-800:hover,.link-purple-800:focus{color:#23153e}.link-purple-900{color:#160d27}.link-purple-900:hover,.link-purple-900:focus{color:#120a1f}.link-pink-100{color:#f7d6e6}.link-pink-100:hover,.link-pink-100:focus{color:#f9deeb}.link-pink-200{color:#efadce}.link-pink-200:hover,.link-pink-200:focus{color:#f2bdd8}.link-pink-300{color:#e685b5}.link-pink-300:hover,.link-pink-300:focus{color:#eb9dc4}.link-pink-400{color:#de5c9d}.link-pink-400:hover,.link-pink-400:focus{color:#e57db1}.link-pink-500{color:#d63384}.link-pink-500:hover,.link-pink-500:focus{color:#ab296a}.link-pink-600{color:#ab296a}.link-pink-600:hover,.link-pink-600:focus{color:#892155}.link-pink-700{color:#801f4f}.link-pink-700:hover,.link-pink-700:focus{color:#66193f}.link-pink-800{color:#561435}.link-pink-800:hover,.link-pink-800:focus{color:#45102a}.link-pink-900{color:#2b0a1a}.link-pink-900:hover,.link-pink-900:focus{color:#220815}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.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}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;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}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow: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-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:0 .5rem 1rem #00000026!important}.shadow-sm{box-shadow:0 .125rem .25rem #00000013!important}.shadow-lg{box-shadow:0 1rem 3rem #0000002d!important}.shadow-none{box-shadow:none!important}.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:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#337ab7!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#54d6f0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-red{border-color:#dc3545!important}.border-yellow{border-color:#ffc107!important}.border-green{border-color:#198754!important}.border-blue{border-color:#0d6efd!important}.border-cyan{border-color:#0dcaf0!important}.border-indigo{border-color:#6610f2!important}.border-purple{border-color:#6f42c1!important}.border-pink{border-color:#d63384!important}.border-darker{border-color:#1b1f22!important}.border-darkest{border-color:#171b1d!important}.border-gray{border-color:#ced4da!important}.border-gray-100{border-color:#f8f9fa!important}.border-gray-200{border-color:#e9ecef!important}.border-gray-300{border-color:#dee2e6!important}.border-gray-400{border-color:#ced4da!important}.border-gray-500{border-color:#adb5bd!important}.border-gray-600{border-color:#6c757d!important}.border-gray-700{border-color:#495057!important}.border-gray-800{border-color:#343a40!important}.border-gray-900{border-color:#212529!important}.border-red-100{border-color:#f8d7da!important}.border-red-200{border-color:#f1aeb5!important}.border-red-300{border-color:#ea868f!important}.border-red-400{border-color:#e35d6a!important}.border-red-500{border-color:#dc3545!important}.border-red-600{border-color:#b02a37!important}.border-red-700{border-color:#842029!important}.border-red-800{border-color:#58151c!important}.border-red-900{border-color:#2c0b0e!important}.border-yellow-100{border-color:#fff3cd!important}.border-yellow-200{border-color:#ffe69c!important}.border-yellow-300{border-color:#ffda6a!important}.border-yellow-400{border-color:#ffcd39!important}.border-yellow-500{border-color:#ffc107!important}.border-yellow-600{border-color:#cc9a06!important}.border-yellow-700{border-color:#997404!important}.border-yellow-800{border-color:#664d03!important}.border-yellow-900{border-color:#332701!important}.border-green-100{border-color:#d1e7dd!important}.border-green-200{border-color:#a3cfbb!important}.border-green-300{border-color:#75b798!important}.border-green-400{border-color:#479f76!important}.border-green-500{border-color:#198754!important}.border-green-600{border-color:#146c43!important}.border-green-700{border-color:#0f5132!important}.border-green-800{border-color:#0a3622!important}.border-green-900{border-color:#051b11!important}.border-blue-100{border-color:#cfe2ff!important}.border-blue-200{border-color:#9ec5fe!important}.border-blue-300{border-color:#6ea8fe!important}.border-blue-400{border-color:#3d8bfd!important}.border-blue-500{border-color:#0d6efd!important}.border-blue-600{border-color:#0a58ca!important}.border-blue-700{border-color:#084298!important}.border-blue-800{border-color:#052c65!important}.border-blue-900{border-color:#031633!important}.border-cyan-100{border-color:#cff4fc!important}.border-cyan-200{border-color:#9eeaf9!important}.border-cyan-300{border-color:#6edff6!important}.border-cyan-400{border-color:#3dd5f3!important}.border-cyan-500{border-color:#0dcaf0!important}.border-cyan-600{border-color:#0aa2c0!important}.border-cyan-700{border-color:#087990!important}.border-cyan-800{border-color:#055160!important}.border-cyan-900{border-color:#032830!important}.border-indigo-100{border-color:#e0cffc!important}.border-indigo-200{border-color:#c29ffa!important}.border-indigo-300{border-color:#a370f7!important}.border-indigo-400{border-color:#8540f5!important}.border-indigo-500{border-color:#6610f2!important}.border-indigo-600{border-color:#520dc2!important}.border-indigo-700{border-color:#3d0a91!important}.border-indigo-800{border-color:#290661!important}.border-indigo-900{border-color:#140330!important}.border-purple-100{border-color:#e2d9f3!important}.border-purple-200{border-color:#c5b3e6!important}.border-purple-300{border-color:#a98eda!important}.border-purple-400{border-color:#8c68cd!important}.border-purple-500{border-color:#6f42c1!important}.border-purple-600{border-color:#59359a!important}.border-purple-700{border-color:#432874!important}.border-purple-800{border-color:#2c1a4d!important}.border-purple-900{border-color:#160d27!important}.border-pink-100{border-color:#f7d6e6!important}.border-pink-200{border-color:#efadce!important}.border-pink-300{border-color:#e685b5!important}.border-pink-400{border-color:#de5c9d!important}.border-pink-500{border-color:#d63384!important}.border-pink-600{border-color:#ab296a!important}.border-pink-700{border-color:#801f4f!important}.border-pink-800{border-color:#561435!important}.border-pink-900{border-color:#2b0a1a!important}.border-white{border-color:#fff!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}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:200!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:800!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:1.75!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{color:#337ab7!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#54d6f0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-red{color:#dc3545!important}.text-yellow{color:#ffc107!important}.text-green{color:#198754!important}.text-blue{color:#0d6efd!important}.text-cyan{color:#0dcaf0!important}.text-indigo{color:#6610f2!important}.text-purple{color:#6f42c1!important}.text-pink{color:#d63384!important}.text-darker{color:#1b1f22!important}.text-darkest{color:#171b1d!important}.text-gray{color:#ced4da!important}.text-gray-100{color:#f8f9fa!important}.text-gray-200{color:#e9ecef!important}.text-gray-300{color:#dee2e6!important}.text-gray-400{color:#ced4da!important}.text-gray-500{color:#adb5bd!important}.text-gray-600{color:#6c757d!important}.text-gray-700{color:#495057!important}.text-gray-800{color:#343a40!important}.text-gray-900{color:#212529!important}.text-red-100{color:#f8d7da!important}.text-red-200{color:#f1aeb5!important}.text-red-300{color:#ea868f!important}.text-red-400{color:#e35d6a!important}.text-red-500{color:#dc3545!important}.text-red-600{color:#b02a37!important}.text-red-700{color:#842029!important}.text-red-800{color:#58151c!important}.text-red-900{color:#2c0b0e!important}.text-yellow-100{color:#fff3cd!important}.text-yellow-200{color:#ffe69c!important}.text-yellow-300{color:#ffda6a!important}.text-yellow-400{color:#ffcd39!important}.text-yellow-500{color:#ffc107!important}.text-yellow-600{color:#cc9a06!important}.text-yellow-700{color:#997404!important}.text-yellow-800{color:#664d03!important}.text-yellow-900{color:#332701!important}.text-green-100{color:#d1e7dd!important}.text-green-200{color:#a3cfbb!important}.text-green-300{color:#75b798!important}.text-green-400{color:#479f76!important}.text-green-500{color:#198754!important}.text-green-600{color:#146c43!important}.text-green-700{color:#0f5132!important}.text-green-800{color:#0a3622!important}.text-green-900{color:#051b11!important}.text-blue-100{color:#cfe2ff!important}.text-blue-200{color:#9ec5fe!important}.text-blue-300{color:#6ea8fe!important}.text-blue-400{color:#3d8bfd!important}.text-blue-500{color:#0d6efd!important}.text-blue-600{color:#0a58ca!important}.text-blue-700{color:#084298!important}.text-blue-800{color:#052c65!important}.text-blue-900{color:#031633!important}.text-cyan-100{color:#cff4fc!important}.text-cyan-200{color:#9eeaf9!important}.text-cyan-300{color:#6edff6!important}.text-cyan-400{color:#3dd5f3!important}.text-cyan-500{color:#0dcaf0!important}.text-cyan-600{color:#0aa2c0!important}.text-cyan-700{color:#087990!important}.text-cyan-800{color:#055160!important}.text-cyan-900{color:#032830!important}.text-indigo-100{color:#e0cffc!important}.text-indigo-200{color:#c29ffa!important}.text-indigo-300{color:#a370f7!important}.text-indigo-400{color:#8540f5!important}.text-indigo-500{color:#6610f2!important}.text-indigo-600{color:#520dc2!important}.text-indigo-700{color:#3d0a91!important}.text-indigo-800{color:#290661!important}.text-indigo-900{color:#140330!important}.text-purple-100{color:#e2d9f3!important}.text-purple-200{color:#c5b3e6!important}.text-purple-300{color:#a98eda!important}.text-purple-400{color:#8c68cd!important}.text-purple-500{color:#6f42c1!important}.text-purple-600{color:#59359a!important}.text-purple-700{color:#432874!important}.text-purple-800{color:#2c1a4d!important}.text-purple-900{color:#160d27!important}.text-pink-100{color:#f7d6e6!important}.text-pink-200{color:#efadce!important}.text-pink-300{color:#e685b5!important}.text-pink-400{color:#de5c9d!important}.text-pink-500{color:#d63384!important}.text-pink-600{color:#ab296a!important}.text-pink-700{color:#801f4f!important}.text-pink-800{color:#561435!important}.text-pink-900{color:#2b0a1a!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:#00000080!important}.text-white-50{color:#ffffff80!important}.text-reset{color:inherit!important}.bg-primary{background-color:#337ab7!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#54d6f0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-red{background-color:#dc3545!important}.bg-yellow{background-color:#ffc107!important}.bg-green{background-color:#198754!important}.bg-blue{background-color:#0d6efd!important}.bg-cyan{background-color:#0dcaf0!important}.bg-indigo{background-color:#6610f2!important}.bg-purple{background-color:#6f42c1!important}.bg-pink{background-color:#d63384!important}.bg-darker{background-color:#1b1f22!important}.bg-darkest{background-color:#171b1d!important}.bg-gray{background-color:#ced4da!important}.bg-gray-100{background-color:#f8f9fa!important}.bg-gray-200{background-color:#e9ecef!important}.bg-gray-300{background-color:#dee2e6!important}.bg-gray-400{background-color:#ced4da!important}.bg-gray-500{background-color:#adb5bd!important}.bg-gray-600{background-color:#6c757d!important}.bg-gray-700{background-color:#495057!important}.bg-gray-800{background-color:#343a40!important}.bg-gray-900{background-color:#212529!important}.bg-red-100{background-color:#f8d7da!important}.bg-red-200{background-color:#f1aeb5!important}.bg-red-300{background-color:#ea868f!important}.bg-red-400{background-color:#e35d6a!important}.bg-red-500{background-color:#dc3545!important}.bg-red-600{background-color:#b02a37!important}.bg-red-700{background-color:#842029!important}.bg-red-800{background-color:#58151c!important}.bg-red-900{background-color:#2c0b0e!important}.bg-yellow-100{background-color:#fff3cd!important}.bg-yellow-200{background-color:#ffe69c!important}.bg-yellow-300{background-color:#ffda6a!important}.bg-yellow-400{background-color:#ffcd39!important}.bg-yellow-500{background-color:#ffc107!important}.bg-yellow-600{background-color:#cc9a06!important}.bg-yellow-700{background-color:#997404!important}.bg-yellow-800{background-color:#664d03!important}.bg-yellow-900{background-color:#332701!important}.bg-green-100{background-color:#d1e7dd!important}.bg-green-200{background-color:#a3cfbb!important}.bg-green-300{background-color:#75b798!important}.bg-green-400{background-color:#479f76!important}.bg-green-500{background-color:#198754!important}.bg-green-600{background-color:#146c43!important}.bg-green-700{background-color:#0f5132!important}.bg-green-800{background-color:#0a3622!important}.bg-green-900{background-color:#051b11!important}.bg-blue-100{background-color:#cfe2ff!important}.bg-blue-200{background-color:#9ec5fe!important}.bg-blue-300{background-color:#6ea8fe!important}.bg-blue-400{background-color:#3d8bfd!important}.bg-blue-500{background-color:#0d6efd!important}.bg-blue-600{background-color:#0a58ca!important}.bg-blue-700{background-color:#084298!important}.bg-blue-800{background-color:#052c65!important}.bg-blue-900{background-color:#031633!important}.bg-cyan-100{background-color:#cff4fc!important}.bg-cyan-200{background-color:#9eeaf9!important}.bg-cyan-300{background-color:#6edff6!important}.bg-cyan-400{background-color:#3dd5f3!important}.bg-cyan-500{background-color:#0dcaf0!important}.bg-cyan-600{background-color:#0aa2c0!important}.bg-cyan-700{background-color:#087990!important}.bg-cyan-800{background-color:#055160!important}.bg-cyan-900{background-color:#032830!important}.bg-indigo-100{background-color:#e0cffc!important}.bg-indigo-200{background-color:#c29ffa!important}.bg-indigo-300{background-color:#a370f7!important}.bg-indigo-400{background-color:#8540f5!important}.bg-indigo-500{background-color:#6610f2!important}.bg-indigo-600{background-color:#520dc2!important}.bg-indigo-700{background-color:#3d0a91!important}.bg-indigo-800{background-color:#290661!important}.bg-indigo-900{background-color:#140330!important}.bg-purple-100{background-color:#e2d9f3!important}.bg-purple-200{background-color:#c5b3e6!important}.bg-purple-300{background-color:#a98eda!important}.bg-purple-400{background-color:#8c68cd!important}.bg-purple-500{background-color:#6f42c1!important}.bg-purple-600{background-color:#59359a!important}.bg-purple-700{background-color:#432874!important}.bg-purple-800{background-color:#2c1a4d!important}.bg-purple-900{background-color:#160d27!important}.bg-pink-100{background-color:#f7d6e6!important}.bg-pink-200{background-color:#efadce!important}.bg-pink-300{background-color:#e685b5!important}.bg-pink-400{background-color:#de5c9d!important}.bg-pink-500{background-color:#d63384!important}.bg-pink-600{background-color:#ab296a!important}.bg-pink-700{background-color:#801f4f!important}.bg-pink-800{background-color:#561435!important}.bg-pink-900{background-color:#2b0a1a!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-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:.375rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.375rem!important}.rounded-2{border-radius:.375rem!important}.rounded-3{border-radius:.75rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.375rem!important;border-top-right-radius:.375rem!important}.rounded-end{border-top-right-radius:.375rem!important;border-bottom-right-radius:.375rem!important}.rounded-bottom{border-bottom-right-radius:.375rem!important;border-bottom-left-radius:.375rem!important}.rounded-start{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width: 576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float: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-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}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width: 768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.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-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}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width: 992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.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-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}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width: 1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.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-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}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width: 1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.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-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}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width: 1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-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{--nbx-select-content-bg: #fff;--nbx-select-option-selected-bg: #dee2e6;--nbx-select-option-hover-bg: #0d6efd;--nbx-select-option-hover-color: #fff;--nbx-select-placeholder-color: #adb5bd;--nbx-select-value-color: #fff}:root[data-netbox-color-mode=dark]{--nbx-select-content-bg: #212529;--nbx-select-option-selected-bg: #adb5bd;--nbx-select-option-hover-bg: #9ec5fe;--nbx-select-option-hover-color: #000;--nbx-select-placeholder-color: #495057;--nbx-select-value-color: #000}.ss-main{position:relative;display:inline-block;user-select:none;color:#212529;width:100%}.ss-main .ss-single-selected{display:flex;cursor:pointer;width:100%;height:calc(1.5em + (.75rem + 2px));padding:.75rem;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}.ss-main .ss-single-selected.ss-disabled{background-color:#ced4da;cursor:not-allowed}.ss-main .ss-single-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}.ss-main .ss-single-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}.ss-main .ss-single-selected .placeholder{display:flex;flex:1 1 100%;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;width:calc(100% - 30px);line-height:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ss-main .ss-single-selected .placeholder *{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}.ss-main .ss-single-selected .placeholder .ss-disabled{color:#6c757d}.ss-main .ss-single-selected .ss-deselect{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem;font-weight:bold}.ss-main .ss-single-selected .ss-deselect.ss-hide{display:none}.ss-main .ss-single-selected .ss-arrow{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem}.ss-main .ss-single-selected .ss-arrow span{border:solid #212529;border-width:0 2px 2px 0;display:inline-block;padding:3px;transition:transform .2s,margin .2s}.ss-main .ss-single-selected .ss-arrow span.arrow-up{transform:rotate(-135deg);margin:3px 0 0}.ss-main .ss-single-selected .ss-arrow span.arrow-down{transform:rotate(45deg);margin:-3px 0 0}.ss-main .ss-multi-selected{display:flex;flex-direction:row;cursor:pointer;min-height:calc(1.5em + (.75rem + 2px));width:100%;padding:0 0 0 3px;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}.ss-main .ss-multi-selected.ss-disabled{background-color:#ced4da;cursor:not-allowed}.ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled{color:#212529}.ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete{cursor:not-allowed}.ss-main .ss-multi-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}.ss-main .ss-multi-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}.ss-main .ss-multi-selected .ss-values{display:flex;flex-wrap:wrap;justify-content:flex-start;flex:1 1 100%;width:calc(100% - 30px)}.ss-main .ss-multi-selected .ss-values .ss-disabled{display:flex;padding:4px 5px;margin:2px 0;line-height:1em;align-items:center;width:100%;color:#6c757d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes scaleOut{0%{transform:scale(1);opacity:1}to{transform:scale(0);opacity:0}}.ss-main .ss-multi-selected .ss-values .ss-value{display:flex;user-select:none;align-items:center;font-size:12px;padding:3px 5px;margin:3px 5px 3px 0;color:#fff;background-color:#0d6efd;border-radius:.375rem;animation-name:scaleIn;animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:both}.ss-main .ss-multi-selected .ss-values .ss-value.ss-out{animation-name:scaleOut;animation-duration:.2s;animation-timing-function:ease-out}.ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete{margin:0 0 0 5px;cursor:pointer}.ss-main .ss-multi-selected .ss-add{display:flex;flex:0 1 3px;margin:9px 12px 0 5px}.ss-main .ss-multi-selected .ss-add .ss-plus{display:flex;justify-content:center;align-items:center;background:#212529;position:relative;height:10px;width:2px;transition:transform .2s}.ss-main .ss-multi-selected .ss-add .ss-plus:after{background:#212529;content:"";position:absolute;height:2px;width:10px;left:-4px;top:4px}.ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross{transform:rotate(45deg)}.ss-content{position:absolute;width:100%;margin:-1px 0 0;box-sizing:border-box;border:solid 1px #ced4da;z-index:1010;background-color:#fff;transform-origin:center top;transition:transform .2s,opacity .2s;opacity:0;transform:scaleY(0)}.ss-content.ss-open{display:block;opacity:1;transform:scaleY(1)}.ss-content .ss-search{display:flex;flex-direction:row;padding:.75rem}.ss-content .ss-search.ss-hide{height:0px;opacity:0;padding:0;margin:0}.ss-content .ss-search.ss-hide input{height:0px;opacity:0;padding:0;margin:0}.ss-content .ss-search input{display:inline-flex;font-size:inherit;line-height:inherit;flex:1 1 auto;width:100%;min-width:0px;height:30px;padding:.75rem;margin:0;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;text-align:left;box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-appearance:textfield}.ss-content .ss-search input::placeholder{color:#adb5bd;vertical-align:middle}.ss-content .ss-search input:focus{box-shadow:0 0 5px #0d6efd}.ss-content .ss-search .ss-addable{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;font-size:22px;font-weight:bold;flex:0 0 30px;height:30px;margin:0 0 0 8px;border:1px solid #ced4da;border-radius:.375rem;box-sizing:border-box}.ss-content .ss-addable{padding-top:0}.ss-content .ss-list{max-height:200px;overflow-x:hidden;overflow-y:auto;text-align:left}.ss-content .ss-list .ss-optgroup .ss-optgroup-label{padding:6px 10px;font-weight:bold}.ss-content .ss-list .ss-optgroup .ss-option{padding:6px 6px 6px 25px}.ss-content .ss-list .ss-optgroup-label-selectable{cursor:pointer}.ss-content .ss-list .ss-optgroup-label-selectable:hover{color:#fff;background-color:#0d6efd}.ss-content .ss-list .ss-option{padding:6px 10px;cursor:pointer;user-select:none}.ss-content .ss-list .ss-option *{display:inline-block}.ss-content .ss-list .ss-option:hover,.ss-content .ss-list .ss-option.ss-highlighted{color:#fff;background-color:#0d6efd}.ss-content .ss-list .ss-option.ss-disabled{cursor:not-allowed;color:#6c757d;background-color:#fff}.ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected{color:#212529;background-color:#0d6efd1a}.ss-content .ss-list .ss-option.ss-hide{display:none}.ss-content .ss-list .ss-option .ss-search-highlight{background-color:#ffc107}.ss-main{color:#212529}.ss-main.is-invalid .ss-single-selected,.ss-main.is-invalid .ss-multi-selected{border-color:#dc3545}.ss-main.is-valid .ss-single-selected,.ss-main.is-valid .ss-multi-selected{border-color:#198754}.ss-main .ss-single-selected,.ss-main .ss-multi-selected{padding:.375rem .75rem;background-color:#fff;border:1px solid #e9ecef}.ss-main .ss-single-selected[disabled],.ss-main .ss-multi-selected[disabled]{color:#6c757d;background-color:#e9ecef}.ss-main div.ss-multi-selected .ss-values .ss-disabled,.ss-main div.ss-single-selected span.placeholder .ss-disabled{color:var(--nbx-select-placeholder-color)}.ss-main .ss-single-selected span.ss-arrow span.arrow-down,.ss-main .ss-single-selected span.ss-arrow span.arrow-up{border-color:currentColor;color:#6c757d}.ss-main .ss-single-selected .placeholder .depth{display:none}.ss-main .ss-single-selected span.placeholder>*,.ss-main .ss-single-selected span.placeholder{line-height:1.5}.ss-main .ss-multi-selected{align-items:center;padding-right:.75rem;padding-left:.75rem}.ss-main .ss-multi-selected .ss-values .ss-disabled{padding:4px 0}.ss-main .ss-multi-selected .ss-values .ss-value{color:var(--nbx-select-value-color);border-radius:.375rem}.ss-main .ss-multi-selected .ss-values .ss-value .depth{display:none}.ss-main .ss-multi-selected .ss-add{margin:0 .75rem}.ss-main .ss-content{background-color:var(--nbx-select-content-bg);border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.ss-main .ss-content .ss-list .ss-option.ss-option-selected{color:#212529;background-color:var(--nbx-select-option-selected-bg)}.ss-main .ss-content .ss-list .ss-option:hover{color:var(--nbx-select-option-hover-color);background-color:var(--nbx-select-option-hover-bg)}.ss-main .ss-content .ss-list .ss-option:last-child{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.ss-main .ss-content .ss-list .ss-option.ss-disabled{background-color:unset}.ss-main .ss-content .ss-list .ss-option.ss-disabled:hover{color:#6c757d}.ss-main .ss-content .ss-list .ss-option .depth{opacity:.3}.ss-main .ss-content .ss-list::-webkit-scrollbar{right:0;width:4px}.ss-main .ss-content .ss-list::-webkit-scrollbar:hover{opacity:.8}.ss-main .ss-content .ss-list::-webkit-scrollbar-track{background:transparent}.ss-main .ss-content .ss-list::-webkit-scrollbar-thumb{right:0;width:2px;background-color:var(--nbx-sidebar-scroll)}.ss-main .ss-content .ss-search{padding-right:.5rem}.ss-main .ss-content .ss-search button{margin-left:.75rem}.ss-main .ss-content .ss-search input[type=search]{color:#212529;background-color:#fff;border:1px solid #e9ecef}.ss-main .ss-content .ss-search input[type=search]:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.sidenav{position:fixed;top:0;bottom:0;left:0;z-index:1050;display:block;width:100%;max-width:3rem;padding-top:0;padding-right:0;padding-left:0;background-color:var(--nbx-sidebar-bg);border-right:1px solid #ced4da;transition:all .1s ease-in-out}@media (max-width: 991.98px){.sidenav{transform:translate(-3rem)}.sidenav+.content-container[class]{margin-left:0}.sidenav .profile-button-container[class]{display:block}}.sidenav .profile-button-container{display:none;padding:.5rem 1rem}.sidenav+.content-container{margin-left:3rem;transition:all .1s ease-in-out}.sidenav .sidenav-brand{margin-right:0;transition:opacity .1s ease-in-out}.sidenav .sidenav-brand-icon{transition:opacity .1s ease-in-out}.sidenav .sidenav-inner{padding-right:1.5rem;padding-left:1.5rem}@media (min-width: 768px){.sidenav .sidenav-inner{padding-right:0;padding-left:0}}.sidenav .sidenav-brand-img,.sidenav .sidenav-brand>img{max-width:100%;max-height:calc(16rem - 1rem)}.sidenav .navbar-heading{padding-top:.5rem;padding-bottom:.5rem;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em}.sidenav .sidenav-header{position:relative;display:flex;align-items:center;justify-content:space-between;height:78px;padding:1rem;transition:all .1s ease-in-out}.sidenav .sidenav-toggle{position:absolute;display:inline-block;opacity:0;transition:opacity 10ms ease-in-out;transition-delay:.1s}.sidenav .sidenav-collapse{display:flex;flex:1;flex-direction:column;align-items:stretch;padding-right:1.5rem;padding-left:1.5rem;margin-right:-1.5rem;margin-left:-1.5rem}.sidenav .sidenav-collapse>*{min-width:100%}@media (min-width: 768px){.sidenav .sidenav-collapse{margin-right:0;margin-left:0}}.sidenav .nav-group-header{padding:.25rem 1rem;margin-top:.5rem;margin-bottom:0}.sidenav .nav .nav-item{display:flex;align-items:center;justify-content:space-between;width:100%}.sidenav .nav .nav-item.no-buttons{padding-right:5rem}.sidenav .collapse .nav .nav-item .nav-link{width:100%;padding:.25rem .25rem .25rem 1rem;margin-top:0;margin-bottom:0;border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon{width:1rem;text-align:center;transition:all .1s ease-in-out}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]{width:unset;height:100%;padding-left:.5rem;font-weight:700;color:var(--nbx-sidenav-parent-color)}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{color:#343a40;background:#cfe2ff}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after{display:inline-block;margin-left:auto;font-family:"Material Design Icons";font-style:normal;font-weight:700;font-variant:normal;color:#6c757d;text-rendering:auto;-webkit-font-smoothing:antialiased;content:"\f0142";transition:all .1s ease-in-out}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after{color:#343a40}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after{color:#0d6efd;transform:rotate(90deg)}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text{padding-left:.25rem;transition:all .1s ease-in-out}.sidenav .navbar-nav{flex-direction:column;margin-right:-1.5rem;margin-left:-1.5rem}.sidenav .navbar-nav .nav-item{margin-top:2px}.sidenav .navbar-nav .nav-item.disabled{cursor:not-allowed;opacity:.8}.sidenav .navbar-nav .nav-item .nav-link{position:relative;display:flex;align-items:center;width:100%;padding:.5rem 1rem;font-size:.875rem;color:var(--nbx-sidenav-link-color);white-space:nowrap;transition:all .1s ease-in-out}.sidenav .navbar-nav .nav-item .nav-link.active{background-color:var(--nbx-sidebar-link-active-bg)}.sidenav .navbar-nav .nav-item .nav-link:hover:not(.active){color:var(--nbx-body-color);background-color:var(--nbx-sidebar-link-hover-bg)}.sidenav .navbar-nav .nav-item .nav-link>i{min-width:2rem;font-size:calc(45px / 2);text-align:center}.sidenav .navbar-nav .nav-group-label{display:block;font-size:.75rem;font-weight:700;color:var(--nbx-sidenav-group-color);text-transform:uppercase;white-space:nowrap}body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon{color:var(--nbx-sidenav-pin-color);transform:rotate(90deg)}@media (min-width: 1200px){body[data-sidenav-pinned] .sidenav+.content-container{margin-left:16rem}}.g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon{transform:rotate(0)}body[data-sidenav-show] .sidenav,body[data-sidenav-pinned] .sidenav{max-width:16rem}body[data-sidenav-show] .sidenav .sidenav-brand,body[data-sidenav-show] .sidenav .navbar-heading,body[data-sidenav-pinned] .sidenav .sidenav-brand,body[data-sidenav-pinned] .sidenav .navbar-heading{display:block}body[data-sidenav-show] .sidenav .sidenav-brand,body[data-sidenav-pinned] .sidenav .sidenav-brand{opacity:1;transform:translate(0)}body[data-sidenav-show] .sidenav .sidenav-brand-icon,body[data-sidenav-pinned] .sidenav .sidenav-brand-icon{position:absolute;opacity:0}@media (max-width: 991.98px){body[data-sidenav-show] .sidenav,body[data-sidenav-pinned] .sidenav{transform:translate(0)}}body[data-sidenav-hide] .sidenav .sidenav-header,body[data-sidenav-hidden] .sidenav .sidenav-header{padding:.5rem}body[data-sidenav-hide] .sidenav .sidenav-brand,body[data-sidenav-hidden] .sidenav .sidenav-brand{position:absolute;opacity:0}body[data-sidenav-hide] .sidenav .sidenav-brand-icon,body[data-sidenav-hidden] .sidenav .sidenav-brand-icon{opacity:1}body[data-sidenav-hide] .sidenav .sidenav-toggle,body[data-sidenav-hidden] .sidenav .sidenav-toggle{opacity:0;position:absolute;transition:unset;transition-delay:0ms}body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after{content:""}body[data-sidenav-hide] .sidenav .nav-item .collapse,body[data-sidenav-hidden] .sidenav .nav-item .collapse{display:none}body[data-sidenav-hide] .sidenav .nav-link-text,body[data-sidenav-hidden] .sidenav .nav-link-text{opacity:0}body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{margin-right:0;margin-left:0;border-radius:unset}body[data-sidenav-show] .sidenav .sidenav-brand{display:block}body[data-sidenav-show] .sidenav .nav-item .collapse{height:auto;transition:all .1s ease-in-out}body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text{opacity:1}body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon{opacity:0}@media (min-width: 992px){body[data-sidenav-show] .sidenav .sidenav-toggle{position:relative;opacity:1}}.simplebar-track.simplebar-vertical{right:0;width:6px;background-color:transparent}.simplebar-track.simplebar-vertical .simplebar-scrollbar{transition:none}.simplebar-track.simplebar-vertical .simplebar-scrollbar:before{right:0;width:3px;background:var(--nbx-sidebar-scroll);border-radius:.375rem}.simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before{width:5px}body{color:var(--nbx-body-color);background-color:var(--nbx-body-bg);font-size:.875rem}pre{white-space:pre}small,.small{font-size:smaller!important}a[type=button]{-webkit-appearance:unset!important}*[data-href]{cursor:pointer}.form-control:not([type=file]){font-size:inherit}.badge{font-size:.75rem}.text-xs{font-size:.75rem!important;line-height:1.25!important}.border-input{border:1px solid #e9ecef!important}.ws-nowrap{white-space:nowrap!important}table tr .vertical-align,table td .vertical-align{vertical-align:middle}@media print{.noprint{display:none!important;visibility:hidden!important}}.printonly{display:none!important;visibility:hidden!important}@media print{.printonly{display:block!important;visibility:visible!important}}:root{--nbx-sidebar-bg: #e9ecef;--nbx-sidebar-scroll: #adb5bd;--nbx-sidebar-link-hover-bg: rgba(108, 117, 125, .15);--nbx-sidebar-link-active-bg: #cfe2ff;--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(0, 0, 0, .25);--nbx-breadcrumb-bg: #e9ecef;--nbx-body-bg: #fff;--nbx-body-color: #343a40;--nbx-pre-bg: #f8f9fa;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(25, 135, 84, .4);--nbx-change-removed: rgba(220, 53, 69, .4);--nbx-cable-node-bg: #f8f9fa;--nbx-cable-node-border-color: #e9ecef;--nbx-cable-termination-bg: #e9ecef;--nbx-cable-termination-border-color: #dee2e6;--nbx-search-filter-border-left-color: #dee2e6;--nbx-color-mode-toggle-color: #0d6efd;--nbx-sidenav-link-color: #343a40;--nbx-sidenav-pin-color: #fd7e14;--nbx-sidenav-parent-color: #343a40;--nbx-sidenav-group-color: #343a40}:root[data-netbox-color-mode=dark]{--nbx-sidebar-bg: #212529;--nbx-sidebar-scroll: #495057;--nbx-sidebar-link-active-bg: rgba(110, 168, 254, .25);--nbx-sidebar-link-hover-bg: rgba(173, 181, 189, .15);--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(255, 255, 255, .05);--nbx-breadcrumb-bg: #343a40;--nbx-body-bg: #1b1f22;--nbx-body-color: #f8f9fa;--nbx-pre-bg: #495057;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(117, 183, 152, .4);--nbx-change-removed: rgba(234, 134, 143, .4);--nbx-cable-node-bg: #495057;--nbx-cable-node-border-color: #6c757d;--nbx-cable-termination-bg: #343a40;--nbx-cable-termination-border-color: #495057;--nbx-search-filter-border-left-color: #6c757d;--nbx-color-mode-toggle-color: #ffda6a;--nbx-sidenav-link-color: #e9ecef;--nbx-sidenav-pin-color: #ffc107;--nbx-sidenav-parent-color: #e9ecef;--nbx-sidenav-group-color: #6c757d}.bg-primary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f496e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-primary{color:#337ab7}.btn.btn-ghost-primary:hover{background-color:#337ab71f}.alert.alert-primary a:not(.btn),.table-primary a:not(.btn){font-weight:700;color:#1f496e}.alert.alert-primary .btn:not([class*=btn-outline]),.table-primary .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-primary a:not(.btn){font-weight:700;color:#adcae2}.badge.bg-primary,.toast.bg-primary,.toast-header.bg-primary,.progress-bar.bg-primary{color:#fff}.bg-secondary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2341464b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-secondary{color:#6c757d}.btn.btn-ghost-secondary:hover{background-color:#6c757d1f}.alert.alert-secondary a:not(.btn),.table-secondary a:not(.btn){font-weight:700;color:#41464b}.alert.alert-secondary .btn:not([class*=btn-outline]),.table-secondary .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-secondary a:not(.btn){font-weight:700;color:#c4c8cb}.badge.bg-secondary,.toast.bg-secondary,.toast-header.bg-secondary,.progress-bar.bg-secondary{color:#fff}.bg-success button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-success{color:#198754}.btn.btn-ghost-success:hover{background-color:#1987541f}.alert.alert-success a:not(.btn),.table-success a:not(.btn){font-weight:700;color:#0f5132}.alert.alert-success .btn:not([class*=btn-outline]),.table-success .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-success a:not(.btn){font-weight:700;color:#a3cfbb}.badge.bg-success,.toast.bg-success,.toast-header.bg-success,.progress-bar.bg-success{color:#fff}.bg-info button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23225660'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-info{color:#54d6f0}.btn.btn-ghost-info:hover{background-color:#54d6f01f}.alert.alert-info a:not(.btn),.table-info a:not(.btn){font-weight:700;color:#225660}.alert.alert-info .btn:not([class*=btn-outline]),.table-info .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-info a:not(.btn){font-weight:700;color:#225660}.badge.bg-info,.toast.bg-info,.toast-header.bg-info,.progress-bar.bg-info{color:#000}.bg-warning button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-warning{color:#ffc107}.btn.btn-ghost-warning:hover{background-color:#ffc1071f}.alert.alert-warning a:not(.btn),.table-warning a:not(.btn){font-weight:700;color:#664d03}.alert.alert-warning .btn:not([class*=btn-outline]),.table-warning .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-warning a:not(.btn){font-weight:700;color:#664d03}.badge.bg-warning,.toast.bg-warning,.toast-header.bg-warning,.progress-bar.bg-warning{color:#000}.bg-danger button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-danger{color:#dc3545}.btn.btn-ghost-danger:hover{background-color:#dc35451f}.alert.alert-danger a:not(.btn),.table-danger a:not(.btn){font-weight:700;color:#842029}.alert.alert-danger .btn:not([class*=btn-outline]),.table-danger .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-danger a:not(.btn){font-weight:700;color:#f1aeb5}.badge.bg-danger,.toast.bg-danger,.toast-header.bg-danger,.progress-bar.bg-danger{color:#fff}.bg-light button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23636464'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-light{color:#f8f9fa}.btn.btn-ghost-light:hover{background-color:#f8f9fa1f}.alert.alert-light a:not(.btn),.table-light a:not(.btn){font-weight:700;color:#636464}.alert.alert-light .btn:not([class*=btn-outline]),.table-light .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-light a:not(.btn){font-weight:700;color:#636464}.badge.bg-light,.toast.bg-light,.toast-header.bg-light,.progress-bar.bg-light{color:#000}.bg-dark button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23141619'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-dark{color:#212529}.btn.btn-ghost-dark:hover{background-color:#2125291f}.alert.alert-dark a:not(.btn),.table-dark a:not(.btn){font-weight:700;color:#141619}.alert.alert-dark .btn:not([class*=btn-outline]),.table-dark .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-dark a:not(.btn){font-weight:700;color:#a6a8a9}.badge.bg-dark,.toast.bg-dark,.toast-header.bg-dark,.progress-bar.bg-dark{color:#fff}.bg-red button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red{color:#dc3545}.btn.btn-ghost-red:hover{background-color:#dc35451f}.alert.alert-red a:not(.btn),.table-red a:not(.btn){font-weight:700;color:#842029}.alert.alert-red .btn:not([class*=btn-outline]),.table-red .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red a:not(.btn){font-weight:700;color:#f1aeb5}.badge.bg-red,.toast.bg-red,.toast-header.bg-red,.progress-bar.bg-red{color:#fff}.bg-yellow button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow{color:#ffc107}.btn.btn-ghost-yellow:hover{background-color:#ffc1071f}.alert.alert-yellow a:not(.btn),.table-yellow a:not(.btn){font-weight:700;color:#664d03}.alert.alert-yellow .btn:not([class*=btn-outline]),.table-yellow .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow a:not(.btn){font-weight:700;color:#664d03}.badge.bg-yellow,.toast.bg-yellow,.toast-header.bg-yellow,.progress-bar.bg-yellow{color:#000}.bg-green button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green{color:#198754}.btn.btn-ghost-green:hover{background-color:#1987541f}.alert.alert-green a:not(.btn),.table-green a:not(.btn){font-weight:700;color:#0f5132}.alert.alert-green .btn:not([class*=btn-outline]),.table-green .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green a:not(.btn){font-weight:700;color:#a3cfbb}.badge.bg-green,.toast.bg-green,.toast-header.bg-green,.progress-bar.bg-green{color:#fff}.bg-blue button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23084298'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue{color:#0d6efd}.btn.btn-ghost-blue:hover{background-color:#0d6efd1f}.alert.alert-blue a:not(.btn),.table-blue a:not(.btn){font-weight:700;color:#084298}.alert.alert-blue .btn:not([class*=btn-outline]),.table-blue .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue a:not(.btn){font-weight:700;color:#9ec5fe}.badge.bg-blue,.toast.bg-blue,.toast-header.bg-blue,.progress-bar.bg-blue{color:#fff}.bg-cyan button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23055160'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan{color:#0dcaf0}.btn.btn-ghost-cyan:hover{background-color:#0dcaf01f}.alert.alert-cyan a:not(.btn),.table-cyan a:not(.btn){font-weight:700;color:#055160}.alert.alert-cyan .btn:not([class*=btn-outline]),.table-cyan .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan a:not(.btn){font-weight:700;color:#055160}.badge.bg-cyan,.toast.bg-cyan,.toast-header.bg-cyan,.progress-bar.bg-cyan{color:#000}.bg-indigo button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233d0a91'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo{color:#6610f2}.btn.btn-ghost-indigo:hover{background-color:#6610f21f}.alert.alert-indigo a:not(.btn),.table-indigo a:not(.btn){font-weight:700;color:#3d0a91}.alert.alert-indigo .btn:not([class*=btn-outline]),.table-indigo .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo a:not(.btn){font-weight:700;color:#c29ffa}.badge.bg-indigo,.toast.bg-indigo,.toast-header.bg-indigo,.progress-bar.bg-indigo{color:#fff}.bg-purple button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23432874'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple{color:#6f42c1}.btn.btn-ghost-purple:hover{background-color:#6f42c11f}.alert.alert-purple a:not(.btn),.table-purple a:not(.btn){font-weight:700;color:#432874}.alert.alert-purple .btn:not([class*=btn-outline]),.table-purple .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple a:not(.btn){font-weight:700;color:#c5b3e6}.badge.bg-purple,.toast.bg-purple,.toast-header.bg-purple,.progress-bar.bg-purple{color:#fff}.bg-pink button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23801f4f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink{color:#d63384}.btn.btn-ghost-pink:hover{background-color:#d633841f}.alert.alert-pink a:not(.btn),.table-pink a:not(.btn){font-weight:700;color:#801f4f}.alert.alert-pink .btn:not([class*=btn-outline]),.table-pink .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink a:not(.btn){font-weight:700;color:#efadce}.badge.bg-pink,.toast.bg-pink,.toast-header.bg-pink,.progress-bar.bg-pink{color:#fff}.bg-darker button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23101314'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-darker{color:#1b1f22}.btn.btn-ghost-darker:hover{background-color:#1b1f221f}.alert.alert-darker a:not(.btn),.table-darker a:not(.btn){font-weight:700;color:#101314}.alert.alert-darker .btn:not([class*=btn-outline]),.table-darker .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-darker a:not(.btn){font-weight:700;color:#a4a5a7}.badge.bg-darker,.toast.bg-darker,.toast-header.bg-darker,.progress-bar.bg-darker{color:#fff}.bg-darkest button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230e1011'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-darkest{color:#171b1d}.btn.btn-ghost-darkest:hover{background-color:#171b1d1f}.alert.alert-darkest a:not(.btn),.table-darkest a:not(.btn){font-weight:700;color:#0e1011}.alert.alert-darkest .btn:not([class*=btn-outline]),.table-darkest .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-darkest a:not(.btn){font-weight:700;color:#a2a4a5}.badge.bg-darkest,.toast.bg-darkest,.toast-header.bg-darkest,.progress-bar.bg-darkest{color:#fff}.bg-gray button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23525557'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray{color:#ced4da}.btn.btn-ghost-gray:hover{background-color:#ced4da1f}.alert.alert-gray a:not(.btn),.table-gray a:not(.btn){font-weight:700;color:#525557}.alert.alert-gray .btn:not([class*=btn-outline]),.table-gray .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray a:not(.btn){font-weight:700;color:#525557}.badge.bg-gray,.toast.bg-gray,.toast-header.bg-gray,.progress-bar.bg-gray{color:#000}.bg-gray-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23636464'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-100{color:#f8f9fa}.btn.btn-ghost-gray-100:hover{background-color:#f8f9fa1f}.alert.alert-gray-100 a:not(.btn),.table-gray-100 a:not(.btn){font-weight:700;color:#636464}.alert.alert-gray-100 .btn:not([class*=btn-outline]),.table-gray-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-100 a:not(.btn){font-weight:700;color:#636464}.badge.bg-gray-100,.toast.bg-gray-100,.toast-header.bg-gray-100,.progress-bar.bg-gray-100{color:#000}.bg-gray-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235d5e60'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-200{color:#e9ecef}.btn.btn-ghost-gray-200:hover{background-color:#e9ecef1f}.alert.alert-gray-200 a:not(.btn),.table-gray-200 a:not(.btn){font-weight:700;color:#5d5e60}.alert.alert-gray-200 .btn:not([class*=btn-outline]),.table-gray-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-200 a:not(.btn){font-weight:700;color:#5d5e60}.badge.bg-gray-200,.toast.bg-gray-200,.toast-header.bg-gray-200,.progress-bar.bg-gray-200{color:#000}.bg-gray-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23595a5c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-300{color:#dee2e6}.btn.btn-ghost-gray-300:hover{background-color:#dee2e61f}.alert.alert-gray-300 a:not(.btn),.table-gray-300 a:not(.btn){font-weight:700;color:#595a5c}.alert.alert-gray-300 .btn:not([class*=btn-outline]),.table-gray-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-300 a:not(.btn){font-weight:700;color:#595a5c}.badge.bg-gray-300,.toast.bg-gray-300,.toast-header.bg-gray-300,.progress-bar.bg-gray-300{color:#000}.bg-gray-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23525557'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-400{color:#ced4da}.btn.btn-ghost-gray-400:hover{background-color:#ced4da1f}.alert.alert-gray-400 a:not(.btn),.table-gray-400 a:not(.btn){font-weight:700;color:#525557}.alert.alert-gray-400 .btn:not([class*=btn-outline]),.table-gray-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-400 a:not(.btn){font-weight:700;color:#525557}.badge.bg-gray-400,.toast.bg-gray-400,.toast-header.bg-gray-400,.progress-bar.bg-gray-400{color:#000}.bg-gray-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23686d71'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-500{color:#adb5bd}.btn.btn-ghost-gray-500:hover{background-color:#adb5bd1f}.alert.alert-gray-500 a:not(.btn),.table-gray-500 a:not(.btn){font-weight:700;color:#686d71}.alert.alert-gray-500 .btn:not([class*=btn-outline]),.table-gray-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-500 a:not(.btn){font-weight:700;color:#45484c}.badge.bg-gray-500,.toast.bg-gray-500,.toast-header.bg-gray-500,.progress-bar.bg-gray-500{color:#000}.bg-gray-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2341464b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-600{color:#6c757d}.btn.btn-ghost-gray-600:hover{background-color:#6c757d1f}.alert.alert-gray-600 a:not(.btn),.table-gray-600 a:not(.btn){font-weight:700;color:#41464b}.alert.alert-gray-600 .btn:not([class*=btn-outline]),.table-gray-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-600 a:not(.btn){font-weight:700;color:#c4c8cb}.badge.bg-gray-600,.toast.bg-gray-600,.toast-header.bg-gray-600,.progress-bar.bg-gray-600{color:#fff}.bg-gray-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c3034'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-700{color:#495057}.btn.btn-ghost-gray-700:hover{background-color:#4950571f}.alert.alert-gray-700 a:not(.btn),.table-gray-700 a:not(.btn){font-weight:700;color:#2c3034}.alert.alert-gray-700 .btn:not([class*=btn-outline]),.table-gray-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-700 a:not(.btn){font-weight:700;color:#b6b9bc}.badge.bg-gray-700,.toast.bg-gray-700,.toast-header.bg-gray-700,.progress-bar.bg-gray-700{color:#fff}.bg-gray-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f2326'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-800{color:#343a40}.btn.btn-ghost-gray-800:hover{background-color:#343a401f}.alert.alert-gray-800 a:not(.btn),.table-gray-800 a:not(.btn){font-weight:700;color:#1f2326}.alert.alert-gray-800 .btn:not([class*=btn-outline]),.table-gray-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-800 a:not(.btn){font-weight:700;color:#aeb0b3}.badge.bg-gray-800,.toast.bg-gray-800,.toast-header.bg-gray-800,.progress-bar.bg-gray-800{color:#fff}.bg-gray-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23141619'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray-900{color:#212529}.btn.btn-ghost-gray-900:hover{background-color:#2125291f}.alert.alert-gray-900 a:not(.btn),.table-gray-900 a:not(.btn){font-weight:700;color:#141619}.alert.alert-gray-900 .btn:not([class*=btn-outline]),.table-gray-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray-900 a:not(.btn){font-weight:700;color:#a6a8a9}.badge.bg-gray-900,.toast.bg-gray-900,.toast-header.bg-gray-900,.progress-bar.bg-gray-900{color:#fff}.bg-red-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23635657'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-100{color:#f8d7da}.btn.btn-ghost-red-100:hover{background-color:#f8d7da1f}.alert.alert-red-100 a:not(.btn),.table-red-100 a:not(.btn){font-weight:700;color:#635657}.alert.alert-red-100 .btn:not([class*=btn-outline]),.table-red-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-100 a:not(.btn){font-weight:700;color:#635657}.badge.bg-red-100,.toast.bg-red-100,.toast-header.bg-red-100,.progress-bar.bg-red-100{color:#000}.bg-red-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23604648'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-200{color:#f1aeb5}.btn.btn-ghost-red-200:hover{background-color:#f1aeb51f}.alert.alert-red-200 a:not(.btn),.table-red-200 a:not(.btn){font-weight:700;color:#604648}.alert.alert-red-200 .btn:not([class*=btn-outline]),.table-red-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-200 a:not(.btn){font-weight:700;color:#604648}.badge.bg-red-200,.toast.bg-red-200,.toast-header.bg-red-200,.progress-bar.bg-red-200{color:#000}.bg-red-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%238c5056'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-300{color:#ea868f}.btn.btn-ghost-red-300:hover{background-color:#ea868f1f}.alert.alert-red-300 a:not(.btn),.table-red-300 a:not(.btn){font-weight:700;color:#8c5056}.alert.alert-red-300 .btn:not([class*=btn-outline]),.table-red-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-300 a:not(.btn){font-weight:700;color:#5e3639}.badge.bg-red-300,.toast.bg-red-300,.toast-header.bg-red-300,.progress-bar.bg-red-300{color:#000}.bg-red-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23883840'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-400{color:#e35d6a}.btn.btn-ghost-red-400:hover{background-color:#e35d6a1f}.alert.alert-red-400 a:not(.btn),.table-red-400 a:not(.btn){font-weight:700;color:#883840}.alert.alert-red-400 .btn:not([class*=btn-outline]),.table-red-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-400 a:not(.btn){font-weight:700;color:#5b252a}.badge.bg-red-400,.toast.bg-red-400,.toast-header.bg-red-400,.progress-bar.bg-red-400{color:#000}.bg-red-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-500{color:#dc3545}.btn.btn-ghost-red-500:hover{background-color:#dc35451f}.alert.alert-red-500 a:not(.btn),.table-red-500 a:not(.btn){font-weight:700;color:#842029}.alert.alert-red-500 .btn:not([class*=btn-outline]),.table-red-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-500 a:not(.btn){font-weight:700;color:#f1aeb5}.badge.bg-red-500,.toast.bg-red-500,.toast-header.bg-red-500,.progress-bar.bg-red-500{color:#fff}.bg-red-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236a1921'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-600{color:#b02a37}.btn.btn-ghost-red-600:hover{background-color:#b02a371f}.alert.alert-red-600 a:not(.btn),.table-red-600 a:not(.btn){font-weight:700;color:#6a1921}.alert.alert-red-600 .btn:not([class*=btn-outline]),.table-red-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-600 a:not(.btn){font-weight:700;color:#dfaaaf}.badge.bg-red-600,.toast.bg-red-600,.toast-header.bg-red-600,.progress-bar.bg-red-600{color:#fff}.bg-red-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234f1319'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-700{color:#842029}.btn.btn-ghost-red-700:hover{background-color:#8420291f}.alert.alert-red-700 a:not(.btn),.table-red-700 a:not(.btn){font-weight:700;color:#4f1319}.alert.alert-red-700 .btn:not([class*=btn-outline]),.table-red-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-700 a:not(.btn){font-weight:700;color:#cea6a9}.badge.bg-red-700,.toast.bg-red-700,.toast-header.bg-red-700,.progress-bar.bg-red-700{color:#fff}.bg-red-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23350d11'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-800{color:#58151c}.btn.btn-ghost-red-800:hover{background-color:#58151c1f}.alert.alert-red-800 a:not(.btn),.table-red-800 a:not(.btn){font-weight:700;color:#350d11}.alert.alert-red-800 .btn:not([class*=btn-outline]),.table-red-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-800 a:not(.btn){font-weight:700;color:#bca1a4}.badge.bg-red-800,.toast.bg-red-800,.toast-header.bg-red-800,.progress-bar.bg-red-800{color:#fff}.bg-red-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231a0708'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red-900{color:#2c0b0e}.btn.btn-ghost-red-900:hover{background-color:#2c0b0e1f}.alert.alert-red-900 a:not(.btn),.table-red-900 a:not(.btn){font-weight:700;color:#1a0708}.alert.alert-red-900 .btn:not([class*=btn-outline]),.table-red-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red-900 a:not(.btn){font-weight:700;color:#ab9d9f}.badge.bg-red-900,.toast.bg-red-900,.toast-header.bg-red-900,.progress-bar.bg-red-900{color:#fff}.bg-yellow-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23666152'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-100{color:#fff3cd}.btn.btn-ghost-yellow-100:hover{background-color:#fff3cd1f}.alert.alert-yellow-100 a:not(.btn),.table-yellow-100 a:not(.btn){font-weight:700;color:#666152}.alert.alert-yellow-100 .btn:not([class*=btn-outline]),.table-yellow-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-100 a:not(.btn){font-weight:700;color:#666152}.badge.bg-yellow-100,.toast.bg-yellow-100,.toast-header.bg-yellow-100,.progress-bar.bg-yellow-100{color:#000}.bg-yellow-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23665c3e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-200{color:#ffe69c}.btn.btn-ghost-yellow-200:hover{background-color:#ffe69c1f}.alert.alert-yellow-200 a:not(.btn),.table-yellow-200 a:not(.btn){font-weight:700;color:#665c3e}.alert.alert-yellow-200 .btn:not([class*=btn-outline]),.table-yellow-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-200 a:not(.btn){font-weight:700;color:#665c3e}.badge.bg-yellow-200,.toast.bg-yellow-200,.toast-header.bg-yellow-200,.progress-bar.bg-yellow-200{color:#000}.bg-yellow-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2366572a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-300{color:#ffda6a}.btn.btn-ghost-yellow-300:hover{background-color:#ffda6a1f}.alert.alert-yellow-300 a:not(.btn),.table-yellow-300 a:not(.btn){font-weight:700;color:#66572a}.alert.alert-yellow-300 .btn:not([class*=btn-outline]),.table-yellow-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-300 a:not(.btn){font-weight:700;color:#66572a}.badge.bg-yellow-300,.toast.bg-yellow-300,.toast-header.bg-yellow-300,.progress-bar.bg-yellow-300{color:#000}.bg-yellow-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23665217'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-400{color:#ffcd39}.btn.btn-ghost-yellow-400:hover{background-color:#ffcd391f}.alert.alert-yellow-400 a:not(.btn),.table-yellow-400 a:not(.btn){font-weight:700;color:#665217}.alert.alert-yellow-400 .btn:not([class*=btn-outline]),.table-yellow-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-400 a:not(.btn){font-weight:700;color:#665217}.badge.bg-yellow-400,.toast.bg-yellow-400,.toast-header.bg-yellow-400,.progress-bar.bg-yellow-400{color:#000}.bg-yellow-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-500{color:#ffc107}.btn.btn-ghost-yellow-500:hover{background-color:#ffc1071f}.alert.alert-yellow-500 a:not(.btn),.table-yellow-500 a:not(.btn){font-weight:700;color:#664d03}.alert.alert-yellow-500 .btn:not([class*=btn-outline]),.table-yellow-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-500 a:not(.btn){font-weight:700;color:#664d03}.badge.bg-yellow-500,.toast.bg-yellow-500,.toast-header.bg-yellow-500,.progress-bar.bg-yellow-500{color:#000}.bg-yellow-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237a5c04'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-600{color:#cc9a06}.btn.btn-ghost-yellow-600:hover{background-color:#cc9a061f}.alert.alert-yellow-600 a:not(.btn),.table-yellow-600 a:not(.btn){font-weight:700;color:#7a5c04}.alert.alert-yellow-600 .btn:not([class*=btn-outline]),.table-yellow-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-600 a:not(.btn){font-weight:700;color:#523e02}.badge.bg-yellow-600,.toast.bg-yellow-600,.toast-header.bg-yellow-600,.progress-bar.bg-yellow-600{color:#000}.bg-yellow-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235c4602'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-700{color:#997404}.btn.btn-ghost-yellow-700:hover{background-color:#9974041f}.alert.alert-yellow-700 a:not(.btn),.table-yellow-700 a:not(.btn){font-weight:700;color:#5c4602}.alert.alert-yellow-700 .btn:not([class*=btn-outline]),.table-yellow-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-700 a:not(.btn){font-weight:700;color:#3d2e02}.badge.bg-yellow-700,.toast.bg-yellow-700,.toast-header.bg-yellow-700,.progress-bar.bg-yellow-700{color:#000}.bg-yellow-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233d2e02'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-800{color:#664d03}.btn.btn-ghost-yellow-800:hover{background-color:#664d031f}.alert.alert-yellow-800 a:not(.btn),.table-yellow-800 a:not(.btn){font-weight:700;color:#3d2e02}.alert.alert-yellow-800 .btn:not([class*=btn-outline]),.table-yellow-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-800 a:not(.btn){font-weight:700;color:#c2b89a}.badge.bg-yellow-800,.toast.bg-yellow-800,.toast-header.bg-yellow-800,.progress-bar.bg-yellow-800{color:#fff}.bg-yellow-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f1701'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow-900{color:#332701}.btn.btn-ghost-yellow-900:hover{background-color:#3327011f}.alert.alert-yellow-900 a:not(.btn),.table-yellow-900 a:not(.btn){font-weight:700;color:#1f1701}.alert.alert-yellow-900 .btn:not([class*=btn-outline]),.table-yellow-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow-900 a:not(.btn){font-weight:700;color:#ada999}.badge.bg-yellow-900,.toast.bg-yellow-900,.toast-header.bg-yellow-900,.progress-bar.bg-yellow-900{color:#fff}.bg-green-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23545c58'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-100{color:#d1e7dd}.btn.btn-ghost-green-100:hover{background-color:#d1e7dd1f}.alert.alert-green-100 a:not(.btn),.table-green-100 a:not(.btn){font-weight:700;color:#545c58}.alert.alert-green-100 .btn:not([class*=btn-outline]),.table-green-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-100 a:not(.btn){font-weight:700;color:#545c58}.badge.bg-green-100,.toast.bg-green-100,.toast-header.bg-green-100,.progress-bar.bg-green-100{color:#000}.bg-green-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2341534b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-200{color:#a3cfbb}.btn.btn-ghost-green-200:hover{background-color:#a3cfbb1f}.alert.alert-green-200 a:not(.btn),.table-green-200 a:not(.btn){font-weight:700;color:#41534b}.alert.alert-green-200 .btn:not([class*=btn-outline]),.table-green-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-200 a:not(.btn){font-weight:700;color:#41534b}.badge.bg-green-200,.toast.bg-green-200,.toast-header.bg-green-200,.progress-bar.bg-green-200{color:#000}.bg-green-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23466e5b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-300{color:#75b798}.btn.btn-ghost-green-300:hover{background-color:#75b7981f}.alert.alert-green-300 a:not(.btn),.table-green-300 a:not(.btn){font-weight:700;color:#466e5b}.alert.alert-green-300 .btn:not([class*=btn-outline]),.table-green-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-300 a:not(.btn){font-weight:700;color:#2f493d}.badge.bg-green-300,.toast.bg-green-300,.toast-header.bg-green-300,.progress-bar.bg-green-300{color:#000}.bg-green-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232b5f47'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-400{color:#479f76}.btn.btn-ghost-green-400:hover{background-color:#479f761f}.alert.alert-green-400 a:not(.btn),.table-green-400 a:not(.btn){font-weight:700;color:#2b5f47}.alert.alert-green-400 .btn:not([class*=btn-outline]),.table-green-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-400 a:not(.btn){font-weight:700;color:#1c402f}.badge.bg-green-400,.toast.bg-green-400,.toast-header.bg-green-400,.progress-bar.bg-green-400{color:#000}.bg-green-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-500{color:#198754}.btn.btn-ghost-green-500:hover{background-color:#1987541f}.alert.alert-green-500 a:not(.btn),.table-green-500 a:not(.btn){font-weight:700;color:#0f5132}.alert.alert-green-500 .btn:not([class*=btn-outline]),.table-green-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-500 a:not(.btn){font-weight:700;color:#a3cfbb}.badge.bg-green-500,.toast.bg-green-500,.toast-header.bg-green-500,.progress-bar.bg-green-500{color:#fff}.bg-green-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c4128'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-600{color:#146c43}.btn.btn-ghost-green-600:hover{background-color:#146c431f}.alert.alert-green-600 a:not(.btn),.table-green-600 a:not(.btn){font-weight:700;color:#0c4128}.alert.alert-green-600 .btn:not([class*=btn-outline]),.table-green-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-600 a:not(.btn){font-weight:700;color:#a1c4b4}.badge.bg-green-600,.toast.bg-green-600,.toast-header.bg-green-600,.progress-bar.bg-green-600{color:#fff}.bg-green-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2309311e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-700{color:#0f5132}.btn.btn-ghost-green-700:hover{background-color:#0f51321f}.alert.alert-green-700 a:not(.btn),.table-green-700 a:not(.btn){font-weight:700;color:#09311e}.alert.alert-green-700 .btn:not([class*=btn-outline]),.table-green-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-700 a:not(.btn){font-weight:700;color:#9fb9ad}.badge.bg-green-700,.toast.bg-green-700,.toast-header.bg-green-700,.progress-bar.bg-green-700{color:#fff}.bg-green-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23062014'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-800{color:#0a3622}.btn.btn-ghost-green-800:hover{background-color:#0a36221f}.alert.alert-green-800 a:not(.btn),.table-green-800 a:not(.btn){font-weight:700;color:#062014}.alert.alert-green-800 .btn:not([class*=btn-outline]),.table-green-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-800 a:not(.btn){font-weight:700;color:#9dafa7}.badge.bg-green-800,.toast.bg-green-800,.toast-header.bg-green-800,.progress-bar.bg-green-800{color:#fff}.bg-green-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2303100a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green-900{color:#051b11}.btn.btn-ghost-green-900:hover{background-color:#051b111f}.alert.alert-green-900 a:not(.btn),.table-green-900 a:not(.btn){font-weight:700;color:#03100a}.alert.alert-green-900 .btn:not([class*=btn-outline]),.table-green-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green-900 a:not(.btn){font-weight:700;color:#9ba4a0}.badge.bg-green-900,.toast.bg-green-900,.toast-header.bg-green-900,.progress-bar.bg-green-900{color:#fff}.bg-blue-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23535a66'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-100{color:#cfe2ff}.btn.btn-ghost-blue-100:hover{background-color:#cfe2ff1f}.alert.alert-blue-100 a:not(.btn),.table-blue-100 a:not(.btn){font-weight:700;color:#535a66}.alert.alert-blue-100 .btn:not([class*=btn-outline]),.table-blue-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-100 a:not(.btn){font-weight:700;color:#535a66}.badge.bg-blue-100,.toast.bg-blue-100,.toast-header.bg-blue-100,.progress-bar.bg-blue-100{color:#000}.bg-blue-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233f4f66'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-200{color:#9ec5fe}.btn.btn-ghost-blue-200:hover{background-color:#9ec5fe1f}.alert.alert-blue-200 a:not(.btn),.table-blue-200 a:not(.btn){font-weight:700;color:#3f4f66}.alert.alert-blue-200 .btn:not([class*=btn-outline]),.table-blue-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-200 a:not(.btn){font-weight:700;color:#3f4f66}.badge.bg-blue-200,.toast.bg-blue-200,.toast-header.bg-blue-200,.progress-bar.bg-blue-200{color:#000}.bg-blue-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23426598'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-300{color:#6ea8fe}.btn.btn-ghost-blue-300:hover{background-color:#6ea8fe1f}.alert.alert-blue-300 a:not(.btn),.table-blue-300 a:not(.btn){font-weight:700;color:#426598}.alert.alert-blue-300 .btn:not([class*=btn-outline]),.table-blue-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-300 a:not(.btn){font-weight:700;color:#2c4366}.badge.bg-blue-300,.toast.bg-blue-300,.toast-header.bg-blue-300,.progress-bar.bg-blue-300{color:#000}.bg-blue-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23255398'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-400{color:#3d8bfd}.btn.btn-ghost-blue-400:hover{background-color:#3d8bfd1f}.alert.alert-blue-400 a:not(.btn),.table-blue-400 a:not(.btn){font-weight:700;color:#255398}.alert.alert-blue-400 .btn:not([class*=btn-outline]),.table-blue-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-400 a:not(.btn){font-weight:700;color:#183865}.badge.bg-blue-400,.toast.bg-blue-400,.toast-header.bg-blue-400,.progress-bar.bg-blue-400{color:#000}.bg-blue-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23084298'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-500{color:#0d6efd}.btn.btn-ghost-blue-500:hover{background-color:#0d6efd1f}.alert.alert-blue-500 a:not(.btn),.table-blue-500 a:not(.btn){font-weight:700;color:#084298}.alert.alert-blue-500 .btn:not([class*=btn-outline]),.table-blue-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-500 a:not(.btn){font-weight:700;color:#9ec5fe}.badge.bg-blue-500,.toast.bg-blue-500,.toast-header.bg-blue-500,.progress-bar.bg-blue-500{color:#fff}.bg-blue-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23063579'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-600{color:#0a58ca}.btn.btn-ghost-blue-600:hover{background-color:#0a58ca1f}.alert.alert-blue-600 a:not(.btn),.table-blue-600 a:not(.btn){font-weight:700;color:#063579}.alert.alert-blue-600 .btn:not([class*=btn-outline]),.table-blue-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-600 a:not(.btn){font-weight:700;color:#9dbcea}.badge.bg-blue-600,.toast.bg-blue-600,.toast-header.bg-blue-600,.progress-bar.bg-blue-600{color:#fff}.bg-blue-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2305285b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-700{color:#084298}.btn.btn-ghost-blue-700:hover{background-color:#0842981f}.alert.alert-blue-700 a:not(.btn),.table-blue-700 a:not(.btn){font-weight:700;color:#05285b}.alert.alert-blue-700 .btn:not([class*=btn-outline]),.table-blue-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-700 a:not(.btn){font-weight:700;color:#9cb3d6}.badge.bg-blue-700,.toast.bg-blue-700,.toast-header.bg-blue-700,.progress-bar.bg-blue-700{color:#fff}.bg-blue-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23031a3d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-800{color:#052c65}.btn.btn-ghost-blue-800:hover{background-color:#052c651f}.alert.alert-blue-800 a:not(.btn),.table-blue-800 a:not(.btn){font-weight:700;color:#031a3d}.alert.alert-blue-800 .btn:not([class*=btn-outline]),.table-blue-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-800 a:not(.btn){font-weight:700;color:#9babc1}.badge.bg-blue-800,.toast.bg-blue-800,.toast-header.bg-blue-800,.progress-bar.bg-blue-800{color:#fff}.bg-blue-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23020d1f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue-900{color:#031633}.btn.btn-ghost-blue-900:hover{background-color:#0316331f}.alert.alert-blue-900 a:not(.btn),.table-blue-900 a:not(.btn){font-weight:700;color:#020d1f}.alert.alert-blue-900 .btn:not([class*=btn-outline]),.table-blue-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue-900 a:not(.btn){font-weight:700;color:#9aa2ad}.badge.bg-blue-900,.toast.bg-blue-900,.toast-header.bg-blue-900,.progress-bar.bg-blue-900{color:#fff}.bg-cyan-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23536265'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-100{color:#cff4fc}.btn.btn-ghost-cyan-100:hover{background-color:#cff4fc1f}.alert.alert-cyan-100 a:not(.btn),.table-cyan-100 a:not(.btn){font-weight:700;color:#536265}.alert.alert-cyan-100 .btn:not([class*=btn-outline]),.table-cyan-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-100 a:not(.btn){font-weight:700;color:#536265}.badge.bg-cyan-100,.toast.bg-cyan-100,.toast-header.bg-cyan-100,.progress-bar.bg-cyan-100{color:#000}.bg-cyan-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233f5e64'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-200{color:#9eeaf9}.btn.btn-ghost-cyan-200:hover{background-color:#9eeaf91f}.alert.alert-cyan-200 a:not(.btn),.table-cyan-200 a:not(.btn){font-weight:700;color:#3f5e64}.alert.alert-cyan-200 .btn:not([class*=btn-outline]),.table-cyan-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-200 a:not(.btn){font-weight:700;color:#3f5e64}.badge.bg-cyan-200,.toast.bg-cyan-200,.toast-header.bg-cyan-200,.progress-bar.bg-cyan-200{color:#000}.bg-cyan-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c5962'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-300{color:#6edff6}.btn.btn-ghost-cyan-300:hover{background-color:#6edff61f}.alert.alert-cyan-300 a:not(.btn),.table-cyan-300 a:not(.btn){font-weight:700;color:#2c5962}.alert.alert-cyan-300 .btn:not([class*=btn-outline]),.table-cyan-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-300 a:not(.btn){font-weight:700;color:#2c5962}.badge.bg-cyan-300,.toast.bg-cyan-300,.toast-header.bg-cyan-300,.progress-bar.bg-cyan-300{color:#000}.bg-cyan-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23185561'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-400{color:#3dd5f3}.btn.btn-ghost-cyan-400:hover{background-color:#3dd5f31f}.alert.alert-cyan-400 a:not(.btn),.table-cyan-400 a:not(.btn){font-weight:700;color:#185561}.alert.alert-cyan-400 .btn:not([class*=btn-outline]),.table-cyan-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-400 a:not(.btn){font-weight:700;color:#185561}.badge.bg-cyan-400,.toast.bg-cyan-400,.toast-header.bg-cyan-400,.progress-bar.bg-cyan-400{color:#000}.bg-cyan-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23055160'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-500{color:#0dcaf0}.btn.btn-ghost-cyan-500:hover{background-color:#0dcaf01f}.alert.alert-cyan-500 a:not(.btn),.table-cyan-500 a:not(.btn){font-weight:700;color:#055160}.alert.alert-cyan-500 .btn:not([class*=btn-outline]),.table-cyan-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-500 a:not(.btn){font-weight:700;color:#055160}.badge.bg-cyan-500,.toast.bg-cyan-500,.toast-header.bg-cyan-500,.progress-bar.bg-cyan-500{color:#000}.bg-cyan-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23066173'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-600{color:#0aa2c0}.btn.btn-ghost-cyan-600:hover{background-color:#0aa2c01f}.alert.alert-cyan-600 a:not(.btn),.table-cyan-600 a:not(.btn){font-weight:700;color:#066173}.alert.alert-cyan-600 .btn:not([class*=btn-outline]),.table-cyan-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-600 a:not(.btn){font-weight:700;color:#04414d}.badge.bg-cyan-600,.toast.bg-cyan-600,.toast-header.bg-cyan-600,.progress-bar.bg-cyan-600{color:#000}.bg-cyan-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23054956'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-700{color:#087990}.btn.btn-ghost-cyan-700:hover{background-color:#0879901f}.alert.alert-cyan-700 a:not(.btn),.table-cyan-700 a:not(.btn){font-weight:700;color:#054956}.alert.alert-cyan-700 .btn:not([class*=btn-outline]),.table-cyan-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-700 a:not(.btn){font-weight:700;color:#9cc9d3}.badge.bg-cyan-700,.toast.bg-cyan-700,.toast-header.bg-cyan-700,.progress-bar.bg-cyan-700{color:#fff}.bg-cyan-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2303313a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-800{color:#055160}.btn.btn-ghost-cyan-800:hover{background-color:#0551601f}.alert.alert-cyan-800 a:not(.btn),.table-cyan-800 a:not(.btn){font-weight:700;color:#03313a}.alert.alert-cyan-800 .btn:not([class*=btn-outline]),.table-cyan-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-800 a:not(.btn){font-weight:700;color:#9bb9bf}.badge.bg-cyan-800,.toast.bg-cyan-800,.toast-header.bg-cyan-800,.progress-bar.bg-cyan-800{color:#fff}.bg-cyan-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2302181d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan-900{color:#032830}.btn.btn-ghost-cyan-900:hover{background-color:#0328301f}.alert.alert-cyan-900 a:not(.btn),.table-cyan-900 a:not(.btn){font-weight:700;color:#02181d}.alert.alert-cyan-900 .btn:not([class*=btn-outline]),.table-cyan-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan-900 a:not(.btn){font-weight:700;color:#9aa9ac}.badge.bg-cyan-900,.toast.bg-cyan-900,.toast-header.bg-cyan-900,.progress-bar.bg-cyan-900{color:#fff}.bg-indigo-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235a5365'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-100{color:#e0cffc}.btn.btn-ghost-indigo-100:hover{background-color:#e0cffc1f}.alert.alert-indigo-100 a:not(.btn),.table-indigo-100 a:not(.btn){font-weight:700;color:#5a5365}.alert.alert-indigo-100 .btn:not([class*=btn-outline]),.table-indigo-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-100 a:not(.btn){font-weight:700;color:#5a5365}.badge.bg-indigo-100,.toast.bg-indigo-100,.toast-header.bg-indigo-100,.progress-bar.bg-indigo-100{color:#000}.bg-indigo-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23745f96'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-200{color:#c29ffa}.btn.btn-ghost-indigo-200:hover{background-color:#c29ffa1f}.alert.alert-indigo-200 a:not(.btn),.table-indigo-200 a:not(.btn){font-weight:700;color:#745f96}.alert.alert-indigo-200 .btn:not([class*=btn-outline]),.table-indigo-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-200 a:not(.btn){font-weight:700;color:#4e4064}.badge.bg-indigo-200,.toast.bg-indigo-200,.toast-header.bg-indigo-200,.progress-bar.bg-indigo-200{color:#000}.bg-indigo-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23624394'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-300{color:#a370f7}.btn.btn-ghost-indigo-300:hover{background-color:#a370f71f}.alert.alert-indigo-300 a:not(.btn),.table-indigo-300 a:not(.btn){font-weight:700;color:#624394}.alert.alert-indigo-300 .btn:not([class*=btn-outline]),.table-indigo-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-300 a:not(.btn){font-weight:700;color:#412d63}.badge.bg-indigo-300,.toast.bg-indigo-300,.toast-header.bg-indigo-300,.progress-bar.bg-indigo-300{color:#000}.bg-indigo-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23502693'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-400{color:#8540f5}.btn.btn-ghost-indigo-400:hover{background-color:#8540f51f}.alert.alert-indigo-400 a:not(.btn),.table-indigo-400 a:not(.btn){font-weight:700;color:#502693}.alert.alert-indigo-400 .btn:not([class*=btn-outline]),.table-indigo-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-400 a:not(.btn){font-weight:700;color:#ceb3fb}.badge.bg-indigo-400,.toast.bg-indigo-400,.toast-header.bg-indigo-400,.progress-bar.bg-indigo-400{color:#fff}.bg-indigo-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233d0a91'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-500{color:#6610f2}.btn.btn-ghost-indigo-500:hover{background-color:#6610f21f}.alert.alert-indigo-500 a:not(.btn),.table-indigo-500 a:not(.btn){font-weight:700;color:#3d0a91}.alert.alert-indigo-500 .btn:not([class*=btn-outline]),.table-indigo-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-500 a:not(.btn){font-weight:700;color:#c29ffa}.badge.bg-indigo-500,.toast.bg-indigo-500,.toast-header.bg-indigo-500,.progress-bar.bg-indigo-500{color:#fff}.bg-indigo-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23310874'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-600{color:#520dc2}.btn.btn-ghost-indigo-600:hover{background-color:#520dc21f}.alert.alert-indigo-600 a:not(.btn),.table-indigo-600 a:not(.btn){font-weight:700;color:#310874}.alert.alert-indigo-600 .btn:not([class*=btn-outline]),.table-indigo-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-600 a:not(.btn){font-weight:700;color:#ba9ee7}.badge.bg-indigo-600,.toast.bg-indigo-600,.toast-header.bg-indigo-600,.progress-bar.bg-indigo-600{color:#fff}.bg-indigo-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23250657'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-700{color:#3d0a91}.btn.btn-ghost-indigo-700:hover{background-color:#3d0a911f}.alert.alert-indigo-700 a:not(.btn),.table-indigo-700 a:not(.btn){font-weight:700;color:#250657}.alert.alert-indigo-700 .btn:not([class*=btn-outline]),.table-indigo-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-700 a:not(.btn){font-weight:700;color:#b19dd3}.badge.bg-indigo-700,.toast.bg-indigo-700,.toast-header.bg-indigo-700,.progress-bar.bg-indigo-700{color:#fff}.bg-indigo-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2319043a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-800{color:#290661}.btn.btn-ghost-indigo-800:hover{background-color:#2906611f}.alert.alert-indigo-800 a:not(.btn),.table-indigo-800 a:not(.btn){font-weight:700;color:#19043a}.alert.alert-indigo-800 .btn:not([class*=btn-outline]),.table-indigo-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-800 a:not(.btn){font-weight:700;color:#a99bc0}.badge.bg-indigo-800,.toast.bg-indigo-800,.toast-header.bg-indigo-800,.progress-bar.bg-indigo-800{color:#fff}.bg-indigo-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c021d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo-900{color:#140330}.btn.btn-ghost-indigo-900:hover{background-color:#1403301f}.alert.alert-indigo-900 a:not(.btn),.table-indigo-900 a:not(.btn){font-weight:700;color:#0c021d}.alert.alert-indigo-900 .btn:not([class*=btn-outline]),.table-indigo-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo-900 a:not(.btn){font-weight:700;color:#a19aac}.badge.bg-indigo-900,.toast.bg-indigo-900,.toast-header.bg-indigo-900,.progress-bar.bg-indigo-900{color:#fff}.bg-purple-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235a5761'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-100{color:#e2d9f3}.btn.btn-ghost-purple-100:hover{background-color:#e2d9f31f}.alert.alert-purple-100 a:not(.btn),.table-purple-100 a:not(.btn){font-weight:700;color:#5a5761}.alert.alert-purple-100 .btn:not([class*=btn-outline]),.table-purple-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-100 a:not(.btn){font-weight:700;color:#5a5761}.badge.bg-purple-100,.toast.bg-purple-100,.toast-header.bg-purple-100,.progress-bar.bg-purple-100{color:#000}.bg-purple-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234f485c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-200{color:#c5b3e6}.btn.btn-ghost-purple-200:hover{background-color:#c5b3e61f}.alert.alert-purple-200 a:not(.btn),.table-purple-200 a:not(.btn){font-weight:700;color:#4f485c}.alert.alert-purple-200 .btn:not([class*=btn-outline]),.table-purple-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-200 a:not(.btn){font-weight:700;color:#4f485c}.badge.bg-purple-200,.toast.bg-purple-200,.toast-header.bg-purple-200,.progress-bar.bg-purple-200{color:#000}.bg-purple-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23655583'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-300{color:#a98eda}.btn.btn-ghost-purple-300:hover{background-color:#a98eda1f}.alert.alert-purple-300 a:not(.btn),.table-purple-300 a:not(.btn){font-weight:700;color:#655583}.alert.alert-purple-300 .btn:not([class*=btn-outline]),.table-purple-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-300 a:not(.btn){font-weight:700;color:#443957}.badge.bg-purple-300,.toast.bg-purple-300,.toast-header.bg-purple-300,.progress-bar.bg-purple-300{color:#000}.bg-purple-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23543e7b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-400{color:#8c68cd}.btn.btn-ghost-purple-400:hover{background-color:#8c68cd1f}.alert.alert-purple-400 a:not(.btn),.table-purple-400 a:not(.btn){font-weight:700;color:#543e7b}.alert.alert-purple-400 .btn:not([class*=btn-outline]),.table-purple-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-400 a:not(.btn){font-weight:700;color:#382a52}.badge.bg-purple-400,.toast.bg-purple-400,.toast-header.bg-purple-400,.progress-bar.bg-purple-400{color:#000}.bg-purple-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23432874'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-500{color:#6f42c1}.btn.btn-ghost-purple-500:hover{background-color:#6f42c11f}.alert.alert-purple-500 a:not(.btn),.table-purple-500 a:not(.btn){font-weight:700;color:#432874}.alert.alert-purple-500 .btn:not([class*=btn-outline]),.table-purple-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-500 a:not(.btn){font-weight:700;color:#c5b3e6}.badge.bg-purple-500,.toast.bg-purple-500,.toast-header.bg-purple-500,.progress-bar.bg-purple-500{color:#fff}.bg-purple-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2335205c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-600{color:#59359a}.btn.btn-ghost-purple-600:hover{background-color:#59359a1f}.alert.alert-purple-600 a:not(.btn),.table-purple-600 a:not(.btn){font-weight:700;color:#35205c}.alert.alert-purple-600 .btn:not([class*=btn-outline]),.table-purple-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-600 a:not(.btn){font-weight:700;color:#bdaed7}.badge.bg-purple-600,.toast.bg-purple-600,.toast-header.bg-purple-600,.progress-bar.bg-purple-600{color:#fff}.bg-purple-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23281846'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-700{color:#432874}.btn.btn-ghost-purple-700:hover{background-color:#4328741f}.alert.alert-purple-700 a:not(.btn),.table-purple-700 a:not(.btn){font-weight:700;color:#281846}.alert.alert-purple-700 .btn:not([class*=btn-outline]),.table-purple-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-700 a:not(.btn){font-weight:700;color:#b4a9c7}.badge.bg-purple-700,.toast.bg-purple-700,.toast-header.bg-purple-700,.progress-bar.bg-purple-700{color:#fff}.bg-purple-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231a102e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-800{color:#2c1a4d}.btn.btn-ghost-purple-800:hover{background-color:#2c1a4d1f}.alert.alert-purple-800 a:not(.btn),.table-purple-800 a:not(.btn){font-weight:700;color:#1a102e}.alert.alert-purple-800 .btn:not([class*=btn-outline]),.table-purple-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-800 a:not(.btn){font-weight:700;color:#aba3b8}.badge.bg-purple-800,.toast.bg-purple-800,.toast-header.bg-purple-800,.progress-bar.bg-purple-800{color:#fff}.bg-purple-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230d0817'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple-900{color:#160d27}.btn.btn-ghost-purple-900:hover{background-color:#160d271f}.alert.alert-purple-900 a:not(.btn),.table-purple-900 a:not(.btn){font-weight:700;color:#0d0817}.alert.alert-purple-900 .btn:not([class*=btn-outline]),.table-purple-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple-900 a:not(.btn){font-weight:700;color:#a29ea9}.badge.bg-purple-900,.toast.bg-purple-900,.toast-header.bg-purple-900,.progress-bar.bg-purple-900{color:#fff}.bg-pink-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2363565c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-100{color:#f7d6e6}.btn.btn-ghost-pink-100:hover{background-color:#f7d6e61f}.alert.alert-pink-100 a:not(.btn),.table-pink-100 a:not(.btn){font-weight:700;color:#63565c}.alert.alert-pink-100 .btn:not([class*=btn-outline]),.table-pink-100 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-100 a:not(.btn){font-weight:700;color:#63565c}.badge.bg-pink-100,.toast.bg-pink-100,.toast-header.bg-pink-100,.progress-bar.bg-pink-100{color:#000}.bg-pink-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23604552'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-200{color:#efadce}.btn.btn-ghost-pink-200:hover{background-color:#efadce1f}.alert.alert-pink-200 a:not(.btn),.table-pink-200 a:not(.btn){font-weight:700;color:#604552}.alert.alert-pink-200 .btn:not([class*=btn-outline]),.table-pink-200 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-200 a:not(.btn){font-weight:700;color:#604552}.badge.bg-pink-200,.toast.bg-pink-200,.toast-header.bg-pink-200,.progress-bar.bg-pink-200{color:#000}.bg-pink-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%238a506d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-300{color:#e685b5}.btn.btn-ghost-pink-300:hover{background-color:#e685b51f}.alert.alert-pink-300 a:not(.btn),.table-pink-300 a:not(.btn){font-weight:700;color:#8a506d}.alert.alert-pink-300 .btn:not([class*=btn-outline]),.table-pink-300 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-300 a:not(.btn){font-weight:700;color:#5c3548}.badge.bg-pink-300,.toast.bg-pink-300,.toast-header.bg-pink-300,.progress-bar.bg-pink-300{color:#000}.bg-pink-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2385375e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-400{color:#de5c9d}.btn.btn-ghost-pink-400:hover{background-color:#de5c9d1f}.alert.alert-pink-400 a:not(.btn),.table-pink-400 a:not(.btn){font-weight:700;color:#85375e}.alert.alert-pink-400 .btn:not([class*=btn-outline]),.table-pink-400 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-400 a:not(.btn){font-weight:700;color:#59253f}.badge.bg-pink-400,.toast.bg-pink-400,.toast-header.bg-pink-400,.progress-bar.bg-pink-400{color:#000}.bg-pink-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23801f4f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-500{color:#d63384}.btn.btn-ghost-pink-500:hover{background-color:#d633841f}.alert.alert-pink-500 a:not(.btn),.table-pink-500 a:not(.btn){font-weight:700;color:#801f4f}.alert.alert-pink-500 .btn:not([class*=btn-outline]),.table-pink-500 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-500 a:not(.btn){font-weight:700;color:#efadce}.badge.bg-pink-500,.toast.bg-pink-500,.toast-header.bg-pink-500,.progress-bar.bg-pink-500{color:#fff}.bg-pink-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23671940'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-600{color:#ab296a}.btn.btn-ghost-pink-600:hover{background-color:#ab296a1f}.alert.alert-pink-600 a:not(.btn),.table-pink-600 a:not(.btn){font-weight:700;color:#671940}.alert.alert-pink-600 .btn:not([class*=btn-outline]),.table-pink-600 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-600 a:not(.btn){font-weight:700;color:#dda9c3}.badge.bg-pink-600,.toast.bg-pink-600,.toast-header.bg-pink-600,.progress-bar.bg-pink-600{color:#fff}.bg-pink-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234d132f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-700{color:#801f4f}.btn.btn-ghost-pink-700:hover{background-color:#801f4f1f}.alert.alert-pink-700 a:not(.btn),.table-pink-700 a:not(.btn){font-weight:700;color:#4d132f}.alert.alert-pink-700 .btn:not([class*=btn-outline]),.table-pink-700 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-700 a:not(.btn){font-weight:700;color:#cca5b9}.badge.bg-pink-700,.toast.bg-pink-700,.toast-header.bg-pink-700,.progress-bar.bg-pink-700{color:#fff}.bg-pink-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23340c20'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-800{color:#561435}.btn.btn-ghost-pink-800:hover{background-color:#5614351f}.alert.alert-pink-800 a:not(.btn),.table-pink-800 a:not(.btn){font-weight:700;color:#340c20}.alert.alert-pink-800 .btn:not([class*=btn-outline]),.table-pink-800 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-800 a:not(.btn){font-weight:700;color:#bba1ae}.badge.bg-pink-800,.toast.bg-pink-800,.toast-header.bg-pink-800,.progress-bar.bg-pink-800{color:#fff}.bg-pink-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231a0610'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink-900{color:#2b0a1a}.btn.btn-ghost-pink-900:hover{background-color:#2b0a1a1f}.alert.alert-pink-900 a:not(.btn),.table-pink-900 a:not(.btn){font-weight:700;color:#1a0610}.alert.alert-pink-900 .btn:not([class*=btn-outline]),.table-pink-900 .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink-900 a:not(.btn){font-weight:700;color:#aa9da3}.badge.bg-pink-900,.toast.bg-pink-900,.toast-header.bg-pink-900,.progress-bar.bg-pink-900{color:#fff}table td>.progress{min-width:6rem}.small .form-control{font-size:.875rem}:not(.card-body)>.col:not(:last-child):not(:only-child){margin-bottom:1rem}.nav-mobile{display:none;flex-direction:column;align-items:center;justify-content:space-between;width:100%}@media (max-width: 991.98px){.nav-mobile{display:flex}}.nav-mobile .nav-mobile-top{display:flex;align-items:center;justify-content:space-between;width:100%}.card>.table.table-flush{margin-bottom:0;overflow:hidden;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.card>.table.table-flush thead th[scope=col]{padding-top:1rem;padding-bottom:1rem;text-transform:uppercase;vertical-align:middle;background-color:#f8f9fa;border-top:1px solid rgba(0,0,0,.125);border-bottom-color:#00000020}.card>.table.table-flush th,.card>.table.table-flush td{padding-right:1.5rem!important;padding-left:1.5rem!important;border-right:0;border-left:0}.card>.table.table-flush tr[class]{border-color:#00000020!important}.card>.table.table-flush tr[class]:last-of-type{border-bottom-color:transparent!important;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.header-alert-container{display:flex;align-items:center;justify-content:center;padding:0 1rem}.header-alert-container .alert{width:100%}@media (min-width: 768px){.header-alert-container .alert{max-width:75%}}@media (min-width: 992px){.header-alert-container .alert{max-width:50%}}span.profile-button .dropdown-menu{right:0;left:auto;display:block!important;margin-top:.5rem;box-shadow:0 .5rem 1rem #00000026;transition:opacity .2s ease-in-out}span.profile-button .dropdown-menu:not(.show){pointer-events:none;opacity:0}span.profile-button .dropdown-menu.show{pointer-events:auto;opacity:1}div#advanced-search-content div.card div.card-body div.col:not(:last-child){margin-right:1rem}table td a{text-decoration:none}table td a:hover{text-decoration:underline}table td .dropdown{position:static}table th a,table th a:hover{color:#212529;text-decoration:none}table td,table th{font-size:.875rem;line-height:1.25;vertical-align:middle}table td.min-width,table th.min-width{width:1%}table td .form-check-input,table th .form-check-input{margin-top:.125em;font-size:1rem}table td .btn-sm,table td .btn-group-sm>.btn,table th .btn-sm,table th .btn-group-sm>.btn{line-height:1}table td p,table th p{margin-bottom:0}table th.asc a:after{content:"\f0140";font-family:"Material Design Icons"}table th.desc a:after{content:"\f0143";font-family:"Material Design Icons"}table.table>:not(caption)>*>*{padding-right:.25rem!important;padding-left:.25rem!important}table.object-list th{font-size:.75rem;line-height:1;vertical-align:bottom}table.attr-table th{font-weight:normal;width:25%}div.title-container{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:space-between}@media (min-width: 992px){div.title-container{flex-direction:row}}div.title-container #content-title{display:flex;flex:1 0;flex-direction:column;padding-bottom:.5rem}.controls{margin-bottom:.5rem}@media print{.controls{display:none!important}}.controls .control-group{display:flex;flex-wrap:wrap;justify-content:flex-start}@media (min-width: 992px){.controls .control-group{justify-content:flex-end}}.controls .control-group>*{margin:.25rem}.controls .control-group>*:first-child{margin-left:0}.controls .control-group>*:last-child{margin-right:0}.object-subtitle{display:block;font-size:.875rem;color:#6c757d}@media (min-width: 768px){.object-subtitle{display:inline-block}}.object-subtitle>span{display:block}.object-subtitle>span.separator{display:none}@media (min-width: 768px){.object-subtitle>span,.object-subtitle>span.separator{display:inline-block}}nav.search{z-index:999;justify-content:center;background-color:var(--nbx-body-bg)}nav.search .search-container{display:flex;width:100%}@media (max-width: 991.98px){nav.search .search-container{display:none}}nav.search .input-group .search-obj-selected{border-color:#e9ecef}nav.search .input-group .dropdown-toggle{color:#000;border-color:#e9ecef;margin-left:0;font-weight:400;line-height:1.5;color:#212529;background-color:#e9ecef;border:1px solid #e9ecef;border-radius:.375rem;border-left:1px solid var(--nbx-search-filter-border-left-color)}nav.search .input-group .dropdown-toggle:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}.btn-check:focus+nav.search .input-group .dropdown-toggle,nav.search .input-group .dropdown-toggle:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}.btn-check:checked+nav.search .input-group .dropdown-toggle,.btn-check:active+nav.search .input-group .dropdown-toggle,nav.search .input-group .dropdown-toggle:active,nav.search .input-group .dropdown-toggle.active,.show>nav.search .input-group .dropdown-toggle.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}.btn-check:checked+nav.search .input-group .dropdown-toggle:focus,.btn-check:active+nav.search .input-group .dropdown-toggle:focus,nav.search .input-group .dropdown-toggle:active:focus,nav.search .input-group .dropdown-toggle.active:focus,.show>nav.search .input-group .dropdown-toggle.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}nav.search .input-group .dropdown-toggle:disabled,nav.search .input-group .dropdown-toggle.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}nav.search .input-group .dropdown-toggle:focus{box-shadow:unset!important}nav.search .input-group .dropdown-toggle:after{display:none}nav.search .input-group .search-obj-selector{max-height:70vh;overflow-y:auto}nav.search .input-group .search-obj-selector .dropdown-item,nav.search .input-group .search-obj-selector .dropdown-header{font-size:.875rem}nav.search .input-group .search-obj-selector .dropdown-header{text-transform:uppercase}main.layout{display:flex;flex-wrap:nowrap;height:100vh;height:-webkit-fill-available;max-height:100vh;overflow-x:auto;overflow-y:hidden}@media print{main.layout{position:static!important;display:block!important;height:100%;overflow-x:visible!important;overflow-y:visible!important}}main.login-container{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;max-width:100vw;height:calc(100vh - 4rem);padding-top:40px;padding-bottom:40px}main.login-container+footer.footer button.color-mode-toggle{color:var(--nbx-color-mode-toggle-color)}.footer{padding:0}.footer .nav-link{padding:.5rem}@media (max-width: 767.98px){.footer{margin-bottom:8rem}}footer.login-footer{height:4rem;margin-top:auto}footer.login-footer .container-fluid,footer.login-footer .container-sm,footer.login-footer .container-md,footer.login-footer .container-lg,footer.login-footer .container-xl,footer.login-footer .container-xxl{display:flex;justify-content:flex-end;padding:.75rem 1.5rem}h1.accordion-item-title,.accordion-item-title.h1,h2.accordion-item-title,.accordion-item-title.h2,h3.accordion-item-title,.accordion-item-title.h3,h4.accordion-item-title,.accordion-item-title.h4,h5.accordion-item-title,.accordion-item-title.h5,h6.accordion-item-title,.accordion-item-title.h6{padding:.25rem .5rem;font-size:.875rem;font-weight:700;color:var(--nbx-sidebar-title-color);text-transform:uppercase}.form-login{width:100%;max-width:330px;padding:15px}.form-login input:focus{z-index:1}.form-login input[type=text]{margin-bottom:-1px;border-bottom-right-radius:0;border-bottom-left-radius:0}.form-login input[type=password]{margin-bottom:10px;border-top-left-radius:0;border-top-right-radius:0}.form-login .form-control{position:relative;box-sizing:border-box;height:auto;padding:10px;font-size:16px}.navbar-brand{padding-top:.75rem;padding-bottom:.75rem;font-size:1rem}nav.nav.nav-pills .nav-item.nav-link{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}nav.nav.nav-pills .nav-item.nav-link:hover{color:#343a40;background-color:#cfe2ff}div.content-container{position:relative;display:flex;flex-direction:column;width:calc(100% - 3rem);min-height:100vh;overflow-x:hidden;overflow-y:auto}div.content-container:focus,div.content-container:focus-visible{outline:0}div.content-container div.content{flex:1}@media (max-width: 991.98px){div.content-container{width:100%}}@media print{div.content-container{width:100%!important;margin-left:0!important}}@media (max-width: 768px){.sidebar.collapse.show~.content-container>.content{position:fixed;top:0;left:0;overflow-y:hidden}}.tooltip{pointer-events:none}span.color-label{display:block;width:5rem;height:1rem;padding:.35em .65em;border:1px solid #303030;border-radius:.375rem;box-shadow:0 .125rem .25rem #00000013}.btn{white-space:nowrap}.card{box-shadow:0 .125rem .25rem #00000013}.card .card-header{padding:1rem;color:var(--nbx-body-color);border-bottom:none}.card .card-header+.card-body{padding-top:0}.card .card-body.small .form-control,.card .card-body.small .form-select{font-size:.875rem}.card .card-divider{width:100%;height:1px;margin:1rem 0;border-top:1px solid rgba(0,0,0,.125);opacity:.25}@media print{.card{box-shadow:unset!important}}.form-floating{position:relative}.form-floating>.input-group>.form-control,.form-floating>.input-group>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>.input-group>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>.input-group>label{transition:none}}.form-floating>.input-group>.form-control::placeholder{color:transparent}.form-floating>.input-group>.form-control:focus,.form-floating>.input-group>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.input-group>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.input-group>.form-select,.form-floating>.choices>.choices__inner,.form-floating>.ss-main span.placeholder,.form-floating>.ss-main div.ss-values{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.input-group>.form-control:focus~label,.form-floating>.input-group>.form-control:not(:placeholder-shown)~label,.form-floating>.input-group>.form-select~label,.form-floating>.choices~label,.form-floating>.ss-main~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem);z-index:4}.form-floating>.input-group>.form-control:-webkit-autofill~label{z-index:4;opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-object-edit{margin:0 auto;max-width:800px}textarea.form-control[rows="10"]{height:18rem}textarea#id_local_context_data,textarea.markdown,textarea#id_public_key,textarea.form-control[name=csv],textarea.form-control[name=data]{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.card:not(:only-of-type){margin-bottom:1rem}.stat-btn{min-width:3rem}nav.breadcrumb-container{width:fit-content;padding:.35em .65em;font-size:.875rem}nav.breadcrumb-container ol.breadcrumb{margin-bottom:0}nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a{text-decoration:none}nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover{text-decoration:underline}label.required{font-weight:700}label.required:after{position:absolute;display:inline-block;margin:0 0 0 2px;font-family:"Material Design Icons";font-size:8px;font-style:normal;font-weight:600;text-decoration:none;content:"\f06c4"}div.bulk-buttons{display:flex;justify-content:space-between;margin:.5rem 0}div.bulk-buttons>div.bulk-button-group{display:flex;flex-wrap:wrap;align-items:flex-start}div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child{margin-left:0}div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child{margin-right:0}div.bulk-buttons>div.bulk-button-group>*{margin:.25rem}table tbody tr.primary{background-color:#337ab726;border-color:#adb5bd}table tbody tr.secondary{background-color:#6c757d26;border-color:#adb5bd}table tbody tr.success{background-color:#19875426;border-color:#adb5bd}table tbody tr.info{background-color:#54d6f026;border-color:#adb5bd}table tbody tr.warning{background-color:#ffc10726;border-color:#adb5bd}table tbody tr.danger{background-color:#dc354526;border-color:#adb5bd}table tbody tr.light{background-color:#f8f9fa26;border-color:#adb5bd}table tbody tr.dark{background-color:#21252926;border-color:#adb5bd}table tbody tr.red{background-color:#dc354526;border-color:#adb5bd}table tbody tr.yellow{background-color:#ffc10726;border-color:#adb5bd}table tbody tr.green{background-color:#19875426;border-color:#adb5bd}table tbody tr.blue{background-color:#0d6efd26;border-color:#adb5bd}table tbody tr.cyan{background-color:#0dcaf026;border-color:#adb5bd}table tbody tr.indigo{background-color:#6610f226;border-color:#adb5bd}table tbody tr.purple{background-color:#6f42c126;border-color:#adb5bd}table tbody tr.pink{background-color:#d6338426;border-color:#adb5bd}table tbody tr.darker{background-color:#1b1f2226;border-color:#adb5bd}table tbody tr.darkest{background-color:#171b1d26;border-color:#adb5bd}table tbody tr.gray{background-color:#ced4da26;border-color:#adb5bd}table tbody tr.gray-100{background-color:#f8f9fa26;border-color:#adb5bd}table tbody tr.gray-200{background-color:#e9ecef26;border-color:#adb5bd}table tbody tr.gray-300{background-color:#dee2e626;border-color:#adb5bd}table tbody tr.gray-400{background-color:#ced4da26;border-color:#adb5bd}table tbody tr.gray-500{background-color:#adb5bd26;border-color:#adb5bd}table tbody tr.gray-600{background-color:#6c757d26;border-color:#adb5bd}table tbody tr.gray-700{background-color:#49505726;border-color:#adb5bd}table tbody tr.gray-800{background-color:#343a4026;border-color:#adb5bd}table tbody tr.gray-900{background-color:#21252926;border-color:#adb5bd}table tbody tr.red-100{background-color:#f8d7da26;border-color:#adb5bd}table tbody tr.red-200{background-color:#f1aeb526;border-color:#adb5bd}table tbody tr.red-300{background-color:#ea868f26;border-color:#adb5bd}table tbody tr.red-400{background-color:#e35d6a26;border-color:#adb5bd}table tbody tr.red-500{background-color:#dc354526;border-color:#adb5bd}table tbody tr.red-600{background-color:#b02a3726;border-color:#adb5bd}table tbody tr.red-700{background-color:#84202926;border-color:#adb5bd}table tbody tr.red-800{background-color:#58151c26;border-color:#adb5bd}table tbody tr.red-900{background-color:#2c0b0e26;border-color:#adb5bd}table tbody tr.yellow-100{background-color:#fff3cd26;border-color:#adb5bd}table tbody tr.yellow-200{background-color:#ffe69c26;border-color:#adb5bd}table tbody tr.yellow-300{background-color:#ffda6a26;border-color:#adb5bd}table tbody tr.yellow-400{background-color:#ffcd3926;border-color:#adb5bd}table tbody tr.yellow-500{background-color:#ffc10726;border-color:#adb5bd}table tbody tr.yellow-600{background-color:#cc9a0626;border-color:#adb5bd}table tbody tr.yellow-700{background-color:#99740426;border-color:#adb5bd}table tbody tr.yellow-800{background-color:#664d0326;border-color:#adb5bd}table tbody tr.yellow-900{background-color:#33270126;border-color:#adb5bd}table tbody tr.green-100{background-color:#d1e7dd26;border-color:#adb5bd}table tbody tr.green-200{background-color:#a3cfbb26;border-color:#adb5bd}table tbody tr.green-300{background-color:#75b79826;border-color:#adb5bd}table tbody tr.green-400{background-color:#479f7626;border-color:#adb5bd}table tbody tr.green-500{background-color:#19875426;border-color:#adb5bd}table tbody tr.green-600{background-color:#146c4326;border-color:#adb5bd}table tbody tr.green-700{background-color:#0f513226;border-color:#adb5bd}table tbody tr.green-800{background-color:#0a362226;border-color:#adb5bd}table tbody tr.green-900{background-color:#051b1126;border-color:#adb5bd}table tbody tr.blue-100{background-color:#cfe2ff26;border-color:#adb5bd}table tbody tr.blue-200{background-color:#9ec5fe26;border-color:#adb5bd}table tbody tr.blue-300{background-color:#6ea8fe26;border-color:#adb5bd}table tbody tr.blue-400{background-color:#3d8bfd26;border-color:#adb5bd}table tbody tr.blue-500{background-color:#0d6efd26;border-color:#adb5bd}table tbody tr.blue-600{background-color:#0a58ca26;border-color:#adb5bd}table tbody tr.blue-700{background-color:#08429826;border-color:#adb5bd}table tbody tr.blue-800{background-color:#052c6526;border-color:#adb5bd}table tbody tr.blue-900{background-color:#03163326;border-color:#adb5bd}table tbody tr.cyan-100{background-color:#cff4fc26;border-color:#adb5bd}table tbody tr.cyan-200{background-color:#9eeaf926;border-color:#adb5bd}table tbody tr.cyan-300{background-color:#6edff626;border-color:#adb5bd}table tbody tr.cyan-400{background-color:#3dd5f326;border-color:#adb5bd}table tbody tr.cyan-500{background-color:#0dcaf026;border-color:#adb5bd}table tbody tr.cyan-600{background-color:#0aa2c026;border-color:#adb5bd}table tbody tr.cyan-700{background-color:#08799026;border-color:#adb5bd}table tbody tr.cyan-800{background-color:#05516026;border-color:#adb5bd}table tbody tr.cyan-900{background-color:#03283026;border-color:#adb5bd}table tbody tr.indigo-100{background-color:#e0cffc26;border-color:#adb5bd}table tbody tr.indigo-200{background-color:#c29ffa26;border-color:#adb5bd}table tbody tr.indigo-300{background-color:#a370f726;border-color:#adb5bd}table tbody tr.indigo-400{background-color:#8540f526;border-color:#adb5bd}table tbody tr.indigo-500{background-color:#6610f226;border-color:#adb5bd}table tbody tr.indigo-600{background-color:#520dc226;border-color:#adb5bd}table tbody tr.indigo-700{background-color:#3d0a9126;border-color:#adb5bd}table tbody tr.indigo-800{background-color:#29066126;border-color:#adb5bd}table tbody tr.indigo-900{background-color:#14033026;border-color:#adb5bd}table tbody tr.purple-100{background-color:#e2d9f326;border-color:#adb5bd}table tbody tr.purple-200{background-color:#c5b3e626;border-color:#adb5bd}table tbody tr.purple-300{background-color:#a98eda26;border-color:#adb5bd}table tbody tr.purple-400{background-color:#8c68cd26;border-color:#adb5bd}table tbody tr.purple-500{background-color:#6f42c126;border-color:#adb5bd}table tbody tr.purple-600{background-color:#59359a26;border-color:#adb5bd}table tbody tr.purple-700{background-color:#43287426;border-color:#adb5bd}table tbody tr.purple-800{background-color:#2c1a4d26;border-color:#adb5bd}table tbody tr.purple-900{background-color:#160d2726;border-color:#adb5bd}table tbody tr.pink-100{background-color:#f7d6e626;border-color:#adb5bd}table tbody tr.pink-200{background-color:#efadce26;border-color:#adb5bd}table tbody tr.pink-300{background-color:#e685b526;border-color:#adb5bd}table tbody tr.pink-400{background-color:#de5c9d26;border-color:#adb5bd}table tbody tr.pink-500{background-color:#d6338426;border-color:#adb5bd}table tbody tr.pink-600{background-color:#ab296a26;border-color:#adb5bd}table tbody tr.pink-700{background-color:#801f4f26;border-color:#adb5bd}table tbody tr.pink-800{background-color:#56143526;border-color:#adb5bd}table tbody tr.pink-900{background-color:#2b0a1a26;border-color:#adb5bd}table .table-badge-group .table-badge{display:block;width:min-content;font-size:.875rem;font-weight:400}table .table-badge-group .table-badge:not(.badge){padding:0 .65em}table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child){margin-bottom:.25rem}pre.change-data{padding-right:0;padding-left:0}pre.change-data>span{display:block;padding-right:1rem;padding-left:1rem}pre.change-data>span.added{background-color:var(--nbx-change-added)}pre.change-data>span.removed{background-color:var(--nbx-change-removed)}pre.change-diff{border-color:transparent}pre.change-diff.change-removed{background-color:var(--nbx-change-removed)}pre.change-diff.change-added{background-color:var(--nbx-change-added)}div.card-overlay{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#ffffffbf;border-radius:.375rem}div.card-overlay>div.spinner-border{width:6rem;height:6rem;color:#6c757d}.table-controls{display:flex}@media (min-width: 768px){.table-controls{margin-top:0!important;margin-bottom:0!important}}.table-controls .table-configure{justify-content:flex-start}@media (min-width: 768px){.table-controls .table-configure{justify-content:flex-end}}.table-controls .form-switch.form-check-inline{flex:1 0 auto;font-size:.875rem}.nav-tabs .nav-link:hover{border-bottom-color:transparent}.nav-tabs .nav-link.active{background-color:#f8f9fa;border-bottom-color:#f8f9fa;transform:translateY(1px)}.tab-content{display:flex;flex-direction:column;padding:1rem;background-color:#f8f9fa;border-bottom:1px solid #dee2e6}@media print{.tab-content{background-color:var(--nbx-body-bg)!important;border-bottom:none!important}}@media print{.masonry{position:static!important;display:block!important;height:unset!important}}@media print{.masonry .masonry-item{position:static!important;top:unset!important;left:unset!important;display:block!important}}.record-depth{display:inline;font-size:1rem;user-select:none;opacity:.33}.record-depth span:only-of-type,.record-depth span:last-of-type{margin-right:.25rem}.popover.image-preview-popover{max-width:unset}.rendered-markdown table{width:100%}.rendered-markdown th{border-bottom:2px solid #ddd;padding:8px}.rendered-markdown td{border-top:1px solid #ddd;padding:8px}td pre{margin-bottom:0}pre.block{padding:1rem;background-color:var(--nbx-pre-bg);border:1px solid var(--nbx-pre-border-color);border-radius:.375rem}#django-messages{position:fixed;right:1rem;bottom:0;margin:1rem}html[data-netbox-url-name=home] .content-container,html[data-netbox-url-name=home] .search{background-color:#f8f9fa!important}html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search{background-color:#171b1d!important}html[data-netbox-url-name=login] #django-messages{display:none} +:root{--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #337ab7;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #54d6f0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #e9ecef;--bs-dark: #343a40;--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-gray: #adb5bd;--bs-black: #000;--bs-white: #fff;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0))}*,*:before,*:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-bs-original-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:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:800}small,.small{font-size:.875em}mark,.mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#212529;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.375rem}kbd kbd{padding:0;font-size:1em;font-weight:700}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:#6c757d;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]::-webkit-calendar-picker-indicator{display:none}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;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer:before{content:"\2014\a0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:var(--bs-gutter-x, .75rem);padding-left:var(--bs-gutter-x, .75rem);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}}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.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.6666666667%}@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.3333333333%}.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.6666666667%}}@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.3333333333%}.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.6666666667%}}@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.3333333333%}.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.6666666667%}}@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.3333333333%}.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.6666666667%}}@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.3333333333%}.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.6666666667%}}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: .25rem}.g-1,.gy-1{--bs-gutter-y: .25rem}.g-2,.gx-2{--bs-gutter-x: .5rem}.g-2,.gy-2{--bs-gutter-y: .5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: .25rem}.g-md-1,.gy-md-1{--bs-gutter-y: .25rem}.g-md-2,.gx-md-2{--bs-gutter-x: .5rem}.g-md-2,.gy-md-2{--bs-gutter-y: .5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}.table{--bs-table-bg: transparent;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, .05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, .1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, .075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #cfe2ff;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg: #e2e3e5;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg: #d1e7dd;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg: #cff4fc;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg: #fff3cd;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg: #212529;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #e9ecef;appearance:none;border-radius:.375rem;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:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#adb5bd;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.375rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.375rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#6c757d;background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px 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{padding:1rem .75rem}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){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),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){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:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#198754e6;border-radius:.375rem}.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:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.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"]{padding-right:4.125rem;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem #19875440}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.input-group .form-control.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:1}.was-validated .input-group .form-control:valid:focus,.input-group .form-control.is-valid:focus,.was-validated .input-group .form-select:valid:focus,.input-group .form-select.is-valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#dc3545e6;border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem #dc354540}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.input-group .form-control.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:2}.was-validated .input-group .form-control:invalid:focus,.input-group .form-control.is-invalid:focus,.was-validated .input-group .form-select:invalid:focus,.input-group .form-select.is-invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.375rem;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:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-primary:hover{color:#fff;background-color:#2b689c;border-color:#296292}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#2b689c;border-color:#296292;box-shadow:0 0 0 .25rem #528ec280}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#296292;border-color:#265c89}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #528ec280}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem #828a9180}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #828a9180}.btn-secondary:disabled,.btn-secondary.disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-info:hover{color:#000;background-color:#6edcf2;border-color:#65daf2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#6edcf2;border-color:#65daf2;box-shadow:0 0 0 .25rem #47b6cc80}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#76def3;border-color:#65daf2}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #47b6cc80}.btn-info:disabled,.btn-info.disabled{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}.btn-warning:disabled,.btn-warning.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-light:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#2c3136;border-color:#2a2e33}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#2c3136;border-color:#2a2e33;box-shadow:0 0 0 .25rem #52585d80}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#2a2e33;border-color:#272c30}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52585d80}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-blue{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-blue:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-blue,.btn-blue:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem #3184fd80}.btn-check:checked+.btn-blue,.btn-check:active+.btn-blue,.btn-blue:active,.btn-blue.active,.show>.btn-blue.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:checked+.btn-blue:focus,.btn-check:active+.btn-blue:focus,.btn-blue:active:focus,.btn-blue.active:focus,.show>.btn-blue.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3184fd80}.btn-blue:disabled,.btn-blue.disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-indigo{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-indigo:hover{color:#fff;background-color:#570ece;border-color:#520dc2}.btn-check:focus+.btn-indigo,.btn-indigo:focus{color:#fff;background-color:#570ece;border-color:#520dc2;box-shadow:0 0 0 .25rem #7d34f480}.btn-check:checked+.btn-indigo,.btn-check:active+.btn-indigo,.btn-indigo:active,.btn-indigo.active,.show>.btn-indigo.dropdown-toggle{color:#fff;background-color:#520dc2;border-color:#4d0cb6}.btn-check:checked+.btn-indigo:focus,.btn-check:active+.btn-indigo:focus,.btn-indigo:active:focus,.btn-indigo.active:focus,.show>.btn-indigo.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d34f480}.btn-indigo:disabled,.btn-indigo.disabled{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-purple{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-purple:hover{color:#fff;background-color:#5e38a4;border-color:#59359a}.btn-check:focus+.btn-purple,.btn-purple:focus{color:#fff;background-color:#5e38a4;border-color:#59359a;box-shadow:0 0 0 .25rem #855eca80}.btn-check:checked+.btn-purple,.btn-check:active+.btn-purple,.btn-purple:active,.btn-purple.active,.show>.btn-purple.dropdown-toggle{color:#fff;background-color:#59359a;border-color:#533291}.btn-check:checked+.btn-purple:focus,.btn-check:active+.btn-purple:focus,.btn-purple:active:focus,.btn-purple.active:focus,.show>.btn-purple.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #855eca80}.btn-purple:disabled,.btn-purple.disabled{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-pink{color:#fff;background-color:#d63384;border-color:#d63384}.btn-pink:hover{color:#fff;background-color:#b62b70;border-color:#ab296a}.btn-check:focus+.btn-pink,.btn-pink:focus{color:#fff;background-color:#b62b70;border-color:#ab296a;box-shadow:0 0 0 .25rem #dc529680}.btn-check:checked+.btn-pink,.btn-check:active+.btn-pink,.btn-pink:active,.btn-pink.active,.show>.btn-pink.dropdown-toggle{color:#fff;background-color:#ab296a;border-color:#a12663}.btn-check:checked+.btn-pink:focus,.btn-check:active+.btn-pink:focus,.btn-pink:active:focus,.btn-pink.active:focus,.show>.btn-pink.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #dc529680}.btn-pink:disabled,.btn-pink.disabled{color:#fff;background-color:#d63384;border-color:#d63384}.btn-red{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-red:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-red,.btn-red:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+.btn-red,.btn-check:active+.btn-red,.btn-red:active,.btn-red.active,.show>.btn-red.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+.btn-red:focus,.btn-check:active+.btn-red:focus,.btn-red:active:focus,.btn-red.active:focus,.show>.btn-red.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}.btn-red:disabled,.btn-red.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-orange{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-orange:hover{color:#000;background-color:#fd9137;border-color:#fd8b2c}.btn-check:focus+.btn-orange,.btn-orange:focus{color:#000;background-color:#fd9137;border-color:#fd8b2c;box-shadow:0 0 0 .25rem #d76b1180}.btn-check:checked+.btn-orange,.btn-check:active+.btn-orange,.btn-orange:active,.btn-orange.active,.show>.btn-orange.dropdown-toggle{color:#000;background-color:#fd9843;border-color:#fd8b2c}.btn-check:checked+.btn-orange:focus,.btn-check:active+.btn-orange:focus,.btn-orange:active:focus,.btn-orange.active:focus,.show>.btn-orange.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d76b1180}.btn-orange:disabled,.btn-orange.disabled{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-yellow{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-yellow:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-yellow,.btn-yellow:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+.btn-yellow,.btn-check:active+.btn-yellow,.btn-yellow:active,.btn-yellow.active,.show>.btn-yellow.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+.btn-yellow:focus,.btn-check:active+.btn-yellow:focus,.btn-yellow:active:focus,.btn-yellow.active:focus,.show>.btn-yellow.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}.btn-yellow:disabled,.btn-yellow.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-green{color:#fff;background-color:#198754;border-color:#198754}.btn-green:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-green,.btn-green:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+.btn-green,.btn-check:active+.btn-green,.btn-green:active,.btn-green.active,.show>.btn-green.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+.btn-green:focus,.btn-check:active+.btn-green:focus,.btn-green:active:focus,.btn-green.active:focus,.show>.btn-green.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}.btn-green:disabled,.btn-green.disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-teal{color:#000;background-color:#20c997;border-color:#20c997}.btn-teal:hover{color:#000;background-color:#41d1a7;border-color:#36cea1}.btn-check:focus+.btn-teal,.btn-teal:focus{color:#000;background-color:#41d1a7;border-color:#36cea1;box-shadow:0 0 0 .25rem #1bab8080}.btn-check:checked+.btn-teal,.btn-check:active+.btn-teal,.btn-teal:active,.btn-teal.active,.show>.btn-teal.dropdown-toggle{color:#000;background-color:#4dd4ac;border-color:#36cea1}.btn-check:checked+.btn-teal:focus,.btn-check:active+.btn-teal:focus,.btn-teal:active:focus,.btn-teal.active:focus,.show>.btn-teal.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #1bab8080}.btn-teal:disabled,.btn-teal.disabled{color:#000;background-color:#20c997;border-color:#20c997}.btn-cyan{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-cyan:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-cyan,.btn-cyan:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem #0baccc80}.btn-check:checked+.btn-cyan,.btn-check:active+.btn-cyan,.btn-cyan:active,.btn-cyan.active,.show>.btn-cyan.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+.btn-cyan:focus,.btn-check:active+.btn-cyan:focus,.btn-cyan:active:focus,.btn-cyan.active:focus,.show>.btn-cyan.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #0baccc80}.btn-cyan:disabled,.btn-cyan.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-gray{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-gray:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+.btn-gray,.btn-gray:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+.btn-gray,.btn-check:active+.btn-gray,.btn-gray:active,.btn-gray.active,.show>.btn-gray.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+.btn-gray:focus,.btn-check:active+.btn-gray:focus,.btn-gray:active:focus,.btn-gray.active:focus,.show>.btn-gray.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}.btn-gray:disabled,.btn-gray.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-black{color:#fff;background-color:#000;border-color:#000}.btn-black:hover{color:#fff;background-color:#000;border-color:#000}.btn-check:focus+.btn-black,.btn-black:focus{color:#fff;background-color:#000;border-color:#000;box-shadow:0 0 0 .25rem #26262680}.btn-check:checked+.btn-black,.btn-check:active+.btn-black,.btn-black:active,.btn-black.active,.show>.btn-black.dropdown-toggle{color:#fff;background-color:#000;border-color:#000}.btn-check:checked+.btn-black:focus,.btn-check:active+.btn-black:focus,.btn-black:active:focus,.btn-black.active:focus,.show>.btn-black.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #26262680}.btn-black:disabled,.btn-black.disabled{color:#fff;background-color:#000;border-color:#000}.btn-white{color:#000;background-color:#fff;border-color:#fff}.btn-white:hover{color:#000;background-color:#fff;border-color:#fff}.btn-check:focus+.btn-white,.btn-white:focus{color:#000;background-color:#fff;border-color:#fff;box-shadow:0 0 0 .25rem #d9d9d980}.btn-check:checked+.btn-white,.btn-check:active+.btn-white,.btn-white:active,.btn-white.active,.show>.btn-white.dropdown-toggle{color:#000;background-color:#fff;border-color:#fff}.btn-check:checked+.btn-white:focus,.btn-check:active+.btn-white:focus,.btn-white:active:focus,.btn-white.active:focus,.show>.btn-white.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9d9d980}.btn-white:disabled,.btn-white.disabled{color:#000;background-color:#fff;border-color:#fff}.btn-outline-primary{color:#337ab7;border-color:#337ab7}.btn-outline-primary:hover{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem #337ab780}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #337ab780}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#337ab7;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#54d6f0;border-color:#54d6f0}.btn-outline-info:hover{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem #54d6f080}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #54d6f080}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#54d6f0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#e9ecef;border-color:#e9ecef}.btn-outline-light:hover{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem #e9ecef80}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e9ecef80}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#e9ecef;background-color:transparent}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#343a40;background-color:transparent}.btn-outline-blue{color:#0d6efd;border-color:#0d6efd}.btn-outline-blue:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-blue,.btn-outline-blue:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-check:checked+.btn-outline-blue,.btn-check:active+.btn-outline-blue,.btn-outline-blue:active,.btn-outline-blue.active,.btn-outline-blue.dropdown-toggle.show{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:checked+.btn-outline-blue:focus,.btn-check:active+.btn-outline-blue:focus,.btn-outline-blue:active:focus,.btn-outline-blue.active:focus,.btn-outline-blue.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-outline-blue:disabled,.btn-outline-blue.disabled{color:#0d6efd;background-color:transparent}.btn-outline-indigo{color:#6610f2;border-color:#6610f2}.btn-outline-indigo:hover{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:focus+.btn-outline-indigo,.btn-outline-indigo:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-check:checked+.btn-outline-indigo,.btn-check:active+.btn-outline-indigo,.btn-outline-indigo:active,.btn-outline-indigo.active,.btn-outline-indigo.dropdown-toggle.show{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:checked+.btn-outline-indigo:focus,.btn-check:active+.btn-outline-indigo:focus,.btn-outline-indigo:active:focus,.btn-outline-indigo.active:focus,.btn-outline-indigo.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-outline-indigo:disabled,.btn-outline-indigo.disabled{color:#6610f2;background-color:transparent}.btn-outline-purple{color:#6f42c1;border-color:#6f42c1}.btn-outline-purple:hover{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:focus+.btn-outline-purple,.btn-outline-purple:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-check:checked+.btn-outline-purple,.btn-check:active+.btn-outline-purple,.btn-outline-purple:active,.btn-outline-purple.active,.btn-outline-purple.dropdown-toggle.show{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:checked+.btn-outline-purple:focus,.btn-check:active+.btn-outline-purple:focus,.btn-outline-purple:active:focus,.btn-outline-purple.active:focus,.btn-outline-purple.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-outline-purple:disabled,.btn-outline-purple.disabled{color:#6f42c1;background-color:transparent}.btn-outline-pink{color:#d63384;border-color:#d63384}.btn-outline-pink:hover{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:focus+.btn-outline-pink,.btn-outline-pink:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-check:checked+.btn-outline-pink,.btn-check:active+.btn-outline-pink,.btn-outline-pink:active,.btn-outline-pink.active,.btn-outline-pink.dropdown-toggle.show{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:checked+.btn-outline-pink:focus,.btn-check:active+.btn-outline-pink:focus,.btn-outline-pink:active:focus,.btn-outline-pink.active:focus,.btn-outline-pink.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-outline-pink:disabled,.btn-outline-pink.disabled{color:#d63384;background-color:transparent}.btn-outline-red{color:#dc3545;border-color:#dc3545}.btn-outline-red:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-red,.btn-outline-red:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+.btn-outline-red,.btn-check:active+.btn-outline-red,.btn-outline-red:active,.btn-outline-red.active,.btn-outline-red.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+.btn-outline-red:focus,.btn-check:active+.btn-outline-red:focus,.btn-outline-red:active:focus,.btn-outline-red.active:focus,.btn-outline-red.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-outline-red:disabled,.btn-outline-red.disabled{color:#dc3545;background-color:transparent}.btn-outline-orange{color:#fd7e14;border-color:#fd7e14}.btn-outline-orange:hover{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-check:focus+.btn-outline-orange,.btn-outline-orange:focus{box-shadow:0 0 0 .25rem #fd7e1480}.btn-check:checked+.btn-outline-orange,.btn-check:active+.btn-outline-orange,.btn-outline-orange:active,.btn-outline-orange.active,.btn-outline-orange.dropdown-toggle.show{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-check:checked+.btn-outline-orange:focus,.btn-check:active+.btn-outline-orange:focus,.btn-outline-orange:active:focus,.btn-outline-orange.active:focus,.btn-outline-orange.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #fd7e1480}.btn-outline-orange:disabled,.btn-outline-orange.disabled{color:#fd7e14;background-color:transparent}.btn-outline-yellow{color:#ffc107;border-color:#ffc107}.btn-outline-yellow:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-yellow,.btn-outline-yellow:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+.btn-outline-yellow,.btn-check:active+.btn-outline-yellow,.btn-outline-yellow:active,.btn-outline-yellow.active,.btn-outline-yellow.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+.btn-outline-yellow:focus,.btn-check:active+.btn-outline-yellow:focus,.btn-outline-yellow:active:focus,.btn-outline-yellow.active:focus,.btn-outline-yellow.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-outline-yellow:disabled,.btn-outline-yellow.disabled{color:#ffc107;background-color:transparent}.btn-outline-green{color:#198754;border-color:#198754}.btn-outline-green:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-green,.btn-outline-green:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+.btn-outline-green,.btn-check:active+.btn-outline-green,.btn-outline-green:active,.btn-outline-green.active,.btn-outline-green.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+.btn-outline-green:focus,.btn-check:active+.btn-outline-green:focus,.btn-outline-green:active:focus,.btn-outline-green.active:focus,.btn-outline-green.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}.btn-outline-green:disabled,.btn-outline-green.disabled{color:#198754;background-color:transparent}.btn-outline-teal{color:#20c997;border-color:#20c997}.btn-outline-teal:hover{color:#000;background-color:#20c997;border-color:#20c997}.btn-check:focus+.btn-outline-teal,.btn-outline-teal:focus{box-shadow:0 0 0 .25rem #20c99780}.btn-check:checked+.btn-outline-teal,.btn-check:active+.btn-outline-teal,.btn-outline-teal:active,.btn-outline-teal.active,.btn-outline-teal.dropdown-toggle.show{color:#000;background-color:#20c997;border-color:#20c997}.btn-check:checked+.btn-outline-teal:focus,.btn-check:active+.btn-outline-teal:focus,.btn-outline-teal:active:focus,.btn-outline-teal.active:focus,.btn-outline-teal.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #20c99780}.btn-outline-teal:disabled,.btn-outline-teal.disabled{color:#20c997;background-color:transparent}.btn-outline-cyan{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-cyan:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-cyan,.btn-outline-cyan:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-check:checked+.btn-outline-cyan,.btn-check:active+.btn-outline-cyan,.btn-outline-cyan:active,.btn-outline-cyan.active,.btn-outline-cyan.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+.btn-outline-cyan:focus,.btn-check:active+.btn-outline-cyan:focus,.btn-outline-cyan:active:focus,.btn-outline-cyan.active:focus,.btn-outline-cyan.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-outline-cyan:disabled,.btn-outline-cyan.disabled{color:#0dcaf0;background-color:transparent}.btn-outline-gray{color:#adb5bd;border-color:#adb5bd}.btn-outline-gray:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+.btn-outline-gray,.btn-outline-gray:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+.btn-outline-gray,.btn-check:active+.btn-outline-gray,.btn-outline-gray:active,.btn-outline-gray.active,.btn-outline-gray.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+.btn-outline-gray:focus,.btn-check:active+.btn-outline-gray:focus,.btn-outline-gray:active:focus,.btn-outline-gray.active:focus,.btn-outline-gray.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-outline-gray:disabled,.btn-outline-gray.disabled{color:#adb5bd;background-color:transparent}.btn-outline-black{color:#000;border-color:#000}.btn-outline-black:hover{color:#fff;background-color:#000;border-color:#000}.btn-check:focus+.btn-outline-black,.btn-outline-black:focus{box-shadow:0 0 0 .25rem #00000080}.btn-check:checked+.btn-outline-black,.btn-check:active+.btn-outline-black,.btn-outline-black:active,.btn-outline-black.active,.btn-outline-black.dropdown-toggle.show{color:#fff;background-color:#000;border-color:#000}.btn-check:checked+.btn-outline-black:focus,.btn-check:active+.btn-outline-black:focus,.btn-outline-black:active:focus,.btn-outline-black.active:focus,.btn-outline-black.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #00000080}.btn-outline-black:disabled,.btn-outline-black.disabled{color:#000;background-color:transparent}.btn-outline-white{color:#fff;border-color:#fff}.btn-outline-white:hover{color:#000;background-color:#fff;border-color:#fff}.btn-check:focus+.btn-outline-white,.btn-outline-white:focus{box-shadow:0 0 0 .25rem #ffffff80}.btn-check:checked+.btn-outline-white,.btn-check:active+.btn-outline-white,.btn-outline-white:active,.btn-outline-white.active,.btn-outline-white.dropdown-toggle.show{color:#000;background-color:#fff;border-color:#fff}.btn-check:checked+.btn-outline-white:focus,.btn-check:active+.btn-outline-white:focus,.btn-outline-white:active:focus,.btn-outline-white.active:focus,.btn-outline-white.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffffff80}.btn-outline-white:disabled,.btn-outline-white.disabled{color:#fff;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}.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}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.375rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.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:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle:after{display:none}.dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#00000026}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:#ffffff26}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:#00000026}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.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>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.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:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:.375rem;border-top-right-radius:.375rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:.375rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.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:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.375rem;transition:box-shadow .15s ease-in-out}@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 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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{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:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:#000000e6}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:#000000e6}.navbar-light .navbar-nav .nav-link{color:#0000008c}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:#000000b3}.navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:#000000e6}.navbar-light .navbar-toggler{color:#0000008c;border-color:#0000001a}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#0000008c}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:#000000e6}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#ffffff8c}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:#ffffffbf}.navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#ffffff8c;border-color:#ffffff1a}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#ffffff8c}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.375rem}.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:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;color:#343a40;background-color:"unset";border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.375rem - 1px) calc(.375rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;color:#343a40;background-color:"unset";border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.375rem - 1px) calc(.375rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.375rem - 1px)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#343a40;background-color:#cfe2ff;box-shadow:inset 0 -1px #dee2e6}.accordion-button:not(.collapsed):after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button:after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion: reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.accordion-header{margin-bottom:0}.accordion-item{background-color:transparent;border:1px solid #dee2e6}.accordion-item:first-of-type{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.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-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='currentColor'/%3E%3C/svg%3E"))}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.375rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.375rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#1f496e;background-color:#d6e4f1;border-color:#c2d7e9}.alert-primary .alert-link{color:#193a58}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#225660;background-color:#ddf7fc;border-color:#ccf3fb}.alert-info .alert-link{color:#1b454d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#5d5e60;background-color:#fbfbfc;border-color:#f8f9fa}.alert-light .alert-link{color:#4a4b4d}.alert-dark{color:#1f2326;background-color:#d6d8d9;border-color:#c2c4c6}.alert-dark .alert-link{color:#191c1e}.alert-blue{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-blue .alert-link{color:#06357a}.alert-indigo{color:#3d0a91;background-color:#e0cffc;border-color:#d1b7fb}.alert-indigo .alert-link{color:#310874}.alert-purple{color:#432874;background-color:#e2d9f3;border-color:#d4c6ec}.alert-purple .alert-link{color:#36205d}.alert-pink{color:#801f4f;background-color:#f7d6e6;border-color:#f3c2da}.alert-pink .alert-link{color:#66193f}.alert-red{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-red .alert-link{color:#6a1a21}.alert-orange{color:#984c0c;background-color:#ffe5d0;border-color:#fed8b9}.alert-orange .alert-link{color:#7a3d0a}.alert-yellow{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-yellow .alert-link{color:#523e02}.alert-green{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-green .alert-link{color:#0c4128}.alert-teal{color:#13795b;background-color:#d2f4ea;border-color:#bcefe0}.alert-teal .alert-link{color:#0f6149}.alert-cyan{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-cyan .alert-link{color:#04414d}.alert-gray{color:#686d71;background-color:#eff0f2;border-color:#e6e9eb}.alert-gray .alert-link{color:#53575a}.alert-black{color:#000;background-color:#ccc;border-color:#b3b3b3}.alert-black .alert-link{color:#000}.alert-white{color:#666;background-color:#fff;border-color:#fff}.alert-white .alert-link{color:#525252}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.375rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@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:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.375rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#495057;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.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:#adb5bd;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.375rem;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:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#1f496e;background-color:#d6e4f1}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#1f496e;background-color:#c1cdd9}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1f496e;border-color:#1f496e}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#225660;background-color:#ddf7fc}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#225660;background-color:#c7dee3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#225660;border-color:#225660}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#5d5e60;background-color:#fbfbfc}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#5d5e60;background-color:#e2e2e3}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#5d5e60;border-color:#5d5e60}.list-group-item-dark{color:#1f2326;background-color:#d6d8d9}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1f2326;background-color:#c1c2c3}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1f2326;border-color:#1f2326}.list-group-item-blue{color:#084298;background-color:#cfe2ff}.list-group-item-blue.list-group-item-action:hover,.list-group-item-blue.list-group-item-action:focus{color:#084298;background-color:#bacbe6}.list-group-item-blue.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-indigo{color:#3d0a91;background-color:#e0cffc}.list-group-item-indigo.list-group-item-action:hover,.list-group-item-indigo.list-group-item-action:focus{color:#3d0a91;background-color:#cabae3}.list-group-item-indigo.list-group-item-action.active{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.list-group-item-purple{color:#432874;background-color:#e2d9f3}.list-group-item-purple.list-group-item-action:hover,.list-group-item-purple.list-group-item-action:focus{color:#432874;background-color:#cbc3db}.list-group-item-purple.list-group-item-action.active{color:#fff;background-color:#432874;border-color:#432874}.list-group-item-pink{color:#801f4f;background-color:#f7d6e6}.list-group-item-pink.list-group-item-action:hover,.list-group-item-pink.list-group-item-action:focus{color:#801f4f;background-color:#dec1cf}.list-group-item-pink.list-group-item-action.active{color:#fff;background-color:#801f4f;border-color:#801f4f}.list-group-item-red{color:#842029;background-color:#f8d7da}.list-group-item-red.list-group-item-action:hover,.list-group-item-red.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}.list-group-item-red.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-orange{color:#984c0c;background-color:#ffe5d0}.list-group-item-orange.list-group-item-action:hover,.list-group-item-orange.list-group-item-action:focus{color:#984c0c;background-color:#e6cebb}.list-group-item-orange.list-group-item-action.active{color:#fff;background-color:#984c0c;border-color:#984c0c}.list-group-item-yellow{color:#664d03;background-color:#fff3cd}.list-group-item-yellow.list-group-item-action:hover,.list-group-item-yellow.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}.list-group-item-yellow.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-green{color:#0f5132;background-color:#d1e7dd}.list-group-item-green.list-group-item-action:hover,.list-group-item-green.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}.list-group-item-green.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-teal{color:#13795b;background-color:#d2f4ea}.list-group-item-teal.list-group-item-action:hover,.list-group-item-teal.list-group-item-action:focus{color:#13795b;background-color:#bddcd3}.list-group-item-teal.list-group-item-action.active{color:#fff;background-color:#13795b;border-color:#13795b}.list-group-item-cyan{color:#055160;background-color:#cff4fc}.list-group-item-cyan.list-group-item-action:hover,.list-group-item-cyan.list-group-item-action:focus{color:#055160;background-color:#badce3}.list-group-item-cyan.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-gray{color:#686d71;background-color:#eff0f2}.list-group-item-gray.list-group-item-action:hover,.list-group-item-gray.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}.list-group-item-gray.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}.list-group-item-black{color:#000;background-color:#ccc}.list-group-item-black.list-group-item-action:hover,.list-group-item-black.list-group-item-action:focus{color:#000;background-color:#b8b8b8}.list-group-item-black.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}.list-group-item-white{color:#666;background-color:#fff}.list-group-item-white.list-group-item-action:hover,.list-group-item-white.list-group-item-action:focus{color:#666;background-color:#e6e6e6}.list-group-item-white.list-group-item-action.active{color:#fff;background-color:#666;border-color:#666}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40;opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:#ffffffd9;background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem #00000026;border-radius:.375rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:#ffffffd9;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.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% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.75rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}.modal-header .btn-close{padding:.5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.75rem - 1px);border-bottom-left-radius:calc(.75rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-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{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@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{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@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{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@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{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@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{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@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{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.375rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.75rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow:before,.popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.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:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem;color:#212529}.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;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:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.clearfix:after{display:block;clear:both;content:""}.link-primary{color:#337ab7}.link-primary:hover,.link-primary:focus{color:#296292}.link-secondary{color:#6c757d}.link-secondary:hover,.link-secondary:focus{color:#565e64}.link-success{color:#198754}.link-success:hover,.link-success:focus{color:#146c43}.link-info{color:#54d6f0}.link-info:hover,.link-info:focus{color:#76def3}.link-warning{color:#ffc107}.link-warning:hover,.link-warning:focus{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:hover,.link-danger:focus{color:#b02a37}.link-light{color:#e9ecef}.link-light:hover,.link-light:focus{color:#edf0f2}.link-dark{color:#343a40}.link-dark:hover,.link-dark:focus{color:#2a2e33}.link-blue{color:#0d6efd}.link-blue:hover,.link-blue:focus{color:#0a58ca}.link-indigo{color:#6610f2}.link-indigo:hover,.link-indigo:focus{color:#520dc2}.link-purple{color:#6f42c1}.link-purple:hover,.link-purple:focus{color:#59359a}.link-pink{color:#d63384}.link-pink:hover,.link-pink:focus{color:#ab296a}.link-red{color:#dc3545}.link-red:hover,.link-red:focus{color:#b02a37}.link-orange{color:#fd7e14}.link-orange:hover,.link-orange:focus{color:#fd9843}.link-yellow{color:#ffc107}.link-yellow:hover,.link-yellow:focus{color:#ffcd39}.link-green{color:#198754}.link-green:hover,.link-green:focus{color:#146c43}.link-teal{color:#20c997}.link-teal:hover,.link-teal:focus{color:#4dd4ac}.link-cyan{color:#0dcaf0}.link-cyan:hover,.link-cyan:focus{color:#3dd5f3}.link-gray{color:#adb5bd}.link-gray:hover,.link-gray:focus{color:#bdc4ca}.link-black{color:#000}.link-black:hover,.link-black:focus{color:#000}.link-white{color:#fff}.link-white:hover,.link-white:focus{color:#fff}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.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}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;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}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow: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-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:0 .5rem 1rem #00000026!important}.shadow-sm{box-shadow:0 .125rem .25rem #00000013!important}.shadow-lg{box-shadow:0 1rem 3rem #0000002d!important}.shadow-none{box-shadow:none!important}.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:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#337ab7!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#54d6f0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#e9ecef!important}.border-dark{border-color:#343a40!important}.border-blue{border-color:#0d6efd!important}.border-indigo{border-color:#6610f2!important}.border-purple{border-color:#6f42c1!important}.border-pink{border-color:#d63384!important}.border-red{border-color:#dc3545!important}.border-orange{border-color:#fd7e14!important}.border-yellow{border-color:#ffc107!important}.border-green{border-color:#198754!important}.border-teal{border-color:#20c997!important}.border-cyan{border-color:#0dcaf0!important}.border-gray{border-color:#adb5bd!important}.border-black{border-color:#000!important}.border-white{border-color:#fff!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}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:200!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:800!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:1.75!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{color:#337ab7!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#54d6f0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#e9ecef!important}.text-dark{color:#343a40!important}.text-blue{color:#0d6efd!important}.text-indigo{color:#6610f2!important}.text-purple{color:#6f42c1!important}.text-pink{color:#d63384!important}.text-red{color:#dc3545!important}.text-orange{color:#fd7e14!important}.text-yellow{color:#ffc107!important}.text-green{color:#198754!important}.text-teal{color:#20c997!important}.text-cyan{color:#0dcaf0!important}.text-gray{color:#adb5bd!important}.text-black{color:#000!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:#00000080!important}.text-white-50{color:#ffffff80!important}.text-reset{color:inherit!important}.bg-primary{background-color:#337ab7!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#54d6f0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#e9ecef!important}.bg-dark{background-color:#343a40!important}.bg-blue{background-color:#0d6efd!important}.bg-indigo{background-color:#6610f2!important}.bg-purple{background-color:#6f42c1!important}.bg-pink{background-color:#d63384!important}.bg-red{background-color:#dc3545!important}.bg-orange{background-color:#fd7e14!important}.bg-yellow{background-color:#ffc107!important}.bg-green{background-color:#198754!important}.bg-teal{background-color:#20c997!important}.bg-cyan{background-color:#0dcaf0!important}.bg-gray{background-color:#adb5bd!important}.bg-black{background-color:#000!important}.bg-white{background-color:#fff!important}.bg-body{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-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:.375rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.375rem!important}.rounded-2{border-radius:.375rem!important}.rounded-3{border-radius:.75rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.375rem!important;border-top-right-radius:.375rem!important}.rounded-end{border-top-right-radius:.375rem!important;border-bottom-right-radius:.375rem!important}.rounded-bottom{border-bottom-right-radius:.375rem!important;border-bottom-left-radius:.375rem!important}.rounded-start{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width: 576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float: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-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}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width: 768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.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-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}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width: 992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.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-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}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width: 1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.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-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}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width: 1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.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-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}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width: 1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-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{--nbx-select-content-bg: #fff;--nbx-select-option-selected-bg: #dee2e6;--nbx-select-option-hover-bg: #0d6efd;--nbx-select-option-hover-color: #fff;--nbx-select-placeholder-color: #adb5bd;--nbx-select-value-color: #fff}:root[data-netbox-color-mode=dark]{--nbx-select-content-bg: #212529;--nbx-select-option-selected-bg: #adb5bd;--nbx-select-option-hover-bg: #9ec5fe;--nbx-select-option-hover-color: #000;--nbx-select-placeholder-color: #495057;--nbx-select-value-color: #000}.ss-main{position:relative;display:inline-block;user-select:none;color:#212529;width:100%}.ss-main .ss-single-selected{display:flex;cursor:pointer;width:100%;height:calc(1.5em + (.75rem + 2px));padding:.75rem;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}.ss-main .ss-single-selected.ss-disabled{background-color:#ced4da;cursor:not-allowed}.ss-main .ss-single-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}.ss-main .ss-single-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}.ss-main .ss-single-selected .placeholder{display:flex;flex:1 1 100%;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;width:calc(100% - 30px);line-height:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ss-main .ss-single-selected .placeholder *{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}.ss-main .ss-single-selected .placeholder .ss-disabled{color:#6c757d}.ss-main .ss-single-selected .ss-deselect{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem;font-weight:bold}.ss-main .ss-single-selected .ss-deselect.ss-hide{display:none}.ss-main .ss-single-selected .ss-arrow{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem}.ss-main .ss-single-selected .ss-arrow span{border:solid #212529;border-width:0 2px 2px 0;display:inline-block;padding:3px;transition:transform .2s,margin .2s}.ss-main .ss-single-selected .ss-arrow span.arrow-up{transform:rotate(-135deg);margin:3px 0 0}.ss-main .ss-single-selected .ss-arrow span.arrow-down{transform:rotate(45deg);margin:-3px 0 0}.ss-main .ss-multi-selected{display:flex;flex-direction:row;cursor:pointer;min-height:calc(1.5em + (.75rem + 2px));width:100%;padding:0 0 0 3px;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}.ss-main .ss-multi-selected.ss-disabled{background-color:#ced4da;cursor:not-allowed}.ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled{color:#212529}.ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete{cursor:not-allowed}.ss-main .ss-multi-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}.ss-main .ss-multi-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}.ss-main .ss-multi-selected .ss-values{display:flex;flex-wrap:wrap;justify-content:flex-start;flex:1 1 100%;width:calc(100% - 30px)}.ss-main .ss-multi-selected .ss-values .ss-disabled{display:flex;padding:4px 5px;margin:2px 0;line-height:1em;align-items:center;width:100%;color:#6c757d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes scaleOut{0%{transform:scale(1);opacity:1}to{transform:scale(0);opacity:0}}.ss-main .ss-multi-selected .ss-values .ss-value{display:flex;user-select:none;align-items:center;font-size:12px;padding:3px 5px;margin:3px 5px 3px 0;color:#fff;background-color:#337ab7;border-radius:.375rem;animation-name:scaleIn;animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:both}.ss-main .ss-multi-selected .ss-values .ss-value.ss-out{animation-name:scaleOut;animation-duration:.2s;animation-timing-function:ease-out}.ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete{margin:0 0 0 5px;cursor:pointer}.ss-main .ss-multi-selected .ss-add{display:flex;flex:0 1 3px;margin:9px 12px 0 5px}.ss-main .ss-multi-selected .ss-add .ss-plus{display:flex;justify-content:center;align-items:center;background:#212529;position:relative;height:10px;width:2px;transition:transform .2s}.ss-main .ss-multi-selected .ss-add .ss-plus:after{background:#212529;content:"";position:absolute;height:2px;width:10px;left:-4px;top:4px}.ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross{transform:rotate(45deg)}.ss-content{position:absolute;width:100%;margin:-1px 0 0;box-sizing:border-box;border:solid 1px #ced4da;z-index:1010;background-color:#fff;transform-origin:center top;transition:transform .2s,opacity .2s;opacity:0;transform:scaleY(0)}.ss-content.ss-open{display:block;opacity:1;transform:scaleY(1)}.ss-content .ss-search{display:flex;flex-direction:row;padding:.75rem}.ss-content .ss-search.ss-hide{height:0px;opacity:0;padding:0;margin:0}.ss-content .ss-search.ss-hide input{height:0px;opacity:0;padding:0;margin:0}.ss-content .ss-search input{display:inline-flex;font-size:inherit;line-height:inherit;flex:1 1 auto;width:100%;min-width:0px;height:30px;padding:.75rem;margin:0;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;text-align:left;box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-appearance:textfield}.ss-content .ss-search input::placeholder{color:#adb5bd;vertical-align:middle}.ss-content .ss-search input:focus{box-shadow:0 0 5px #337ab7}.ss-content .ss-search .ss-addable{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;font-size:22px;font-weight:bold;flex:0 0 30px;height:30px;margin:0 0 0 8px;border:1px solid #ced4da;border-radius:.375rem;box-sizing:border-box}.ss-content .ss-addable{padding-top:0}.ss-content .ss-list{max-height:200px;overflow-x:hidden;overflow-y:auto;text-align:left}.ss-content .ss-list .ss-optgroup .ss-optgroup-label{padding:6px 10px;font-weight:bold}.ss-content .ss-list .ss-optgroup .ss-option{padding:6px 6px 6px 25px}.ss-content .ss-list .ss-optgroup-label-selectable{cursor:pointer}.ss-content .ss-list .ss-optgroup-label-selectable:hover{color:#fff;background-color:#337ab7}.ss-content .ss-list .ss-option{padding:6px 10px;cursor:pointer;user-select:none}.ss-content .ss-list .ss-option *{display:inline-block}.ss-content .ss-list .ss-option:hover,.ss-content .ss-list .ss-option.ss-highlighted{color:#fff;background-color:#337ab7}.ss-content .ss-list .ss-option.ss-disabled{cursor:not-allowed;color:#6c757d;background-color:#fff}.ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected{color:#212529;background-color:#337ab71a}.ss-content .ss-list .ss-option.ss-hide{display:none}.ss-content .ss-list .ss-option .ss-search-highlight{background-color:#ffc107}.ss-main{color:#212529}.ss-main.is-invalid .ss-single-selected,.ss-main.is-invalid .ss-multi-selected{border-color:#dc3545}.ss-main.is-valid .ss-single-selected,.ss-main.is-valid .ss-multi-selected{border-color:#198754}.ss-main .ss-single-selected,.ss-main .ss-multi-selected{padding:.375rem .75rem;background-color:#fff;border:1px solid #e9ecef}.ss-main .ss-single-selected[disabled],.ss-main .ss-multi-selected[disabled]{color:#6c757d;background-color:#e9ecef}.ss-main div.ss-multi-selected .ss-values .ss-disabled,.ss-main div.ss-single-selected span.placeholder .ss-disabled{color:var(--nbx-select-placeholder-color)}.ss-main .ss-single-selected span.ss-arrow span.arrow-down,.ss-main .ss-single-selected span.ss-arrow span.arrow-up{border-color:currentColor;color:#6c757d}.ss-main .ss-single-selected .placeholder .depth{display:none}.ss-main .ss-single-selected span.placeholder>*,.ss-main .ss-single-selected span.placeholder{line-height:1.5}.ss-main .ss-multi-selected{align-items:center;padding-right:.75rem;padding-left:.75rem}.ss-main .ss-multi-selected .ss-values .ss-disabled{padding:4px 0}.ss-main .ss-multi-selected .ss-values .ss-value{color:var(--nbx-select-value-color);border-radius:.375rem}.ss-main .ss-multi-selected .ss-values .ss-value .depth{display:none}.ss-main .ss-multi-selected .ss-add{margin:0 .75rem}.ss-main .ss-content{background-color:var(--nbx-select-content-bg);border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.ss-main .ss-content .ss-list .ss-option.ss-option-selected{color:#212529;background-color:var(--nbx-select-option-selected-bg)}.ss-main .ss-content .ss-list .ss-option:hover{color:var(--nbx-select-option-hover-color);background-color:var(--nbx-select-option-hover-bg)}.ss-main .ss-content .ss-list .ss-option:last-child{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.ss-main .ss-content .ss-list .ss-option.ss-disabled{background-color:unset}.ss-main .ss-content .ss-list .ss-option.ss-disabled:hover{color:#6c757d}.ss-main .ss-content .ss-list .ss-option .depth{opacity:.3}.ss-main .ss-content .ss-list::-webkit-scrollbar{right:0;width:4px}.ss-main .ss-content .ss-list::-webkit-scrollbar:hover{opacity:.8}.ss-main .ss-content .ss-list::-webkit-scrollbar-track{background:transparent}.ss-main .ss-content .ss-list::-webkit-scrollbar-thumb{right:0;width:2px;background-color:var(--nbx-sidebar-scroll)}.ss-main .ss-content .ss-search{padding-right:.5rem}.ss-main .ss-content .ss-search button{margin-left:.75rem}.ss-main .ss-content .ss-search input[type=search]{color:#212529;background-color:#fff;border:1px solid #e9ecef}.ss-main .ss-content .ss-search input[type=search]:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.sidenav{position:fixed;top:0;bottom:0;left:0;z-index:1050;display:block;width:100%;max-width:3rem;padding-top:0;padding-right:0;padding-left:0;background-color:var(--nbx-sidebar-bg);border-right:1px solid #ced4da;transition:all .1s ease-in-out}@media (max-width: 991.98px){.sidenav{transform:translate(-3rem)}.sidenav+.content-container[class]{margin-left:0}.sidenav .profile-button-container[class]{display:block}}.sidenav .profile-button-container{display:none;padding:.5rem 1rem}.sidenav+.content-container{margin-left:3rem;transition:all .1s ease-in-out}.sidenav .sidenav-brand{margin-right:0;transition:opacity .1s ease-in-out}.sidenav .sidenav-brand-icon{transition:opacity .1s ease-in-out}.sidenav .sidenav-inner{padding-right:1.5rem;padding-left:1.5rem}@media (min-width: 768px){.sidenav .sidenav-inner{padding-right:0;padding-left:0}}.sidenav .sidenav-brand-img,.sidenav .sidenav-brand>img{max-width:100%;max-height:calc(16rem - 1rem)}.sidenav .navbar-heading{padding-top:.5rem;padding-bottom:.5rem;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em}.sidenav .sidenav-header{position:relative;display:flex;align-items:center;justify-content:space-between;height:78px;padding:1rem;transition:all .1s ease-in-out}.sidenav .sidenav-toggle{position:absolute;display:inline-block;opacity:0;transition:opacity 10ms ease-in-out;transition-delay:.1s}.sidenav .sidenav-collapse{display:flex;flex:1;flex-direction:column;align-items:stretch;padding-right:1.5rem;padding-left:1.5rem;margin-right:-1.5rem;margin-left:-1.5rem}.sidenav .sidenav-collapse>*{min-width:100%}@media (min-width: 768px){.sidenav .sidenav-collapse{margin-right:0;margin-left:0}}.sidenav .nav-group-header{padding:.25rem 1rem;margin-top:.5rem;margin-bottom:0}.sidenav .nav .nav-item{display:flex;align-items:center;justify-content:space-between;width:100%}.sidenav .nav .nav-item.no-buttons{padding-right:5rem}.sidenav .collapse .nav .nav-item .nav-link{width:100%;padding:.25rem .25rem .25rem 1rem;margin-top:0;margin-bottom:0;border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon{width:1rem;text-align:center;transition:all .1s ease-in-out}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]{width:unset;height:100%;padding-left:.5rem;font-weight:700;color:var(--nbx-sidenav-parent-color)}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{color:#343a40;background:#cfe2ff}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after{display:inline-block;margin-left:auto;font-family:"Material Design Icons";font-style:normal;font-weight:700;font-variant:normal;color:#6c757d;text-rendering:auto;-webkit-font-smoothing:antialiased;content:"\f0142";transition:all .1s ease-in-out}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after{color:#343a40}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after{color:#337ab7;transform:rotate(90deg)}.sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text{padding-left:.25rem;transition:all .1s ease-in-out}.sidenav .navbar-nav{flex-direction:column;margin-right:-1.5rem;margin-left:-1.5rem}.sidenav .navbar-nav .nav-item{margin-top:2px}.sidenav .navbar-nav .nav-item.disabled{cursor:not-allowed;opacity:.8}.sidenav .navbar-nav .nav-item .nav-link{position:relative;display:flex;align-items:center;width:100%;padding:.5rem 1rem;font-size:.875rem;color:var(--nbx-sidenav-link-color);white-space:nowrap;transition:all .1s ease-in-out}.sidenav .navbar-nav .nav-item .nav-link.active{background-color:var(--nbx-sidebar-link-active-bg)}.sidenav .navbar-nav .nav-item .nav-link:hover:not(.active){color:var(--nbx-body-color);background-color:var(--nbx-sidebar-link-hover-bg)}.sidenav .navbar-nav .nav-item .nav-link>i{min-width:2rem;font-size:calc(45px / 2);text-align:center}.sidenav .navbar-nav .nav-group-label{display:block;font-size:.75rem;font-weight:700;color:var(--nbx-sidenav-group-color);text-transform:uppercase;white-space:nowrap}body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon{color:var(--nbx-sidenav-pin-color);transform:rotate(90deg)}@media (min-width: 1200px){body[data-sidenav-pinned] .sidenav+.content-container{margin-left:16rem}}.g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon{transform:rotate(0)}body[data-sidenav-show] .sidenav,body[data-sidenav-pinned] .sidenav{max-width:16rem}body[data-sidenav-show] .sidenav .sidenav-brand,body[data-sidenav-show] .sidenav .navbar-heading,body[data-sidenav-pinned] .sidenav .sidenav-brand,body[data-sidenav-pinned] .sidenav .navbar-heading{display:block}body[data-sidenav-show] .sidenav .sidenav-brand,body[data-sidenav-pinned] .sidenav .sidenav-brand{opacity:1;transform:translate(0)}body[data-sidenav-show] .sidenav .sidenav-brand-icon,body[data-sidenav-pinned] .sidenav .sidenav-brand-icon{position:absolute;opacity:0}@media (max-width: 991.98px){body[data-sidenav-show] .sidenav,body[data-sidenav-pinned] .sidenav{transform:translate(0)}}body[data-sidenav-hide] .sidenav .sidenav-header,body[data-sidenav-hidden] .sidenav .sidenav-header{padding:.5rem}body[data-sidenav-hide] .sidenav .sidenav-brand,body[data-sidenav-hidden] .sidenav .sidenav-brand{position:absolute;opacity:0}body[data-sidenav-hide] .sidenav .sidenav-brand-icon,body[data-sidenav-hidden] .sidenav .sidenav-brand-icon{opacity:1}body[data-sidenav-hide] .sidenav .sidenav-toggle,body[data-sidenav-hidden] .sidenav .sidenav-toggle{opacity:0;position:absolute;transition:unset;transition-delay:0ms}body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after{content:""}body[data-sidenav-hide] .sidenav .nav-item .collapse,body[data-sidenav-hidden] .sidenav .nav-item .collapse{display:none}body[data-sidenav-hide] .sidenav .nav-link-text,body[data-sidenav-hidden] .sidenav .nav-link-text{opacity:0}body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{margin-right:0;margin-left:0;border-radius:unset}body[data-sidenav-show] .sidenav .sidenav-brand{display:block}body[data-sidenav-show] .sidenav .nav-item .collapse{height:auto;transition:all .1s ease-in-out}body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text{opacity:1}body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon{opacity:0}@media (min-width: 992px){body[data-sidenav-show] .sidenav .sidenav-toggle{position:relative;opacity:1}}.simplebar-track.simplebar-vertical{right:0;width:6px;background-color:transparent}.simplebar-track.simplebar-vertical .simplebar-scrollbar{transition:none}.simplebar-track.simplebar-vertical .simplebar-scrollbar:before{right:0;width:3px;background:var(--nbx-sidebar-scroll);border-radius:.375rem}.simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before{width:5px}body{color:var(--nbx-body-color);background-color:var(--nbx-body-bg);font-size:.875rem}pre{white-space:pre}small,.small{font-size:smaller!important}a[type=button]{-webkit-appearance:unset!important}*[data-href]{cursor:pointer}.form-control:not([type=file]){font-size:inherit}.badge{font-size:.75rem}.text-xs{font-size:.75rem!important;line-height:1.25!important}.border-input{border:1px solid #e9ecef!important}.ws-nowrap{white-space:nowrap!important}table tr .vertical-align,table td .vertical-align{vertical-align:middle}@media print{.noprint{display:none!important;visibility:hidden!important}}.printonly{display:none!important;visibility:hidden!important}@media print{.printonly{display:block!important;visibility:visible!important}}:root{--nbx-sidebar-bg: #e9ecef;--nbx-sidebar-scroll: #adb5bd;--nbx-sidebar-link-hover-bg: rgba(108, 117, 125, .15);--nbx-sidebar-link-active-bg: #cfe2ff;--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(0, 0, 0, .25);--nbx-breadcrumb-bg: #e9ecef;--nbx-body-bg: #fff;--nbx-body-color: #343a40;--nbx-pre-bg: #f8f9fa;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(25, 135, 84, .4);--nbx-change-removed: rgba(220, 53, 69, .4);--nbx-cable-node-bg: #f8f9fa;--nbx-cable-node-border-color: #e9ecef;--nbx-cable-termination-bg: #e9ecef;--nbx-cable-termination-border-color: #dee2e6;--nbx-search-filter-border-left-color: #dee2e6;--nbx-color-mode-toggle-color: #337ab7;--nbx-sidenav-link-color: #343a40;--nbx-sidenav-pin-color: #fd7e14;--nbx-sidenav-parent-color: #343a40;--nbx-sidenav-group-color: #343a40}:root[data-netbox-color-mode=dark]{--nbx-sidebar-bg: #212529;--nbx-sidebar-scroll: #495057;--nbx-sidebar-link-active-bg: rgba(110, 168, 254, .25);--nbx-sidebar-link-hover-bg: rgba(173, 181, 189, .15);--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(255, 255, 255, .05);--nbx-breadcrumb-bg: #343a40;--nbx-body-bg: #1b1f22;--nbx-body-color: #f8f9fa;--nbx-pre-bg: #495057;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(117, 183, 152, .4);--nbx-change-removed: rgba(234, 134, 143, .4);--nbx-cable-node-bg: #495057;--nbx-cable-node-border-color: #6c757d;--nbx-cable-termination-bg: #343a40;--nbx-cable-termination-border-color: #495057;--nbx-search-filter-border-left-color: #6c757d;--nbx-color-mode-toggle-color: #ffda6a;--nbx-sidenav-link-color: #e9ecef;--nbx-sidenav-pin-color: #ffc107;--nbx-sidenav-parent-color: #e9ecef;--nbx-sidenav-group-color: #6c757d}.bg-primary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f496e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-primary{color:#337ab7}.btn.btn-ghost-primary:hover{background-color:#337ab71f}.alert.alert-primary a:not(.btn),.table-primary a:not(.btn){font-weight:700;color:#1f496e}.alert.alert-primary .btn:not([class*=btn-outline]),.table-primary .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-primary a:not(.btn){font-weight:700;color:#adcae2}.badge.bg-primary,.toast.bg-primary,.toast-header.bg-primary,.progress-bar.bg-primary{color:#fff}.bg-secondary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2341464b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-secondary{color:#6c757d}.btn.btn-ghost-secondary:hover{background-color:#6c757d1f}.alert.alert-secondary a:not(.btn),.table-secondary a:not(.btn){font-weight:700;color:#41464b}.alert.alert-secondary .btn:not([class*=btn-outline]),.table-secondary .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-secondary a:not(.btn){font-weight:700;color:#c4c8cb}.badge.bg-secondary,.toast.bg-secondary,.toast-header.bg-secondary,.progress-bar.bg-secondary{color:#fff}.bg-success button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-success{color:#198754}.btn.btn-ghost-success:hover{background-color:#1987541f}.alert.alert-success a:not(.btn),.table-success a:not(.btn){font-weight:700;color:#0f5132}.alert.alert-success .btn:not([class*=btn-outline]),.table-success .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-success a:not(.btn){font-weight:700;color:#a3cfbb}.badge.bg-success,.toast.bg-success,.toast-header.bg-success,.progress-bar.bg-success{color:#fff}.bg-info button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23225660'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-info{color:#54d6f0}.btn.btn-ghost-info:hover{background-color:#54d6f01f}.alert.alert-info a:not(.btn),.table-info a:not(.btn){font-weight:700;color:#225660}.alert.alert-info .btn:not([class*=btn-outline]),.table-info .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-info a:not(.btn){font-weight:700;color:#225660}.badge.bg-info,.toast.bg-info,.toast-header.bg-info,.progress-bar.bg-info{color:#000}.bg-warning button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-warning{color:#ffc107}.btn.btn-ghost-warning:hover{background-color:#ffc1071f}.alert.alert-warning a:not(.btn),.table-warning a:not(.btn){font-weight:700;color:#664d03}.alert.alert-warning .btn:not([class*=btn-outline]),.table-warning .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-warning a:not(.btn){font-weight:700;color:#664d03}.badge.bg-warning,.toast.bg-warning,.toast-header.bg-warning,.progress-bar.bg-warning{color:#000}.bg-danger button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-danger{color:#dc3545}.btn.btn-ghost-danger:hover{background-color:#dc35451f}.alert.alert-danger a:not(.btn),.table-danger a:not(.btn){font-weight:700;color:#842029}.alert.alert-danger .btn:not([class*=btn-outline]),.table-danger .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-danger a:not(.btn){font-weight:700;color:#f1aeb5}.badge.bg-danger,.toast.bg-danger,.toast-header.bg-danger,.progress-bar.bg-danger{color:#fff}.bg-light button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235d5e60'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-light{color:#e9ecef}.btn.btn-ghost-light:hover{background-color:#e9ecef1f}.alert.alert-light a:not(.btn),.table-light a:not(.btn){font-weight:700;color:#5d5e60}.alert.alert-light .btn:not([class*=btn-outline]),.table-light .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-light a:not(.btn){font-weight:700;color:#5d5e60}.badge.bg-light,.toast.bg-light,.toast-header.bg-light,.progress-bar.bg-light{color:#000}.bg-dark button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f2326'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-dark{color:#343a40}.btn.btn-ghost-dark:hover{background-color:#343a401f}.alert.alert-dark a:not(.btn),.table-dark a:not(.btn){font-weight:700;color:#1f2326}.alert.alert-dark .btn:not([class*=btn-outline]),.table-dark .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-dark a:not(.btn){font-weight:700;color:#aeb0b3}.badge.bg-dark,.toast.bg-dark,.toast-header.bg-dark,.progress-bar.bg-dark{color:#fff}.bg-blue button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23084298'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-blue{color:#0d6efd}.btn.btn-ghost-blue:hover{background-color:#0d6efd1f}.alert.alert-blue a:not(.btn),.table-blue a:not(.btn){font-weight:700;color:#084298}.alert.alert-blue .btn:not([class*=btn-outline]),.table-blue .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-blue a:not(.btn){font-weight:700;color:#9ec5fe}.badge.bg-blue,.toast.bg-blue,.toast-header.bg-blue,.progress-bar.bg-blue{color:#fff}.bg-indigo button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233d0a91'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-indigo{color:#6610f2}.btn.btn-ghost-indigo:hover{background-color:#6610f21f}.alert.alert-indigo a:not(.btn),.table-indigo a:not(.btn){font-weight:700;color:#3d0a91}.alert.alert-indigo .btn:not([class*=btn-outline]),.table-indigo .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-indigo a:not(.btn){font-weight:700;color:#c29ffa}.badge.bg-indigo,.toast.bg-indigo,.toast-header.bg-indigo,.progress-bar.bg-indigo{color:#fff}.bg-purple button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23432874'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-purple{color:#6f42c1}.btn.btn-ghost-purple:hover{background-color:#6f42c11f}.alert.alert-purple a:not(.btn),.table-purple a:not(.btn){font-weight:700;color:#432874}.alert.alert-purple .btn:not([class*=btn-outline]),.table-purple .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-purple a:not(.btn){font-weight:700;color:#c5b3e6}.badge.bg-purple,.toast.bg-purple,.toast-header.bg-purple,.progress-bar.bg-purple{color:#fff}.bg-pink button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23801f4f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-pink{color:#d63384}.btn.btn-ghost-pink:hover{background-color:#d633841f}.alert.alert-pink a:not(.btn),.table-pink a:not(.btn){font-weight:700;color:#801f4f}.alert.alert-pink .btn:not([class*=btn-outline]),.table-pink .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-pink a:not(.btn){font-weight:700;color:#efadce}.badge.bg-pink,.toast.bg-pink,.toast-header.bg-pink,.progress-bar.bg-pink{color:#fff}.bg-red button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-red{color:#dc3545}.btn.btn-ghost-red:hover{background-color:#dc35451f}.alert.alert-red a:not(.btn),.table-red a:not(.btn){font-weight:700;color:#842029}.alert.alert-red .btn:not([class*=btn-outline]),.table-red .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-red a:not(.btn){font-weight:700;color:#f1aeb5}.badge.bg-red,.toast.bg-red,.toast-header.bg-red,.progress-bar.bg-red{color:#fff}.bg-orange button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23984c0c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-orange{color:#fd7e14}.btn.btn-ghost-orange:hover{background-color:#fd7e141f}.alert.alert-orange a:not(.btn),.table-orange a:not(.btn){font-weight:700;color:#984c0c}.alert.alert-orange .btn:not([class*=btn-outline]),.table-orange .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-orange a:not(.btn){font-weight:700;color:#653208}.badge.bg-orange,.toast.bg-orange,.toast-header.bg-orange,.progress-bar.bg-orange{color:#000}.bg-yellow button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-yellow{color:#ffc107}.btn.btn-ghost-yellow:hover{background-color:#ffc1071f}.alert.alert-yellow a:not(.btn),.table-yellow a:not(.btn){font-weight:700;color:#664d03}.alert.alert-yellow .btn:not([class*=btn-outline]),.table-yellow .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-yellow a:not(.btn){font-weight:700;color:#664d03}.badge.bg-yellow,.toast.bg-yellow,.toast-header.bg-yellow,.progress-bar.bg-yellow{color:#000}.bg-green button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-green{color:#198754}.btn.btn-ghost-green:hover{background-color:#1987541f}.alert.alert-green a:not(.btn),.table-green a:not(.btn){font-weight:700;color:#0f5132}.alert.alert-green .btn:not([class*=btn-outline]),.table-green .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-green a:not(.btn){font-weight:700;color:#a3cfbb}.badge.bg-green,.toast.bg-green,.toast-header.bg-green,.progress-bar.bg-green{color:#fff}.bg-teal button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2313795b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-teal{color:#20c997}.btn.btn-ghost-teal:hover{background-color:#20c9971f}.alert.alert-teal a:not(.btn),.table-teal a:not(.btn){font-weight:700;color:#13795b}.alert.alert-teal .btn:not([class*=btn-outline]),.table-teal .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-teal a:not(.btn){font-weight:700;color:#0d503c}.badge.bg-teal,.toast.bg-teal,.toast-header.bg-teal,.progress-bar.bg-teal{color:#000}.bg-cyan button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23055160'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-cyan{color:#0dcaf0}.btn.btn-ghost-cyan:hover{background-color:#0dcaf01f}.alert.alert-cyan a:not(.btn),.table-cyan a:not(.btn){font-weight:700;color:#055160}.alert.alert-cyan .btn:not([class*=btn-outline]),.table-cyan .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-cyan a:not(.btn){font-weight:700;color:#055160}.badge.bg-cyan,.toast.bg-cyan,.toast-header.bg-cyan,.progress-bar.bg-cyan{color:#000}.bg-gray button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23686d71'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-gray{color:#adb5bd}.btn.btn-ghost-gray:hover{background-color:#adb5bd1f}.alert.alert-gray a:not(.btn),.table-gray a:not(.btn){font-weight:700;color:#686d71}.alert.alert-gray .btn:not([class*=btn-outline]),.table-gray .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-gray a:not(.btn){font-weight:700;color:#45484c}.badge.bg-gray,.toast.bg-gray,.toast-header.bg-gray,.progress-bar.bg-gray{color:#000}.bg-black button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='black'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-black{color:#000}.btn.btn-ghost-black:hover{background-color:#0000001f}.alert.alert-black a:not(.btn),.table-black a:not(.btn){font-weight:700;color:#000}.alert.alert-black .btn:not([class*=btn-outline]),.table-black .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-black a:not(.btn){font-weight:700;color:#999}.badge.bg-black,.toast.bg-black,.toast-header.bg-black,.progress-bar.bg-black{color:#fff}.bg-white button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23666666'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.btn.btn-ghost-white{color:#fff}.btn.btn-ghost-white:hover{background-color:#ffffff1f}.alert.alert-white a:not(.btn),.table-white a:not(.btn){font-weight:700;color:#666}.alert.alert-white .btn:not([class*=btn-outline]),.table-white .btn:not([class*=btn-outline]){border-color:#495057}.toast.bg-white a:not(.btn){font-weight:700;color:#666}.badge.bg-white,.toast.bg-white,.toast-header.bg-white,.progress-bar.bg-white{color:#000}table td>.progress{min-width:6rem}.small .form-control{font-size:.875rem}:not(.card-body)>.col:not(:last-child):not(:only-child){margin-bottom:1rem}.nav-mobile{display:none;flex-direction:column;align-items:center;justify-content:space-between;width:100%}@media (max-width: 991.98px){.nav-mobile{display:flex}}.nav-mobile .nav-mobile-top{display:flex;align-items:center;justify-content:space-between;width:100%}.card>.table.table-flush{margin-bottom:0;overflow:hidden;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.card>.table.table-flush thead th[scope=col]{padding-top:1rem;padding-bottom:1rem;text-transform:uppercase;vertical-align:middle;background-color:#f8f9fa;border-top:1px solid rgba(0,0,0,.125);border-bottom-color:#00000020}.card>.table.table-flush th,.card>.table.table-flush td{padding-right:1.5rem!important;padding-left:1.5rem!important;border-right:0;border-left:0}.card>.table.table-flush tr[class]{border-color:#00000020!important}.card>.table.table-flush tr[class]:last-of-type{border-bottom-color:transparent!important;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.header-alert-container{display:flex;align-items:center;justify-content:center;padding:0 1rem}.header-alert-container .alert{width:100%}@media (min-width: 768px){.header-alert-container .alert{max-width:75%}}@media (min-width: 992px){.header-alert-container .alert{max-width:50%}}span.profile-button .dropdown-menu{right:0;left:auto;display:block!important;margin-top:.5rem;box-shadow:0 .5rem 1rem #00000026;transition:opacity .2s ease-in-out}span.profile-button .dropdown-menu:not(.show){pointer-events:none;opacity:0}span.profile-button .dropdown-menu.show{pointer-events:auto;opacity:1}div#advanced-search-content div.card div.card-body div.col:not(:last-child){margin-right:1rem}table td a{text-decoration:none}table td a:hover{text-decoration:underline}table td .dropdown{position:static}table th a,table th a:hover{color:#212529;text-decoration:none}table td,table th{font-size:.875rem;line-height:1.25;vertical-align:middle}table td.min-width,table th.min-width{width:1%}table td .form-check-input,table th .form-check-input{margin-top:.125em;font-size:1rem}table td .btn-sm,table td .btn-group-sm>.btn,table th .btn-sm,table th .btn-group-sm>.btn{line-height:1}table td p,table th p{margin-bottom:0}table th.asc a:after{content:"\f0140";font-family:"Material Design Icons"}table th.desc a:after{content:"\f0143";font-family:"Material Design Icons"}table.table>:not(caption)>*>*{padding-right:.25rem!important;padding-left:.25rem!important}table.object-list th{font-size:.75rem;line-height:1;vertical-align:bottom}table.attr-table th{font-weight:normal;width:25%}div.title-container{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:space-between}@media (min-width: 992px){div.title-container{flex-direction:row}}div.title-container #content-title{display:flex;flex:1 0;flex-direction:column;padding-bottom:.5rem}.controls{margin-bottom:.5rem}@media print{.controls{display:none!important}}.controls .control-group{display:flex;flex-wrap:wrap;justify-content:flex-start}@media (min-width: 992px){.controls .control-group{justify-content:flex-end}}.controls .control-group>*{margin:.25rem}.controls .control-group>*:first-child{margin-left:0}.controls .control-group>*:last-child{margin-right:0}.object-subtitle{display:block;font-size:.875rem;color:#6c757d}@media (min-width: 768px){.object-subtitle{display:inline-block}}.object-subtitle>span{display:block}.object-subtitle>span.separator{display:none}@media (min-width: 768px){.object-subtitle>span,.object-subtitle>span.separator{display:inline-block}}nav.search{z-index:999;justify-content:center;background-color:var(--nbx-body-bg)}nav.search .search-container{display:flex;width:100%}@media (max-width: 991.98px){nav.search .search-container{display:none}}nav.search .input-group .search-obj-selected{border-color:#e9ecef}nav.search .input-group .dropdown-toggle{color:#000;border-color:#e9ecef;margin-left:0;font-weight:400;line-height:1.5;color:#212529;background-color:#e9ecef;border:1px solid #e9ecef;border-radius:.375rem;border-left:1px solid var(--nbx-search-filter-border-left-color)}nav.search .input-group .dropdown-toggle:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}.btn-check:focus+nav.search .input-group .dropdown-toggle,nav.search .input-group .dropdown-toggle:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}.btn-check:checked+nav.search .input-group .dropdown-toggle,.btn-check:active+nav.search .input-group .dropdown-toggle,nav.search .input-group .dropdown-toggle:active,nav.search .input-group .dropdown-toggle.active,.show>nav.search .input-group .dropdown-toggle.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}.btn-check:checked+nav.search .input-group .dropdown-toggle:focus,.btn-check:active+nav.search .input-group .dropdown-toggle:focus,nav.search .input-group .dropdown-toggle:active:focus,nav.search .input-group .dropdown-toggle.active:focus,.show>nav.search .input-group .dropdown-toggle.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}nav.search .input-group .dropdown-toggle:disabled,nav.search .input-group .dropdown-toggle.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}nav.search .input-group .dropdown-toggle:focus{box-shadow:unset!important}nav.search .input-group .dropdown-toggle:after{display:none}nav.search .input-group .search-obj-selector{max-height:70vh;overflow-y:auto}nav.search .input-group .search-obj-selector .dropdown-item,nav.search .input-group .search-obj-selector .dropdown-header{font-size:.875rem}nav.search .input-group .search-obj-selector .dropdown-header{text-transform:uppercase}main.layout{display:flex;flex-wrap:nowrap;height:100vh;height:-webkit-fill-available;max-height:100vh;overflow-x:auto;overflow-y:hidden}@media print{main.layout{position:static!important;display:block!important;height:100%;overflow-x:visible!important;overflow-y:visible!important}}main.login-container{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;max-width:100vw;height:calc(100vh - 4rem);padding-top:40px;padding-bottom:40px}main.login-container+footer.footer button.color-mode-toggle{color:var(--nbx-color-mode-toggle-color)}.footer{padding:0}.footer .nav-link{padding:.5rem}@media (max-width: 767.98px){.footer{margin-bottom:8rem}}footer.login-footer{height:4rem;margin-top:auto}footer.login-footer .container-fluid,footer.login-footer .container-sm,footer.login-footer .container-md,footer.login-footer .container-lg,footer.login-footer .container-xl,footer.login-footer .container-xxl{display:flex;justify-content:flex-end;padding:.75rem 1.5rem}h1.accordion-item-title,.accordion-item-title.h1,h2.accordion-item-title,.accordion-item-title.h2,h3.accordion-item-title,.accordion-item-title.h3,h4.accordion-item-title,.accordion-item-title.h4,h5.accordion-item-title,.accordion-item-title.h5,h6.accordion-item-title,.accordion-item-title.h6{padding:.25rem .5rem;font-size:.875rem;font-weight:700;color:var(--nbx-sidebar-title-color);text-transform:uppercase}.form-login{width:100%;max-width:330px;padding:15px}.form-login input:focus{z-index:1}.form-login input[type=text]{margin-bottom:-1px;border-bottom-right-radius:0;border-bottom-left-radius:0}.form-login input[type=password]{margin-bottom:10px;border-top-left-radius:0;border-top-right-radius:0}.form-login .form-control{position:relative;box-sizing:border-box;height:auto;padding:10px;font-size:16px}.navbar-brand{padding-top:.75rem;padding-bottom:.75rem;font-size:1rem}nav.nav.nav-pills .nav-item.nav-link{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}nav.nav.nav-pills .nav-item.nav-link:hover{color:#343a40;background-color:#cfe2ff}div.content-container{position:relative;display:flex;flex-direction:column;width:calc(100% - 3rem);min-height:100vh;overflow-x:hidden;overflow-y:auto}div.content-container:focus,div.content-container:focus-visible{outline:0}div.content-container div.content{flex:1}@media (max-width: 991.98px){div.content-container{width:100%}}@media print{div.content-container{width:100%!important;margin-left:0!important}}@media (max-width: 768px){.sidebar.collapse.show~.content-container>.content{position:fixed;top:0;left:0;overflow-y:hidden}}.tooltip{pointer-events:none}span.color-label{display:block;width:5rem;height:1rem;padding:.35em .65em;border:1px solid #303030;border-radius:.375rem;box-shadow:0 .125rem .25rem #00000013}.btn{white-space:nowrap}.card{box-shadow:0 .125rem .25rem #00000013}.card .card-header{padding:1rem;color:var(--nbx-body-color);border-bottom:none}.card .card-header+.card-body{padding-top:0}.card .card-body.small .form-control,.card .card-body.small .form-select{font-size:.875rem}.card .card-divider{width:100%;height:1px;margin:1rem 0;border-top:1px solid rgba(0,0,0,.125);opacity:.25}@media print{.card{box-shadow:unset!important}}.form-floating{position:relative}.form-floating>.input-group>.form-control,.form-floating>.input-group>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>.input-group>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>.input-group>label{transition:none}}.form-floating>.input-group>.form-control::placeholder{color:transparent}.form-floating>.input-group>.form-control:focus,.form-floating>.input-group>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.input-group>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.input-group>.form-select,.form-floating>.choices>.choices__inner,.form-floating>.ss-main span.placeholder,.form-floating>.ss-main div.ss-values{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.input-group>.form-control:focus~label,.form-floating>.input-group>.form-control:not(:placeholder-shown)~label,.form-floating>.input-group>.form-select~label,.form-floating>.choices~label,.form-floating>.ss-main~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem);z-index:4}.form-floating>.input-group>.form-control:-webkit-autofill~label{z-index:4;opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-object-edit{margin:0 auto;max-width:800px}textarea.form-control[rows="10"]{height:18rem}textarea#id_local_context_data,textarea.markdown,textarea#id_public_key,textarea.form-control[name=csv],textarea.form-control[name=data]{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.card:not(:only-of-type){margin-bottom:1rem}.stat-btn{min-width:3rem}nav.breadcrumb-container{width:fit-content;padding:.35em .65em;font-size:.875rem}nav.breadcrumb-container ol.breadcrumb{margin-bottom:0}nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a{text-decoration:none}nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover{text-decoration:underline}label.required{font-weight:700}label.required:after{position:absolute;display:inline-block;margin:0 0 0 2px;font-family:"Material Design Icons";font-size:8px;font-style:normal;font-weight:600;text-decoration:none;content:"\f06c4"}div.bulk-buttons{display:flex;justify-content:space-between;margin:.5rem 0}div.bulk-buttons>div.bulk-button-group{display:flex;flex-wrap:wrap;align-items:flex-start}div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child{margin-left:0}div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child{margin-right:0}div.bulk-buttons>div.bulk-button-group>*{margin:.25rem}table tbody tr.primary{background-color:#337ab726;border-color:#adb5bd}table tbody tr.secondary{background-color:#6c757d26;border-color:#adb5bd}table tbody tr.success{background-color:#19875426;border-color:#adb5bd}table tbody tr.info{background-color:#54d6f026;border-color:#adb5bd}table tbody tr.warning{background-color:#ffc10726;border-color:#adb5bd}table tbody tr.danger{background-color:#dc354526;border-color:#adb5bd}table tbody tr.light{background-color:#e9ecef26;border-color:#adb5bd}table tbody tr.dark{background-color:#343a4026;border-color:#adb5bd}table tbody tr.blue{background-color:#0d6efd26;border-color:#adb5bd}table tbody tr.indigo{background-color:#6610f226;border-color:#adb5bd}table tbody tr.purple{background-color:#6f42c126;border-color:#adb5bd}table tbody tr.pink{background-color:#d6338426;border-color:#adb5bd}table tbody tr.red{background-color:#dc354526;border-color:#adb5bd}table tbody tr.orange{background-color:#fd7e1426;border-color:#adb5bd}table tbody tr.yellow{background-color:#ffc10726;border-color:#adb5bd}table tbody tr.green{background-color:#19875426;border-color:#adb5bd}table tbody tr.teal{background-color:#20c99726;border-color:#adb5bd}table tbody tr.cyan{background-color:#0dcaf026;border-color:#adb5bd}table tbody tr.gray{background-color:#adb5bd26;border-color:#adb5bd}table tbody tr.black{background-color:#00000026;border-color:#adb5bd}table tbody tr.white{background-color:#ffffff26;border-color:#adb5bd}table .table-badge-group .table-badge{display:block;width:min-content;font-size:.875rem;font-weight:400}table .table-badge-group .table-badge:not(.badge){padding:0 .65em}table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child){margin-bottom:.25rem}pre.change-data{padding-right:0;padding-left:0}pre.change-data>span{display:block;padding-right:1rem;padding-left:1rem}pre.change-data>span.added{background-color:var(--nbx-change-added)}pre.change-data>span.removed{background-color:var(--nbx-change-removed)}pre.change-diff{border-color:transparent}pre.change-diff.change-removed{background-color:var(--nbx-change-removed)}pre.change-diff.change-added{background-color:var(--nbx-change-added)}div.card-overlay{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#ffffffbf;border-radius:.375rem}div.card-overlay>div.spinner-border{width:6rem;height:6rem;color:#6c757d}.table-controls{display:flex}@media (min-width: 768px){.table-controls{margin-top:0!important;margin-bottom:0!important}}.table-controls .table-configure{justify-content:flex-start}@media (min-width: 768px){.table-controls .table-configure{justify-content:flex-end}}.table-controls .form-switch.form-check-inline{flex:1 0 auto;font-size:.875rem}.nav-tabs .nav-link:hover{border-bottom-color:transparent}.nav-tabs .nav-link.active{background-color:#f8f9fa;border-bottom-color:#f8f9fa;transform:translateY(1px)}.tab-content{display:flex;flex-direction:column;padding:1rem;background-color:#f8f9fa;border-bottom:1px solid #dee2e6}@media print{.tab-content{background-color:var(--nbx-body-bg)!important;border-bottom:none!important}}@media print{.masonry{position:static!important;display:block!important;height:unset!important}}@media print{.masonry .masonry-item{position:static!important;top:unset!important;left:unset!important;display:block!important}}.record-depth{display:inline;font-size:1rem;user-select:none;opacity:.33}.record-depth span:only-of-type,.record-depth span:last-of-type{margin-right:.25rem}.popover.image-preview-popover{max-width:unset}.rendered-markdown table{width:100%}.rendered-markdown th{border-bottom:2px solid #ddd;padding:8px}.rendered-markdown td{border-top:1px solid #ddd;padding:8px}td pre{margin-bottom:0}pre.block{padding:1rem;background-color:var(--nbx-pre-bg);border:1px solid var(--nbx-pre-border-color);border-radius:.375rem}#django-messages{position:fixed;right:1rem;bottom:0;margin:1rem}html[data-netbox-url-name=home] .content-container,html[data-netbox-url-name=home] .search{background-color:#f8f9fa!important}html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search{background-color:#171b1d!important}html[data-netbox-url-name=login] #django-messages{display:none} diff --git a/netbox/project-static/dist/netbox-print.css b/netbox/project-static/dist/netbox-print.css index dde212a6c34..9b46d50c85c 100644 --- a/netbox/project-static/dist/netbox-print.css +++ b/netbox/project-static/dist/netbox-print.css @@ -1 +1 @@ -@media print{:root{--nbx-body-bg: #fff !important;--nbx-body-color: #000 !important}html :root,html[data-netbox-color-mode=dark] :root,html[data-netbox-color-mode=light] :root{--bs-orange: #fd7e14;--bs-teal: #20c997;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #337ab7;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #54d6f0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-red: #dc3545;--bs-yellow: #ffc107;--bs-green: #198754;--bs-blue: #0d6efd;--bs-cyan: #0dcaf0;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-darker: #1b1f22;--bs-darkest: #171b1d;--bs-gray: #ced4da;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-red-100: #f8d7da;--bs-red-200: #f1aeb5;--bs-red-300: #ea868f;--bs-red-400: #e35d6a;--bs-red-500: #dc3545;--bs-red-600: #b02a37;--bs-red-700: #842029;--bs-red-800: #58151c;--bs-red-900: #2c0b0e;--bs-yellow-100: #fff3cd;--bs-yellow-200: #ffe69c;--bs-yellow-300: #ffda6a;--bs-yellow-400: #ffcd39;--bs-yellow-500: #ffc107;--bs-yellow-600: #cc9a06;--bs-yellow-700: #997404;--bs-yellow-800: #664d03;--bs-yellow-900: #332701;--bs-green-100: #d1e7dd;--bs-green-200: #a3cfbb;--bs-green-300: #75b798;--bs-green-400: #479f76;--bs-green-500: #198754;--bs-green-600: #146c43;--bs-green-700: #0f5132;--bs-green-800: #0a3622;--bs-green-900: #051b11;--bs-blue-100: #cfe2ff;--bs-blue-200: #9ec5fe;--bs-blue-300: #6ea8fe;--bs-blue-400: #3d8bfd;--bs-blue-500: #0d6efd;--bs-blue-600: #0a58ca;--bs-blue-700: #084298;--bs-blue-800: #052c65;--bs-blue-900: #031633;--bs-cyan-100: #cff4fc;--bs-cyan-200: #9eeaf9;--bs-cyan-300: #6edff6;--bs-cyan-400: #3dd5f3;--bs-cyan-500: #0dcaf0;--bs-cyan-600: #0aa2c0;--bs-cyan-700: #087990;--bs-cyan-800: #055160;--bs-cyan-900: #032830;--bs-indigo-100: #e0cffc;--bs-indigo-200: #c29ffa;--bs-indigo-300: #a370f7;--bs-indigo-400: #8540f5;--bs-indigo-500: #6610f2;--bs-indigo-600: #520dc2;--bs-indigo-700: #3d0a91;--bs-indigo-800: #290661;--bs-indigo-900: #140330;--bs-purple-100: #e2d9f3;--bs-purple-200: #c5b3e6;--bs-purple-300: #a98eda;--bs-purple-400: #8c68cd;--bs-purple-500: #6f42c1;--bs-purple-600: #59359a;--bs-purple-700: #432874;--bs-purple-800: #2c1a4d;--bs-purple-900: #160d27;--bs-pink-100: #f7d6e6;--bs-pink-200: #efadce;--bs-pink-300: #e685b5;--bs-pink-400: #de5c9d;--bs-pink-500: #d63384;--bs-pink-600: #ab296a;--bs-pink-700: #801f4f;--bs-pink-800: #561435;--bs-pink-900: #2b0a1a;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0))}html *,html *:before,html *:after,html[data-netbox-color-mode=dark] *,html[data-netbox-color-mode=dark] *:before,html[data-netbox-color-mode=dark] *:after,html[data-netbox-color-mode=light] *,html[data-netbox-color-mode=light] *:before,html[data-netbox-color-mode=light] *:after{box-sizing:border-box}}@media print and (prefers-reduced-motion: no-preference){html :root,html[data-netbox-color-mode=dark] :root,html[data-netbox-color-mode=light] :root{scroll-behavior:smooth}}@media print{html body,html[data-netbox-color-mode=dark] body,html[data-netbox-color-mode=light] body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}}@media print{html hr,html[data-netbox-color-mode=dark] hr,html[data-netbox-color-mode=light] hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}}@media print{html hr:not([size]),html[data-netbox-color-mode=dark] hr:not([size]),html[data-netbox-color-mode=light] hr:not([size]){height:1px}}@media print{html h6,html .h6,html[data-netbox-color-mode=dark] .h6,html[data-netbox-color-mode=light] .h6,html[data-netbox-color-mode=dark] h6,html[data-netbox-color-mode=light] h6,html h5,html .h5,html[data-netbox-color-mode=dark] .h5,html[data-netbox-color-mode=light] .h5,html[data-netbox-color-mode=dark] h5,html[data-netbox-color-mode=light] h5,html h4,html .h4,html[data-netbox-color-mode=dark] .h4,html[data-netbox-color-mode=light] .h4,html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=light] h4,html h3,html .h3,html[data-netbox-color-mode=dark] .h3,html[data-netbox-color-mode=light] .h3,html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=light] h3,html h2,html .h2,html[data-netbox-color-mode=dark] .h2,html[data-netbox-color-mode=light] .h2,html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=light] h2,html h1,html .h1,html[data-netbox-color-mode=dark] .h1,html[data-netbox-color-mode=light] .h1,html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=light] h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}}@media print{html h1,html .h1,html[data-netbox-color-mode=dark] .h1,html[data-netbox-color-mode=light] .h1,html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=light] h1{font-size:calc(1.375rem + 1.5vw)}}@media print and (min-width: 1200px){html h1,html .h1,html[data-netbox-color-mode=dark] .h1,html[data-netbox-color-mode=light] .h1,html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=light] h1{font-size:2.5rem}}@media print{html h2,html .h2,html[data-netbox-color-mode=dark] .h2,html[data-netbox-color-mode=light] .h2,html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=light] h2{font-size:calc(1.325rem + .9vw)}}@media print and (min-width: 1200px){html h2,html .h2,html[data-netbox-color-mode=dark] .h2,html[data-netbox-color-mode=light] .h2,html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=light] h2{font-size:2rem}}@media print{html h3,html .h3,html[data-netbox-color-mode=dark] .h3,html[data-netbox-color-mode=light] .h3,html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=light] h3{font-size:calc(1.3rem + .6vw)}}@media print and (min-width: 1200px){html h3,html .h3,html[data-netbox-color-mode=dark] .h3,html[data-netbox-color-mode=light] .h3,html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=light] h3{font-size:1.75rem}}@media print{html h4,html .h4,html[data-netbox-color-mode=dark] .h4,html[data-netbox-color-mode=light] .h4,html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=light] h4{font-size:calc(1.275rem + .3vw)}}@media print and (min-width: 1200px){html h4,html .h4,html[data-netbox-color-mode=dark] .h4,html[data-netbox-color-mode=light] .h4,html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=light] h4{font-size:1.5rem}}@media print{html h5,html .h5,html[data-netbox-color-mode=dark] .h5,html[data-netbox-color-mode=light] .h5,html[data-netbox-color-mode=dark] h5,html[data-netbox-color-mode=light] h5{font-size:1.25rem}}@media print{html h6,html .h6,html[data-netbox-color-mode=dark] .h6,html[data-netbox-color-mode=light] .h6,html[data-netbox-color-mode=dark] h6,html[data-netbox-color-mode=light] h6{font-size:1rem}}@media print{html p,html[data-netbox-color-mode=dark] p,html[data-netbox-color-mode=light] p{margin-top:0;margin-bottom:1rem}}@media print{html abbr[title],html abbr[data-bs-original-title],html[data-netbox-color-mode=dark] abbr[title],html[data-netbox-color-mode=dark] abbr[data-bs-original-title],html[data-netbox-color-mode=light] abbr[title],html[data-netbox-color-mode=light] abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}}@media print{html address,html[data-netbox-color-mode=dark] address,html[data-netbox-color-mode=light] address{margin-bottom:1rem;font-style:normal;line-height:inherit}}@media print{html ol,html ul,html[data-netbox-color-mode=dark] ol,html[data-netbox-color-mode=dark] ul,html[data-netbox-color-mode=light] ol,html[data-netbox-color-mode=light] ul{padding-left:2rem}}@media print{html ol,html ul,html dl,html[data-netbox-color-mode=dark] ol,html[data-netbox-color-mode=dark] ul,html[data-netbox-color-mode=dark] dl,html[data-netbox-color-mode=light] ol,html[data-netbox-color-mode=light] ul,html[data-netbox-color-mode=light] dl{margin-top:0;margin-bottom:1rem}}@media print{html ol ol,html ul ul,html ol ul,html ul ol,html[data-netbox-color-mode=dark] ol ol,html[data-netbox-color-mode=dark] ul ul,html[data-netbox-color-mode=dark] ol ul,html[data-netbox-color-mode=dark] ul ol,html[data-netbox-color-mode=light] ol ol,html[data-netbox-color-mode=light] ul ul,html[data-netbox-color-mode=light] ol ul,html[data-netbox-color-mode=light] ul ol{margin-bottom:0}}@media print{html dt,html[data-netbox-color-mode=dark] dt,html[data-netbox-color-mode=light] dt{font-weight:700}}@media print{html dd,html[data-netbox-color-mode=dark] dd,html[data-netbox-color-mode=light] dd{margin-bottom:.5rem;margin-left:0}}@media print{html blockquote,html[data-netbox-color-mode=dark] blockquote,html[data-netbox-color-mode=light] blockquote{margin:0 0 1rem}}@media print{html b,html strong,html[data-netbox-color-mode=dark] b,html[data-netbox-color-mode=dark] strong,html[data-netbox-color-mode=light] b,html[data-netbox-color-mode=light] strong{font-weight:800}}@media print{html small,html .small,html[data-netbox-color-mode=dark] .small,html[data-netbox-color-mode=light] .small,html[data-netbox-color-mode=dark] small,html[data-netbox-color-mode=light] small{font-size:.875em}}@media print{html mark,html .mark,html[data-netbox-color-mode=dark] .mark,html[data-netbox-color-mode=light] .mark,html[data-netbox-color-mode=dark] mark,html[data-netbox-color-mode=light] mark{padding:.2em;background-color:#fcf8e3}}@media print{html sub,html sup,html[data-netbox-color-mode=dark] sub,html[data-netbox-color-mode=dark] sup,html[data-netbox-color-mode=light] sub,html[data-netbox-color-mode=light] sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}}@media print{html sub,html[data-netbox-color-mode=dark] sub,html[data-netbox-color-mode=light] sub{bottom:-.25em}}@media print{html sup,html[data-netbox-color-mode=dark] sup,html[data-netbox-color-mode=light] sup{top:-.5em}}@media print{html a,html[data-netbox-color-mode=dark] a,html[data-netbox-color-mode=light] a{color:#0d6efd;text-decoration:underline}html a:hover,html[data-netbox-color-mode=dark] a:hover,html[data-netbox-color-mode=light] a:hover{color:#0a58ca}}@media print{html a:not([href]):not([class]),html a:not([href]):not([class]):hover,html[data-netbox-color-mode=dark] a:not([href]):not([class]),html[data-netbox-color-mode=dark] a:not([href]):not([class]):hover,html[data-netbox-color-mode=light] a:not([href]):not([class]),html[data-netbox-color-mode=light] a:not([href]):not([class]):hover{color:inherit;text-decoration:none}}@media print{html pre,html code,html kbd,html samp,html[data-netbox-color-mode=dark] pre,html[data-netbox-color-mode=dark] code,html[data-netbox-color-mode=dark] kbd,html[data-netbox-color-mode=dark] samp,html[data-netbox-color-mode=light] pre,html[data-netbox-color-mode=light] code,html[data-netbox-color-mode=light] kbd,html[data-netbox-color-mode=light] samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}}@media print{html pre,html[data-netbox-color-mode=dark] pre,html[data-netbox-color-mode=light] pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}html pre code,html[data-netbox-color-mode=dark] pre code,html[data-netbox-color-mode=light] pre code{font-size:inherit;color:inherit;word-break:normal}}@media print{html code,html[data-netbox-color-mode=dark] code,html[data-netbox-color-mode=light] code{font-size:.875em;color:#212529;word-wrap:break-word}a>html code,a>html[data-netbox-color-mode=dark] code,a>html[data-netbox-color-mode=light] code{color:inherit}}@media print{html kbd,html[data-netbox-color-mode=dark] kbd,html[data-netbox-color-mode=light] kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.375rem}html kbd kbd,html[data-netbox-color-mode=dark] kbd kbd,html[data-netbox-color-mode=light] kbd kbd{padding:0;font-size:1em;font-weight:700}}@media print{html figure,html[data-netbox-color-mode=dark] figure,html[data-netbox-color-mode=light] figure{margin:0 0 1rem}}@media print{html img,html svg,html[data-netbox-color-mode=dark] img,html[data-netbox-color-mode=dark] svg,html[data-netbox-color-mode=light] img,html[data-netbox-color-mode=light] svg{vertical-align:middle}}@media print{html table,html[data-netbox-color-mode=dark] table,html[data-netbox-color-mode=light] table{caption-side:bottom;border-collapse:collapse}}@media print{html caption,html[data-netbox-color-mode=dark] caption,html[data-netbox-color-mode=light] caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}}@media print{html th,html[data-netbox-color-mode=dark] th,html[data-netbox-color-mode=light] th{text-align:inherit;text-align:-webkit-match-parent}}@media print{html thead,html tbody,html tfoot,html tr,html td,html th,html[data-netbox-color-mode=dark] thead,html[data-netbox-color-mode=dark] tbody,html[data-netbox-color-mode=dark] tfoot,html[data-netbox-color-mode=dark] tr,html[data-netbox-color-mode=dark] td,html[data-netbox-color-mode=dark] th,html[data-netbox-color-mode=light] thead,html[data-netbox-color-mode=light] tbody,html[data-netbox-color-mode=light] tfoot,html[data-netbox-color-mode=light] tr,html[data-netbox-color-mode=light] td,html[data-netbox-color-mode=light] th{border-color:inherit;border-style:solid;border-width:0}}@media print{html label,html[data-netbox-color-mode=dark] label,html[data-netbox-color-mode=light] label{display:inline-block}}@media print{html button,html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=light] button{border-radius:0}}@media print{html button:focus:not(:focus-visible),html[data-netbox-color-mode=dark] button:focus:not(:focus-visible),html[data-netbox-color-mode=light] button:focus:not(:focus-visible){outline:0}}@media print{html input,html button,html select,html optgroup,html textarea,html[data-netbox-color-mode=dark] input,html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] select,html[data-netbox-color-mode=dark] optgroup,html[data-netbox-color-mode=dark] textarea,html[data-netbox-color-mode=light] input,html[data-netbox-color-mode=light] button,html[data-netbox-color-mode=light] select,html[data-netbox-color-mode=light] optgroup,html[data-netbox-color-mode=light] textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}}@media print{html button,html select,html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] select,html[data-netbox-color-mode=light] button,html[data-netbox-color-mode=light] select{text-transform:none}}@media print{html [role=button],html[data-netbox-color-mode=dark] [role=button],html[data-netbox-color-mode=light] [role=button]{cursor:pointer}}@media print{html select,html[data-netbox-color-mode=dark] select,html[data-netbox-color-mode=light] select{word-wrap:normal}html select:disabled,html[data-netbox-color-mode=dark] select:disabled,html[data-netbox-color-mode=light] select:disabled{opacity:1}}@media print{html [list]::-webkit-calendar-picker-indicator,html[data-netbox-color-mode=dark] [list]::-webkit-calendar-picker-indicator,html[data-netbox-color-mode=light] [list]::-webkit-calendar-picker-indicator{display:none}}@media print{html button,html [type=button],html [type=reset],html [type=submit],html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] [type=button],html[data-netbox-color-mode=dark] [type=reset],html[data-netbox-color-mode=dark] [type=submit],html[data-netbox-color-mode=light] button,html[data-netbox-color-mode=light] [type=button],html[data-netbox-color-mode=light] [type=reset],html[data-netbox-color-mode=light] [type=submit]{-webkit-appearance:button}html button:not(:disabled),html [type=button]:not(:disabled),html [type=reset]:not(:disabled),html [type=submit]:not(:disabled),html[data-netbox-color-mode=dark] button:not(:disabled),html[data-netbox-color-mode=dark] [type=button]:not(:disabled),html[data-netbox-color-mode=dark] [type=reset]:not(:disabled),html[data-netbox-color-mode=dark] [type=submit]:not(:disabled),html[data-netbox-color-mode=light] button:not(:disabled),html[data-netbox-color-mode=light] [type=button]:not(:disabled),html[data-netbox-color-mode=light] [type=reset]:not(:disabled),html[data-netbox-color-mode=light] [type=submit]:not(:disabled){cursor:pointer}}@media print{html ::-moz-focus-inner,html[data-netbox-color-mode=dark] ::-moz-focus-inner,html[data-netbox-color-mode=light] ::-moz-focus-inner{padding:0;border-style:none}}@media print{html textarea,html[data-netbox-color-mode=dark] textarea,html[data-netbox-color-mode=light] textarea{resize:vertical}}@media print{html fieldset,html[data-netbox-color-mode=dark] fieldset,html[data-netbox-color-mode=light] fieldset{min-width:0;padding:0;margin:0;border:0}}@media print{html legend,html[data-netbox-color-mode=dark] legend,html[data-netbox-color-mode=light] legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}}@media print and (min-width: 1200px){html legend,html[data-netbox-color-mode=dark] legend,html[data-netbox-color-mode=light] legend{font-size:1.5rem}}@media print{html legend+*,html[data-netbox-color-mode=dark] legend+*,html[data-netbox-color-mode=light] legend+*{clear:left}}@media print{html ::-webkit-datetime-edit-fields-wrapper,html ::-webkit-datetime-edit-text,html ::-webkit-datetime-edit-minute,html ::-webkit-datetime-edit-hour-field,html ::-webkit-datetime-edit-day-field,html ::-webkit-datetime-edit-month-field,html ::-webkit-datetime-edit-year-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-fields-wrapper,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-text,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-minute,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-hour-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-day-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-month-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-year-field,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-fields-wrapper,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-text,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-minute,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-hour-field,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-day-field,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-month-field,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-year-field{padding:0}}@media print{html ::-webkit-inner-spin-button,html[data-netbox-color-mode=dark] ::-webkit-inner-spin-button,html[data-netbox-color-mode=light] ::-webkit-inner-spin-button{height:auto}}@media print{html [type=search],html[data-netbox-color-mode=dark] [type=search],html[data-netbox-color-mode=light] [type=search]{outline-offset:-2px;-webkit-appearance:textfield}}@media print{html ::-webkit-search-decoration,html[data-netbox-color-mode=dark] ::-webkit-search-decoration,html[data-netbox-color-mode=light] ::-webkit-search-decoration{-webkit-appearance:none}}@media print{html ::-webkit-color-swatch-wrapper,html[data-netbox-color-mode=dark] ::-webkit-color-swatch-wrapper,html[data-netbox-color-mode=light] ::-webkit-color-swatch-wrapper{padding:0}}@media print{html ::file-selector-button,html[data-netbox-color-mode=dark] ::file-selector-button,html[data-netbox-color-mode=light] ::file-selector-button{font:inherit}}@media print{html ::-webkit-file-upload-button,html[data-netbox-color-mode=dark] ::-webkit-file-upload-button,html[data-netbox-color-mode=light] ::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}}@media print{html output,html[data-netbox-color-mode=dark] output,html[data-netbox-color-mode=light] output{display:inline-block}}@media print{html iframe,html[data-netbox-color-mode=dark] iframe,html[data-netbox-color-mode=light] iframe{border:0}}@media print{html summary,html[data-netbox-color-mode=dark] summary,html[data-netbox-color-mode=light] summary{display:list-item;cursor:pointer}}@media print{html progress,html[data-netbox-color-mode=dark] progress,html[data-netbox-color-mode=light] progress{vertical-align:baseline}}@media print{html [hidden],html[data-netbox-color-mode=dark] [hidden],html[data-netbox-color-mode=light] [hidden]{display:none!important}}@media print{html .lead,html[data-netbox-color-mode=dark] .lead,html[data-netbox-color-mode=light] .lead{font-size:1.25rem;font-weight:300}}@media print{html .display-1,html[data-netbox-color-mode=dark] .display-1,html[data-netbox-color-mode=light] .display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-1,html[data-netbox-color-mode=dark] .display-1,html[data-netbox-color-mode=light] .display-1{font-size:5rem}}@media print{html .display-2,html[data-netbox-color-mode=dark] .display-2,html[data-netbox-color-mode=light] .display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-2,html[data-netbox-color-mode=dark] .display-2,html[data-netbox-color-mode=light] .display-2{font-size:4.5rem}}@media print{html .display-3,html[data-netbox-color-mode=dark] .display-3,html[data-netbox-color-mode=light] .display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-3,html[data-netbox-color-mode=dark] .display-3,html[data-netbox-color-mode=light] .display-3{font-size:4rem}}@media print{html .display-4,html[data-netbox-color-mode=dark] .display-4,html[data-netbox-color-mode=light] .display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-4,html[data-netbox-color-mode=dark] .display-4,html[data-netbox-color-mode=light] .display-4{font-size:3.5rem}}@media print{html .display-5,html[data-netbox-color-mode=dark] .display-5,html[data-netbox-color-mode=light] .display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-5,html[data-netbox-color-mode=dark] .display-5,html[data-netbox-color-mode=light] .display-5{font-size:3rem}}@media print{html .display-6,html[data-netbox-color-mode=dark] .display-6,html[data-netbox-color-mode=light] .display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-6,html[data-netbox-color-mode=dark] .display-6,html[data-netbox-color-mode=light] .display-6{font-size:2.5rem}}@media print{html .list-unstyled,html[data-netbox-color-mode=dark] .list-unstyled,html[data-netbox-color-mode=light] .list-unstyled{padding-left:0;list-style:none}}@media print{html .list-inline,html[data-netbox-color-mode=dark] .list-inline,html[data-netbox-color-mode=light] .list-inline{padding-left:0;list-style:none}}@media print{html .list-inline-item,html[data-netbox-color-mode=dark] .list-inline-item,html[data-netbox-color-mode=light] .list-inline-item{display:inline-block}html .list-inline-item:not(:last-child),html[data-netbox-color-mode=dark] .list-inline-item:not(:last-child),html[data-netbox-color-mode=light] .list-inline-item:not(:last-child){margin-right:.5rem}}@media print{html .initialism,html[data-netbox-color-mode=dark] .initialism,html[data-netbox-color-mode=light] .initialism{font-size:.875em;text-transform:uppercase}}@media print{html .blockquote,html[data-netbox-color-mode=dark] .blockquote,html[data-netbox-color-mode=light] .blockquote{margin-bottom:1rem;font-size:1.25rem}html .blockquote>:last-child,html[data-netbox-color-mode=dark] .blockquote>:last-child,html[data-netbox-color-mode=light] .blockquote>:last-child{margin-bottom:0}}@media print{html .blockquote-footer,html[data-netbox-color-mode=dark] .blockquote-footer,html[data-netbox-color-mode=light] .blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}html .blockquote-footer:before,html[data-netbox-color-mode=dark] .blockquote-footer:before,html[data-netbox-color-mode=light] .blockquote-footer:before{content:"\2014\a0"}}@media print{html .img-fluid,html[data-netbox-color-mode=dark] .img-fluid,html[data-netbox-color-mode=light] .img-fluid{max-width:100%;height:auto}}@media print{html .img-thumbnail,html[data-netbox-color-mode=dark] .img-thumbnail,html[data-netbox-color-mode=light] .img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.375rem;max-width:100%;height:auto}}@media print{html .figure,html[data-netbox-color-mode=dark] .figure,html[data-netbox-color-mode=light] .figure{display:inline-block}}@media print{html .figure-img,html[data-netbox-color-mode=dark] .figure-img,html[data-netbox-color-mode=light] .figure-img{margin-bottom:.5rem;line-height:1}}@media print{html .figure-caption,html[data-netbox-color-mode=dark] .figure-caption,html[data-netbox-color-mode=light] .figure-caption{font-size:.875em;color:#6c757d}}@media print{html .container,html .container-fluid,html .container-xxl,html[data-netbox-color-mode=dark] .container-xxl,html[data-netbox-color-mode=light] .container-xxl,html .container-xl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=light] .container-xl,html .container-lg,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=light] .container-lg,html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=dark] .container-fluid,html[data-netbox-color-mode=light] .container,html[data-netbox-color-mode=light] .container-fluid{width:100%;padding-right:var(--bs-gutter-x, .75rem);padding-left:var(--bs-gutter-x, .75rem);margin-right:auto;margin-left:auto}}@media print and (min-width: 576px){html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:540px}}@media print and (min-width: 768px){html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:720px}}@media print and (min-width: 992px){html .container-lg,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=light] .container-lg,html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:960px}}@media print and (min-width: 1200px){html .container-xl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=light] .container-xl,html .container-lg,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=light] .container-lg,html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:1140px}}@media print and (min-width: 1400px){html .container-xxl,html[data-netbox-color-mode=dark] .container-xxl,html[data-netbox-color-mode=light] .container-xxl,html .container-xl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=light] .container-xl,html .container-lg,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=light] .container-lg,html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:1320px}}@media print{html .row,html[data-netbox-color-mode=dark] .row,html[data-netbox-color-mode=light] .row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}html .row>*,html[data-netbox-color-mode=dark] .row>*,html[data-netbox-color-mode=light] .row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}}@media print{html .col,html[data-netbox-color-mode=dark] .col,html[data-netbox-color-mode=light] .col{flex:1 0 0%}}@media print{html .row-cols-auto>*,html[data-netbox-color-mode=dark] .row-cols-auto>*,html[data-netbox-color-mode=light] .row-cols-auto>*{flex:0 0 auto;width:auto}}@media print{html .row-cols-1>*,html[data-netbox-color-mode=dark] .row-cols-1>*,html[data-netbox-color-mode=light] .row-cols-1>*{flex:0 0 auto;width:100%}}@media print{html .row-cols-2>*,html[data-netbox-color-mode=dark] .row-cols-2>*,html[data-netbox-color-mode=light] .row-cols-2>*{flex:0 0 auto;width:50%}}@media print{html .row-cols-3>*,html[data-netbox-color-mode=dark] .row-cols-3>*,html[data-netbox-color-mode=light] .row-cols-3>*{flex:0 0 auto;width:33.3333333333%}}@media print{html .row-cols-4>*,html[data-netbox-color-mode=dark] .row-cols-4>*,html[data-netbox-color-mode=light] .row-cols-4>*{flex:0 0 auto;width:25%}}@media print{html .row-cols-5>*,html[data-netbox-color-mode=dark] .row-cols-5>*,html[data-netbox-color-mode=light] .row-cols-5>*{flex:0 0 auto;width:20%}}@media print{html .row-cols-6>*,html[data-netbox-color-mode=dark] .row-cols-6>*,html[data-netbox-color-mode=light] .row-cols-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 576px){html .col-sm,html[data-netbox-color-mode=dark] .col-sm,html[data-netbox-color-mode=light] .col-sm{flex:1 0 0%}html .row-cols-sm-auto>*,html[data-netbox-color-mode=dark] .row-cols-sm-auto>*,html[data-netbox-color-mode=light] .row-cols-sm-auto>*{flex:0 0 auto;width:auto}html .row-cols-sm-1>*,html[data-netbox-color-mode=dark] .row-cols-sm-1>*,html[data-netbox-color-mode=light] .row-cols-sm-1>*{flex:0 0 auto;width:100%}html .row-cols-sm-2>*,html[data-netbox-color-mode=dark] .row-cols-sm-2>*,html[data-netbox-color-mode=light] .row-cols-sm-2>*{flex:0 0 auto;width:50%}html .row-cols-sm-3>*,html[data-netbox-color-mode=dark] .row-cols-sm-3>*,html[data-netbox-color-mode=light] .row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-sm-4>*,html[data-netbox-color-mode=dark] .row-cols-sm-4>*,html[data-netbox-color-mode=light] .row-cols-sm-4>*{flex:0 0 auto;width:25%}html .row-cols-sm-5>*,html[data-netbox-color-mode=dark] .row-cols-sm-5>*,html[data-netbox-color-mode=light] .row-cols-sm-5>*{flex:0 0 auto;width:20%}html .row-cols-sm-6>*,html[data-netbox-color-mode=dark] .row-cols-sm-6>*,html[data-netbox-color-mode=light] .row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 768px){html .col-md,html[data-netbox-color-mode=dark] .col-md,html[data-netbox-color-mode=light] .col-md{flex:1 0 0%}html .row-cols-md-auto>*,html[data-netbox-color-mode=dark] .row-cols-md-auto>*,html[data-netbox-color-mode=light] .row-cols-md-auto>*{flex:0 0 auto;width:auto}html .row-cols-md-1>*,html[data-netbox-color-mode=dark] .row-cols-md-1>*,html[data-netbox-color-mode=light] .row-cols-md-1>*{flex:0 0 auto;width:100%}html .row-cols-md-2>*,html[data-netbox-color-mode=dark] .row-cols-md-2>*,html[data-netbox-color-mode=light] .row-cols-md-2>*{flex:0 0 auto;width:50%}html .row-cols-md-3>*,html[data-netbox-color-mode=dark] .row-cols-md-3>*,html[data-netbox-color-mode=light] .row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-md-4>*,html[data-netbox-color-mode=dark] .row-cols-md-4>*,html[data-netbox-color-mode=light] .row-cols-md-4>*{flex:0 0 auto;width:25%}html .row-cols-md-5>*,html[data-netbox-color-mode=dark] .row-cols-md-5>*,html[data-netbox-color-mode=light] .row-cols-md-5>*{flex:0 0 auto;width:20%}html .row-cols-md-6>*,html[data-netbox-color-mode=dark] .row-cols-md-6>*,html[data-netbox-color-mode=light] .row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 992px){html .col-lg,html[data-netbox-color-mode=dark] .col-lg,html[data-netbox-color-mode=light] .col-lg{flex:1 0 0%}html .row-cols-lg-auto>*,html[data-netbox-color-mode=dark] .row-cols-lg-auto>*,html[data-netbox-color-mode=light] .row-cols-lg-auto>*{flex:0 0 auto;width:auto}html .row-cols-lg-1>*,html[data-netbox-color-mode=dark] .row-cols-lg-1>*,html[data-netbox-color-mode=light] .row-cols-lg-1>*{flex:0 0 auto;width:100%}html .row-cols-lg-2>*,html[data-netbox-color-mode=dark] .row-cols-lg-2>*,html[data-netbox-color-mode=light] .row-cols-lg-2>*{flex:0 0 auto;width:50%}html .row-cols-lg-3>*,html[data-netbox-color-mode=dark] .row-cols-lg-3>*,html[data-netbox-color-mode=light] .row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-lg-4>*,html[data-netbox-color-mode=dark] .row-cols-lg-4>*,html[data-netbox-color-mode=light] .row-cols-lg-4>*{flex:0 0 auto;width:25%}html .row-cols-lg-5>*,html[data-netbox-color-mode=dark] .row-cols-lg-5>*,html[data-netbox-color-mode=light] .row-cols-lg-5>*{flex:0 0 auto;width:20%}html .row-cols-lg-6>*,html[data-netbox-color-mode=dark] .row-cols-lg-6>*,html[data-netbox-color-mode=light] .row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 1200px){html .col-xl,html[data-netbox-color-mode=dark] .col-xl,html[data-netbox-color-mode=light] .col-xl{flex:1 0 0%}html .row-cols-xl-auto>*,html[data-netbox-color-mode=dark] .row-cols-xl-auto>*,html[data-netbox-color-mode=light] .row-cols-xl-auto>*{flex:0 0 auto;width:auto}html .row-cols-xl-1>*,html[data-netbox-color-mode=dark] .row-cols-xl-1>*,html[data-netbox-color-mode=light] .row-cols-xl-1>*{flex:0 0 auto;width:100%}html .row-cols-xl-2>*,html[data-netbox-color-mode=dark] .row-cols-xl-2>*,html[data-netbox-color-mode=light] .row-cols-xl-2>*{flex:0 0 auto;width:50%}html .row-cols-xl-3>*,html[data-netbox-color-mode=dark] .row-cols-xl-3>*,html[data-netbox-color-mode=light] .row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-xl-4>*,html[data-netbox-color-mode=dark] .row-cols-xl-4>*,html[data-netbox-color-mode=light] .row-cols-xl-4>*{flex:0 0 auto;width:25%}html .row-cols-xl-5>*,html[data-netbox-color-mode=dark] .row-cols-xl-5>*,html[data-netbox-color-mode=light] .row-cols-xl-5>*{flex:0 0 auto;width:20%}html .row-cols-xl-6>*,html[data-netbox-color-mode=dark] .row-cols-xl-6>*,html[data-netbox-color-mode=light] .row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 1400px){html .col-xxl,html[data-netbox-color-mode=dark] .col-xxl,html[data-netbox-color-mode=light] .col-xxl{flex:1 0 0%}html .row-cols-xxl-auto>*,html[data-netbox-color-mode=dark] .row-cols-xxl-auto>*,html[data-netbox-color-mode=light] .row-cols-xxl-auto>*{flex:0 0 auto;width:auto}html .row-cols-xxl-1>*,html[data-netbox-color-mode=dark] .row-cols-xxl-1>*,html[data-netbox-color-mode=light] .row-cols-xxl-1>*{flex:0 0 auto;width:100%}html .row-cols-xxl-2>*,html[data-netbox-color-mode=dark] .row-cols-xxl-2>*,html[data-netbox-color-mode=light] .row-cols-xxl-2>*{flex:0 0 auto;width:50%}html .row-cols-xxl-3>*,html[data-netbox-color-mode=dark] .row-cols-xxl-3>*,html[data-netbox-color-mode=light] .row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-xxl-4>*,html[data-netbox-color-mode=dark] .row-cols-xxl-4>*,html[data-netbox-color-mode=light] .row-cols-xxl-4>*{flex:0 0 auto;width:25%}html .row-cols-xxl-5>*,html[data-netbox-color-mode=dark] .row-cols-xxl-5>*,html[data-netbox-color-mode=light] .row-cols-xxl-5>*{flex:0 0 auto;width:20%}html .row-cols-xxl-6>*,html[data-netbox-color-mode=dark] .row-cols-xxl-6>*,html[data-netbox-color-mode=light] .row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}@media print{html .col-auto,html[data-netbox-color-mode=dark] .col-auto,html[data-netbox-color-mode=light] .col-auto{flex:0 0 auto;width:auto}}@media print{html .col-1,html[data-netbox-color-mode=dark] .col-1,html[data-netbox-color-mode=light] .col-1{flex:0 0 auto;width:8.33333333%}}@media print{html .col-2,html[data-netbox-color-mode=dark] .col-2,html[data-netbox-color-mode=light] .col-2{flex:0 0 auto;width:16.66666667%}}@media print{html .col-3,html[data-netbox-color-mode=dark] .col-3,html[data-netbox-color-mode=light] .col-3{flex:0 0 auto;width:25%}}@media print{html .col-4,html[data-netbox-color-mode=dark] .col-4,html[data-netbox-color-mode=light] .col-4{flex:0 0 auto;width:33.33333333%}}@media print{html .col-5,html[data-netbox-color-mode=dark] .col-5,html[data-netbox-color-mode=light] .col-5{flex:0 0 auto;width:41.66666667%}}@media print{html .col-6,html[data-netbox-color-mode=dark] .col-6,html[data-netbox-color-mode=light] .col-6{flex:0 0 auto;width:50%}}@media print{html .col-7,html[data-netbox-color-mode=dark] .col-7,html[data-netbox-color-mode=light] .col-7{flex:0 0 auto;width:58.33333333%}}@media print{html .col-8,html[data-netbox-color-mode=dark] .col-8,html[data-netbox-color-mode=light] .col-8{flex:0 0 auto;width:66.66666667%}}@media print{html .col-9,html[data-netbox-color-mode=dark] .col-9,html[data-netbox-color-mode=light] .col-9{flex:0 0 auto;width:75%}}@media print{html .col-10,html[data-netbox-color-mode=dark] .col-10,html[data-netbox-color-mode=light] .col-10{flex:0 0 auto;width:83.33333333%}}@media print{html .col-11,html[data-netbox-color-mode=dark] .col-11,html[data-netbox-color-mode=light] .col-11{flex:0 0 auto;width:91.66666667%}}@media print{html .col-12,html[data-netbox-color-mode=dark] .col-12,html[data-netbox-color-mode=light] .col-12{flex:0 0 auto;width:100%}}@media print{html .offset-1,html[data-netbox-color-mode=dark] .offset-1,html[data-netbox-color-mode=light] .offset-1{margin-left:8.33333333%}}@media print{html .offset-2,html[data-netbox-color-mode=dark] .offset-2,html[data-netbox-color-mode=light] .offset-2{margin-left:16.66666667%}}@media print{html .offset-3,html[data-netbox-color-mode=dark] .offset-3,html[data-netbox-color-mode=light] .offset-3{margin-left:25%}}@media print{html .offset-4,html[data-netbox-color-mode=dark] .offset-4,html[data-netbox-color-mode=light] .offset-4{margin-left:33.33333333%}}@media print{html .offset-5,html[data-netbox-color-mode=dark] .offset-5,html[data-netbox-color-mode=light] .offset-5{margin-left:41.66666667%}}@media print{html .offset-6,html[data-netbox-color-mode=dark] .offset-6,html[data-netbox-color-mode=light] .offset-6{margin-left:50%}}@media print{html .offset-7,html[data-netbox-color-mode=dark] .offset-7,html[data-netbox-color-mode=light] .offset-7{margin-left:58.33333333%}}@media print{html .offset-8,html[data-netbox-color-mode=dark] .offset-8,html[data-netbox-color-mode=light] .offset-8{margin-left:66.66666667%}}@media print{html .offset-9,html[data-netbox-color-mode=dark] .offset-9,html[data-netbox-color-mode=light] .offset-9{margin-left:75%}}@media print{html .offset-10,html[data-netbox-color-mode=dark] .offset-10,html[data-netbox-color-mode=light] .offset-10{margin-left:83.33333333%}}@media print{html .offset-11,html[data-netbox-color-mode=dark] .offset-11,html[data-netbox-color-mode=light] .offset-11{margin-left:91.66666667%}}@media print{html .g-0,html .gx-0,html[data-netbox-color-mode=dark] .g-0,html[data-netbox-color-mode=dark] .gx-0,html[data-netbox-color-mode=light] .g-0,html[data-netbox-color-mode=light] .gx-0{--bs-gutter-x: 0}}@media print{html .g-0,html .gy-0,html[data-netbox-color-mode=dark] .g-0,html[data-netbox-color-mode=dark] .gy-0,html[data-netbox-color-mode=light] .g-0,html[data-netbox-color-mode=light] .gy-0{--bs-gutter-y: 0}}@media print{html .g-1,html .gx-1,html[data-netbox-color-mode=dark] .g-1,html[data-netbox-color-mode=dark] .gx-1,html[data-netbox-color-mode=light] .g-1,html[data-netbox-color-mode=light] .gx-1{--bs-gutter-x: .25rem}}@media print{html .g-1,html .gy-1,html[data-netbox-color-mode=dark] .g-1,html[data-netbox-color-mode=dark] .gy-1,html[data-netbox-color-mode=light] .g-1,html[data-netbox-color-mode=light] .gy-1{--bs-gutter-y: .25rem}}@media print{html .g-2,html .gx-2,html[data-netbox-color-mode=dark] .g-2,html[data-netbox-color-mode=dark] .gx-2,html[data-netbox-color-mode=light] .g-2,html[data-netbox-color-mode=light] .gx-2{--bs-gutter-x: .5rem}}@media print{html .g-2,html .gy-2,html[data-netbox-color-mode=dark] .g-2,html[data-netbox-color-mode=dark] .gy-2,html[data-netbox-color-mode=light] .g-2,html[data-netbox-color-mode=light] .gy-2{--bs-gutter-y: .5rem}}@media print{html .g-3,html .gx-3,html[data-netbox-color-mode=dark] .g-3,html[data-netbox-color-mode=dark] .gx-3,html[data-netbox-color-mode=light] .g-3,html[data-netbox-color-mode=light] .gx-3{--bs-gutter-x: 1rem}}@media print{html .g-3,html .gy-3,html[data-netbox-color-mode=dark] .g-3,html[data-netbox-color-mode=dark] .gy-3,html[data-netbox-color-mode=light] .g-3,html[data-netbox-color-mode=light] .gy-3{--bs-gutter-y: 1rem}}@media print{html .g-4,html .gx-4,html[data-netbox-color-mode=dark] .g-4,html[data-netbox-color-mode=dark] .gx-4,html[data-netbox-color-mode=light] .g-4,html[data-netbox-color-mode=light] .gx-4{--bs-gutter-x: 1.5rem}}@media print{html .g-4,html .gy-4,html[data-netbox-color-mode=dark] .g-4,html[data-netbox-color-mode=dark] .gy-4,html[data-netbox-color-mode=light] .g-4,html[data-netbox-color-mode=light] .gy-4{--bs-gutter-y: 1.5rem}}@media print{html .g-5,html .gx-5,html[data-netbox-color-mode=dark] .g-5,html[data-netbox-color-mode=dark] .gx-5,html[data-netbox-color-mode=light] .g-5,html[data-netbox-color-mode=light] .gx-5{--bs-gutter-x: 3rem}}@media print{html .g-5,html .gy-5,html[data-netbox-color-mode=dark] .g-5,html[data-netbox-color-mode=dark] .gy-5,html[data-netbox-color-mode=light] .g-5,html[data-netbox-color-mode=light] .gy-5{--bs-gutter-y: 3rem}}@media print and (min-width: 576px){html .col-sm-auto,html[data-netbox-color-mode=dark] .col-sm-auto,html[data-netbox-color-mode=light] .col-sm-auto{flex:0 0 auto;width:auto}html .col-sm-1,html[data-netbox-color-mode=dark] .col-sm-1,html[data-netbox-color-mode=light] .col-sm-1{flex:0 0 auto;width:8.33333333%}html .col-sm-2,html[data-netbox-color-mode=dark] .col-sm-2,html[data-netbox-color-mode=light] .col-sm-2{flex:0 0 auto;width:16.66666667%}html .col-sm-3,html[data-netbox-color-mode=dark] .col-sm-3,html[data-netbox-color-mode=light] .col-sm-3{flex:0 0 auto;width:25%}html .col-sm-4,html[data-netbox-color-mode=dark] .col-sm-4,html[data-netbox-color-mode=light] .col-sm-4{flex:0 0 auto;width:33.33333333%}html .col-sm-5,html[data-netbox-color-mode=dark] .col-sm-5,html[data-netbox-color-mode=light] .col-sm-5{flex:0 0 auto;width:41.66666667%}html .col-sm-6,html[data-netbox-color-mode=dark] .col-sm-6,html[data-netbox-color-mode=light] .col-sm-6{flex:0 0 auto;width:50%}html .col-sm-7,html[data-netbox-color-mode=dark] .col-sm-7,html[data-netbox-color-mode=light] .col-sm-7{flex:0 0 auto;width:58.33333333%}html .col-sm-8,html[data-netbox-color-mode=dark] .col-sm-8,html[data-netbox-color-mode=light] .col-sm-8{flex:0 0 auto;width:66.66666667%}html .col-sm-9,html[data-netbox-color-mode=dark] .col-sm-9,html[data-netbox-color-mode=light] .col-sm-9{flex:0 0 auto;width:75%}html .col-sm-10,html[data-netbox-color-mode=dark] .col-sm-10,html[data-netbox-color-mode=light] .col-sm-10{flex:0 0 auto;width:83.33333333%}html .col-sm-11,html[data-netbox-color-mode=dark] .col-sm-11,html[data-netbox-color-mode=light] .col-sm-11{flex:0 0 auto;width:91.66666667%}html .col-sm-12,html[data-netbox-color-mode=dark] .col-sm-12,html[data-netbox-color-mode=light] .col-sm-12{flex:0 0 auto;width:100%}html .offset-sm-0,html[data-netbox-color-mode=dark] .offset-sm-0,html[data-netbox-color-mode=light] .offset-sm-0{margin-left:0}html .offset-sm-1,html[data-netbox-color-mode=dark] .offset-sm-1,html[data-netbox-color-mode=light] .offset-sm-1{margin-left:8.33333333%}html .offset-sm-2,html[data-netbox-color-mode=dark] .offset-sm-2,html[data-netbox-color-mode=light] .offset-sm-2{margin-left:16.66666667%}html .offset-sm-3,html[data-netbox-color-mode=dark] .offset-sm-3,html[data-netbox-color-mode=light] .offset-sm-3{margin-left:25%}html .offset-sm-4,html[data-netbox-color-mode=dark] .offset-sm-4,html[data-netbox-color-mode=light] .offset-sm-4{margin-left:33.33333333%}html .offset-sm-5,html[data-netbox-color-mode=dark] .offset-sm-5,html[data-netbox-color-mode=light] .offset-sm-5{margin-left:41.66666667%}html .offset-sm-6,html[data-netbox-color-mode=dark] .offset-sm-6,html[data-netbox-color-mode=light] .offset-sm-6{margin-left:50%}html .offset-sm-7,html[data-netbox-color-mode=dark] .offset-sm-7,html[data-netbox-color-mode=light] .offset-sm-7{margin-left:58.33333333%}html .offset-sm-8,html[data-netbox-color-mode=dark] .offset-sm-8,html[data-netbox-color-mode=light] .offset-sm-8{margin-left:66.66666667%}html .offset-sm-9,html[data-netbox-color-mode=dark] .offset-sm-9,html[data-netbox-color-mode=light] .offset-sm-9{margin-left:75%}html .offset-sm-10,html[data-netbox-color-mode=dark] .offset-sm-10,html[data-netbox-color-mode=light] .offset-sm-10{margin-left:83.33333333%}html .offset-sm-11,html[data-netbox-color-mode=dark] .offset-sm-11,html[data-netbox-color-mode=light] .offset-sm-11{margin-left:91.66666667%}html .g-sm-0,html .gx-sm-0,html[data-netbox-color-mode=dark] .g-sm-0,html[data-netbox-color-mode=dark] .gx-sm-0,html[data-netbox-color-mode=light] .g-sm-0,html[data-netbox-color-mode=light] .gx-sm-0{--bs-gutter-x: 0}html .g-sm-0,html .gy-sm-0,html[data-netbox-color-mode=dark] .g-sm-0,html[data-netbox-color-mode=dark] .gy-sm-0,html[data-netbox-color-mode=light] .g-sm-0,html[data-netbox-color-mode=light] .gy-sm-0{--bs-gutter-y: 0}html .g-sm-1,html .gx-sm-1,html[data-netbox-color-mode=dark] .g-sm-1,html[data-netbox-color-mode=dark] .gx-sm-1,html[data-netbox-color-mode=light] .g-sm-1,html[data-netbox-color-mode=light] .gx-sm-1{--bs-gutter-x: .25rem}html .g-sm-1,html .gy-sm-1,html[data-netbox-color-mode=dark] .g-sm-1,html[data-netbox-color-mode=dark] .gy-sm-1,html[data-netbox-color-mode=light] .g-sm-1,html[data-netbox-color-mode=light] .gy-sm-1{--bs-gutter-y: .25rem}html .g-sm-2,html .gx-sm-2,html[data-netbox-color-mode=dark] .g-sm-2,html[data-netbox-color-mode=dark] .gx-sm-2,html[data-netbox-color-mode=light] .g-sm-2,html[data-netbox-color-mode=light] .gx-sm-2{--bs-gutter-x: .5rem}html .g-sm-2,html .gy-sm-2,html[data-netbox-color-mode=dark] .g-sm-2,html[data-netbox-color-mode=dark] .gy-sm-2,html[data-netbox-color-mode=light] .g-sm-2,html[data-netbox-color-mode=light] .gy-sm-2{--bs-gutter-y: .5rem}html .g-sm-3,html .gx-sm-3,html[data-netbox-color-mode=dark] .g-sm-3,html[data-netbox-color-mode=dark] .gx-sm-3,html[data-netbox-color-mode=light] .g-sm-3,html[data-netbox-color-mode=light] .gx-sm-3{--bs-gutter-x: 1rem}html .g-sm-3,html .gy-sm-3,html[data-netbox-color-mode=dark] .g-sm-3,html[data-netbox-color-mode=dark] .gy-sm-3,html[data-netbox-color-mode=light] .g-sm-3,html[data-netbox-color-mode=light] .gy-sm-3{--bs-gutter-y: 1rem}html .g-sm-4,html .gx-sm-4,html[data-netbox-color-mode=dark] .g-sm-4,html[data-netbox-color-mode=dark] .gx-sm-4,html[data-netbox-color-mode=light] .g-sm-4,html[data-netbox-color-mode=light] .gx-sm-4{--bs-gutter-x: 1.5rem}html .g-sm-4,html .gy-sm-4,html[data-netbox-color-mode=dark] .g-sm-4,html[data-netbox-color-mode=dark] .gy-sm-4,html[data-netbox-color-mode=light] .g-sm-4,html[data-netbox-color-mode=light] .gy-sm-4{--bs-gutter-y: 1.5rem}html .g-sm-5,html .gx-sm-5,html[data-netbox-color-mode=dark] .g-sm-5,html[data-netbox-color-mode=dark] .gx-sm-5,html[data-netbox-color-mode=light] .g-sm-5,html[data-netbox-color-mode=light] .gx-sm-5{--bs-gutter-x: 3rem}html .g-sm-5,html .gy-sm-5,html[data-netbox-color-mode=dark] .g-sm-5,html[data-netbox-color-mode=dark] .gy-sm-5,html[data-netbox-color-mode=light] .g-sm-5,html[data-netbox-color-mode=light] .gy-sm-5{--bs-gutter-y: 3rem}}@media print and (min-width: 768px){html .col-md-auto,html[data-netbox-color-mode=dark] .col-md-auto,html[data-netbox-color-mode=light] .col-md-auto{flex:0 0 auto;width:auto}html .col-md-1,html[data-netbox-color-mode=dark] .col-md-1,html[data-netbox-color-mode=light] .col-md-1{flex:0 0 auto;width:8.33333333%}html .col-md-2,html[data-netbox-color-mode=dark] .col-md-2,html[data-netbox-color-mode=light] .col-md-2{flex:0 0 auto;width:16.66666667%}html .col-md-3,html[data-netbox-color-mode=dark] .col-md-3,html[data-netbox-color-mode=light] .col-md-3{flex:0 0 auto;width:25%}html .col-md-4,html[data-netbox-color-mode=dark] .col-md-4,html[data-netbox-color-mode=light] .col-md-4{flex:0 0 auto;width:33.33333333%}html .col-md-5,html[data-netbox-color-mode=dark] .col-md-5,html[data-netbox-color-mode=light] .col-md-5{flex:0 0 auto;width:41.66666667%}html .col-md-6,html[data-netbox-color-mode=dark] .col-md-6,html[data-netbox-color-mode=light] .col-md-6{flex:0 0 auto;width:50%}html .col-md-7,html[data-netbox-color-mode=dark] .col-md-7,html[data-netbox-color-mode=light] .col-md-7{flex:0 0 auto;width:58.33333333%}html .col-md-8,html[data-netbox-color-mode=dark] .col-md-8,html[data-netbox-color-mode=light] .col-md-8{flex:0 0 auto;width:66.66666667%}html .col-md-9,html[data-netbox-color-mode=dark] .col-md-9,html[data-netbox-color-mode=light] .col-md-9{flex:0 0 auto;width:75%}html .col-md-10,html[data-netbox-color-mode=dark] .col-md-10,html[data-netbox-color-mode=light] .col-md-10{flex:0 0 auto;width:83.33333333%}html .col-md-11,html[data-netbox-color-mode=dark] .col-md-11,html[data-netbox-color-mode=light] .col-md-11{flex:0 0 auto;width:91.66666667%}html .col-md-12,html[data-netbox-color-mode=dark] .col-md-12,html[data-netbox-color-mode=light] .col-md-12{flex:0 0 auto;width:100%}html .offset-md-0,html[data-netbox-color-mode=dark] .offset-md-0,html[data-netbox-color-mode=light] .offset-md-0{margin-left:0}html .offset-md-1,html[data-netbox-color-mode=dark] .offset-md-1,html[data-netbox-color-mode=light] .offset-md-1{margin-left:8.33333333%}html .offset-md-2,html[data-netbox-color-mode=dark] .offset-md-2,html[data-netbox-color-mode=light] .offset-md-2{margin-left:16.66666667%}html .offset-md-3,html[data-netbox-color-mode=dark] .offset-md-3,html[data-netbox-color-mode=light] .offset-md-3{margin-left:25%}html .offset-md-4,html[data-netbox-color-mode=dark] .offset-md-4,html[data-netbox-color-mode=light] .offset-md-4{margin-left:33.33333333%}html .offset-md-5,html[data-netbox-color-mode=dark] .offset-md-5,html[data-netbox-color-mode=light] .offset-md-5{margin-left:41.66666667%}html .offset-md-6,html[data-netbox-color-mode=dark] .offset-md-6,html[data-netbox-color-mode=light] .offset-md-6{margin-left:50%}html .offset-md-7,html[data-netbox-color-mode=dark] .offset-md-7,html[data-netbox-color-mode=light] .offset-md-7{margin-left:58.33333333%}html .offset-md-8,html[data-netbox-color-mode=dark] .offset-md-8,html[data-netbox-color-mode=light] .offset-md-8{margin-left:66.66666667%}html .offset-md-9,html[data-netbox-color-mode=dark] .offset-md-9,html[data-netbox-color-mode=light] .offset-md-9{margin-left:75%}html .offset-md-10,html[data-netbox-color-mode=dark] .offset-md-10,html[data-netbox-color-mode=light] .offset-md-10{margin-left:83.33333333%}html .offset-md-11,html[data-netbox-color-mode=dark] .offset-md-11,html[data-netbox-color-mode=light] .offset-md-11{margin-left:91.66666667%}html .g-md-0,html .gx-md-0,html[data-netbox-color-mode=dark] .g-md-0,html[data-netbox-color-mode=dark] .gx-md-0,html[data-netbox-color-mode=light] .g-md-0,html[data-netbox-color-mode=light] .gx-md-0{--bs-gutter-x: 0}html .g-md-0,html .gy-md-0,html[data-netbox-color-mode=dark] .g-md-0,html[data-netbox-color-mode=dark] .gy-md-0,html[data-netbox-color-mode=light] .g-md-0,html[data-netbox-color-mode=light] .gy-md-0{--bs-gutter-y: 0}html .g-md-1,html .gx-md-1,html[data-netbox-color-mode=dark] .g-md-1,html[data-netbox-color-mode=dark] .gx-md-1,html[data-netbox-color-mode=light] .g-md-1,html[data-netbox-color-mode=light] .gx-md-1{--bs-gutter-x: .25rem}html .g-md-1,html .gy-md-1,html[data-netbox-color-mode=dark] .g-md-1,html[data-netbox-color-mode=dark] .gy-md-1,html[data-netbox-color-mode=light] .g-md-1,html[data-netbox-color-mode=light] .gy-md-1{--bs-gutter-y: .25rem}html .g-md-2,html .gx-md-2,html[data-netbox-color-mode=dark] .g-md-2,html[data-netbox-color-mode=dark] .gx-md-2,html[data-netbox-color-mode=light] .g-md-2,html[data-netbox-color-mode=light] .gx-md-2{--bs-gutter-x: .5rem}html .g-md-2,html .gy-md-2,html[data-netbox-color-mode=dark] .g-md-2,html[data-netbox-color-mode=dark] .gy-md-2,html[data-netbox-color-mode=light] .g-md-2,html[data-netbox-color-mode=light] .gy-md-2{--bs-gutter-y: .5rem}html .g-md-3,html .gx-md-3,html[data-netbox-color-mode=dark] .g-md-3,html[data-netbox-color-mode=dark] .gx-md-3,html[data-netbox-color-mode=light] .g-md-3,html[data-netbox-color-mode=light] .gx-md-3{--bs-gutter-x: 1rem}html .g-md-3,html .gy-md-3,html[data-netbox-color-mode=dark] .g-md-3,html[data-netbox-color-mode=dark] .gy-md-3,html[data-netbox-color-mode=light] .g-md-3,html[data-netbox-color-mode=light] .gy-md-3{--bs-gutter-y: 1rem}html .g-md-4,html .gx-md-4,html[data-netbox-color-mode=dark] .g-md-4,html[data-netbox-color-mode=dark] .gx-md-4,html[data-netbox-color-mode=light] .g-md-4,html[data-netbox-color-mode=light] .gx-md-4{--bs-gutter-x: 1.5rem}html .g-md-4,html .gy-md-4,html[data-netbox-color-mode=dark] .g-md-4,html[data-netbox-color-mode=dark] .gy-md-4,html[data-netbox-color-mode=light] .g-md-4,html[data-netbox-color-mode=light] .gy-md-4{--bs-gutter-y: 1.5rem}html .g-md-5,html .gx-md-5,html[data-netbox-color-mode=dark] .g-md-5,html[data-netbox-color-mode=dark] .gx-md-5,html[data-netbox-color-mode=light] .g-md-5,html[data-netbox-color-mode=light] .gx-md-5{--bs-gutter-x: 3rem}html .g-md-5,html .gy-md-5,html[data-netbox-color-mode=dark] .g-md-5,html[data-netbox-color-mode=dark] .gy-md-5,html[data-netbox-color-mode=light] .g-md-5,html[data-netbox-color-mode=light] .gy-md-5{--bs-gutter-y: 3rem}}@media print and (min-width: 992px){html .col-lg-auto,html[data-netbox-color-mode=dark] .col-lg-auto,html[data-netbox-color-mode=light] .col-lg-auto{flex:0 0 auto;width:auto}html .col-lg-1,html[data-netbox-color-mode=dark] .col-lg-1,html[data-netbox-color-mode=light] .col-lg-1{flex:0 0 auto;width:8.33333333%}html .col-lg-2,html[data-netbox-color-mode=dark] .col-lg-2,html[data-netbox-color-mode=light] .col-lg-2{flex:0 0 auto;width:16.66666667%}html .col-lg-3,html[data-netbox-color-mode=dark] .col-lg-3,html[data-netbox-color-mode=light] .col-lg-3{flex:0 0 auto;width:25%}html .col-lg-4,html[data-netbox-color-mode=dark] .col-lg-4,html[data-netbox-color-mode=light] .col-lg-4{flex:0 0 auto;width:33.33333333%}html .col-lg-5,html[data-netbox-color-mode=dark] .col-lg-5,html[data-netbox-color-mode=light] .col-lg-5{flex:0 0 auto;width:41.66666667%}html .col-lg-6,html[data-netbox-color-mode=dark] .col-lg-6,html[data-netbox-color-mode=light] .col-lg-6{flex:0 0 auto;width:50%}html .col-lg-7,html[data-netbox-color-mode=dark] .col-lg-7,html[data-netbox-color-mode=light] .col-lg-7{flex:0 0 auto;width:58.33333333%}html .col-lg-8,html[data-netbox-color-mode=dark] .col-lg-8,html[data-netbox-color-mode=light] .col-lg-8{flex:0 0 auto;width:66.66666667%}html .col-lg-9,html[data-netbox-color-mode=dark] .col-lg-9,html[data-netbox-color-mode=light] .col-lg-9{flex:0 0 auto;width:75%}html .col-lg-10,html[data-netbox-color-mode=dark] .col-lg-10,html[data-netbox-color-mode=light] .col-lg-10{flex:0 0 auto;width:83.33333333%}html .col-lg-11,html[data-netbox-color-mode=dark] .col-lg-11,html[data-netbox-color-mode=light] .col-lg-11{flex:0 0 auto;width:91.66666667%}html .col-lg-12,html[data-netbox-color-mode=dark] .col-lg-12,html[data-netbox-color-mode=light] .col-lg-12{flex:0 0 auto;width:100%}html .offset-lg-0,html[data-netbox-color-mode=dark] .offset-lg-0,html[data-netbox-color-mode=light] .offset-lg-0{margin-left:0}html .offset-lg-1,html[data-netbox-color-mode=dark] .offset-lg-1,html[data-netbox-color-mode=light] .offset-lg-1{margin-left:8.33333333%}html .offset-lg-2,html[data-netbox-color-mode=dark] .offset-lg-2,html[data-netbox-color-mode=light] .offset-lg-2{margin-left:16.66666667%}html .offset-lg-3,html[data-netbox-color-mode=dark] .offset-lg-3,html[data-netbox-color-mode=light] .offset-lg-3{margin-left:25%}html .offset-lg-4,html[data-netbox-color-mode=dark] .offset-lg-4,html[data-netbox-color-mode=light] .offset-lg-4{margin-left:33.33333333%}html .offset-lg-5,html[data-netbox-color-mode=dark] .offset-lg-5,html[data-netbox-color-mode=light] .offset-lg-5{margin-left:41.66666667%}html .offset-lg-6,html[data-netbox-color-mode=dark] .offset-lg-6,html[data-netbox-color-mode=light] .offset-lg-6{margin-left:50%}html .offset-lg-7,html[data-netbox-color-mode=dark] .offset-lg-7,html[data-netbox-color-mode=light] .offset-lg-7{margin-left:58.33333333%}html .offset-lg-8,html[data-netbox-color-mode=dark] .offset-lg-8,html[data-netbox-color-mode=light] .offset-lg-8{margin-left:66.66666667%}html .offset-lg-9,html[data-netbox-color-mode=dark] .offset-lg-9,html[data-netbox-color-mode=light] .offset-lg-9{margin-left:75%}html .offset-lg-10,html[data-netbox-color-mode=dark] .offset-lg-10,html[data-netbox-color-mode=light] .offset-lg-10{margin-left:83.33333333%}html .offset-lg-11,html[data-netbox-color-mode=dark] .offset-lg-11,html[data-netbox-color-mode=light] .offset-lg-11{margin-left:91.66666667%}html .g-lg-0,html .gx-lg-0,html[data-netbox-color-mode=dark] .g-lg-0,html[data-netbox-color-mode=dark] .gx-lg-0,html[data-netbox-color-mode=light] .g-lg-0,html[data-netbox-color-mode=light] .gx-lg-0{--bs-gutter-x: 0}html .g-lg-0,html .gy-lg-0,html[data-netbox-color-mode=dark] .g-lg-0,html[data-netbox-color-mode=dark] .gy-lg-0,html[data-netbox-color-mode=light] .g-lg-0,html[data-netbox-color-mode=light] .gy-lg-0{--bs-gutter-y: 0}html .g-lg-1,html .gx-lg-1,html[data-netbox-color-mode=dark] .g-lg-1,html[data-netbox-color-mode=dark] .gx-lg-1,html[data-netbox-color-mode=light] .g-lg-1,html[data-netbox-color-mode=light] .gx-lg-1{--bs-gutter-x: .25rem}html .g-lg-1,html .gy-lg-1,html[data-netbox-color-mode=dark] .g-lg-1,html[data-netbox-color-mode=dark] .gy-lg-1,html[data-netbox-color-mode=light] .g-lg-1,html[data-netbox-color-mode=light] .gy-lg-1{--bs-gutter-y: .25rem}html .g-lg-2,html .gx-lg-2,html[data-netbox-color-mode=dark] .g-lg-2,html[data-netbox-color-mode=dark] .gx-lg-2,html[data-netbox-color-mode=light] .g-lg-2,html[data-netbox-color-mode=light] .gx-lg-2{--bs-gutter-x: .5rem}html .g-lg-2,html .gy-lg-2,html[data-netbox-color-mode=dark] .g-lg-2,html[data-netbox-color-mode=dark] .gy-lg-2,html[data-netbox-color-mode=light] .g-lg-2,html[data-netbox-color-mode=light] .gy-lg-2{--bs-gutter-y: .5rem}html .g-lg-3,html .gx-lg-3,html[data-netbox-color-mode=dark] .g-lg-3,html[data-netbox-color-mode=dark] .gx-lg-3,html[data-netbox-color-mode=light] .g-lg-3,html[data-netbox-color-mode=light] .gx-lg-3{--bs-gutter-x: 1rem}html .g-lg-3,html .gy-lg-3,html[data-netbox-color-mode=dark] .g-lg-3,html[data-netbox-color-mode=dark] .gy-lg-3,html[data-netbox-color-mode=light] .g-lg-3,html[data-netbox-color-mode=light] .gy-lg-3{--bs-gutter-y: 1rem}html .g-lg-4,html .gx-lg-4,html[data-netbox-color-mode=dark] .g-lg-4,html[data-netbox-color-mode=dark] .gx-lg-4,html[data-netbox-color-mode=light] .g-lg-4,html[data-netbox-color-mode=light] .gx-lg-4{--bs-gutter-x: 1.5rem}html .g-lg-4,html .gy-lg-4,html[data-netbox-color-mode=dark] .g-lg-4,html[data-netbox-color-mode=dark] .gy-lg-4,html[data-netbox-color-mode=light] .g-lg-4,html[data-netbox-color-mode=light] .gy-lg-4{--bs-gutter-y: 1.5rem}html .g-lg-5,html .gx-lg-5,html[data-netbox-color-mode=dark] .g-lg-5,html[data-netbox-color-mode=dark] .gx-lg-5,html[data-netbox-color-mode=light] .g-lg-5,html[data-netbox-color-mode=light] .gx-lg-5{--bs-gutter-x: 3rem}html .g-lg-5,html .gy-lg-5,html[data-netbox-color-mode=dark] .g-lg-5,html[data-netbox-color-mode=dark] .gy-lg-5,html[data-netbox-color-mode=light] .g-lg-5,html[data-netbox-color-mode=light] .gy-lg-5{--bs-gutter-y: 3rem}}@media print and (min-width: 1200px){html .col-xl-auto,html[data-netbox-color-mode=dark] .col-xl-auto,html[data-netbox-color-mode=light] .col-xl-auto{flex:0 0 auto;width:auto}html .col-xl-1,html[data-netbox-color-mode=dark] .col-xl-1,html[data-netbox-color-mode=light] .col-xl-1{flex:0 0 auto;width:8.33333333%}html .col-xl-2,html[data-netbox-color-mode=dark] .col-xl-2,html[data-netbox-color-mode=light] .col-xl-2{flex:0 0 auto;width:16.66666667%}html .col-xl-3,html[data-netbox-color-mode=dark] .col-xl-3,html[data-netbox-color-mode=light] .col-xl-3{flex:0 0 auto;width:25%}html .col-xl-4,html[data-netbox-color-mode=dark] .col-xl-4,html[data-netbox-color-mode=light] .col-xl-4{flex:0 0 auto;width:33.33333333%}html .col-xl-5,html[data-netbox-color-mode=dark] .col-xl-5,html[data-netbox-color-mode=light] .col-xl-5{flex:0 0 auto;width:41.66666667%}html .col-xl-6,html[data-netbox-color-mode=dark] .col-xl-6,html[data-netbox-color-mode=light] .col-xl-6{flex:0 0 auto;width:50%}html .col-xl-7,html[data-netbox-color-mode=dark] .col-xl-7,html[data-netbox-color-mode=light] .col-xl-7{flex:0 0 auto;width:58.33333333%}html .col-xl-8,html[data-netbox-color-mode=dark] .col-xl-8,html[data-netbox-color-mode=light] .col-xl-8{flex:0 0 auto;width:66.66666667%}html .col-xl-9,html[data-netbox-color-mode=dark] .col-xl-9,html[data-netbox-color-mode=light] .col-xl-9{flex:0 0 auto;width:75%}html .col-xl-10,html[data-netbox-color-mode=dark] .col-xl-10,html[data-netbox-color-mode=light] .col-xl-10{flex:0 0 auto;width:83.33333333%}html .col-xl-11,html[data-netbox-color-mode=dark] .col-xl-11,html[data-netbox-color-mode=light] .col-xl-11{flex:0 0 auto;width:91.66666667%}html .col-xl-12,html[data-netbox-color-mode=dark] .col-xl-12,html[data-netbox-color-mode=light] .col-xl-12{flex:0 0 auto;width:100%}html .offset-xl-0,html[data-netbox-color-mode=dark] .offset-xl-0,html[data-netbox-color-mode=light] .offset-xl-0{margin-left:0}html .offset-xl-1,html[data-netbox-color-mode=dark] .offset-xl-1,html[data-netbox-color-mode=light] .offset-xl-1{margin-left:8.33333333%}html .offset-xl-2,html[data-netbox-color-mode=dark] .offset-xl-2,html[data-netbox-color-mode=light] .offset-xl-2{margin-left:16.66666667%}html .offset-xl-3,html[data-netbox-color-mode=dark] .offset-xl-3,html[data-netbox-color-mode=light] .offset-xl-3{margin-left:25%}html .offset-xl-4,html[data-netbox-color-mode=dark] .offset-xl-4,html[data-netbox-color-mode=light] .offset-xl-4{margin-left:33.33333333%}html .offset-xl-5,html[data-netbox-color-mode=dark] .offset-xl-5,html[data-netbox-color-mode=light] .offset-xl-5{margin-left:41.66666667%}html .offset-xl-6,html[data-netbox-color-mode=dark] .offset-xl-6,html[data-netbox-color-mode=light] .offset-xl-6{margin-left:50%}html .offset-xl-7,html[data-netbox-color-mode=dark] .offset-xl-7,html[data-netbox-color-mode=light] .offset-xl-7{margin-left:58.33333333%}html .offset-xl-8,html[data-netbox-color-mode=dark] .offset-xl-8,html[data-netbox-color-mode=light] .offset-xl-8{margin-left:66.66666667%}html .offset-xl-9,html[data-netbox-color-mode=dark] .offset-xl-9,html[data-netbox-color-mode=light] .offset-xl-9{margin-left:75%}html .offset-xl-10,html[data-netbox-color-mode=dark] .offset-xl-10,html[data-netbox-color-mode=light] .offset-xl-10{margin-left:83.33333333%}html .offset-xl-11,html[data-netbox-color-mode=dark] .offset-xl-11,html[data-netbox-color-mode=light] .offset-xl-11{margin-left:91.66666667%}html .g-xl-0,html .gx-xl-0,html[data-netbox-color-mode=dark] .g-xl-0,html[data-netbox-color-mode=dark] .gx-xl-0,html[data-netbox-color-mode=light] .g-xl-0,html[data-netbox-color-mode=light] .gx-xl-0{--bs-gutter-x: 0}html .g-xl-0,html .gy-xl-0,html[data-netbox-color-mode=dark] .g-xl-0,html[data-netbox-color-mode=dark] .gy-xl-0,html[data-netbox-color-mode=light] .g-xl-0,html[data-netbox-color-mode=light] .gy-xl-0{--bs-gutter-y: 0}html .g-xl-1,html .gx-xl-1,html[data-netbox-color-mode=dark] .g-xl-1,html[data-netbox-color-mode=dark] .gx-xl-1,html[data-netbox-color-mode=light] .g-xl-1,html[data-netbox-color-mode=light] .gx-xl-1{--bs-gutter-x: .25rem}html .g-xl-1,html .gy-xl-1,html[data-netbox-color-mode=dark] .g-xl-1,html[data-netbox-color-mode=dark] .gy-xl-1,html[data-netbox-color-mode=light] .g-xl-1,html[data-netbox-color-mode=light] .gy-xl-1{--bs-gutter-y: .25rem}html .g-xl-2,html .gx-xl-2,html[data-netbox-color-mode=dark] .g-xl-2,html[data-netbox-color-mode=dark] .gx-xl-2,html[data-netbox-color-mode=light] .g-xl-2,html[data-netbox-color-mode=light] .gx-xl-2{--bs-gutter-x: .5rem}html .g-xl-2,html .gy-xl-2,html[data-netbox-color-mode=dark] .g-xl-2,html[data-netbox-color-mode=dark] .gy-xl-2,html[data-netbox-color-mode=light] .g-xl-2,html[data-netbox-color-mode=light] .gy-xl-2{--bs-gutter-y: .5rem}html .g-xl-3,html .gx-xl-3,html[data-netbox-color-mode=dark] .g-xl-3,html[data-netbox-color-mode=dark] .gx-xl-3,html[data-netbox-color-mode=light] .g-xl-3,html[data-netbox-color-mode=light] .gx-xl-3{--bs-gutter-x: 1rem}html .g-xl-3,html .gy-xl-3,html[data-netbox-color-mode=dark] .g-xl-3,html[data-netbox-color-mode=dark] .gy-xl-3,html[data-netbox-color-mode=light] .g-xl-3,html[data-netbox-color-mode=light] .gy-xl-3{--bs-gutter-y: 1rem}html .g-xl-4,html .gx-xl-4,html[data-netbox-color-mode=dark] .g-xl-4,html[data-netbox-color-mode=dark] .gx-xl-4,html[data-netbox-color-mode=light] .g-xl-4,html[data-netbox-color-mode=light] .gx-xl-4{--bs-gutter-x: 1.5rem}html .g-xl-4,html .gy-xl-4,html[data-netbox-color-mode=dark] .g-xl-4,html[data-netbox-color-mode=dark] .gy-xl-4,html[data-netbox-color-mode=light] .g-xl-4,html[data-netbox-color-mode=light] .gy-xl-4{--bs-gutter-y: 1.5rem}html .g-xl-5,html .gx-xl-5,html[data-netbox-color-mode=dark] .g-xl-5,html[data-netbox-color-mode=dark] .gx-xl-5,html[data-netbox-color-mode=light] .g-xl-5,html[data-netbox-color-mode=light] .gx-xl-5{--bs-gutter-x: 3rem}html .g-xl-5,html .gy-xl-5,html[data-netbox-color-mode=dark] .g-xl-5,html[data-netbox-color-mode=dark] .gy-xl-5,html[data-netbox-color-mode=light] .g-xl-5,html[data-netbox-color-mode=light] .gy-xl-5{--bs-gutter-y: 3rem}}@media print and (min-width: 1400px){html .col-xxl-auto,html[data-netbox-color-mode=dark] .col-xxl-auto,html[data-netbox-color-mode=light] .col-xxl-auto{flex:0 0 auto;width:auto}html .col-xxl-1,html[data-netbox-color-mode=dark] .col-xxl-1,html[data-netbox-color-mode=light] .col-xxl-1{flex:0 0 auto;width:8.33333333%}html .col-xxl-2,html[data-netbox-color-mode=dark] .col-xxl-2,html[data-netbox-color-mode=light] .col-xxl-2{flex:0 0 auto;width:16.66666667%}html .col-xxl-3,html[data-netbox-color-mode=dark] .col-xxl-3,html[data-netbox-color-mode=light] .col-xxl-3{flex:0 0 auto;width:25%}html .col-xxl-4,html[data-netbox-color-mode=dark] .col-xxl-4,html[data-netbox-color-mode=light] .col-xxl-4{flex:0 0 auto;width:33.33333333%}html .col-xxl-5,html[data-netbox-color-mode=dark] .col-xxl-5,html[data-netbox-color-mode=light] .col-xxl-5{flex:0 0 auto;width:41.66666667%}html .col-xxl-6,html[data-netbox-color-mode=dark] .col-xxl-6,html[data-netbox-color-mode=light] .col-xxl-6{flex:0 0 auto;width:50%}html .col-xxl-7,html[data-netbox-color-mode=dark] .col-xxl-7,html[data-netbox-color-mode=light] .col-xxl-7{flex:0 0 auto;width:58.33333333%}html .col-xxl-8,html[data-netbox-color-mode=dark] .col-xxl-8,html[data-netbox-color-mode=light] .col-xxl-8{flex:0 0 auto;width:66.66666667%}html .col-xxl-9,html[data-netbox-color-mode=dark] .col-xxl-9,html[data-netbox-color-mode=light] .col-xxl-9{flex:0 0 auto;width:75%}html .col-xxl-10,html[data-netbox-color-mode=dark] .col-xxl-10,html[data-netbox-color-mode=light] .col-xxl-10{flex:0 0 auto;width:83.33333333%}html .col-xxl-11,html[data-netbox-color-mode=dark] .col-xxl-11,html[data-netbox-color-mode=light] .col-xxl-11{flex:0 0 auto;width:91.66666667%}html .col-xxl-12,html[data-netbox-color-mode=dark] .col-xxl-12,html[data-netbox-color-mode=light] .col-xxl-12{flex:0 0 auto;width:100%}html .offset-xxl-0,html[data-netbox-color-mode=dark] .offset-xxl-0,html[data-netbox-color-mode=light] .offset-xxl-0{margin-left:0}html .offset-xxl-1,html[data-netbox-color-mode=dark] .offset-xxl-1,html[data-netbox-color-mode=light] .offset-xxl-1{margin-left:8.33333333%}html .offset-xxl-2,html[data-netbox-color-mode=dark] .offset-xxl-2,html[data-netbox-color-mode=light] .offset-xxl-2{margin-left:16.66666667%}html .offset-xxl-3,html[data-netbox-color-mode=dark] .offset-xxl-3,html[data-netbox-color-mode=light] .offset-xxl-3{margin-left:25%}html .offset-xxl-4,html[data-netbox-color-mode=dark] .offset-xxl-4,html[data-netbox-color-mode=light] .offset-xxl-4{margin-left:33.33333333%}html .offset-xxl-5,html[data-netbox-color-mode=dark] .offset-xxl-5,html[data-netbox-color-mode=light] .offset-xxl-5{margin-left:41.66666667%}html .offset-xxl-6,html[data-netbox-color-mode=dark] .offset-xxl-6,html[data-netbox-color-mode=light] .offset-xxl-6{margin-left:50%}html .offset-xxl-7,html[data-netbox-color-mode=dark] .offset-xxl-7,html[data-netbox-color-mode=light] .offset-xxl-7{margin-left:58.33333333%}html .offset-xxl-8,html[data-netbox-color-mode=dark] .offset-xxl-8,html[data-netbox-color-mode=light] .offset-xxl-8{margin-left:66.66666667%}html .offset-xxl-9,html[data-netbox-color-mode=dark] .offset-xxl-9,html[data-netbox-color-mode=light] .offset-xxl-9{margin-left:75%}html .offset-xxl-10,html[data-netbox-color-mode=dark] .offset-xxl-10,html[data-netbox-color-mode=light] .offset-xxl-10{margin-left:83.33333333%}html .offset-xxl-11,html[data-netbox-color-mode=dark] .offset-xxl-11,html[data-netbox-color-mode=light] .offset-xxl-11{margin-left:91.66666667%}html .g-xxl-0,html .gx-xxl-0,html[data-netbox-color-mode=dark] .g-xxl-0,html[data-netbox-color-mode=dark] .gx-xxl-0,html[data-netbox-color-mode=light] .g-xxl-0,html[data-netbox-color-mode=light] .gx-xxl-0{--bs-gutter-x: 0}html .g-xxl-0,html .gy-xxl-0,html[data-netbox-color-mode=dark] .g-xxl-0,html[data-netbox-color-mode=dark] .gy-xxl-0,html[data-netbox-color-mode=light] .g-xxl-0,html[data-netbox-color-mode=light] .gy-xxl-0{--bs-gutter-y: 0}html .g-xxl-1,html .gx-xxl-1,html[data-netbox-color-mode=dark] .g-xxl-1,html[data-netbox-color-mode=dark] .gx-xxl-1,html[data-netbox-color-mode=light] .g-xxl-1,html[data-netbox-color-mode=light] .gx-xxl-1{--bs-gutter-x: .25rem}html .g-xxl-1,html .gy-xxl-1,html[data-netbox-color-mode=dark] .g-xxl-1,html[data-netbox-color-mode=dark] .gy-xxl-1,html[data-netbox-color-mode=light] .g-xxl-1,html[data-netbox-color-mode=light] .gy-xxl-1{--bs-gutter-y: .25rem}html .g-xxl-2,html .gx-xxl-2,html[data-netbox-color-mode=dark] .g-xxl-2,html[data-netbox-color-mode=dark] .gx-xxl-2,html[data-netbox-color-mode=light] .g-xxl-2,html[data-netbox-color-mode=light] .gx-xxl-2{--bs-gutter-x: .5rem}html .g-xxl-2,html .gy-xxl-2,html[data-netbox-color-mode=dark] .g-xxl-2,html[data-netbox-color-mode=dark] .gy-xxl-2,html[data-netbox-color-mode=light] .g-xxl-2,html[data-netbox-color-mode=light] .gy-xxl-2{--bs-gutter-y: .5rem}html .g-xxl-3,html .gx-xxl-3,html[data-netbox-color-mode=dark] .g-xxl-3,html[data-netbox-color-mode=dark] .gx-xxl-3,html[data-netbox-color-mode=light] .g-xxl-3,html[data-netbox-color-mode=light] .gx-xxl-3{--bs-gutter-x: 1rem}html .g-xxl-3,html .gy-xxl-3,html[data-netbox-color-mode=dark] .g-xxl-3,html[data-netbox-color-mode=dark] .gy-xxl-3,html[data-netbox-color-mode=light] .g-xxl-3,html[data-netbox-color-mode=light] .gy-xxl-3{--bs-gutter-y: 1rem}html .g-xxl-4,html .gx-xxl-4,html[data-netbox-color-mode=dark] .g-xxl-4,html[data-netbox-color-mode=dark] .gx-xxl-4,html[data-netbox-color-mode=light] .g-xxl-4,html[data-netbox-color-mode=light] .gx-xxl-4{--bs-gutter-x: 1.5rem}html .g-xxl-4,html .gy-xxl-4,html[data-netbox-color-mode=dark] .g-xxl-4,html[data-netbox-color-mode=dark] .gy-xxl-4,html[data-netbox-color-mode=light] .g-xxl-4,html[data-netbox-color-mode=light] .gy-xxl-4{--bs-gutter-y: 1.5rem}html .g-xxl-5,html .gx-xxl-5,html[data-netbox-color-mode=dark] .g-xxl-5,html[data-netbox-color-mode=dark] .gx-xxl-5,html[data-netbox-color-mode=light] .g-xxl-5,html[data-netbox-color-mode=light] .gx-xxl-5{--bs-gutter-x: 3rem}html .g-xxl-5,html .gy-xxl-5,html[data-netbox-color-mode=dark] .g-xxl-5,html[data-netbox-color-mode=dark] .gy-xxl-5,html[data-netbox-color-mode=light] .g-xxl-5,html[data-netbox-color-mode=light] .gy-xxl-5{--bs-gutter-y: 3rem}}@media print{html .table,html[data-netbox-color-mode=dark] .table,html[data-netbox-color-mode=light] .table{--bs-table-bg: transparent;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, .05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, .1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, .075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}html .table>:not(caption)>*>*,html[data-netbox-color-mode=dark] .table>:not(caption)>*>*,html[data-netbox-color-mode=light] .table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}html .table>tbody,html[data-netbox-color-mode=dark] .table>tbody,html[data-netbox-color-mode=light] .table>tbody{vertical-align:inherit}html .table>thead,html[data-netbox-color-mode=dark] .table>thead,html[data-netbox-color-mode=light] .table>thead{vertical-align:bottom}html .table>:not(:last-child)>:last-child>*,html[data-netbox-color-mode=dark] .table>:not(:last-child)>:last-child>*,html[data-netbox-color-mode=light] .table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}}@media print{html .caption-top,html[data-netbox-color-mode=dark] .caption-top,html[data-netbox-color-mode=light] .caption-top{caption-side:top}}@media print{html .table-sm>:not(caption)>*>*,html[data-netbox-color-mode=dark] .table-sm>:not(caption)>*>*,html[data-netbox-color-mode=light] .table-sm>:not(caption)>*>*{padding:.25rem}}@media print{html .table-bordered>:not(caption)>*,html[data-netbox-color-mode=dark] .table-bordered>:not(caption)>*,html[data-netbox-color-mode=light] .table-bordered>:not(caption)>*{border-width:1px 0}html .table-bordered>:not(caption)>*>*,html[data-netbox-color-mode=dark] .table-bordered>:not(caption)>*>*,html[data-netbox-color-mode=light] .table-bordered>:not(caption)>*>*{border-width:0 1px}}@media print{html .table-borderless>:not(caption)>*>*,html[data-netbox-color-mode=dark] .table-borderless>:not(caption)>*>*,html[data-netbox-color-mode=light] .table-borderless>:not(caption)>*>*{border-bottom-width:0}}@media print{html .table-striped>tbody>tr:nth-of-type(odd),html[data-netbox-color-mode=dark] .table-striped>tbody>tr:nth-of-type(odd),html[data-netbox-color-mode=light] .table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}}@media print{html .table-active,html[data-netbox-color-mode=dark] .table-active,html[data-netbox-color-mode=light] .table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}}@media print{html .table-hover>tbody>tr:hover,html[data-netbox-color-mode=dark] .table-hover>tbody>tr:hover,html[data-netbox-color-mode=light] .table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}}@media print{html .table-primary,html[data-netbox-color-mode=dark] .table-primary,html[data-netbox-color-mode=light] .table-primary{--bs-table-bg: #cfe2ff;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:#000;border-color:#bacbe6}}@media print{html .table-secondary,html[data-netbox-color-mode=dark] .table-secondary,html[data-netbox-color-mode=light] .table-secondary{--bs-table-bg: #e2e3e5;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:#000;border-color:#cbccce}}@media print{html .table-success,html[data-netbox-color-mode=dark] .table-success,html[data-netbox-color-mode=light] .table-success{--bs-table-bg: #d1e7dd;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:#000;border-color:#bcd0c7}}@media print{html .table-info,html[data-netbox-color-mode=dark] .table-info,html[data-netbox-color-mode=light] .table-info{--bs-table-bg: #cff4fc;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:#000;border-color:#badce3}}@media print{html .table-warning,html[data-netbox-color-mode=dark] .table-warning,html[data-netbox-color-mode=light] .table-warning{--bs-table-bg: #fff3cd;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:#000;border-color:#e6dbb9}}@media print{html .table-danger,html[data-netbox-color-mode=dark] .table-danger,html[data-netbox-color-mode=light] .table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}}@media print{html .table-light,html[data-netbox-color-mode=dark] .table-light,html[data-netbox-color-mode=light] .table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}}@media print{html .table-dark,html[data-netbox-color-mode=dark] .table-dark,html[data-netbox-color-mode=light] .table-dark{--bs-table-bg: #212529;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:#fff;border-color:#373b3e}}@media print{html .table-responsive,html[data-netbox-color-mode=dark] .table-responsive,html[data-netbox-color-mode=light] .table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 575.98px){html .table-responsive-sm,html[data-netbox-color-mode=dark] .table-responsive-sm,html[data-netbox-color-mode=light] .table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 767.98px){html .table-responsive-md,html[data-netbox-color-mode=dark] .table-responsive-md,html[data-netbox-color-mode=light] .table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 991.98px){html .table-responsive-lg,html[data-netbox-color-mode=dark] .table-responsive-lg,html[data-netbox-color-mode=light] .table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 1199.98px){html .table-responsive-xl,html[data-netbox-color-mode=dark] .table-responsive-xl,html[data-netbox-color-mode=light] .table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 1399.98px){html .table-responsive-xxl,html[data-netbox-color-mode=dark] .table-responsive-xxl,html[data-netbox-color-mode=light] .table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print{html .form-label,html[data-netbox-color-mode=dark] .form-label,html[data-netbox-color-mode=light] .form-label{margin-bottom:.5rem}}@media print{html .col-form-label,html[data-netbox-color-mode=dark] .col-form-label,html[data-netbox-color-mode=light] .col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}}@media print{html .col-form-label-lg,html[data-netbox-color-mode=dark] .col-form-label-lg,html[data-netbox-color-mode=light] .col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}}@media print{html .col-form-label-sm,html[data-netbox-color-mode=dark] .col-form-label-sm,html[data-netbox-color-mode=light] .col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}}@media print{html .form-text,html[data-netbox-color-mode=dark] .form-text,html[data-netbox-color-mode=light] .form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}}@media print{html .form-control,html[data-netbox-color-mode=dark] .form-control,html[data-netbox-color-mode=light] .form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #e9ecef;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .form-control,html[data-netbox-color-mode=dark] .form-control,html[data-netbox-color-mode=light] .form-control{transition:none}}@media print{html .form-control[type=file],html[data-netbox-color-mode=dark] .form-control[type=file],html[data-netbox-color-mode=light] .form-control[type=file]{overflow:hidden}html .form-control[type=file]:not(:disabled):not([readonly]),html[data-netbox-color-mode=dark] .form-control[type=file]:not(:disabled):not([readonly]),html[data-netbox-color-mode=light] .form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}}@media print{html .form-control:focus,html[data-netbox-color-mode=dark] .form-control:focus,html[data-netbox-color-mode=light] .form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .form-control::-webkit-date-and-time-value,html[data-netbox-color-mode=dark] .form-control::-webkit-date-and-time-value,html[data-netbox-color-mode=light] .form-control::-webkit-date-and-time-value{height:1.5em}}@media print{html .form-control::placeholder,html[data-netbox-color-mode=dark] .form-control::placeholder,html[data-netbox-color-mode=light] .form-control::placeholder{color:#adb5bd;opacity:1}}@media print{html .form-control:disabled,html .form-control[readonly],html[data-netbox-color-mode=dark] .form-control:disabled,html[data-netbox-color-mode=dark] .form-control[readonly],html[data-netbox-color-mode=light] .form-control:disabled,html[data-netbox-color-mode=light] .form-control[readonly]{background-color:#e9ecef;opacity:1}}@media print{html .form-control::file-selector-button,html[data-netbox-color-mode=dark] .form-control::file-selector-button,html[data-netbox-color-mode=light] .form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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 print and (prefers-reduced-motion: reduce){html .form-control::file-selector-button,html[data-netbox-color-mode=dark] .form-control::file-selector-button,html[data-netbox-color-mode=light] .form-control::file-selector-button{transition:none}}@media print{html .form-control:hover:not(:disabled):not([readonly])::file-selector-button,html[data-netbox-color-mode=dark] .form-control:hover:not(:disabled):not([readonly])::file-selector-button,html[data-netbox-color-mode=light] .form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}}@media print{html .form-control::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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 print and (prefers-reduced-motion: reduce){html .form-control::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control::-webkit-file-upload-button{transition:none}}@media print{html .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}}@media print{html .form-control-plaintext,html[data-netbox-color-mode=dark] .form-control-plaintext,html[data-netbox-color-mode=light] .form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}html .form-control-plaintext.form-control-sm,html .form-control-plaintext.form-control-lg,html[data-netbox-color-mode=dark] .form-control-plaintext.form-control-sm,html[data-netbox-color-mode=dark] .form-control-plaintext.form-control-lg,html[data-netbox-color-mode=light] .form-control-plaintext.form-control-sm,html[data-netbox-color-mode=light] .form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}}@media print{html .form-control-sm,html[data-netbox-color-mode=dark] .form-control-sm,html[data-netbox-color-mode=light] .form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html .form-control-sm::file-selector-button,html[data-netbox-color-mode=dark] .form-control-sm::file-selector-button,html[data-netbox-color-mode=light] .form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}html .form-control-sm::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control-sm::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}}@media print{html .form-control-lg,html[data-netbox-color-mode=dark] .form-control-lg,html[data-netbox-color-mode=light] .form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}html .form-control-lg::file-selector-button,html[data-netbox-color-mode=dark] .form-control-lg::file-selector-button,html[data-netbox-color-mode=light] .form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}html .form-control-lg::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control-lg::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}}@media print{html textarea.form-control,html[data-netbox-color-mode=dark] textarea.form-control,html[data-netbox-color-mode=light] textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}html textarea.form-control-sm,html[data-netbox-color-mode=dark] textarea.form-control-sm,html[data-netbox-color-mode=light] textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}html textarea.form-control-lg,html[data-netbox-color-mode=dark] textarea.form-control-lg,html[data-netbox-color-mode=light] textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}}@media print{html .form-control-color,html[data-netbox-color-mode=dark] .form-control-color,html[data-netbox-color-mode=light] .form-control-color{max-width:3rem;height:auto;padding:.375rem}html .form-control-color:not(:disabled):not([readonly]),html[data-netbox-color-mode=dark] .form-control-color:not(:disabled):not([readonly]),html[data-netbox-color-mode=light] .form-control-color:not(:disabled):not([readonly]){cursor:pointer}html .form-control-color::-moz-color-swatch,html[data-netbox-color-mode=dark] .form-control-color::-moz-color-swatch,html[data-netbox-color-mode=light] .form-control-color::-moz-color-swatch{height:1.5em;border-radius:.375rem}html .form-control-color::-webkit-color-swatch,html[data-netbox-color-mode=dark] .form-control-color::-webkit-color-swatch,html[data-netbox-color-mode=light] .form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.375rem}}@media print{html .form-select,html[data-netbox-color-mode=dark] .form-select,html[data-netbox-color-mode=light] .form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}}@media print and (prefers-reduced-motion: reduce){html .form-select,html[data-netbox-color-mode=dark] .form-select,html[data-netbox-color-mode=light] .form-select{transition:none}}@media print{html .form-select:focus,html[data-netbox-color-mode=dark] .form-select:focus,html[data-netbox-color-mode=light] .form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .form-select[multiple],html .form-select[size]:not([size="1"]),html[data-netbox-color-mode=dark] .form-select[multiple],html[data-netbox-color-mode=dark] .form-select[size]:not([size="1"]),html[data-netbox-color-mode=light] .form-select[multiple],html[data-netbox-color-mode=light] .form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}}@media print{html .form-select:disabled,html[data-netbox-color-mode=dark] .form-select:disabled,html[data-netbox-color-mode=light] .form-select:disabled{color:#6c757d;background-color:#e9ecef}}@media print{html .form-select:-moz-focusring,html[data-netbox-color-mode=dark] .form-select:-moz-focusring,html[data-netbox-color-mode=light] .form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}}@media print{html .form-select-sm,html[data-netbox-color-mode=dark] .form-select-sm,html[data-netbox-color-mode=light] .form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}}@media print{html .form-select-lg,html[data-netbox-color-mode=dark] .form-select-lg,html[data-netbox-color-mode=light] .form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}}@media print{html .form-check,html[data-netbox-color-mode=dark] .form-check,html[data-netbox-color-mode=light] .form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}html .form-check .form-check-input,html[data-netbox-color-mode=dark] .form-check .form-check-input,html[data-netbox-color-mode=light] .form-check .form-check-input{float:left;margin-left:-1.5em}}@media print{html .form-check-input,html[data-netbox-color-mode=dark] .form-check-input,html[data-netbox-color-mode=light] .form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;color-adjust:exact}html .form-check-input[type=checkbox],html[data-netbox-color-mode=dark] .form-check-input[type=checkbox],html[data-netbox-color-mode=light] .form-check-input[type=checkbox]{border-radius:.25em}html .form-check-input[type=radio],html[data-netbox-color-mode=dark] .form-check-input[type=radio],html[data-netbox-color-mode=light] .form-check-input[type=radio]{border-radius:50%}html .form-check-input:active,html[data-netbox-color-mode=dark] .form-check-input:active,html[data-netbox-color-mode=light] .form-check-input:active{filter:brightness(90%)}html .form-check-input:focus,html[data-netbox-color-mode=dark] .form-check-input:focus,html[data-netbox-color-mode=light] .form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html .form-check-input:checked,html[data-netbox-color-mode=dark] .form-check-input:checked,html[data-netbox-color-mode=light] .form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}html .form-check-input:checked[type=checkbox],html[data-netbox-color-mode=dark] .form-check-input:checked[type=checkbox],html[data-netbox-color-mode=light] .form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}html .form-check-input:checked[type=radio],html[data-netbox-color-mode=dark] .form-check-input:checked[type=radio],html[data-netbox-color-mode=light] .form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}html .form-check-input[type=checkbox]:indeterminate,html[data-netbox-color-mode=dark] .form-check-input[type=checkbox]:indeterminate,html[data-netbox-color-mode=light] .form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}html .form-check-input:disabled,html[data-netbox-color-mode=dark] .form-check-input:disabled,html[data-netbox-color-mode=light] .form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}html .form-check-input[disabled]~.form-check-label,html .form-check-input:disabled~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input[disabled]~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input:disabled~.form-check-label,html[data-netbox-color-mode=light] .form-check-input[disabled]~.form-check-label,html[data-netbox-color-mode=light] .form-check-input:disabled~.form-check-label{opacity:.5}}@media print{html .form-switch,html[data-netbox-color-mode=dark] .form-switch,html[data-netbox-color-mode=light] .form-switch{padding-left:2.5em}html .form-switch .form-check-input,html[data-netbox-color-mode=dark] .form-switch .form-check-input,html[data-netbox-color-mode=light] .form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .form-switch .form-check-input,html[data-netbox-color-mode=dark] .form-switch .form-check-input,html[data-netbox-color-mode=light] .form-switch .form-check-input{transition:none}}@media print{html .form-switch .form-check-input:focus,html[data-netbox-color-mode=dark] .form-switch .form-check-input:focus,html[data-netbox-color-mode=light] .form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}}@media print{html .form-switch .form-check-input:checked,html[data-netbox-color-mode=dark] .form-switch .form-check-input:checked,html[data-netbox-color-mode=light] .form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}}@media print{html .form-check-inline,html[data-netbox-color-mode=dark] .form-check-inline,html[data-netbox-color-mode=light] .form-check-inline{display:inline-block;margin-right:1rem}}@media print{html .btn-check,html[data-netbox-color-mode=dark] .btn-check,html[data-netbox-color-mode=light] .btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}html .btn-check[disabled]+.btn,html .btn-check:disabled+.btn,html[data-netbox-color-mode=dark] .btn-check[disabled]+.btn,html[data-netbox-color-mode=dark] .btn-check:disabled+.btn,html[data-netbox-color-mode=light] .btn-check[disabled]+.btn,html[data-netbox-color-mode=light] .btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}}@media print{html .form-range,html[data-netbox-color-mode=dark] .form-range,html[data-netbox-color-mode=light] .form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}html .form-range:focus,html[data-netbox-color-mode=dark] .form-range:focus,html[data-netbox-color-mode=light] .form-range:focus{outline:0}html .form-range:focus::-webkit-slider-thumb,html[data-netbox-color-mode=dark] .form-range:focus::-webkit-slider-thumb,html[data-netbox-color-mode=light] .form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}html .form-range:focus::-moz-range-thumb,html[data-netbox-color-mode=dark] .form-range:focus::-moz-range-thumb,html[data-netbox-color-mode=light] .form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}html .form-range::-moz-focus-outer,html[data-netbox-color-mode=dark] .form-range::-moz-focus-outer,html[data-netbox-color-mode=light] .form-range::-moz-focus-outer{border:0}html .form-range::-webkit-slider-thumb,html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb,html[data-netbox-color-mode=light] .form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}}@media print and (prefers-reduced-motion: reduce){html .form-range::-webkit-slider-thumb,html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb,html[data-netbox-color-mode=light] .form-range::-webkit-slider-thumb{transition:none}}@media print{html .form-range::-webkit-slider-thumb:active,html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb:active,html[data-netbox-color-mode=light] .form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}}@media print{html .form-range::-webkit-slider-runnable-track,html[data-netbox-color-mode=dark] .form-range::-webkit-slider-runnable-track,html[data-netbox-color-mode=light] .form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}}@media print{html .form-range::-moz-range-thumb,html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb,html[data-netbox-color-mode=light] .form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}}@media print and (prefers-reduced-motion: reduce){html .form-range::-moz-range-thumb,html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb,html[data-netbox-color-mode=light] .form-range::-moz-range-thumb{transition:none}}@media print{html .form-range::-moz-range-thumb:active,html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb:active,html[data-netbox-color-mode=light] .form-range::-moz-range-thumb:active{background-color:#b6d4fe}}@media print{html .form-range::-moz-range-track,html[data-netbox-color-mode=dark] .form-range::-moz-range-track,html[data-netbox-color-mode=light] .form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}}@media print{html .form-range:disabled,html[data-netbox-color-mode=dark] .form-range:disabled,html[data-netbox-color-mode=light] .form-range:disabled{pointer-events:none}html .form-range:disabled::-webkit-slider-thumb,html[data-netbox-color-mode=dark] .form-range:disabled::-webkit-slider-thumb,html[data-netbox-color-mode=light] .form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}html .form-range:disabled::-moz-range-thumb,html[data-netbox-color-mode=dark] .form-range:disabled::-moz-range-thumb,html[data-netbox-color-mode=light] .form-range:disabled::-moz-range-thumb{background-color:#adb5bd}}@media print{html .form-floating,html[data-netbox-color-mode=dark] .form-floating,html[data-netbox-color-mode=light] .form-floating{position:relative}html .form-floating>.form-control,html .form-floating>.form-select,html[data-netbox-color-mode=dark] .form-floating>.form-control,html[data-netbox-color-mode=dark] .form-floating>.form-select,html[data-netbox-color-mode=light] .form-floating>.form-control,html[data-netbox-color-mode=light] .form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}html .form-floating>label,html[data-netbox-color-mode=dark] .form-floating>label,html[data-netbox-color-mode=light] .form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .form-floating>label,html[data-netbox-color-mode=dark] .form-floating>label,html[data-netbox-color-mode=light] .form-floating>label{transition:none}}@media print{html .form-floating>.form-control,html[data-netbox-color-mode=dark] .form-floating>.form-control,html[data-netbox-color-mode=light] .form-floating>.form-control{padding:1rem .75rem}html .form-floating>.form-control::placeholder,html[data-netbox-color-mode=dark] .form-floating>.form-control::placeholder,html[data-netbox-color-mode=light] .form-floating>.form-control::placeholder{color:transparent}html .form-floating>.form-control:focus,html .form-floating>.form-control:not(:placeholder-shown),html[data-netbox-color-mode=dark] .form-floating>.form-control:focus,html[data-netbox-color-mode=dark] .form-floating>.form-control:not(:placeholder-shown),html[data-netbox-color-mode=light] .form-floating>.form-control:focus,html[data-netbox-color-mode=light] .form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}html .form-floating>.form-control:-webkit-autofill,html[data-netbox-color-mode=dark] .form-floating>.form-control:-webkit-autofill,html[data-netbox-color-mode=light] .form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.form-select,html[data-netbox-color-mode=dark] .form-floating>.form-select,html[data-netbox-color-mode=light] .form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.form-control:focus~label,html .form-floating>.form-control:not(:placeholder-shown)~label,html .form-floating>.form-select~label,html[data-netbox-color-mode=dark] .form-floating>.form-control:focus~label,html[data-netbox-color-mode=dark] .form-floating>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=dark] .form-floating>.form-select~label,html[data-netbox-color-mode=light] .form-floating>.form-control:focus~label,html[data-netbox-color-mode=light] .form-floating>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=light] .form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}}@media print{html .form-floating>.form-control:-webkit-autofill~label,html[data-netbox-color-mode=dark] .form-floating>.form-control:-webkit-autofill~label,html[data-netbox-color-mode=light] .form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}}@media print{html .input-group,html[data-netbox-color-mode=dark] .input-group,html[data-netbox-color-mode=light] .input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}html .input-group>.form-control,html .input-group>.form-select,html[data-netbox-color-mode=dark] .input-group>.form-control,html[data-netbox-color-mode=dark] .input-group>.form-select,html[data-netbox-color-mode=light] .input-group>.form-control,html[data-netbox-color-mode=light] .input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}html .input-group>.form-control:focus,html .input-group>.form-select:focus,html[data-netbox-color-mode=dark] .input-group>.form-control:focus,html[data-netbox-color-mode=dark] .input-group>.form-select:focus,html[data-netbox-color-mode=light] .input-group>.form-control:focus,html[data-netbox-color-mode=light] .input-group>.form-select:focus{z-index:3}html .input-group .btn,html[data-netbox-color-mode=dark] .input-group .btn,html[data-netbox-color-mode=light] .input-group .btn{position:relative;z-index:2}html .input-group .btn:focus,html[data-netbox-color-mode=dark] .input-group .btn:focus,html[data-netbox-color-mode=light] .input-group .btn:focus{z-index:3}}@media print{html .input-group-text,html[data-netbox-color-mode=dark] .input-group-text,html[data-netbox-color-mode=light] .input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}}@media print{html .input-group-lg>.form-control,html .input-group-lg>.form-select,html .input-group-lg>.input-group-text,html .input-group-lg>.btn,html[data-netbox-color-mode=dark] .input-group-lg>.form-control,html[data-netbox-color-mode=dark] .input-group-lg>.form-select,html[data-netbox-color-mode=dark] .input-group-lg>.input-group-text,html[data-netbox-color-mode=dark] .input-group-lg>.btn,html[data-netbox-color-mode=light] .input-group-lg>.form-control,html[data-netbox-color-mode=light] .input-group-lg>.form-select,html[data-netbox-color-mode=light] .input-group-lg>.input-group-text,html[data-netbox-color-mode=light] .input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}}@media print{html .input-group-sm>.form-control,html .input-group-sm>.form-select,html .input-group-sm>.input-group-text,html .input-group-sm>.btn,html[data-netbox-color-mode=dark] .input-group-sm>.form-control,html[data-netbox-color-mode=dark] .input-group-sm>.form-select,html[data-netbox-color-mode=dark] .input-group-sm>.input-group-text,html[data-netbox-color-mode=dark] .input-group-sm>.btn,html[data-netbox-color-mode=light] .input-group-sm>.form-control,html[data-netbox-color-mode=light] .input-group-sm>.form-select,html[data-netbox-color-mode=light] .input-group-sm>.input-group-text,html[data-netbox-color-mode=light] .input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}}@media print{html .input-group-lg>.form-select,html .input-group-sm>.form-select,html[data-netbox-color-mode=dark] .input-group-lg>.form-select,html[data-netbox-color-mode=dark] .input-group-sm>.form-select,html[data-netbox-color-mode=light] .input-group-lg>.form-select,html[data-netbox-color-mode=light] .input-group-sm>.form-select{padding-right:3rem}}@media print{html .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),html .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),html[data-netbox-color-mode=dark] .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=dark] .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),html[data-netbox-color-mode=light] .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=light] .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}html .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),html .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),html[data-netbox-color-mode=dark] .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=dark] .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),html[data-netbox-color-mode=light] .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=light] .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}html .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback),html[data-netbox-color-mode=dark] .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback),html[data-netbox-color-mode=light] .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}}@media print{html .valid-feedback,html[data-netbox-color-mode=dark] .valid-feedback,html[data-netbox-color-mode=light] .valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}}@media print{html .valid-tooltip,html[data-netbox-color-mode=dark] .valid-tooltip,html[data-netbox-color-mode=light] .valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#198754e6;border-radius:.375rem}}@media print{.was-validated html:valid~.valid-feedback,.was-validated html:valid~.valid-tooltip,html.is-valid~.valid-feedback,html.is-valid~.valid-tooltip,.was-validated html[data-netbox-color-mode=dark]:valid~.valid-feedback,.was-validated html[data-netbox-color-mode=dark]:valid~.valid-tooltip,html[data-netbox-color-mode=dark].is-valid~.valid-feedback,html[data-netbox-color-mode=dark].is-valid~.valid-tooltip,.was-validated html[data-netbox-color-mode=light]:valid~.valid-feedback,.was-validated html[data-netbox-color-mode=light]:valid~.valid-tooltip,html[data-netbox-color-mode=light].is-valid~.valid-feedback,html[data-netbox-color-mode=light].is-valid~.valid-tooltip{display:block}}@media print{.was-validated html .form-control:valid,html .form-control.is-valid,.was-validated html[data-netbox-color-mode=dark] .form-control:valid,html[data-netbox-color-mode=dark] .form-control.is-valid,.was-validated html[data-netbox-color-mode=light] .form-control:valid,html[data-netbox-color-mode=light] .form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html .form-control:valid:focus,html .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .form-control:valid:focus,html[data-netbox-color-mode=dark] .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .form-control:valid:focus,html[data-netbox-color-mode=light] .form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}}@media print{.was-validated html textarea.form-control:valid,html textarea.form-control.is-valid,.was-validated html[data-netbox-color-mode=dark] textarea.form-control:valid,html[data-netbox-color-mode=dark] textarea.form-control.is-valid,.was-validated html[data-netbox-color-mode=light] textarea.form-control:valid,html[data-netbox-color-mode=light] textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}}@media print{.was-validated html .form-select:valid,html .form-select.is-valid,.was-validated html[data-netbox-color-mode=dark] .form-select:valid,html[data-netbox-color-mode=dark] .form-select.is-valid,.was-validated html[data-netbox-color-mode=light] .form-select:valid,html[data-netbox-color-mode=light] .form-select.is-valid{border-color:#198754}.was-validated html .form-select:valid:not([multiple]):not([size]),.was-validated html .form-select:valid:not([multiple])[size="1"],html .form-select.is-valid:not([multiple]):not([size]),html .form-select.is-valid:not([multiple])[size="1"],.was-validated html[data-netbox-color-mode=dark] .form-select:valid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=dark] .form-select:valid:not([multiple])[size="1"],html[data-netbox-color-mode=dark] .form-select.is-valid:not([multiple]):not([size]),html[data-netbox-color-mode=dark] .form-select.is-valid:not([multiple])[size="1"],.was-validated html[data-netbox-color-mode=light] .form-select:valid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=light] .form-select:valid:not([multiple])[size="1"],html[data-netbox-color-mode=light] .form-select.is-valid:not([multiple]):not([size]),html[data-netbox-color-mode=light] .form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html .form-select:valid:focus,html .form-select.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .form-select:valid:focus,html[data-netbox-color-mode=dark] .form-select.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .form-select:valid:focus,html[data-netbox-color-mode=light] .form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}}@media print{.was-validated html .form-check-input:valid,html .form-check-input.is-valid,.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid,html[data-netbox-color-mode=dark] .form-check-input.is-valid,.was-validated html[data-netbox-color-mode=light] .form-check-input:valid,html[data-netbox-color-mode=light] .form-check-input.is-valid{border-color:#198754}.was-validated html .form-check-input:valid:checked,html .form-check-input.is-valid:checked,.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid:checked,html[data-netbox-color-mode=dark] .form-check-input.is-valid:checked,.was-validated html[data-netbox-color-mode=light] .form-check-input:valid:checked,html[data-netbox-color-mode=light] .form-check-input.is-valid:checked{background-color:#198754}.was-validated html .form-check-input:valid:focus,html .form-check-input.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid:focus,html[data-netbox-color-mode=dark] .form-check-input.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .form-check-input:valid:focus,html[data-netbox-color-mode=light] .form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem #19875440}.was-validated html .form-check-input:valid~.form-check-label,html .form-check-input.is-valid~.form-check-label,.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input.is-valid~.form-check-label,.was-validated html[data-netbox-color-mode=light] .form-check-input:valid~.form-check-label,html[data-netbox-color-mode=light] .form-check-input.is-valid~.form-check-label{color:#198754}}@media print{html .form-check-inline .form-check-input~.valid-feedback,html[data-netbox-color-mode=dark] .form-check-inline .form-check-input~.valid-feedback,html[data-netbox-color-mode=light] .form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}}@media print{.was-validated html .input-group .form-control:valid,html .input-group .form-control.is-valid,.was-validated html .input-group .form-select:valid,html .input-group .form-select.is-valid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:valid,html[data-netbox-color-mode=dark] .input-group .form-control.is-valid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:valid,html[data-netbox-color-mode=dark] .input-group .form-select.is-valid,.was-validated html[data-netbox-color-mode=light] .input-group .form-control:valid,html[data-netbox-color-mode=light] .input-group .form-control.is-valid,.was-validated html[data-netbox-color-mode=light] .input-group .form-select:valid,html[data-netbox-color-mode=light] .input-group .form-select.is-valid{z-index:1}.was-validated html .input-group .form-control:valid:focus,html .input-group .form-control.is-valid:focus,.was-validated html .input-group .form-select:valid:focus,html .input-group .form-select.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:valid:focus,html[data-netbox-color-mode=dark] .input-group .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:valid:focus,html[data-netbox-color-mode=dark] .input-group .form-select.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .input-group .form-control:valid:focus,html[data-netbox-color-mode=light] .input-group .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .input-group .form-select:valid:focus,html[data-netbox-color-mode=light] .input-group .form-select.is-valid:focus{z-index:3}}@media print{html .invalid-feedback,html[data-netbox-color-mode=dark] .invalid-feedback,html[data-netbox-color-mode=light] .invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}}@media print{html .invalid-tooltip,html[data-netbox-color-mode=dark] .invalid-tooltip,html[data-netbox-color-mode=light] .invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#dc3545e6;border-radius:.375rem}}@media print{.was-validated html:invalid~.invalid-feedback,.was-validated html:invalid~.invalid-tooltip,html.is-invalid~.invalid-feedback,html.is-invalid~.invalid-tooltip,.was-validated html[data-netbox-color-mode=dark]:invalid~.invalid-feedback,.was-validated html[data-netbox-color-mode=dark]:invalid~.invalid-tooltip,html[data-netbox-color-mode=dark].is-invalid~.invalid-feedback,html[data-netbox-color-mode=dark].is-invalid~.invalid-tooltip,.was-validated html[data-netbox-color-mode=light]:invalid~.invalid-feedback,.was-validated html[data-netbox-color-mode=light]:invalid~.invalid-tooltip,html[data-netbox-color-mode=light].is-invalid~.invalid-feedback,html[data-netbox-color-mode=light].is-invalid~.invalid-tooltip{display:block}}@media print{.was-validated html .form-control:invalid,html .form-control.is-invalid,.was-validated html[data-netbox-color-mode=dark] .form-control:invalid,html[data-netbox-color-mode=dark] .form-control.is-invalid,.was-validated html[data-netbox-color-mode=light] .form-control:invalid,html[data-netbox-color-mode=light] .form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html .form-control:invalid:focus,html .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .form-control:invalid:focus,html[data-netbox-color-mode=dark] .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .form-control:invalid:focus,html[data-netbox-color-mode=light] .form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}}@media print{.was-validated html textarea.form-control:invalid,html textarea.form-control.is-invalid,.was-validated html[data-netbox-color-mode=dark] textarea.form-control:invalid,html[data-netbox-color-mode=dark] textarea.form-control.is-invalid,.was-validated html[data-netbox-color-mode=light] textarea.form-control:invalid,html[data-netbox-color-mode=light] textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}}@media print{.was-validated html .form-select:invalid,html .form-select.is-invalid,.was-validated html[data-netbox-color-mode=dark] .form-select:invalid,html[data-netbox-color-mode=dark] .form-select.is-invalid,.was-validated html[data-netbox-color-mode=light] .form-select:invalid,html[data-netbox-color-mode=light] .form-select.is-invalid{border-color:#dc3545}.was-validated html .form-select:invalid:not([multiple]):not([size]),.was-validated html .form-select:invalid:not([multiple])[size="1"],html .form-select.is-invalid:not([multiple]):not([size]),html .form-select.is-invalid:not([multiple])[size="1"],.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:not([multiple])[size="1"],html[data-netbox-color-mode=dark] .form-select.is-invalid:not([multiple]):not([size]),html[data-netbox-color-mode=dark] .form-select.is-invalid:not([multiple])[size="1"],.was-validated html[data-netbox-color-mode=light] .form-select:invalid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=light] .form-select:invalid:not([multiple])[size="1"],html[data-netbox-color-mode=light] .form-select.is-invalid:not([multiple]):not([size]),html[data-netbox-color-mode=light] .form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html .form-select:invalid:focus,html .form-select.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:focus,html[data-netbox-color-mode=dark] .form-select.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .form-select:invalid:focus,html[data-netbox-color-mode=light] .form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}}@media print{.was-validated html .form-check-input:invalid,html .form-check-input.is-invalid,.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid,html[data-netbox-color-mode=dark] .form-check-input.is-invalid,.was-validated html[data-netbox-color-mode=light] .form-check-input:invalid,html[data-netbox-color-mode=light] .form-check-input.is-invalid{border-color:#dc3545}.was-validated html .form-check-input:invalid:checked,html .form-check-input.is-invalid:checked,.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid:checked,html[data-netbox-color-mode=dark] .form-check-input.is-invalid:checked,.was-validated html[data-netbox-color-mode=light] .form-check-input:invalid:checked,html[data-netbox-color-mode=light] .form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated html .form-check-input:invalid:focus,html .form-check-input.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid:focus,html[data-netbox-color-mode=dark] .form-check-input.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .form-check-input:invalid:focus,html[data-netbox-color-mode=light] .form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem #dc354540}.was-validated html .form-check-input:invalid~.form-check-label,html .form-check-input.is-invalid~.form-check-label,.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input.is-invalid~.form-check-label,.was-validated html[data-netbox-color-mode=light] .form-check-input:invalid~.form-check-label,html[data-netbox-color-mode=light] .form-check-input.is-invalid~.form-check-label{color:#dc3545}}@media print{html .form-check-inline .form-check-input~.invalid-feedback,html[data-netbox-color-mode=dark] .form-check-inline .form-check-input~.invalid-feedback,html[data-netbox-color-mode=light] .form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}}@media print{.was-validated html .input-group .form-control:invalid,html .input-group .form-control.is-invalid,.was-validated html .input-group .form-select:invalid,html .input-group .form-select.is-invalid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:invalid,html[data-netbox-color-mode=dark] .input-group .form-control.is-invalid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:invalid,html[data-netbox-color-mode=dark] .input-group .form-select.is-invalid,.was-validated html[data-netbox-color-mode=light] .input-group .form-control:invalid,html[data-netbox-color-mode=light] .input-group .form-control.is-invalid,.was-validated html[data-netbox-color-mode=light] .input-group .form-select:invalid,html[data-netbox-color-mode=light] .input-group .form-select.is-invalid{z-index:2}.was-validated html .input-group .form-control:invalid:focus,html .input-group .form-control.is-invalid:focus,.was-validated html .input-group .form-select:invalid:focus,html .input-group .form-select.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:invalid:focus,html[data-netbox-color-mode=dark] .input-group .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:invalid:focus,html[data-netbox-color-mode=dark] .input-group .form-select.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .input-group .form-control:invalid:focus,html[data-netbox-color-mode=light] .input-group .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .input-group .form-select:invalid:focus,html[data-netbox-color-mode=light] .input-group .form-select.is-invalid:focus{z-index:3}}@media print{html .btn,html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=light] .btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.375rem;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 print and (prefers-reduced-motion: reduce){html .btn,html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=light] .btn{transition:none}}@media print{html .btn:hover,html[data-netbox-color-mode=dark] .btn:hover,html[data-netbox-color-mode=light] .btn:hover{color:#212529}}@media print{.btn-check:focus+html .btn,html .btn:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=dark] .btn:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn,html[data-netbox-color-mode=light] .btn:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .btn:disabled,html .btn.disabled,fieldset:disabled html .btn,html[data-netbox-color-mode=dark] .btn:disabled,html[data-netbox-color-mode=dark] .btn.disabled,fieldset:disabled html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=light] .btn:disabled,html[data-netbox-color-mode=light] .btn.disabled,fieldset:disabled html[data-netbox-color-mode=light] .btn{pointer-events:none;opacity:.65}}@media print{html .btn-primary,html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=light] .btn-primary{color:#fff;background-color:#337ab7;border-color:#337ab7}html .btn-primary:hover,html[data-netbox-color-mode=dark] .btn-primary:hover,html[data-netbox-color-mode=light] .btn-primary:hover{color:#fff;background-color:#2b689c;border-color:#296292}.btn-check:focus+html .btn-primary,html .btn-primary:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=dark] .btn-primary:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-primary,html[data-netbox-color-mode=light] .btn-primary:focus{color:#fff;background-color:#2b689c;border-color:#296292;box-shadow:0 0 0 .25rem #528ec280}.btn-check:checked+html .btn-primary,.btn-check:active+html .btn-primary,html .btn-primary:active,html .btn-primary.active,.show>html .btn-primary.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-primary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=dark] .btn-primary:active,html[data-netbox-color-mode=dark] .btn-primary.active,.show>html[data-netbox-color-mode=dark] .btn-primary.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-primary,.btn-check:active+html[data-netbox-color-mode=light] .btn-primary,html[data-netbox-color-mode=light] .btn-primary:active,html[data-netbox-color-mode=light] .btn-primary.active,.show>html[data-netbox-color-mode=light] .btn-primary.dropdown-toggle{color:#fff;background-color:#296292;border-color:#265c89}.btn-check:checked+html .btn-primary:focus,.btn-check:active+html .btn-primary:focus,html .btn-primary:active:focus,html .btn-primary.active:focus,.show>html .btn-primary.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-primary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-primary:focus,html[data-netbox-color-mode=dark] .btn-primary:active:focus,html[data-netbox-color-mode=dark] .btn-primary.active:focus,.show>html[data-netbox-color-mode=dark] .btn-primary.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-primary:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-primary:focus,html[data-netbox-color-mode=light] .btn-primary:active:focus,html[data-netbox-color-mode=light] .btn-primary.active:focus,.show>html[data-netbox-color-mode=light] .btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #528ec280}html .btn-primary:disabled,html .btn-primary.disabled,html[data-netbox-color-mode=dark] .btn-primary:disabled,html[data-netbox-color-mode=dark] .btn-primary.disabled,html[data-netbox-color-mode=light] .btn-primary:disabled,html[data-netbox-color-mode=light] .btn-primary.disabled{color:#fff;background-color:#337ab7;border-color:#337ab7}}@media print{html .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=light] .btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}html .btn-secondary:hover,html[data-netbox-color-mode=dark] .btn-secondary:hover,html[data-netbox-color-mode=light] .btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+html .btn-secondary,html .btn-secondary:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-secondary,html[data-netbox-color-mode=light] .btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem #828a9180}.btn-check:checked+html .btn-secondary,.btn-check:active+html .btn-secondary,html .btn-secondary:active,html .btn-secondary.active,.show>html .btn-secondary.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-secondary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary:active,html[data-netbox-color-mode=dark] .btn-secondary.active,.show>html[data-netbox-color-mode=dark] .btn-secondary.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-secondary,.btn-check:active+html[data-netbox-color-mode=light] .btn-secondary,html[data-netbox-color-mode=light] .btn-secondary:active,html[data-netbox-color-mode=light] .btn-secondary.active,.show>html[data-netbox-color-mode=light] .btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:checked+html .btn-secondary:focus,.btn-check:active+html .btn-secondary:focus,html .btn-secondary:active:focus,html .btn-secondary.active:focus,.show>html .btn-secondary.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-secondary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-secondary:focus,html[data-netbox-color-mode=dark] .btn-secondary:active:focus,html[data-netbox-color-mode=dark] .btn-secondary.active:focus,.show>html[data-netbox-color-mode=dark] .btn-secondary.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-secondary:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-secondary:focus,html[data-netbox-color-mode=light] .btn-secondary:active:focus,html[data-netbox-color-mode=light] .btn-secondary.active:focus,.show>html[data-netbox-color-mode=light] .btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #828a9180}html .btn-secondary:disabled,html .btn-secondary.disabled,html[data-netbox-color-mode=dark] .btn-secondary:disabled,html[data-netbox-color-mode=dark] .btn-secondary.disabled,html[data-netbox-color-mode=light] .btn-secondary:disabled,html[data-netbox-color-mode=light] .btn-secondary.disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}}@media print{html .btn-success,html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=light] .btn-success{color:#fff;background-color:#198754;border-color:#198754}html .btn-success:hover,html[data-netbox-color-mode=dark] .btn-success:hover,html[data-netbox-color-mode=light] .btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+html .btn-success,html .btn-success:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=dark] .btn-success:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-success,html[data-netbox-color-mode=light] .btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+html .btn-success,.btn-check:active+html .btn-success,html .btn-success:active,html .btn-success.active,.show>html .btn-success.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-success,.btn-check:active+html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=dark] .btn-success:active,html[data-netbox-color-mode=dark] .btn-success.active,.show>html[data-netbox-color-mode=dark] .btn-success.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-success,.btn-check:active+html[data-netbox-color-mode=light] .btn-success,html[data-netbox-color-mode=light] .btn-success:active,html[data-netbox-color-mode=light] .btn-success.active,.show>html[data-netbox-color-mode=light] .btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+html .btn-success:focus,.btn-check:active+html .btn-success:focus,html .btn-success:active:focus,html .btn-success.active:focus,.show>html .btn-success.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-success:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-success:focus,html[data-netbox-color-mode=dark] .btn-success:active:focus,html[data-netbox-color-mode=dark] .btn-success.active:focus,.show>html[data-netbox-color-mode=dark] .btn-success.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-success:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-success:focus,html[data-netbox-color-mode=light] .btn-success:active:focus,html[data-netbox-color-mode=light] .btn-success.active:focus,.show>html[data-netbox-color-mode=light] .btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}html .btn-success:disabled,html .btn-success.disabled,html[data-netbox-color-mode=dark] .btn-success:disabled,html[data-netbox-color-mode=dark] .btn-success.disabled,html[data-netbox-color-mode=light] .btn-success:disabled,html[data-netbox-color-mode=light] .btn-success.disabled{color:#fff;background-color:#198754;border-color:#198754}}@media print{html .btn-info,html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=light] .btn-info{color:#000;background-color:#54d6f0;border-color:#54d6f0}html .btn-info:hover,html[data-netbox-color-mode=dark] .btn-info:hover,html[data-netbox-color-mode=light] .btn-info:hover{color:#000;background-color:#6edcf2;border-color:#65daf2}.btn-check:focus+html .btn-info,html .btn-info:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=dark] .btn-info:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-info,html[data-netbox-color-mode=light] .btn-info:focus{color:#000;background-color:#6edcf2;border-color:#65daf2;box-shadow:0 0 0 .25rem #47b6cc80}.btn-check:checked+html .btn-info,.btn-check:active+html .btn-info,html .btn-info:active,html .btn-info.active,.show>html .btn-info.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-info,.btn-check:active+html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=dark] .btn-info:active,html[data-netbox-color-mode=dark] .btn-info.active,.show>html[data-netbox-color-mode=dark] .btn-info.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-info,.btn-check:active+html[data-netbox-color-mode=light] .btn-info,html[data-netbox-color-mode=light] .btn-info:active,html[data-netbox-color-mode=light] .btn-info.active,.show>html[data-netbox-color-mode=light] .btn-info.dropdown-toggle{color:#000;background-color:#76def3;border-color:#65daf2}.btn-check:checked+html .btn-info:focus,.btn-check:active+html .btn-info:focus,html .btn-info:active:focus,html .btn-info.active:focus,.show>html .btn-info.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-info:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-info:focus,html[data-netbox-color-mode=dark] .btn-info:active:focus,html[data-netbox-color-mode=dark] .btn-info.active:focus,.show>html[data-netbox-color-mode=dark] .btn-info.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-info:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-info:focus,html[data-netbox-color-mode=light] .btn-info:active:focus,html[data-netbox-color-mode=light] .btn-info.active:focus,.show>html[data-netbox-color-mode=light] .btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #47b6cc80}html .btn-info:disabled,html .btn-info.disabled,html[data-netbox-color-mode=dark] .btn-info:disabled,html[data-netbox-color-mode=dark] .btn-info.disabled,html[data-netbox-color-mode=light] .btn-info:disabled,html[data-netbox-color-mode=light] .btn-info.disabled{color:#000;background-color:#54d6f0;border-color:#54d6f0}}@media print{html .btn-warning,html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=light] .btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}html .btn-warning:hover,html[data-netbox-color-mode=dark] .btn-warning:hover,html[data-netbox-color-mode=light] .btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+html .btn-warning,html .btn-warning:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=dark] .btn-warning:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-warning,html[data-netbox-color-mode=light] .btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+html .btn-warning,.btn-check:active+html .btn-warning,html .btn-warning:active,html .btn-warning.active,.show>html .btn-warning.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-warning,.btn-check:active+html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=dark] .btn-warning:active,html[data-netbox-color-mode=dark] .btn-warning.active,.show>html[data-netbox-color-mode=dark] .btn-warning.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-warning,.btn-check:active+html[data-netbox-color-mode=light] .btn-warning,html[data-netbox-color-mode=light] .btn-warning:active,html[data-netbox-color-mode=light] .btn-warning.active,.show>html[data-netbox-color-mode=light] .btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+html .btn-warning:focus,.btn-check:active+html .btn-warning:focus,html .btn-warning:active:focus,html .btn-warning.active:focus,.show>html .btn-warning.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-warning:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-warning:focus,html[data-netbox-color-mode=dark] .btn-warning:active:focus,html[data-netbox-color-mode=dark] .btn-warning.active:focus,.show>html[data-netbox-color-mode=dark] .btn-warning.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-warning:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-warning:focus,html[data-netbox-color-mode=light] .btn-warning:active:focus,html[data-netbox-color-mode=light] .btn-warning.active:focus,.show>html[data-netbox-color-mode=light] .btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}html .btn-warning:disabled,html .btn-warning.disabled,html[data-netbox-color-mode=dark] .btn-warning:disabled,html[data-netbox-color-mode=dark] .btn-warning.disabled,html[data-netbox-color-mode=light] .btn-warning:disabled,html[data-netbox-color-mode=light] .btn-warning.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}}@media print{html .btn-danger,html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=light] .btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}html .btn-danger:hover,html[data-netbox-color-mode=dark] .btn-danger:hover,html[data-netbox-color-mode=light] .btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+html .btn-danger,html .btn-danger:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=dark] .btn-danger:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-danger,html[data-netbox-color-mode=light] .btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+html .btn-danger,.btn-check:active+html .btn-danger,html .btn-danger:active,html .btn-danger.active,.show>html .btn-danger.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-danger,.btn-check:active+html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=dark] .btn-danger:active,html[data-netbox-color-mode=dark] .btn-danger.active,.show>html[data-netbox-color-mode=dark] .btn-danger.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-danger,.btn-check:active+html[data-netbox-color-mode=light] .btn-danger,html[data-netbox-color-mode=light] .btn-danger:active,html[data-netbox-color-mode=light] .btn-danger.active,.show>html[data-netbox-color-mode=light] .btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+html .btn-danger:focus,.btn-check:active+html .btn-danger:focus,html .btn-danger:active:focus,html .btn-danger.active:focus,.show>html .btn-danger.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-danger:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-danger:focus,html[data-netbox-color-mode=dark] .btn-danger:active:focus,html[data-netbox-color-mode=dark] .btn-danger.active:focus,.show>html[data-netbox-color-mode=dark] .btn-danger.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-danger:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-danger:focus,html[data-netbox-color-mode=light] .btn-danger:active:focus,html[data-netbox-color-mode=light] .btn-danger.active:focus,.show>html[data-netbox-color-mode=light] .btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}html .btn-danger:disabled,html .btn-danger.disabled,html[data-netbox-color-mode=dark] .btn-danger:disabled,html[data-netbox-color-mode=dark] .btn-danger.disabled,html[data-netbox-color-mode=light] .btn-danger:disabled,html[data-netbox-color-mode=light] .btn-danger.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}}@media print{html .btn-light,html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=light] .btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}html .btn-light:hover,html[data-netbox-color-mode=dark] .btn-light:hover,html[data-netbox-color-mode=light] .btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+html .btn-light,html .btn-light:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=dark] .btn-light:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-light,html[data-netbox-color-mode=light] .btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem #d3d4d580}.btn-check:checked+html .btn-light,.btn-check:active+html .btn-light,html .btn-light:active,html .btn-light.active,.show>html .btn-light.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-light,.btn-check:active+html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=dark] .btn-light:active,html[data-netbox-color-mode=dark] .btn-light.active,.show>html[data-netbox-color-mode=dark] .btn-light.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-light,.btn-check:active+html[data-netbox-color-mode=light] .btn-light,html[data-netbox-color-mode=light] .btn-light:active,html[data-netbox-color-mode=light] .btn-light.active,.show>html[data-netbox-color-mode=light] .btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:checked+html .btn-light:focus,.btn-check:active+html .btn-light:focus,html .btn-light:active:focus,html .btn-light.active:focus,.show>html .btn-light.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-light:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-light:focus,html[data-netbox-color-mode=dark] .btn-light:active:focus,html[data-netbox-color-mode=dark] .btn-light.active:focus,.show>html[data-netbox-color-mode=dark] .btn-light.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-light:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-light:focus,html[data-netbox-color-mode=light] .btn-light:active:focus,html[data-netbox-color-mode=light] .btn-light.active:focus,.show>html[data-netbox-color-mode=light] .btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3d4d580}html .btn-light:disabled,html .btn-light.disabled,html[data-netbox-color-mode=dark] .btn-light:disabled,html[data-netbox-color-mode=dark] .btn-light.disabled,html[data-netbox-color-mode=light] .btn-light:disabled,html[data-netbox-color-mode=light] .btn-light.disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}}@media print{html .btn-dark,html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=light] .btn-dark{color:#fff;background-color:#212529;border-color:#212529}html .btn-dark:hover,html[data-netbox-color-mode=dark] .btn-dark:hover,html[data-netbox-color-mode=light] .btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+html .btn-dark,html .btn-dark:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=dark] .btn-dark:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-dark,html[data-netbox-color-mode=light] .btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem #42464980}.btn-check:checked+html .btn-dark,.btn-check:active+html .btn-dark,html .btn-dark:active,html .btn-dark.active,.show>html .btn-dark.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-dark,.btn-check:active+html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=dark] .btn-dark:active,html[data-netbox-color-mode=dark] .btn-dark.active,.show>html[data-netbox-color-mode=dark] .btn-dark.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-dark,.btn-check:active+html[data-netbox-color-mode=light] .btn-dark,html[data-netbox-color-mode=light] .btn-dark:active,html[data-netbox-color-mode=light] .btn-dark.active,.show>html[data-netbox-color-mode=light] .btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:checked+html .btn-dark:focus,.btn-check:active+html .btn-dark:focus,html .btn-dark:active:focus,html .btn-dark.active:focus,.show>html .btn-dark.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-dark:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-dark:focus,html[data-netbox-color-mode=dark] .btn-dark:active:focus,html[data-netbox-color-mode=dark] .btn-dark.active:focus,.show>html[data-netbox-color-mode=dark] .btn-dark.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-dark:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-dark:focus,html[data-netbox-color-mode=light] .btn-dark:active:focus,html[data-netbox-color-mode=light] .btn-dark.active:focus,.show>html[data-netbox-color-mode=light] .btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #42464980}html .btn-dark:disabled,html .btn-dark.disabled,html[data-netbox-color-mode=dark] .btn-dark:disabled,html[data-netbox-color-mode=dark] .btn-dark.disabled,html[data-netbox-color-mode=light] .btn-dark:disabled,html[data-netbox-color-mode=light] .btn-dark.disabled{color:#fff;background-color:#212529;border-color:#212529}}@media print{html .btn-red,html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=light] .btn-red{color:#fff;background-color:#dc3545;border-color:#dc3545}html .btn-red:hover,html[data-netbox-color-mode=dark] .btn-red:hover,html[data-netbox-color-mode=light] .btn-red:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+html .btn-red,html .btn-red:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=dark] .btn-red:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red,html[data-netbox-color-mode=light] .btn-red:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+html .btn-red,.btn-check:active+html .btn-red,html .btn-red:active,html .btn-red.active,.show>html .btn-red.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=dark] .btn-red:active,html[data-netbox-color-mode=dark] .btn-red.active,.show>html[data-netbox-color-mode=dark] .btn-red.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red,.btn-check:active+html[data-netbox-color-mode=light] .btn-red,html[data-netbox-color-mode=light] .btn-red:active,html[data-netbox-color-mode=light] .btn-red.active,.show>html[data-netbox-color-mode=light] .btn-red.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+html .btn-red:focus,.btn-check:active+html .btn-red:focus,html .btn-red:active:focus,html .btn-red.active:focus,.show>html .btn-red.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red:focus,html[data-netbox-color-mode=dark] .btn-red:active:focus,html[data-netbox-color-mode=dark] .btn-red.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red:focus,html[data-netbox-color-mode=light] .btn-red:active:focus,html[data-netbox-color-mode=light] .btn-red.active:focus,.show>html[data-netbox-color-mode=light] .btn-red.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}html .btn-red:disabled,html .btn-red.disabled,html[data-netbox-color-mode=dark] .btn-red:disabled,html[data-netbox-color-mode=dark] .btn-red.disabled,html[data-netbox-color-mode=light] .btn-red:disabled,html[data-netbox-color-mode=light] .btn-red.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}}@media print{html .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=light] .btn-yellow{color:#000;background-color:#ffc107;border-color:#ffc107}html .btn-yellow:hover,html[data-netbox-color-mode=dark] .btn-yellow:hover,html[data-netbox-color-mode=light] .btn-yellow:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+html .btn-yellow,html .btn-yellow:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow,html[data-netbox-color-mode=light] .btn-yellow:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+html .btn-yellow,.btn-check:active+html .btn-yellow,html .btn-yellow:active,html .btn-yellow.active,.show>html .btn-yellow.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow:active,html[data-netbox-color-mode=dark] .btn-yellow.active,.show>html[data-netbox-color-mode=dark] .btn-yellow.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow,html[data-netbox-color-mode=light] .btn-yellow:active,html[data-netbox-color-mode=light] .btn-yellow.active,.show>html[data-netbox-color-mode=light] .btn-yellow.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+html .btn-yellow:focus,.btn-check:active+html .btn-yellow:focus,html .btn-yellow:active:focus,html .btn-yellow.active:focus,.show>html .btn-yellow.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow:focus,html[data-netbox-color-mode=dark] .btn-yellow:active:focus,html[data-netbox-color-mode=dark] .btn-yellow.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow:focus,html[data-netbox-color-mode=light] .btn-yellow:active:focus,html[data-netbox-color-mode=light] .btn-yellow.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}html .btn-yellow:disabled,html .btn-yellow.disabled,html[data-netbox-color-mode=dark] .btn-yellow:disabled,html[data-netbox-color-mode=dark] .btn-yellow.disabled,html[data-netbox-color-mode=light] .btn-yellow:disabled,html[data-netbox-color-mode=light] .btn-yellow.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}}@media print{html .btn-green,html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=light] .btn-green{color:#fff;background-color:#198754;border-color:#198754}html .btn-green:hover,html[data-netbox-color-mode=dark] .btn-green:hover,html[data-netbox-color-mode=light] .btn-green:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+html .btn-green,html .btn-green:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=dark] .btn-green:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green,html[data-netbox-color-mode=light] .btn-green:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+html .btn-green,.btn-check:active+html .btn-green,html .btn-green:active,html .btn-green.active,.show>html .btn-green.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=dark] .btn-green:active,html[data-netbox-color-mode=dark] .btn-green.active,.show>html[data-netbox-color-mode=dark] .btn-green.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green,.btn-check:active+html[data-netbox-color-mode=light] .btn-green,html[data-netbox-color-mode=light] .btn-green:active,html[data-netbox-color-mode=light] .btn-green.active,.show>html[data-netbox-color-mode=light] .btn-green.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+html .btn-green:focus,.btn-check:active+html .btn-green:focus,html .btn-green:active:focus,html .btn-green.active:focus,.show>html .btn-green.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green:focus,html[data-netbox-color-mode=dark] .btn-green:active:focus,html[data-netbox-color-mode=dark] .btn-green.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green:focus,html[data-netbox-color-mode=light] .btn-green:active:focus,html[data-netbox-color-mode=light] .btn-green.active:focus,.show>html[data-netbox-color-mode=light] .btn-green.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}html .btn-green:disabled,html .btn-green.disabled,html[data-netbox-color-mode=dark] .btn-green:disabled,html[data-netbox-color-mode=dark] .btn-green.disabled,html[data-netbox-color-mode=light] .btn-green:disabled,html[data-netbox-color-mode=light] .btn-green.disabled{color:#fff;background-color:#198754;border-color:#198754}}@media print{html .btn-blue,html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=light] .btn-blue{color:#fff;background-color:#0d6efd;border-color:#0d6efd}html .btn-blue:hover,html[data-netbox-color-mode=dark] .btn-blue:hover,html[data-netbox-color-mode=light] .btn-blue:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+html .btn-blue,html .btn-blue:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=dark] .btn-blue:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue,html[data-netbox-color-mode=light] .btn-blue:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem #3184fd80}.btn-check:checked+html .btn-blue,.btn-check:active+html .btn-blue,html .btn-blue:active,html .btn-blue.active,.show>html .btn-blue.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=dark] .btn-blue:active,html[data-netbox-color-mode=dark] .btn-blue.active,.show>html[data-netbox-color-mode=dark] .btn-blue.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue,html[data-netbox-color-mode=light] .btn-blue:active,html[data-netbox-color-mode=light] .btn-blue.active,.show>html[data-netbox-color-mode=light] .btn-blue.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:checked+html .btn-blue:focus,.btn-check:active+html .btn-blue:focus,html .btn-blue:active:focus,html .btn-blue.active:focus,.show>html .btn-blue.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue:focus,html[data-netbox-color-mode=dark] .btn-blue:active:focus,html[data-netbox-color-mode=dark] .btn-blue.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue:focus,html[data-netbox-color-mode=light] .btn-blue:active:focus,html[data-netbox-color-mode=light] .btn-blue.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3184fd80}html .btn-blue:disabled,html .btn-blue.disabled,html[data-netbox-color-mode=dark] .btn-blue:disabled,html[data-netbox-color-mode=dark] .btn-blue.disabled,html[data-netbox-color-mode=light] .btn-blue:disabled,html[data-netbox-color-mode=light] .btn-blue.disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}}@media print{html .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=light] .btn-cyan{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}html .btn-cyan:hover,html[data-netbox-color-mode=dark] .btn-cyan:hover,html[data-netbox-color-mode=light] .btn-cyan:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+html .btn-cyan,html .btn-cyan:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan,html[data-netbox-color-mode=light] .btn-cyan:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem #0baccc80}.btn-check:checked+html .btn-cyan,.btn-check:active+html .btn-cyan,html .btn-cyan:active,html .btn-cyan.active,.show>html .btn-cyan.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan:active,html[data-netbox-color-mode=dark] .btn-cyan.active,.show>html[data-netbox-color-mode=dark] .btn-cyan.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan,html[data-netbox-color-mode=light] .btn-cyan:active,html[data-netbox-color-mode=light] .btn-cyan.active,.show>html[data-netbox-color-mode=light] .btn-cyan.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+html .btn-cyan:focus,.btn-check:active+html .btn-cyan:focus,html .btn-cyan:active:focus,html .btn-cyan.active:focus,.show>html .btn-cyan.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan:focus,html[data-netbox-color-mode=dark] .btn-cyan:active:focus,html[data-netbox-color-mode=dark] .btn-cyan.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan:focus,html[data-netbox-color-mode=light] .btn-cyan:active:focus,html[data-netbox-color-mode=light] .btn-cyan.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #0baccc80}html .btn-cyan:disabled,html .btn-cyan.disabled,html[data-netbox-color-mode=dark] .btn-cyan:disabled,html[data-netbox-color-mode=dark] .btn-cyan.disabled,html[data-netbox-color-mode=light] .btn-cyan:disabled,html[data-netbox-color-mode=light] .btn-cyan.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}}@media print{html .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=light] .btn-indigo{color:#fff;background-color:#6610f2;border-color:#6610f2}html .btn-indigo:hover,html[data-netbox-color-mode=dark] .btn-indigo:hover,html[data-netbox-color-mode=light] .btn-indigo:hover{color:#fff;background-color:#570ece;border-color:#520dc2}.btn-check:focus+html .btn-indigo,html .btn-indigo:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo,html[data-netbox-color-mode=light] .btn-indigo:focus{color:#fff;background-color:#570ece;border-color:#520dc2;box-shadow:0 0 0 .25rem #7d34f480}.btn-check:checked+html .btn-indigo,.btn-check:active+html .btn-indigo,html .btn-indigo:active,html .btn-indigo.active,.show>html .btn-indigo.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo:active,html[data-netbox-color-mode=dark] .btn-indigo.active,.show>html[data-netbox-color-mode=dark] .btn-indigo.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo,html[data-netbox-color-mode=light] .btn-indigo:active,html[data-netbox-color-mode=light] .btn-indigo.active,.show>html[data-netbox-color-mode=light] .btn-indigo.dropdown-toggle{color:#fff;background-color:#520dc2;border-color:#4d0cb6}.btn-check:checked+html .btn-indigo:focus,.btn-check:active+html .btn-indigo:focus,html .btn-indigo:active:focus,html .btn-indigo.active:focus,.show>html .btn-indigo.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo:focus,html[data-netbox-color-mode=dark] .btn-indigo:active:focus,html[data-netbox-color-mode=dark] .btn-indigo.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo:focus,html[data-netbox-color-mode=light] .btn-indigo:active:focus,html[data-netbox-color-mode=light] .btn-indigo.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d34f480}html .btn-indigo:disabled,html .btn-indigo.disabled,html[data-netbox-color-mode=dark] .btn-indigo:disabled,html[data-netbox-color-mode=dark] .btn-indigo.disabled,html[data-netbox-color-mode=light] .btn-indigo:disabled,html[data-netbox-color-mode=light] .btn-indigo.disabled{color:#fff;background-color:#6610f2;border-color:#6610f2}}@media print{html .btn-purple,html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=light] .btn-purple{color:#fff;background-color:#6f42c1;border-color:#6f42c1}html .btn-purple:hover,html[data-netbox-color-mode=dark] .btn-purple:hover,html[data-netbox-color-mode=light] .btn-purple:hover{color:#fff;background-color:#5e38a4;border-color:#59359a}.btn-check:focus+html .btn-purple,html .btn-purple:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=dark] .btn-purple:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple,html[data-netbox-color-mode=light] .btn-purple:focus{color:#fff;background-color:#5e38a4;border-color:#59359a;box-shadow:0 0 0 .25rem #855eca80}.btn-check:checked+html .btn-purple,.btn-check:active+html .btn-purple,html .btn-purple:active,html .btn-purple.active,.show>html .btn-purple.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=dark] .btn-purple:active,html[data-netbox-color-mode=dark] .btn-purple.active,.show>html[data-netbox-color-mode=dark] .btn-purple.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple,html[data-netbox-color-mode=light] .btn-purple:active,html[data-netbox-color-mode=light] .btn-purple.active,.show>html[data-netbox-color-mode=light] .btn-purple.dropdown-toggle{color:#fff;background-color:#59359a;border-color:#533291}.btn-check:checked+html .btn-purple:focus,.btn-check:active+html .btn-purple:focus,html .btn-purple:active:focus,html .btn-purple.active:focus,.show>html .btn-purple.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple:focus,html[data-netbox-color-mode=dark] .btn-purple:active:focus,html[data-netbox-color-mode=dark] .btn-purple.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple:focus,html[data-netbox-color-mode=light] .btn-purple:active:focus,html[data-netbox-color-mode=light] .btn-purple.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #855eca80}html .btn-purple:disabled,html .btn-purple.disabled,html[data-netbox-color-mode=dark] .btn-purple:disabled,html[data-netbox-color-mode=dark] .btn-purple.disabled,html[data-netbox-color-mode=light] .btn-purple:disabled,html[data-netbox-color-mode=light] .btn-purple.disabled{color:#fff;background-color:#6f42c1;border-color:#6f42c1}}@media print{html .btn-pink,html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=light] .btn-pink{color:#fff;background-color:#d63384;border-color:#d63384}html .btn-pink:hover,html[data-netbox-color-mode=dark] .btn-pink:hover,html[data-netbox-color-mode=light] .btn-pink:hover{color:#fff;background-color:#b62b70;border-color:#ab296a}.btn-check:focus+html .btn-pink,html .btn-pink:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=dark] .btn-pink:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink,html[data-netbox-color-mode=light] .btn-pink:focus{color:#fff;background-color:#b62b70;border-color:#ab296a;box-shadow:0 0 0 .25rem #dc529680}.btn-check:checked+html .btn-pink,.btn-check:active+html .btn-pink,html .btn-pink:active,html .btn-pink.active,.show>html .btn-pink.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=dark] .btn-pink:active,html[data-netbox-color-mode=dark] .btn-pink.active,.show>html[data-netbox-color-mode=dark] .btn-pink.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink,html[data-netbox-color-mode=light] .btn-pink:active,html[data-netbox-color-mode=light] .btn-pink.active,.show>html[data-netbox-color-mode=light] .btn-pink.dropdown-toggle{color:#fff;background-color:#ab296a;border-color:#a12663}.btn-check:checked+html .btn-pink:focus,.btn-check:active+html .btn-pink:focus,html .btn-pink:active:focus,html .btn-pink.active:focus,.show>html .btn-pink.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink:focus,html[data-netbox-color-mode=dark] .btn-pink:active:focus,html[data-netbox-color-mode=dark] .btn-pink.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink:focus,html[data-netbox-color-mode=light] .btn-pink:active:focus,html[data-netbox-color-mode=light] .btn-pink.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #dc529680}html .btn-pink:disabled,html .btn-pink.disabled,html[data-netbox-color-mode=dark] .btn-pink:disabled,html[data-netbox-color-mode=dark] .btn-pink.disabled,html[data-netbox-color-mode=light] .btn-pink:disabled,html[data-netbox-color-mode=light] .btn-pink.disabled{color:#fff;background-color:#d63384;border-color:#d63384}}@media print{html .btn-darker,html[data-netbox-color-mode=dark] .btn-darker,html[data-netbox-color-mode=light] .btn-darker{color:#fff;background-color:#1b1f22;border-color:#1b1f22}html .btn-darker:hover,html[data-netbox-color-mode=dark] .btn-darker:hover,html[data-netbox-color-mode=light] .btn-darker:hover{color:#fff;background-color:#171a1d;border-color:#16191b}.btn-check:focus+html .btn-darker,html .btn-darker:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-darker,html[data-netbox-color-mode=dark] .btn-darker:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-darker,html[data-netbox-color-mode=light] .btn-darker:focus{color:#fff;background-color:#171a1d;border-color:#16191b;box-shadow:0 0 0 .25rem #3d414380}.btn-check:checked+html .btn-darker,.btn-check:active+html .btn-darker,html .btn-darker:active,html .btn-darker.active,.show>html .btn-darker.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-darker,.btn-check:active+html[data-netbox-color-mode=dark] .btn-darker,html[data-netbox-color-mode=dark] .btn-darker:active,html[data-netbox-color-mode=dark] .btn-darker.active,.show>html[data-netbox-color-mode=dark] .btn-darker.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-darker,.btn-check:active+html[data-netbox-color-mode=light] .btn-darker,html[data-netbox-color-mode=light] .btn-darker:active,html[data-netbox-color-mode=light] .btn-darker.active,.show>html[data-netbox-color-mode=light] .btn-darker.dropdown-toggle{color:#fff;background-color:#16191b;border-color:#14171a}.btn-check:checked+html .btn-darker:focus,.btn-check:active+html .btn-darker:focus,html .btn-darker:active:focus,html .btn-darker.active:focus,.show>html .btn-darker.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-darker:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-darker:focus,html[data-netbox-color-mode=dark] .btn-darker:active:focus,html[data-netbox-color-mode=dark] .btn-darker.active:focus,.show>html[data-netbox-color-mode=dark] .btn-darker.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-darker:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-darker:focus,html[data-netbox-color-mode=light] .btn-darker:active:focus,html[data-netbox-color-mode=light] .btn-darker.active:focus,.show>html[data-netbox-color-mode=light] .btn-darker.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3d414380}html .btn-darker:disabled,html .btn-darker.disabled,html[data-netbox-color-mode=dark] .btn-darker:disabled,html[data-netbox-color-mode=dark] .btn-darker.disabled,html[data-netbox-color-mode=light] .btn-darker:disabled,html[data-netbox-color-mode=light] .btn-darker.disabled{color:#fff;background-color:#1b1f22;border-color:#1b1f22}}@media print{html .btn-darkest,html[data-netbox-color-mode=dark] .btn-darkest,html[data-netbox-color-mode=light] .btn-darkest{color:#fff;background-color:#171b1d;border-color:#171b1d}html .btn-darkest:hover,html[data-netbox-color-mode=dark] .btn-darkest:hover,html[data-netbox-color-mode=light] .btn-darkest:hover{color:#fff;background-color:#141719;border-color:#121617}.btn-check:focus+html .btn-darkest,html .btn-darkest:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-darkest,html[data-netbox-color-mode=dark] .btn-darkest:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-darkest,html[data-netbox-color-mode=light] .btn-darkest:focus{color:#fff;background-color:#141719;border-color:#121617;box-shadow:0 0 0 .25rem #3a3d3f80}.btn-check:checked+html .btn-darkest,.btn-check:active+html .btn-darkest,html .btn-darkest:active,html .btn-darkest.active,.show>html .btn-darkest.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-darkest,.btn-check:active+html[data-netbox-color-mode=dark] .btn-darkest,html[data-netbox-color-mode=dark] .btn-darkest:active,html[data-netbox-color-mode=dark] .btn-darkest.active,.show>html[data-netbox-color-mode=dark] .btn-darkest.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-darkest,.btn-check:active+html[data-netbox-color-mode=light] .btn-darkest,html[data-netbox-color-mode=light] .btn-darkest:active,html[data-netbox-color-mode=light] .btn-darkest.active,.show>html[data-netbox-color-mode=light] .btn-darkest.dropdown-toggle{color:#fff;background-color:#121617;border-color:#111416}.btn-check:checked+html .btn-darkest:focus,.btn-check:active+html .btn-darkest:focus,html .btn-darkest:active:focus,html .btn-darkest.active:focus,.show>html .btn-darkest.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-darkest:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-darkest:focus,html[data-netbox-color-mode=dark] .btn-darkest:active:focus,html[data-netbox-color-mode=dark] .btn-darkest.active:focus,.show>html[data-netbox-color-mode=dark] .btn-darkest.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-darkest:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-darkest:focus,html[data-netbox-color-mode=light] .btn-darkest:active:focus,html[data-netbox-color-mode=light] .btn-darkest.active:focus,.show>html[data-netbox-color-mode=light] .btn-darkest.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3a3d3f80}html .btn-darkest:disabled,html .btn-darkest.disabled,html[data-netbox-color-mode=dark] .btn-darkest:disabled,html[data-netbox-color-mode=dark] .btn-darkest.disabled,html[data-netbox-color-mode=light] .btn-darkest:disabled,html[data-netbox-color-mode=light] .btn-darkest.disabled{color:#fff;background-color:#171b1d;border-color:#171b1d}}@media print{html .btn-gray,html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=light] .btn-gray{color:#000;background-color:#ced4da;border-color:#ced4da}html .btn-gray:hover,html[data-netbox-color-mode=dark] .btn-gray:hover,html[data-netbox-color-mode=light] .btn-gray:hover{color:#000;background-color:#d5dae0;border-color:#d3d8de}.btn-check:focus+html .btn-gray,html .btn-gray:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=dark] .btn-gray:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray,html[data-netbox-color-mode=light] .btn-gray:focus{color:#000;background-color:#d5dae0;border-color:#d3d8de;box-shadow:0 0 0 .25rem #afb4b980}.btn-check:checked+html .btn-gray,.btn-check:active+html .btn-gray,html .btn-gray:active,html .btn-gray.active,.show>html .btn-gray.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=dark] .btn-gray:active,html[data-netbox-color-mode=dark] .btn-gray.active,.show>html[data-netbox-color-mode=dark] .btn-gray.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray,html[data-netbox-color-mode=light] .btn-gray:active,html[data-netbox-color-mode=light] .btn-gray.active,.show>html[data-netbox-color-mode=light] .btn-gray.dropdown-toggle{color:#000;background-color:#d8dde1;border-color:#d3d8de}.btn-check:checked+html .btn-gray:focus,.btn-check:active+html .btn-gray:focus,html .btn-gray:active:focus,html .btn-gray.active:focus,.show>html .btn-gray.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray:focus,html[data-netbox-color-mode=dark] .btn-gray:active:focus,html[data-netbox-color-mode=dark] .btn-gray.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray:focus,html[data-netbox-color-mode=light] .btn-gray:active:focus,html[data-netbox-color-mode=light] .btn-gray.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #afb4b980}html .btn-gray:disabled,html .btn-gray.disabled,html[data-netbox-color-mode=dark] .btn-gray:disabled,html[data-netbox-color-mode=dark] .btn-gray.disabled,html[data-netbox-color-mode=light] .btn-gray:disabled,html[data-netbox-color-mode=light] .btn-gray.disabled{color:#000;background-color:#ced4da;border-color:#ced4da}}@media print{html .btn-gray-100,html[data-netbox-color-mode=dark] .btn-gray-100,html[data-netbox-color-mode=light] .btn-gray-100{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}html .btn-gray-100:hover,html[data-netbox-color-mode=dark] .btn-gray-100:hover,html[data-netbox-color-mode=light] .btn-gray-100:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+html .btn-gray-100,html .btn-gray-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-100,html[data-netbox-color-mode=dark] .btn-gray-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-100,html[data-netbox-color-mode=light] .btn-gray-100:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem #d3d4d580}.btn-check:checked+html .btn-gray-100,.btn-check:active+html .btn-gray-100,html .btn-gray-100:active,html .btn-gray-100.active,.show>html .btn-gray-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-100,html[data-netbox-color-mode=dark] .btn-gray-100:active,html[data-netbox-color-mode=dark] .btn-gray-100.active,.show>html[data-netbox-color-mode=dark] .btn-gray-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-100,html[data-netbox-color-mode=light] .btn-gray-100:active,html[data-netbox-color-mode=light] .btn-gray-100.active,.show>html[data-netbox-color-mode=light] .btn-gray-100.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:checked+html .btn-gray-100:focus,.btn-check:active+html .btn-gray-100:focus,html .btn-gray-100:active:focus,html .btn-gray-100.active:focus,.show>html .btn-gray-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-100:focus,html[data-netbox-color-mode=dark] .btn-gray-100:active:focus,html[data-netbox-color-mode=dark] .btn-gray-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-100:focus,html[data-netbox-color-mode=light] .btn-gray-100:active:focus,html[data-netbox-color-mode=light] .btn-gray-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3d4d580}html .btn-gray-100:disabled,html .btn-gray-100.disabled,html[data-netbox-color-mode=dark] .btn-gray-100:disabled,html[data-netbox-color-mode=dark] .btn-gray-100.disabled,html[data-netbox-color-mode=light] .btn-gray-100:disabled,html[data-netbox-color-mode=light] .btn-gray-100.disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}}@media print{html .btn-gray-200,html[data-netbox-color-mode=dark] .btn-gray-200,html[data-netbox-color-mode=light] .btn-gray-200{color:#000;background-color:#e9ecef;border-color:#e9ecef}html .btn-gray-200:hover,html[data-netbox-color-mode=dark] .btn-gray-200:hover,html[data-netbox-color-mode=light] .btn-gray-200:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}.btn-check:focus+html .btn-gray-200,html .btn-gray-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-200,html[data-netbox-color-mode=dark] .btn-gray-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-200,html[data-netbox-color-mode=light] .btn-gray-200:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}.btn-check:checked+html .btn-gray-200,.btn-check:active+html .btn-gray-200,html .btn-gray-200:active,html .btn-gray-200.active,.show>html .btn-gray-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-200,html[data-netbox-color-mode=dark] .btn-gray-200:active,html[data-netbox-color-mode=dark] .btn-gray-200.active,.show>html[data-netbox-color-mode=dark] .btn-gray-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-200,html[data-netbox-color-mode=light] .btn-gray-200:active,html[data-netbox-color-mode=light] .btn-gray-200.active,.show>html[data-netbox-color-mode=light] .btn-gray-200.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}.btn-check:checked+html .btn-gray-200:focus,.btn-check:active+html .btn-gray-200:focus,html .btn-gray-200:active:focus,html .btn-gray-200.active:focus,.show>html .btn-gray-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-200:focus,html[data-netbox-color-mode=dark] .btn-gray-200:active:focus,html[data-netbox-color-mode=dark] .btn-gray-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-200:focus,html[data-netbox-color-mode=light] .btn-gray-200:active:focus,html[data-netbox-color-mode=light] .btn-gray-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}html .btn-gray-200:disabled,html .btn-gray-200.disabled,html[data-netbox-color-mode=dark] .btn-gray-200:disabled,html[data-netbox-color-mode=dark] .btn-gray-200.disabled,html[data-netbox-color-mode=light] .btn-gray-200:disabled,html[data-netbox-color-mode=light] .btn-gray-200.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}}@media print{html .btn-gray-300,html[data-netbox-color-mode=dark] .btn-gray-300,html[data-netbox-color-mode=light] .btn-gray-300{color:#000;background-color:#dee2e6;border-color:#dee2e6}html .btn-gray-300:hover,html[data-netbox-color-mode=dark] .btn-gray-300:hover,html[data-netbox-color-mode=light] .btn-gray-300:hover{color:#000;background-color:#e3e6ea;border-color:#e1e5e9}.btn-check:focus+html .btn-gray-300,html .btn-gray-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-300,html[data-netbox-color-mode=dark] .btn-gray-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-300,html[data-netbox-color-mode=light] .btn-gray-300:focus{color:#000;background-color:#e3e6ea;border-color:#e1e5e9;box-shadow:0 0 0 .25rem #bdc0c480}.btn-check:checked+html .btn-gray-300,.btn-check:active+html .btn-gray-300,html .btn-gray-300:active,html .btn-gray-300.active,.show>html .btn-gray-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-300,html[data-netbox-color-mode=dark] .btn-gray-300:active,html[data-netbox-color-mode=dark] .btn-gray-300.active,.show>html[data-netbox-color-mode=dark] .btn-gray-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-300,html[data-netbox-color-mode=light] .btn-gray-300:active,html[data-netbox-color-mode=light] .btn-gray-300.active,.show>html[data-netbox-color-mode=light] .btn-gray-300.dropdown-toggle{color:#000;background-color:#e5e8eb;border-color:#e1e5e9}.btn-check:checked+html .btn-gray-300:focus,.btn-check:active+html .btn-gray-300:focus,html .btn-gray-300:active:focus,html .btn-gray-300.active:focus,.show>html .btn-gray-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-300:focus,html[data-netbox-color-mode=dark] .btn-gray-300:active:focus,html[data-netbox-color-mode=dark] .btn-gray-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-300:focus,html[data-netbox-color-mode=light] .btn-gray-300:active:focus,html[data-netbox-color-mode=light] .btn-gray-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bdc0c480}html .btn-gray-300:disabled,html .btn-gray-300.disabled,html[data-netbox-color-mode=dark] .btn-gray-300:disabled,html[data-netbox-color-mode=dark] .btn-gray-300.disabled,html[data-netbox-color-mode=light] .btn-gray-300:disabled,html[data-netbox-color-mode=light] .btn-gray-300.disabled{color:#000;background-color:#dee2e6;border-color:#dee2e6}}@media print{html .btn-gray-400,html[data-netbox-color-mode=dark] .btn-gray-400,html[data-netbox-color-mode=light] .btn-gray-400{color:#000;background-color:#ced4da;border-color:#ced4da}html .btn-gray-400:hover,html[data-netbox-color-mode=dark] .btn-gray-400:hover,html[data-netbox-color-mode=light] .btn-gray-400:hover{color:#000;background-color:#d5dae0;border-color:#d3d8de}.btn-check:focus+html .btn-gray-400,html .btn-gray-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-400,html[data-netbox-color-mode=dark] .btn-gray-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-400,html[data-netbox-color-mode=light] .btn-gray-400:focus{color:#000;background-color:#d5dae0;border-color:#d3d8de;box-shadow:0 0 0 .25rem #afb4b980}.btn-check:checked+html .btn-gray-400,.btn-check:active+html .btn-gray-400,html .btn-gray-400:active,html .btn-gray-400.active,.show>html .btn-gray-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-400,html[data-netbox-color-mode=dark] .btn-gray-400:active,html[data-netbox-color-mode=dark] .btn-gray-400.active,.show>html[data-netbox-color-mode=dark] .btn-gray-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-400,html[data-netbox-color-mode=light] .btn-gray-400:active,html[data-netbox-color-mode=light] .btn-gray-400.active,.show>html[data-netbox-color-mode=light] .btn-gray-400.dropdown-toggle{color:#000;background-color:#d8dde1;border-color:#d3d8de}.btn-check:checked+html .btn-gray-400:focus,.btn-check:active+html .btn-gray-400:focus,html .btn-gray-400:active:focus,html .btn-gray-400.active:focus,.show>html .btn-gray-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-400:focus,html[data-netbox-color-mode=dark] .btn-gray-400:active:focus,html[data-netbox-color-mode=dark] .btn-gray-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-400:focus,html[data-netbox-color-mode=light] .btn-gray-400:active:focus,html[data-netbox-color-mode=light] .btn-gray-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #afb4b980}html .btn-gray-400:disabled,html .btn-gray-400.disabled,html[data-netbox-color-mode=dark] .btn-gray-400:disabled,html[data-netbox-color-mode=dark] .btn-gray-400.disabled,html[data-netbox-color-mode=light] .btn-gray-400:disabled,html[data-netbox-color-mode=light] .btn-gray-400.disabled{color:#000;background-color:#ced4da;border-color:#ced4da}}@media print{html .btn-gray-500,html[data-netbox-color-mode=dark] .btn-gray-500,html[data-netbox-color-mode=light] .btn-gray-500{color:#000;background-color:#adb5bd;border-color:#adb5bd}html .btn-gray-500:hover,html[data-netbox-color-mode=dark] .btn-gray-500:hover,html[data-netbox-color-mode=light] .btn-gray-500:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+html .btn-gray-500,html .btn-gray-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-500,html[data-netbox-color-mode=dark] .btn-gray-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-500,html[data-netbox-color-mode=light] .btn-gray-500:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+html .btn-gray-500,.btn-check:active+html .btn-gray-500,html .btn-gray-500:active,html .btn-gray-500.active,.show>html .btn-gray-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-500,html[data-netbox-color-mode=dark] .btn-gray-500:active,html[data-netbox-color-mode=dark] .btn-gray-500.active,.show>html[data-netbox-color-mode=dark] .btn-gray-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-500,html[data-netbox-color-mode=light] .btn-gray-500:active,html[data-netbox-color-mode=light] .btn-gray-500.active,.show>html[data-netbox-color-mode=light] .btn-gray-500.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+html .btn-gray-500:focus,.btn-check:active+html .btn-gray-500:focus,html .btn-gray-500:active:focus,html .btn-gray-500.active:focus,.show>html .btn-gray-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-500:focus,html[data-netbox-color-mode=dark] .btn-gray-500:active:focus,html[data-netbox-color-mode=dark] .btn-gray-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-500:focus,html[data-netbox-color-mode=light] .btn-gray-500:active:focus,html[data-netbox-color-mode=light] .btn-gray-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}html .btn-gray-500:disabled,html .btn-gray-500.disabled,html[data-netbox-color-mode=dark] .btn-gray-500:disabled,html[data-netbox-color-mode=dark] .btn-gray-500.disabled,html[data-netbox-color-mode=light] .btn-gray-500:disabled,html[data-netbox-color-mode=light] .btn-gray-500.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}}@media print{html .btn-gray-600,html[data-netbox-color-mode=dark] .btn-gray-600,html[data-netbox-color-mode=light] .btn-gray-600{color:#fff;background-color:#6c757d;border-color:#6c757d}html .btn-gray-600:hover,html[data-netbox-color-mode=dark] .btn-gray-600:hover,html[data-netbox-color-mode=light] .btn-gray-600:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+html .btn-gray-600,html .btn-gray-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-600,html[data-netbox-color-mode=dark] .btn-gray-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-600,html[data-netbox-color-mode=light] .btn-gray-600:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem #828a9180}.btn-check:checked+html .btn-gray-600,.btn-check:active+html .btn-gray-600,html .btn-gray-600:active,html .btn-gray-600.active,.show>html .btn-gray-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-600,html[data-netbox-color-mode=dark] .btn-gray-600:active,html[data-netbox-color-mode=dark] .btn-gray-600.active,.show>html[data-netbox-color-mode=dark] .btn-gray-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-600,html[data-netbox-color-mode=light] .btn-gray-600:active,html[data-netbox-color-mode=light] .btn-gray-600.active,.show>html[data-netbox-color-mode=light] .btn-gray-600.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:checked+html .btn-gray-600:focus,.btn-check:active+html .btn-gray-600:focus,html .btn-gray-600:active:focus,html .btn-gray-600.active:focus,.show>html .btn-gray-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-600:focus,html[data-netbox-color-mode=dark] .btn-gray-600:active:focus,html[data-netbox-color-mode=dark] .btn-gray-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-600:focus,html[data-netbox-color-mode=light] .btn-gray-600:active:focus,html[data-netbox-color-mode=light] .btn-gray-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #828a9180}html .btn-gray-600:disabled,html .btn-gray-600.disabled,html[data-netbox-color-mode=dark] .btn-gray-600:disabled,html[data-netbox-color-mode=dark] .btn-gray-600.disabled,html[data-netbox-color-mode=light] .btn-gray-600:disabled,html[data-netbox-color-mode=light] .btn-gray-600.disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}}@media print{html .btn-gray-700,html[data-netbox-color-mode=dark] .btn-gray-700,html[data-netbox-color-mode=light] .btn-gray-700{color:#fff;background-color:#495057;border-color:#495057}html .btn-gray-700:hover,html[data-netbox-color-mode=dark] .btn-gray-700:hover,html[data-netbox-color-mode=light] .btn-gray-700:hover{color:#fff;background-color:#3e444a;border-color:#3a4046}.btn-check:focus+html .btn-gray-700,html .btn-gray-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-700,html[data-netbox-color-mode=dark] .btn-gray-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-700,html[data-netbox-color-mode=light] .btn-gray-700:focus{color:#fff;background-color:#3e444a;border-color:#3a4046;box-shadow:0 0 0 .25rem #646a7080}.btn-check:checked+html .btn-gray-700,.btn-check:active+html .btn-gray-700,html .btn-gray-700:active,html .btn-gray-700.active,.show>html .btn-gray-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-700,html[data-netbox-color-mode=dark] .btn-gray-700:active,html[data-netbox-color-mode=dark] .btn-gray-700.active,.show>html[data-netbox-color-mode=dark] .btn-gray-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-700,html[data-netbox-color-mode=light] .btn-gray-700:active,html[data-netbox-color-mode=light] .btn-gray-700.active,.show>html[data-netbox-color-mode=light] .btn-gray-700.dropdown-toggle{color:#fff;background-color:#3a4046;border-color:#373c41}.btn-check:checked+html .btn-gray-700:focus,.btn-check:active+html .btn-gray-700:focus,html .btn-gray-700:active:focus,html .btn-gray-700.active:focus,.show>html .btn-gray-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-700:focus,html[data-netbox-color-mode=dark] .btn-gray-700:active:focus,html[data-netbox-color-mode=dark] .btn-gray-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-700:focus,html[data-netbox-color-mode=light] .btn-gray-700:active:focus,html[data-netbox-color-mode=light] .btn-gray-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #646a7080}html .btn-gray-700:disabled,html .btn-gray-700.disabled,html[data-netbox-color-mode=dark] .btn-gray-700:disabled,html[data-netbox-color-mode=dark] .btn-gray-700.disabled,html[data-netbox-color-mode=light] .btn-gray-700:disabled,html[data-netbox-color-mode=light] .btn-gray-700.disabled{color:#fff;background-color:#495057;border-color:#495057}}@media print{html .btn-gray-800,html[data-netbox-color-mode=dark] .btn-gray-800,html[data-netbox-color-mode=light] .btn-gray-800{color:#fff;background-color:#343a40;border-color:#343a40}html .btn-gray-800:hover,html[data-netbox-color-mode=dark] .btn-gray-800:hover,html[data-netbox-color-mode=light] .btn-gray-800:hover{color:#fff;background-color:#2c3136;border-color:#2a2e33}.btn-check:focus+html .btn-gray-800,html .btn-gray-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-800,html[data-netbox-color-mode=dark] .btn-gray-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-800,html[data-netbox-color-mode=light] .btn-gray-800:focus{color:#fff;background-color:#2c3136;border-color:#2a2e33;box-shadow:0 0 0 .25rem #52585d80}.btn-check:checked+html .btn-gray-800,.btn-check:active+html .btn-gray-800,html .btn-gray-800:active,html .btn-gray-800.active,.show>html .btn-gray-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-800,html[data-netbox-color-mode=dark] .btn-gray-800:active,html[data-netbox-color-mode=dark] .btn-gray-800.active,.show>html[data-netbox-color-mode=dark] .btn-gray-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-800,html[data-netbox-color-mode=light] .btn-gray-800:active,html[data-netbox-color-mode=light] .btn-gray-800.active,.show>html[data-netbox-color-mode=light] .btn-gray-800.dropdown-toggle{color:#fff;background-color:#2a2e33;border-color:#272c30}.btn-check:checked+html .btn-gray-800:focus,.btn-check:active+html .btn-gray-800:focus,html .btn-gray-800:active:focus,html .btn-gray-800.active:focus,.show>html .btn-gray-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-800:focus,html[data-netbox-color-mode=dark] .btn-gray-800:active:focus,html[data-netbox-color-mode=dark] .btn-gray-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-800:focus,html[data-netbox-color-mode=light] .btn-gray-800:active:focus,html[data-netbox-color-mode=light] .btn-gray-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52585d80}html .btn-gray-800:disabled,html .btn-gray-800.disabled,html[data-netbox-color-mode=dark] .btn-gray-800:disabled,html[data-netbox-color-mode=dark] .btn-gray-800.disabled,html[data-netbox-color-mode=light] .btn-gray-800:disabled,html[data-netbox-color-mode=light] .btn-gray-800.disabled{color:#fff;background-color:#343a40;border-color:#343a40}}@media print{html .btn-gray-900,html[data-netbox-color-mode=dark] .btn-gray-900,html[data-netbox-color-mode=light] .btn-gray-900{color:#fff;background-color:#212529;border-color:#212529}html .btn-gray-900:hover,html[data-netbox-color-mode=dark] .btn-gray-900:hover,html[data-netbox-color-mode=light] .btn-gray-900:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+html .btn-gray-900,html .btn-gray-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray-900,html[data-netbox-color-mode=dark] .btn-gray-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray-900,html[data-netbox-color-mode=light] .btn-gray-900:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem #42464980}.btn-check:checked+html .btn-gray-900,.btn-check:active+html .btn-gray-900,html .btn-gray-900:active,html .btn-gray-900.active,.show>html .btn-gray-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-900,html[data-netbox-color-mode=dark] .btn-gray-900:active,html[data-netbox-color-mode=dark] .btn-gray-900.active,.show>html[data-netbox-color-mode=dark] .btn-gray-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-900,html[data-netbox-color-mode=light] .btn-gray-900:active,html[data-netbox-color-mode=light] .btn-gray-900.active,.show>html[data-netbox-color-mode=light] .btn-gray-900.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:checked+html .btn-gray-900:focus,.btn-check:active+html .btn-gray-900:focus,html .btn-gray-900:active:focus,html .btn-gray-900.active:focus,.show>html .btn-gray-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray-900:focus,html[data-netbox-color-mode=dark] .btn-gray-900:active:focus,html[data-netbox-color-mode=dark] .btn-gray-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray-900:focus,html[data-netbox-color-mode=light] .btn-gray-900:active:focus,html[data-netbox-color-mode=light] .btn-gray-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #42464980}html .btn-gray-900:disabled,html .btn-gray-900.disabled,html[data-netbox-color-mode=dark] .btn-gray-900:disabled,html[data-netbox-color-mode=dark] .btn-gray-900.disabled,html[data-netbox-color-mode=light] .btn-gray-900:disabled,html[data-netbox-color-mode=light] .btn-gray-900.disabled{color:#fff;background-color:#212529;border-color:#212529}}@media print{html .btn-red-100,html[data-netbox-color-mode=dark] .btn-red-100,html[data-netbox-color-mode=light] .btn-red-100{color:#000;background-color:#f8d7da;border-color:#f8d7da}html .btn-red-100:hover,html[data-netbox-color-mode=dark] .btn-red-100:hover,html[data-netbox-color-mode=light] .btn-red-100:hover{color:#000;background-color:#f9dde0;border-color:#f9dbde}.btn-check:focus+html .btn-red-100,html .btn-red-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-100,html[data-netbox-color-mode=dark] .btn-red-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-100,html[data-netbox-color-mode=light] .btn-red-100:focus{color:#000;background-color:#f9dde0;border-color:#f9dbde;box-shadow:0 0 0 .25rem #d3b7b980}.btn-check:checked+html .btn-red-100,.btn-check:active+html .btn-red-100,html .btn-red-100:active,html .btn-red-100.active,.show>html .btn-red-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-100,html[data-netbox-color-mode=dark] .btn-red-100:active,html[data-netbox-color-mode=dark] .btn-red-100.active,.show>html[data-netbox-color-mode=dark] .btn-red-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-100,html[data-netbox-color-mode=light] .btn-red-100:active,html[data-netbox-color-mode=light] .btn-red-100.active,.show>html[data-netbox-color-mode=light] .btn-red-100.dropdown-toggle{color:#000;background-color:#f9dfe1;border-color:#f9dbde}.btn-check:checked+html .btn-red-100:focus,.btn-check:active+html .btn-red-100:focus,html .btn-red-100:active:focus,html .btn-red-100.active:focus,.show>html .btn-red-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-100:focus,html[data-netbox-color-mode=dark] .btn-red-100:active:focus,html[data-netbox-color-mode=dark] .btn-red-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-100:focus,html[data-netbox-color-mode=light] .btn-red-100:active:focus,html[data-netbox-color-mode=light] .btn-red-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3b7b980}html .btn-red-100:disabled,html .btn-red-100.disabled,html[data-netbox-color-mode=dark] .btn-red-100:disabled,html[data-netbox-color-mode=dark] .btn-red-100.disabled,html[data-netbox-color-mode=light] .btn-red-100:disabled,html[data-netbox-color-mode=light] .btn-red-100.disabled{color:#000;background-color:#f8d7da;border-color:#f8d7da}}@media print{html .btn-red-200,html[data-netbox-color-mode=dark] .btn-red-200,html[data-netbox-color-mode=light] .btn-red-200{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}html .btn-red-200:hover,html[data-netbox-color-mode=dark] .btn-red-200:hover,html[data-netbox-color-mode=light] .btn-red-200:hover{color:#000;background-color:#f3bac0;border-color:#f2b6bc}.btn-check:focus+html .btn-red-200,html .btn-red-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-200,html[data-netbox-color-mode=dark] .btn-red-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-200,html[data-netbox-color-mode=light] .btn-red-200:focus{color:#000;background-color:#f3bac0;border-color:#f2b6bc;box-shadow:0 0 0 .25rem #cd949a80}.btn-check:checked+html .btn-red-200,.btn-check:active+html .btn-red-200,html .btn-red-200:active,html .btn-red-200.active,.show>html .btn-red-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-200,html[data-netbox-color-mode=dark] .btn-red-200:active,html[data-netbox-color-mode=dark] .btn-red-200.active,.show>html[data-netbox-color-mode=dark] .btn-red-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-200,html[data-netbox-color-mode=light] .btn-red-200:active,html[data-netbox-color-mode=light] .btn-red-200.active,.show>html[data-netbox-color-mode=light] .btn-red-200.dropdown-toggle{color:#000;background-color:#f4bec4;border-color:#f2b6bc}.btn-check:checked+html .btn-red-200:focus,.btn-check:active+html .btn-red-200:focus,html .btn-red-200:active:focus,html .btn-red-200.active:focus,.show>html .btn-red-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-200:focus,html[data-netbox-color-mode=dark] .btn-red-200:active:focus,html[data-netbox-color-mode=dark] .btn-red-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-200:focus,html[data-netbox-color-mode=light] .btn-red-200:active:focus,html[data-netbox-color-mode=light] .btn-red-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #cd949a80}html .btn-red-200:disabled,html .btn-red-200.disabled,html[data-netbox-color-mode=dark] .btn-red-200:disabled,html[data-netbox-color-mode=dark] .btn-red-200.disabled,html[data-netbox-color-mode=light] .btn-red-200:disabled,html[data-netbox-color-mode=light] .btn-red-200.disabled{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}}@media print{html .btn-red-300,html[data-netbox-color-mode=dark] .btn-red-300,html[data-netbox-color-mode=light] .btn-red-300{color:#000;background-color:#ea868f;border-color:#ea868f}html .btn-red-300:hover,html[data-netbox-color-mode=dark] .btn-red-300:hover,html[data-netbox-color-mode=light] .btn-red-300:hover{color:#000;background-color:#ed98a0;border-color:#ec929a}.btn-check:focus+html .btn-red-300,html .btn-red-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-300,html[data-netbox-color-mode=dark] .btn-red-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-300,html[data-netbox-color-mode=light] .btn-red-300:focus{color:#000;background-color:#ed98a0;border-color:#ec929a;box-shadow:0 0 0 .25rem #c7727a80}.btn-check:checked+html .btn-red-300,.btn-check:active+html .btn-red-300,html .btn-red-300:active,html .btn-red-300.active,.show>html .btn-red-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-300,html[data-netbox-color-mode=dark] .btn-red-300:active,html[data-netbox-color-mode=dark] .btn-red-300.active,.show>html[data-netbox-color-mode=dark] .btn-red-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-300,html[data-netbox-color-mode=light] .btn-red-300:active,html[data-netbox-color-mode=light] .btn-red-300.active,.show>html[data-netbox-color-mode=light] .btn-red-300.dropdown-toggle{color:#000;background-color:#ee9ea5;border-color:#ec929a}.btn-check:checked+html .btn-red-300:focus,.btn-check:active+html .btn-red-300:focus,html .btn-red-300:active:focus,html .btn-red-300.active:focus,.show>html .btn-red-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-300:focus,html[data-netbox-color-mode=dark] .btn-red-300:active:focus,html[data-netbox-color-mode=dark] .btn-red-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-300:focus,html[data-netbox-color-mode=light] .btn-red-300:active:focus,html[data-netbox-color-mode=light] .btn-red-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c7727a80}html .btn-red-300:disabled,html .btn-red-300.disabled,html[data-netbox-color-mode=dark] .btn-red-300:disabled,html[data-netbox-color-mode=dark] .btn-red-300.disabled,html[data-netbox-color-mode=light] .btn-red-300:disabled,html[data-netbox-color-mode=light] .btn-red-300.disabled{color:#000;background-color:#ea868f;border-color:#ea868f}}@media print{html .btn-red-400,html[data-netbox-color-mode=dark] .btn-red-400,html[data-netbox-color-mode=light] .btn-red-400{color:#000;background-color:#e35d6a;border-color:#e35d6a}html .btn-red-400:hover,html[data-netbox-color-mode=dark] .btn-red-400:hover,html[data-netbox-color-mode=light] .btn-red-400:hover{color:#000;background-color:#e77580;border-color:#e66d79}.btn-check:focus+html .btn-red-400,html .btn-red-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-400,html[data-netbox-color-mode=dark] .btn-red-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-400,html[data-netbox-color-mode=light] .btn-red-400:focus{color:#000;background-color:#e77580;border-color:#e66d79;box-shadow:0 0 0 .25rem #c14f5a80}.btn-check:checked+html .btn-red-400,.btn-check:active+html .btn-red-400,html .btn-red-400:active,html .btn-red-400.active,.show>html .btn-red-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-400,html[data-netbox-color-mode=dark] .btn-red-400:active,html[data-netbox-color-mode=dark] .btn-red-400.active,.show>html[data-netbox-color-mode=dark] .btn-red-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-400,html[data-netbox-color-mode=light] .btn-red-400:active,html[data-netbox-color-mode=light] .btn-red-400.active,.show>html[data-netbox-color-mode=light] .btn-red-400.dropdown-toggle{color:#000;background-color:#e97d88;border-color:#e66d79}.btn-check:checked+html .btn-red-400:focus,.btn-check:active+html .btn-red-400:focus,html .btn-red-400:active:focus,html .btn-red-400.active:focus,.show>html .btn-red-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-400:focus,html[data-netbox-color-mode=dark] .btn-red-400:active:focus,html[data-netbox-color-mode=dark] .btn-red-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-400:focus,html[data-netbox-color-mode=light] .btn-red-400:active:focus,html[data-netbox-color-mode=light] .btn-red-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c14f5a80}html .btn-red-400:disabled,html .btn-red-400.disabled,html[data-netbox-color-mode=dark] .btn-red-400:disabled,html[data-netbox-color-mode=dark] .btn-red-400.disabled,html[data-netbox-color-mode=light] .btn-red-400:disabled,html[data-netbox-color-mode=light] .btn-red-400.disabled{color:#000;background-color:#e35d6a;border-color:#e35d6a}}@media print{html .btn-red-500,html[data-netbox-color-mode=dark] .btn-red-500,html[data-netbox-color-mode=light] .btn-red-500{color:#fff;background-color:#dc3545;border-color:#dc3545}html .btn-red-500:hover,html[data-netbox-color-mode=dark] .btn-red-500:hover,html[data-netbox-color-mode=light] .btn-red-500:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+html .btn-red-500,html .btn-red-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-500,html[data-netbox-color-mode=dark] .btn-red-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-500,html[data-netbox-color-mode=light] .btn-red-500:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+html .btn-red-500,.btn-check:active+html .btn-red-500,html .btn-red-500:active,html .btn-red-500.active,.show>html .btn-red-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-500,html[data-netbox-color-mode=dark] .btn-red-500:active,html[data-netbox-color-mode=dark] .btn-red-500.active,.show>html[data-netbox-color-mode=dark] .btn-red-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-500,html[data-netbox-color-mode=light] .btn-red-500:active,html[data-netbox-color-mode=light] .btn-red-500.active,.show>html[data-netbox-color-mode=light] .btn-red-500.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+html .btn-red-500:focus,.btn-check:active+html .btn-red-500:focus,html .btn-red-500:active:focus,html .btn-red-500.active:focus,.show>html .btn-red-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-500:focus,html[data-netbox-color-mode=dark] .btn-red-500:active:focus,html[data-netbox-color-mode=dark] .btn-red-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-500:focus,html[data-netbox-color-mode=light] .btn-red-500:active:focus,html[data-netbox-color-mode=light] .btn-red-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}html .btn-red-500:disabled,html .btn-red-500.disabled,html[data-netbox-color-mode=dark] .btn-red-500:disabled,html[data-netbox-color-mode=dark] .btn-red-500.disabled,html[data-netbox-color-mode=light] .btn-red-500:disabled,html[data-netbox-color-mode=light] .btn-red-500.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}}@media print{html .btn-red-600,html[data-netbox-color-mode=dark] .btn-red-600,html[data-netbox-color-mode=light] .btn-red-600{color:#fff;background-color:#b02a37;border-color:#b02a37}html .btn-red-600:hover,html[data-netbox-color-mode=dark] .btn-red-600:hover,html[data-netbox-color-mode=light] .btn-red-600:hover{color:#fff;background-color:#96242f;border-color:#8d222c}.btn-check:focus+html .btn-red-600,html .btn-red-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-600,html[data-netbox-color-mode=dark] .btn-red-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-600,html[data-netbox-color-mode=light] .btn-red-600:focus{color:#fff;background-color:#96242f;border-color:#8d222c;box-shadow:0 0 0 .25rem #bc4a5580}.btn-check:checked+html .btn-red-600,.btn-check:active+html .btn-red-600,html .btn-red-600:active,html .btn-red-600.active,.show>html .btn-red-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-600,html[data-netbox-color-mode=dark] .btn-red-600:active,html[data-netbox-color-mode=dark] .btn-red-600.active,.show>html[data-netbox-color-mode=dark] .btn-red-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-600,html[data-netbox-color-mode=light] .btn-red-600:active,html[data-netbox-color-mode=light] .btn-red-600.active,.show>html[data-netbox-color-mode=light] .btn-red-600.dropdown-toggle{color:#fff;background-color:#8d222c;border-color:#842029}.btn-check:checked+html .btn-red-600:focus,.btn-check:active+html .btn-red-600:focus,html .btn-red-600:active:focus,html .btn-red-600.active:focus,.show>html .btn-red-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-600:focus,html[data-netbox-color-mode=dark] .btn-red-600:active:focus,html[data-netbox-color-mode=dark] .btn-red-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-600:focus,html[data-netbox-color-mode=light] .btn-red-600:active:focus,html[data-netbox-color-mode=light] .btn-red-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bc4a5580}html .btn-red-600:disabled,html .btn-red-600.disabled,html[data-netbox-color-mode=dark] .btn-red-600:disabled,html[data-netbox-color-mode=dark] .btn-red-600.disabled,html[data-netbox-color-mode=light] .btn-red-600:disabled,html[data-netbox-color-mode=light] .btn-red-600.disabled{color:#fff;background-color:#b02a37;border-color:#b02a37}}@media print{html .btn-red-700,html[data-netbox-color-mode=dark] .btn-red-700,html[data-netbox-color-mode=light] .btn-red-700{color:#fff;background-color:#842029;border-color:#842029}html .btn-red-700:hover,html[data-netbox-color-mode=dark] .btn-red-700:hover,html[data-netbox-color-mode=light] .btn-red-700:hover{color:#fff;background-color:#701b23;border-color:#6a1a21}.btn-check:focus+html .btn-red-700,html .btn-red-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-700,html[data-netbox-color-mode=dark] .btn-red-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-700,html[data-netbox-color-mode=light] .btn-red-700:focus{color:#fff;background-color:#701b23;border-color:#6a1a21;box-shadow:0 0 0 .25rem #96414980}.btn-check:checked+html .btn-red-700,.btn-check:active+html .btn-red-700,html .btn-red-700:active,html .btn-red-700.active,.show>html .btn-red-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-700,html[data-netbox-color-mode=dark] .btn-red-700:active,html[data-netbox-color-mode=dark] .btn-red-700.active,.show>html[data-netbox-color-mode=dark] .btn-red-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-700,html[data-netbox-color-mode=light] .btn-red-700:active,html[data-netbox-color-mode=light] .btn-red-700.active,.show>html[data-netbox-color-mode=light] .btn-red-700.dropdown-toggle{color:#fff;background-color:#6a1a21;border-color:#63181f}.btn-check:checked+html .btn-red-700:focus,.btn-check:active+html .btn-red-700:focus,html .btn-red-700:active:focus,html .btn-red-700.active:focus,.show>html .btn-red-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-700:focus,html[data-netbox-color-mode=dark] .btn-red-700:active:focus,html[data-netbox-color-mode=dark] .btn-red-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-700:focus,html[data-netbox-color-mode=light] .btn-red-700:active:focus,html[data-netbox-color-mode=light] .btn-red-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #96414980}html .btn-red-700:disabled,html .btn-red-700.disabled,html[data-netbox-color-mode=dark] .btn-red-700:disabled,html[data-netbox-color-mode=dark] .btn-red-700.disabled,html[data-netbox-color-mode=light] .btn-red-700:disabled,html[data-netbox-color-mode=light] .btn-red-700.disabled{color:#fff;background-color:#842029;border-color:#842029}}@media print{html .btn-red-800,html[data-netbox-color-mode=dark] .btn-red-800,html[data-netbox-color-mode=light] .btn-red-800{color:#fff;background-color:#58151c;border-color:#58151c}html .btn-red-800:hover,html[data-netbox-color-mode=dark] .btn-red-800:hover,html[data-netbox-color-mode=light] .btn-red-800:hover{color:#fff;background-color:#4b1218;border-color:#461116}.btn-check:focus+html .btn-red-800,html .btn-red-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-800,html[data-netbox-color-mode=dark] .btn-red-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-800,html[data-netbox-color-mode=light] .btn-red-800:focus{color:#fff;background-color:#4b1218;border-color:#461116;box-shadow:0 0 0 .25rem #71383e80}.btn-check:checked+html .btn-red-800,.btn-check:active+html .btn-red-800,html .btn-red-800:active,html .btn-red-800.active,.show>html .btn-red-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-800,html[data-netbox-color-mode=dark] .btn-red-800:active,html[data-netbox-color-mode=dark] .btn-red-800.active,.show>html[data-netbox-color-mode=dark] .btn-red-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-800,html[data-netbox-color-mode=light] .btn-red-800:active,html[data-netbox-color-mode=light] .btn-red-800.active,.show>html[data-netbox-color-mode=light] .btn-red-800.dropdown-toggle{color:#fff;background-color:#461116;border-color:#421015}.btn-check:checked+html .btn-red-800:focus,.btn-check:active+html .btn-red-800:focus,html .btn-red-800:active:focus,html .btn-red-800.active:focus,.show>html .btn-red-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-800:focus,html[data-netbox-color-mode=dark] .btn-red-800:active:focus,html[data-netbox-color-mode=dark] .btn-red-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-800:focus,html[data-netbox-color-mode=light] .btn-red-800:active:focus,html[data-netbox-color-mode=light] .btn-red-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #71383e80}html .btn-red-800:disabled,html .btn-red-800.disabled,html[data-netbox-color-mode=dark] .btn-red-800:disabled,html[data-netbox-color-mode=dark] .btn-red-800.disabled,html[data-netbox-color-mode=light] .btn-red-800:disabled,html[data-netbox-color-mode=light] .btn-red-800.disabled{color:#fff;background-color:#58151c;border-color:#58151c}}@media print{html .btn-red-900,html[data-netbox-color-mode=dark] .btn-red-900,html[data-netbox-color-mode=light] .btn-red-900{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}html .btn-red-900:hover,html[data-netbox-color-mode=dark] .btn-red-900:hover,html[data-netbox-color-mode=light] .btn-red-900:hover{color:#fff;background-color:#25090c;border-color:#23090b}.btn-check:focus+html .btn-red-900,html .btn-red-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red-900,html[data-netbox-color-mode=dark] .btn-red-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red-900,html[data-netbox-color-mode=light] .btn-red-900:focus{color:#fff;background-color:#25090c;border-color:#23090b;box-shadow:0 0 0 .25rem #4c303280}.btn-check:checked+html .btn-red-900,.btn-check:active+html .btn-red-900,html .btn-red-900:active,html .btn-red-900.active,.show>html .btn-red-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-900,html[data-netbox-color-mode=dark] .btn-red-900:active,html[data-netbox-color-mode=dark] .btn-red-900.active,.show>html[data-netbox-color-mode=dark] .btn-red-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-900,html[data-netbox-color-mode=light] .btn-red-900:active,html[data-netbox-color-mode=light] .btn-red-900.active,.show>html[data-netbox-color-mode=light] .btn-red-900.dropdown-toggle{color:#fff;background-color:#23090b;border-color:#21080b}.btn-check:checked+html .btn-red-900:focus,.btn-check:active+html .btn-red-900:focus,html .btn-red-900:active:focus,html .btn-red-900.active:focus,.show>html .btn-red-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red-900:focus,html[data-netbox-color-mode=dark] .btn-red-900:active:focus,html[data-netbox-color-mode=dark] .btn-red-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red-900:focus,html[data-netbox-color-mode=light] .btn-red-900:active:focus,html[data-netbox-color-mode=light] .btn-red-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-red-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4c303280}html .btn-red-900:disabled,html .btn-red-900.disabled,html[data-netbox-color-mode=dark] .btn-red-900:disabled,html[data-netbox-color-mode=dark] .btn-red-900.disabled,html[data-netbox-color-mode=light] .btn-red-900:disabled,html[data-netbox-color-mode=light] .btn-red-900.disabled{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}}@media print{html .btn-yellow-100,html[data-netbox-color-mode=dark] .btn-yellow-100,html[data-netbox-color-mode=light] .btn-yellow-100{color:#000;background-color:#fff3cd;border-color:#fff3cd}html .btn-yellow-100:hover,html[data-netbox-color-mode=dark] .btn-yellow-100:hover,html[data-netbox-color-mode=light] .btn-yellow-100:hover{color:#000;background-color:#fff5d5;border-color:#fff4d2}.btn-check:focus+html .btn-yellow-100,html .btn-yellow-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-100,html[data-netbox-color-mode=dark] .btn-yellow-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-100,html[data-netbox-color-mode=light] .btn-yellow-100:focus{color:#000;background-color:#fff5d5;border-color:#fff4d2;box-shadow:0 0 0 .25rem #d9cfae80}.btn-check:checked+html .btn-yellow-100,.btn-check:active+html .btn-yellow-100,html .btn-yellow-100:active,html .btn-yellow-100.active,.show>html .btn-yellow-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-100,html[data-netbox-color-mode=dark] .btn-yellow-100:active,html[data-netbox-color-mode=dark] .btn-yellow-100.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-100,html[data-netbox-color-mode=light] .btn-yellow-100:active,html[data-netbox-color-mode=light] .btn-yellow-100.active,.show>html[data-netbox-color-mode=light] .btn-yellow-100.dropdown-toggle{color:#000;background-color:#fff5d7;border-color:#fff4d2}.btn-check:checked+html .btn-yellow-100:focus,.btn-check:active+html .btn-yellow-100:focus,html .btn-yellow-100:active:focus,html .btn-yellow-100.active:focus,.show>html .btn-yellow-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-100:focus,html[data-netbox-color-mode=dark] .btn-yellow-100:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-100:focus,html[data-netbox-color-mode=light] .btn-yellow-100:active:focus,html[data-netbox-color-mode=light] .btn-yellow-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9cfae80}html .btn-yellow-100:disabled,html .btn-yellow-100.disabled,html[data-netbox-color-mode=dark] .btn-yellow-100:disabled,html[data-netbox-color-mode=dark] .btn-yellow-100.disabled,html[data-netbox-color-mode=light] .btn-yellow-100:disabled,html[data-netbox-color-mode=light] .btn-yellow-100.disabled{color:#000;background-color:#fff3cd;border-color:#fff3cd}}@media print{html .btn-yellow-200,html[data-netbox-color-mode=dark] .btn-yellow-200,html[data-netbox-color-mode=light] .btn-yellow-200{color:#000;background-color:#ffe69c;border-color:#ffe69c}html .btn-yellow-200:hover,html[data-netbox-color-mode=dark] .btn-yellow-200:hover,html[data-netbox-color-mode=light] .btn-yellow-200:hover{color:#000;background-color:#ffeaab;border-color:#ffe9a6}.btn-check:focus+html .btn-yellow-200,html .btn-yellow-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-200,html[data-netbox-color-mode=dark] .btn-yellow-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-200,html[data-netbox-color-mode=light] .btn-yellow-200:focus{color:#000;background-color:#ffeaab;border-color:#ffe9a6;box-shadow:0 0 0 .25rem #d9c48580}.btn-check:checked+html .btn-yellow-200,.btn-check:active+html .btn-yellow-200,html .btn-yellow-200:active,html .btn-yellow-200.active,.show>html .btn-yellow-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-200,html[data-netbox-color-mode=dark] .btn-yellow-200:active,html[data-netbox-color-mode=dark] .btn-yellow-200.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-200,html[data-netbox-color-mode=light] .btn-yellow-200:active,html[data-netbox-color-mode=light] .btn-yellow-200.active,.show>html[data-netbox-color-mode=light] .btn-yellow-200.dropdown-toggle{color:#000;background-color:#ffebb0;border-color:#ffe9a6}.btn-check:checked+html .btn-yellow-200:focus,.btn-check:active+html .btn-yellow-200:focus,html .btn-yellow-200:active:focus,html .btn-yellow-200.active:focus,.show>html .btn-yellow-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-200:focus,html[data-netbox-color-mode=dark] .btn-yellow-200:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-200:focus,html[data-netbox-color-mode=light] .btn-yellow-200:active:focus,html[data-netbox-color-mode=light] .btn-yellow-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9c48580}html .btn-yellow-200:disabled,html .btn-yellow-200.disabled,html[data-netbox-color-mode=dark] .btn-yellow-200:disabled,html[data-netbox-color-mode=dark] .btn-yellow-200.disabled,html[data-netbox-color-mode=light] .btn-yellow-200:disabled,html[data-netbox-color-mode=light] .btn-yellow-200.disabled{color:#000;background-color:#ffe69c;border-color:#ffe69c}}@media print{html .btn-yellow-300,html[data-netbox-color-mode=dark] .btn-yellow-300,html[data-netbox-color-mode=light] .btn-yellow-300{color:#000;background-color:#ffda6a;border-color:#ffda6a}html .btn-yellow-300:hover,html[data-netbox-color-mode=dark] .btn-yellow-300:hover,html[data-netbox-color-mode=light] .btn-yellow-300:hover{color:#000;background-color:#ffe080;border-color:#ffde79}.btn-check:focus+html .btn-yellow-300,html .btn-yellow-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-300,html[data-netbox-color-mode=dark] .btn-yellow-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-300,html[data-netbox-color-mode=light] .btn-yellow-300:focus{color:#000;background-color:#ffe080;border-color:#ffde79;box-shadow:0 0 0 .25rem #d9b95a80}.btn-check:checked+html .btn-yellow-300,.btn-check:active+html .btn-yellow-300,html .btn-yellow-300:active,html .btn-yellow-300.active,.show>html .btn-yellow-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-300,html[data-netbox-color-mode=dark] .btn-yellow-300:active,html[data-netbox-color-mode=dark] .btn-yellow-300.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-300,html[data-netbox-color-mode=light] .btn-yellow-300:active,html[data-netbox-color-mode=light] .btn-yellow-300.active,.show>html[data-netbox-color-mode=light] .btn-yellow-300.dropdown-toggle{color:#000;background-color:#ffe188;border-color:#ffde79}.btn-check:checked+html .btn-yellow-300:focus,.btn-check:active+html .btn-yellow-300:focus,html .btn-yellow-300:active:focus,html .btn-yellow-300.active:focus,.show>html .btn-yellow-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-300:focus,html[data-netbox-color-mode=dark] .btn-yellow-300:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-300:focus,html[data-netbox-color-mode=light] .btn-yellow-300:active:focus,html[data-netbox-color-mode=light] .btn-yellow-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9b95a80}html .btn-yellow-300:disabled,html .btn-yellow-300.disabled,html[data-netbox-color-mode=dark] .btn-yellow-300:disabled,html[data-netbox-color-mode=dark] .btn-yellow-300.disabled,html[data-netbox-color-mode=light] .btn-yellow-300:disabled,html[data-netbox-color-mode=light] .btn-yellow-300.disabled{color:#000;background-color:#ffda6a;border-color:#ffda6a}}@media print{html .btn-yellow-400,html[data-netbox-color-mode=dark] .btn-yellow-400,html[data-netbox-color-mode=light] .btn-yellow-400{color:#000;background-color:#ffcd39;border-color:#ffcd39}html .btn-yellow-400:hover,html[data-netbox-color-mode=dark] .btn-yellow-400:hover,html[data-netbox-color-mode=light] .btn-yellow-400:hover{color:#000;background-color:#ffd557;border-color:#ffd24d}.btn-check:focus+html .btn-yellow-400,html .btn-yellow-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-400,html[data-netbox-color-mode=dark] .btn-yellow-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-400,html[data-netbox-color-mode=light] .btn-yellow-400:focus{color:#000;background-color:#ffd557;border-color:#ffd24d;box-shadow:0 0 0 .25rem #d9ae3080}.btn-check:checked+html .btn-yellow-400,.btn-check:active+html .btn-yellow-400,html .btn-yellow-400:active,html .btn-yellow-400.active,.show>html .btn-yellow-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-400,html[data-netbox-color-mode=dark] .btn-yellow-400:active,html[data-netbox-color-mode=dark] .btn-yellow-400.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-400,html[data-netbox-color-mode=light] .btn-yellow-400:active,html[data-netbox-color-mode=light] .btn-yellow-400.active,.show>html[data-netbox-color-mode=light] .btn-yellow-400.dropdown-toggle{color:#000;background-color:#ffd761;border-color:#ffd24d}.btn-check:checked+html .btn-yellow-400:focus,.btn-check:active+html .btn-yellow-400:focus,html .btn-yellow-400:active:focus,html .btn-yellow-400.active:focus,.show>html .btn-yellow-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-400:focus,html[data-netbox-color-mode=dark] .btn-yellow-400:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-400:focus,html[data-netbox-color-mode=light] .btn-yellow-400:active:focus,html[data-netbox-color-mode=light] .btn-yellow-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9ae3080}html .btn-yellow-400:disabled,html .btn-yellow-400.disabled,html[data-netbox-color-mode=dark] .btn-yellow-400:disabled,html[data-netbox-color-mode=dark] .btn-yellow-400.disabled,html[data-netbox-color-mode=light] .btn-yellow-400:disabled,html[data-netbox-color-mode=light] .btn-yellow-400.disabled{color:#000;background-color:#ffcd39;border-color:#ffcd39}}@media print{html .btn-yellow-500,html[data-netbox-color-mode=dark] .btn-yellow-500,html[data-netbox-color-mode=light] .btn-yellow-500{color:#000;background-color:#ffc107;border-color:#ffc107}html .btn-yellow-500:hover,html[data-netbox-color-mode=dark] .btn-yellow-500:hover,html[data-netbox-color-mode=light] .btn-yellow-500:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+html .btn-yellow-500,html .btn-yellow-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-500,html[data-netbox-color-mode=dark] .btn-yellow-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-500,html[data-netbox-color-mode=light] .btn-yellow-500:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+html .btn-yellow-500,.btn-check:active+html .btn-yellow-500,html .btn-yellow-500:active,html .btn-yellow-500.active,.show>html .btn-yellow-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-500,html[data-netbox-color-mode=dark] .btn-yellow-500:active,html[data-netbox-color-mode=dark] .btn-yellow-500.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-500,html[data-netbox-color-mode=light] .btn-yellow-500:active,html[data-netbox-color-mode=light] .btn-yellow-500.active,.show>html[data-netbox-color-mode=light] .btn-yellow-500.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+html .btn-yellow-500:focus,.btn-check:active+html .btn-yellow-500:focus,html .btn-yellow-500:active:focus,html .btn-yellow-500.active:focus,.show>html .btn-yellow-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-500:focus,html[data-netbox-color-mode=dark] .btn-yellow-500:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-500:focus,html[data-netbox-color-mode=light] .btn-yellow-500:active:focus,html[data-netbox-color-mode=light] .btn-yellow-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}html .btn-yellow-500:disabled,html .btn-yellow-500.disabled,html[data-netbox-color-mode=dark] .btn-yellow-500:disabled,html[data-netbox-color-mode=dark] .btn-yellow-500.disabled,html[data-netbox-color-mode=light] .btn-yellow-500:disabled,html[data-netbox-color-mode=light] .btn-yellow-500.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}}@media print{html .btn-yellow-600,html[data-netbox-color-mode=dark] .btn-yellow-600,html[data-netbox-color-mode=light] .btn-yellow-600{color:#000;background-color:#cc9a06;border-color:#cc9a06}html .btn-yellow-600:hover,html[data-netbox-color-mode=dark] .btn-yellow-600:hover,html[data-netbox-color-mode=light] .btn-yellow-600:hover{color:#000;background-color:#d4a92b;border-color:#d1a41f}.btn-check:focus+html .btn-yellow-600,html .btn-yellow-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-600,html[data-netbox-color-mode=dark] .btn-yellow-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-600,html[data-netbox-color-mode=light] .btn-yellow-600:focus{color:#000;background-color:#d4a92b;border-color:#d1a41f;box-shadow:0 0 0 .25rem #ad830580}.btn-check:checked+html .btn-yellow-600,.btn-check:active+html .btn-yellow-600,html .btn-yellow-600:active,html .btn-yellow-600.active,.show>html .btn-yellow-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-600,html[data-netbox-color-mode=dark] .btn-yellow-600:active,html[data-netbox-color-mode=dark] .btn-yellow-600.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-600,html[data-netbox-color-mode=light] .btn-yellow-600:active,html[data-netbox-color-mode=light] .btn-yellow-600.active,.show>html[data-netbox-color-mode=light] .btn-yellow-600.dropdown-toggle{color:#000;background-color:#d6ae38;border-color:#d1a41f}.btn-check:checked+html .btn-yellow-600:focus,.btn-check:active+html .btn-yellow-600:focus,html .btn-yellow-600:active:focus,html .btn-yellow-600.active:focus,.show>html .btn-yellow-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-600:focus,html[data-netbox-color-mode=dark] .btn-yellow-600:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-600:focus,html[data-netbox-color-mode=light] .btn-yellow-600:active:focus,html[data-netbox-color-mode=light] .btn-yellow-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #ad830580}html .btn-yellow-600:disabled,html .btn-yellow-600.disabled,html[data-netbox-color-mode=dark] .btn-yellow-600:disabled,html[data-netbox-color-mode=dark] .btn-yellow-600.disabled,html[data-netbox-color-mode=light] .btn-yellow-600:disabled,html[data-netbox-color-mode=light] .btn-yellow-600.disabled{color:#000;background-color:#cc9a06;border-color:#cc9a06}}@media print{html .btn-yellow-700,html[data-netbox-color-mode=dark] .btn-yellow-700,html[data-netbox-color-mode=light] .btn-yellow-700{color:#000;background-color:#997404;border-color:#997404}html .btn-yellow-700:hover,html[data-netbox-color-mode=dark] .btn-yellow-700:hover,html[data-netbox-color-mode=light] .btn-yellow-700:hover{color:#000;background-color:#a8892a;border-color:#a3821d}.btn-check:focus+html .btn-yellow-700,html .btn-yellow-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-700,html[data-netbox-color-mode=dark] .btn-yellow-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-700,html[data-netbox-color-mode=light] .btn-yellow-700:focus{color:#000;background-color:#a8892a;border-color:#a3821d;box-shadow:0 0 0 .25rem #82630380}.btn-check:checked+html .btn-yellow-700,.btn-check:active+html .btn-yellow-700,html .btn-yellow-700:active,html .btn-yellow-700.active,.show>html .btn-yellow-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-700,html[data-netbox-color-mode=dark] .btn-yellow-700:active,html[data-netbox-color-mode=dark] .btn-yellow-700.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-700,html[data-netbox-color-mode=light] .btn-yellow-700:active,html[data-netbox-color-mode=light] .btn-yellow-700.active,.show>html[data-netbox-color-mode=light] .btn-yellow-700.dropdown-toggle{color:#000;background-color:#ad9036;border-color:#a3821d}.btn-check:checked+html .btn-yellow-700:focus,.btn-check:active+html .btn-yellow-700:focus,html .btn-yellow-700:active:focus,html .btn-yellow-700.active:focus,.show>html .btn-yellow-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-700:focus,html[data-netbox-color-mode=dark] .btn-yellow-700:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-700:focus,html[data-netbox-color-mode=light] .btn-yellow-700:active:focus,html[data-netbox-color-mode=light] .btn-yellow-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #82630380}html .btn-yellow-700:disabled,html .btn-yellow-700.disabled,html[data-netbox-color-mode=dark] .btn-yellow-700:disabled,html[data-netbox-color-mode=dark] .btn-yellow-700.disabled,html[data-netbox-color-mode=light] .btn-yellow-700:disabled,html[data-netbox-color-mode=light] .btn-yellow-700.disabled{color:#000;background-color:#997404;border-color:#997404}}@media print{html .btn-yellow-800,html[data-netbox-color-mode=dark] .btn-yellow-800,html[data-netbox-color-mode=light] .btn-yellow-800{color:#fff;background-color:#664d03;border-color:#664d03}html .btn-yellow-800:hover,html[data-netbox-color-mode=dark] .btn-yellow-800:hover,html[data-netbox-color-mode=light] .btn-yellow-800:hover{color:#fff;background-color:#574103;border-color:#523e02}.btn-check:focus+html .btn-yellow-800,html .btn-yellow-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-800,html[data-netbox-color-mode=dark] .btn-yellow-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-800,html[data-netbox-color-mode=light] .btn-yellow-800:focus{color:#fff;background-color:#574103;border-color:#523e02;box-shadow:0 0 0 .25rem #7d682980}.btn-check:checked+html .btn-yellow-800,.btn-check:active+html .btn-yellow-800,html .btn-yellow-800:active,html .btn-yellow-800.active,.show>html .btn-yellow-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-800,html[data-netbox-color-mode=dark] .btn-yellow-800:active,html[data-netbox-color-mode=dark] .btn-yellow-800.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-800,html[data-netbox-color-mode=light] .btn-yellow-800:active,html[data-netbox-color-mode=light] .btn-yellow-800.active,.show>html[data-netbox-color-mode=light] .btn-yellow-800.dropdown-toggle{color:#fff;background-color:#523e02;border-color:#4d3a02}.btn-check:checked+html .btn-yellow-800:focus,.btn-check:active+html .btn-yellow-800:focus,html .btn-yellow-800:active:focus,html .btn-yellow-800.active:focus,.show>html .btn-yellow-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-800:focus,html[data-netbox-color-mode=dark] .btn-yellow-800:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-800:focus,html[data-netbox-color-mode=light] .btn-yellow-800:active:focus,html[data-netbox-color-mode=light] .btn-yellow-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d682980}html .btn-yellow-800:disabled,html .btn-yellow-800.disabled,html[data-netbox-color-mode=dark] .btn-yellow-800:disabled,html[data-netbox-color-mode=dark] .btn-yellow-800.disabled,html[data-netbox-color-mode=light] .btn-yellow-800:disabled,html[data-netbox-color-mode=light] .btn-yellow-800.disabled{color:#fff;background-color:#664d03;border-color:#664d03}}@media print{html .btn-yellow-900,html[data-netbox-color-mode=dark] .btn-yellow-900,html[data-netbox-color-mode=light] .btn-yellow-900{color:#fff;background-color:#332701;border-color:#332701}html .btn-yellow-900:hover,html[data-netbox-color-mode=dark] .btn-yellow-900:hover,html[data-netbox-color-mode=light] .btn-yellow-900:hover{color:#fff;background-color:#2b2101;border-color:#291f01}.btn-check:focus+html .btn-yellow-900,html .btn-yellow-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow-900,html[data-netbox-color-mode=dark] .btn-yellow-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow-900,html[data-netbox-color-mode=light] .btn-yellow-900:focus{color:#fff;background-color:#2b2101;border-color:#291f01;box-shadow:0 0 0 .25rem #52472780}.btn-check:checked+html .btn-yellow-900,.btn-check:active+html .btn-yellow-900,html .btn-yellow-900:active,html .btn-yellow-900.active,.show>html .btn-yellow-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-900,html[data-netbox-color-mode=dark] .btn-yellow-900:active,html[data-netbox-color-mode=dark] .btn-yellow-900.active,.show>html[data-netbox-color-mode=dark] .btn-yellow-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-900,html[data-netbox-color-mode=light] .btn-yellow-900:active,html[data-netbox-color-mode=light] .btn-yellow-900.active,.show>html[data-netbox-color-mode=light] .btn-yellow-900.dropdown-toggle{color:#fff;background-color:#291f01;border-color:#261d01}.btn-check:checked+html .btn-yellow-900:focus,.btn-check:active+html .btn-yellow-900:focus,html .btn-yellow-900:active:focus,html .btn-yellow-900.active:focus,.show>html .btn-yellow-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow-900:focus,html[data-netbox-color-mode=dark] .btn-yellow-900:active:focus,html[data-netbox-color-mode=dark] .btn-yellow-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow-900:focus,html[data-netbox-color-mode=light] .btn-yellow-900:active:focus,html[data-netbox-color-mode=light] .btn-yellow-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52472780}html .btn-yellow-900:disabled,html .btn-yellow-900.disabled,html[data-netbox-color-mode=dark] .btn-yellow-900:disabled,html[data-netbox-color-mode=dark] .btn-yellow-900.disabled,html[data-netbox-color-mode=light] .btn-yellow-900:disabled,html[data-netbox-color-mode=light] .btn-yellow-900.disabled{color:#fff;background-color:#332701;border-color:#332701}}@media print{html .btn-green-100,html[data-netbox-color-mode=dark] .btn-green-100,html[data-netbox-color-mode=light] .btn-green-100{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}html .btn-green-100:hover,html[data-netbox-color-mode=dark] .btn-green-100:hover,html[data-netbox-color-mode=light] .btn-green-100:hover{color:#000;background-color:#d8ebe2;border-color:#d6e9e0}.btn-check:focus+html .btn-green-100,html .btn-green-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-100,html[data-netbox-color-mode=dark] .btn-green-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-100,html[data-netbox-color-mode=light] .btn-green-100:focus{color:#000;background-color:#d8ebe2;border-color:#d6e9e0;box-shadow:0 0 0 .25rem #b2c4bc80}.btn-check:checked+html .btn-green-100,.btn-check:active+html .btn-green-100,html .btn-green-100:active,html .btn-green-100.active,.show>html .btn-green-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-100,html[data-netbox-color-mode=dark] .btn-green-100:active,html[data-netbox-color-mode=dark] .btn-green-100.active,.show>html[data-netbox-color-mode=dark] .btn-green-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-100,html[data-netbox-color-mode=light] .btn-green-100:active,html[data-netbox-color-mode=light] .btn-green-100.active,.show>html[data-netbox-color-mode=light] .btn-green-100.dropdown-toggle{color:#000;background-color:#daece4;border-color:#d6e9e0}.btn-check:checked+html .btn-green-100:focus,.btn-check:active+html .btn-green-100:focus,html .btn-green-100:active:focus,html .btn-green-100.active:focus,.show>html .btn-green-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-100:focus,html[data-netbox-color-mode=dark] .btn-green-100:active:focus,html[data-netbox-color-mode=dark] .btn-green-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-100:focus,html[data-netbox-color-mode=light] .btn-green-100:active:focus,html[data-netbox-color-mode=light] .btn-green-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b2c4bc80}html .btn-green-100:disabled,html .btn-green-100.disabled,html[data-netbox-color-mode=dark] .btn-green-100:disabled,html[data-netbox-color-mode=dark] .btn-green-100.disabled,html[data-netbox-color-mode=light] .btn-green-100:disabled,html[data-netbox-color-mode=light] .btn-green-100.disabled{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}}@media print{html .btn-green-200,html[data-netbox-color-mode=dark] .btn-green-200,html[data-netbox-color-mode=light] .btn-green-200{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}html .btn-green-200:hover,html[data-netbox-color-mode=dark] .btn-green-200:hover,html[data-netbox-color-mode=light] .btn-green-200:hover{color:#000;background-color:#b1d6c5;border-color:#acd4c2}.btn-check:focus+html .btn-green-200,html .btn-green-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-200,html[data-netbox-color-mode=dark] .btn-green-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-200,html[data-netbox-color-mode=light] .btn-green-200:focus{color:#000;background-color:#b1d6c5;border-color:#acd4c2;box-shadow:0 0 0 .25rem #8bb09f80}.btn-check:checked+html .btn-green-200,.btn-check:active+html .btn-green-200,html .btn-green-200:active,html .btn-green-200.active,.show>html .btn-green-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-200,html[data-netbox-color-mode=dark] .btn-green-200:active,html[data-netbox-color-mode=dark] .btn-green-200.active,.show>html[data-netbox-color-mode=dark] .btn-green-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-200,html[data-netbox-color-mode=light] .btn-green-200:active,html[data-netbox-color-mode=light] .btn-green-200.active,.show>html[data-netbox-color-mode=light] .btn-green-200.dropdown-toggle{color:#000;background-color:#b5d9c9;border-color:#acd4c2}.btn-check:checked+html .btn-green-200:focus,.btn-check:active+html .btn-green-200:focus,html .btn-green-200:active:focus,html .btn-green-200.active:focus,.show>html .btn-green-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-200:focus,html[data-netbox-color-mode=dark] .btn-green-200:active:focus,html[data-netbox-color-mode=dark] .btn-green-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-200:focus,html[data-netbox-color-mode=light] .btn-green-200:active:focus,html[data-netbox-color-mode=light] .btn-green-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #8bb09f80}html .btn-green-200:disabled,html .btn-green-200.disabled,html[data-netbox-color-mode=dark] .btn-green-200:disabled,html[data-netbox-color-mode=dark] .btn-green-200.disabled,html[data-netbox-color-mode=light] .btn-green-200:disabled,html[data-netbox-color-mode=light] .btn-green-200.disabled{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}}@media print{html .btn-green-300,html[data-netbox-color-mode=dark] .btn-green-300,html[data-netbox-color-mode=light] .btn-green-300{color:#000;background-color:#75b798;border-color:#75b798}html .btn-green-300:hover,html[data-netbox-color-mode=dark] .btn-green-300:hover,html[data-netbox-color-mode=light] .btn-green-300:hover{color:#000;background-color:#8ac2a7;border-color:#83bea2}.btn-check:focus+html .btn-green-300,html .btn-green-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-300,html[data-netbox-color-mode=dark] .btn-green-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-300,html[data-netbox-color-mode=light] .btn-green-300:focus{color:#000;background-color:#8ac2a7;border-color:#83bea2;box-shadow:0 0 0 .25rem #639c8180}.btn-check:checked+html .btn-green-300,.btn-check:active+html .btn-green-300,html .btn-green-300:active,html .btn-green-300.active,.show>html .btn-green-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-300,html[data-netbox-color-mode=dark] .btn-green-300:active,html[data-netbox-color-mode=dark] .btn-green-300.active,.show>html[data-netbox-color-mode=dark] .btn-green-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-300,html[data-netbox-color-mode=light] .btn-green-300:active,html[data-netbox-color-mode=light] .btn-green-300.active,.show>html[data-netbox-color-mode=light] .btn-green-300.dropdown-toggle{color:#000;background-color:#91c5ad;border-color:#83bea2}.btn-check:checked+html .btn-green-300:focus,.btn-check:active+html .btn-green-300:focus,html .btn-green-300:active:focus,html .btn-green-300.active:focus,.show>html .btn-green-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-300:focus,html[data-netbox-color-mode=dark] .btn-green-300:active:focus,html[data-netbox-color-mode=dark] .btn-green-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-300:focus,html[data-netbox-color-mode=light] .btn-green-300:active:focus,html[data-netbox-color-mode=light] .btn-green-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #639c8180}html .btn-green-300:disabled,html .btn-green-300.disabled,html[data-netbox-color-mode=dark] .btn-green-300:disabled,html[data-netbox-color-mode=dark] .btn-green-300.disabled,html[data-netbox-color-mode=light] .btn-green-300:disabled,html[data-netbox-color-mode=light] .btn-green-300.disabled{color:#000;background-color:#75b798;border-color:#75b798}}@media print{html .btn-green-400,html[data-netbox-color-mode=dark] .btn-green-400,html[data-netbox-color-mode=light] .btn-green-400{color:#000;background-color:#479f76;border-color:#479f76}html .btn-green-400:hover,html[data-netbox-color-mode=dark] .btn-green-400:hover,html[data-netbox-color-mode=light] .btn-green-400:hover{color:#000;background-color:#63ad8b;border-color:#59a984}.btn-check:focus+html .btn-green-400,html .btn-green-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-400,html[data-netbox-color-mode=dark] .btn-green-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-400,html[data-netbox-color-mode=light] .btn-green-400:focus{color:#000;background-color:#63ad8b;border-color:#59a984;box-shadow:0 0 0 .25rem #3c876480}.btn-check:checked+html .btn-green-400,.btn-check:active+html .btn-green-400,html .btn-green-400:active,html .btn-green-400.active,.show>html .btn-green-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-400,html[data-netbox-color-mode=dark] .btn-green-400:active,html[data-netbox-color-mode=dark] .btn-green-400.active,.show>html[data-netbox-color-mode=dark] .btn-green-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-400,html[data-netbox-color-mode=light] .btn-green-400:active,html[data-netbox-color-mode=light] .btn-green-400.active,.show>html[data-netbox-color-mode=light] .btn-green-400.dropdown-toggle{color:#000;background-color:#6cb291;border-color:#59a984}.btn-check:checked+html .btn-green-400:focus,.btn-check:active+html .btn-green-400:focus,html .btn-green-400:active:focus,html .btn-green-400.active:focus,.show>html .btn-green-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-400:focus,html[data-netbox-color-mode=dark] .btn-green-400:active:focus,html[data-netbox-color-mode=dark] .btn-green-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-400:focus,html[data-netbox-color-mode=light] .btn-green-400:active:focus,html[data-netbox-color-mode=light] .btn-green-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c876480}html .btn-green-400:disabled,html .btn-green-400.disabled,html[data-netbox-color-mode=dark] .btn-green-400:disabled,html[data-netbox-color-mode=dark] .btn-green-400.disabled,html[data-netbox-color-mode=light] .btn-green-400:disabled,html[data-netbox-color-mode=light] .btn-green-400.disabled{color:#000;background-color:#479f76;border-color:#479f76}}@media print{html .btn-green-500,html[data-netbox-color-mode=dark] .btn-green-500,html[data-netbox-color-mode=light] .btn-green-500{color:#fff;background-color:#198754;border-color:#198754}html .btn-green-500:hover,html[data-netbox-color-mode=dark] .btn-green-500:hover,html[data-netbox-color-mode=light] .btn-green-500:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+html .btn-green-500,html .btn-green-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-500,html[data-netbox-color-mode=dark] .btn-green-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-500,html[data-netbox-color-mode=light] .btn-green-500:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+html .btn-green-500,.btn-check:active+html .btn-green-500,html .btn-green-500:active,html .btn-green-500.active,.show>html .btn-green-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-500,html[data-netbox-color-mode=dark] .btn-green-500:active,html[data-netbox-color-mode=dark] .btn-green-500.active,.show>html[data-netbox-color-mode=dark] .btn-green-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-500,html[data-netbox-color-mode=light] .btn-green-500:active,html[data-netbox-color-mode=light] .btn-green-500.active,.show>html[data-netbox-color-mode=light] .btn-green-500.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+html .btn-green-500:focus,.btn-check:active+html .btn-green-500:focus,html .btn-green-500:active:focus,html .btn-green-500.active:focus,.show>html .btn-green-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-500:focus,html[data-netbox-color-mode=dark] .btn-green-500:active:focus,html[data-netbox-color-mode=dark] .btn-green-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-500:focus,html[data-netbox-color-mode=light] .btn-green-500:active:focus,html[data-netbox-color-mode=light] .btn-green-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}html .btn-green-500:disabled,html .btn-green-500.disabled,html[data-netbox-color-mode=dark] .btn-green-500:disabled,html[data-netbox-color-mode=dark] .btn-green-500.disabled,html[data-netbox-color-mode=light] .btn-green-500:disabled,html[data-netbox-color-mode=light] .btn-green-500.disabled{color:#fff;background-color:#198754;border-color:#198754}}@media print{html .btn-green-600,html[data-netbox-color-mode=dark] .btn-green-600,html[data-netbox-color-mode=light] .btn-green-600{color:#fff;background-color:#146c43;border-color:#146c43}html .btn-green-600:hover,html[data-netbox-color-mode=dark] .btn-green-600:hover,html[data-netbox-color-mode=light] .btn-green-600:hover{color:#fff;background-color:#115c39;border-color:#105636}.btn-check:focus+html .btn-green-600,html .btn-green-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-600,html[data-netbox-color-mode=dark] .btn-green-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-600,html[data-netbox-color-mode=light] .btn-green-600:focus{color:#fff;background-color:#115c39;border-color:#105636;box-shadow:0 0 0 .25rem #37825f80}.btn-check:checked+html .btn-green-600,.btn-check:active+html .btn-green-600,html .btn-green-600:active,html .btn-green-600.active,.show>html .btn-green-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-600,html[data-netbox-color-mode=dark] .btn-green-600:active,html[data-netbox-color-mode=dark] .btn-green-600.active,.show>html[data-netbox-color-mode=dark] .btn-green-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-600,html[data-netbox-color-mode=light] .btn-green-600:active,html[data-netbox-color-mode=light] .btn-green-600.active,.show>html[data-netbox-color-mode=light] .btn-green-600.dropdown-toggle{color:#fff;background-color:#105636;border-color:#0f5132}.btn-check:checked+html .btn-green-600:focus,.btn-check:active+html .btn-green-600:focus,html .btn-green-600:active:focus,html .btn-green-600.active:focus,.show>html .btn-green-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-600:focus,html[data-netbox-color-mode=dark] .btn-green-600:active:focus,html[data-netbox-color-mode=dark] .btn-green-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-600:focus,html[data-netbox-color-mode=light] .btn-green-600:active:focus,html[data-netbox-color-mode=light] .btn-green-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #37825f80}html .btn-green-600:disabled,html .btn-green-600.disabled,html[data-netbox-color-mode=dark] .btn-green-600:disabled,html[data-netbox-color-mode=dark] .btn-green-600.disabled,html[data-netbox-color-mode=light] .btn-green-600:disabled,html[data-netbox-color-mode=light] .btn-green-600.disabled{color:#fff;background-color:#146c43;border-color:#146c43}}@media print{html .btn-green-700,html[data-netbox-color-mode=dark] .btn-green-700,html[data-netbox-color-mode=light] .btn-green-700{color:#fff;background-color:#0f5132;border-color:#0f5132}html .btn-green-700:hover,html[data-netbox-color-mode=dark] .btn-green-700:hover,html[data-netbox-color-mode=light] .btn-green-700:hover{color:#fff;background-color:#0d452b;border-color:#0c4128}.btn-check:focus+html .btn-green-700,html .btn-green-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-700,html[data-netbox-color-mode=dark] .btn-green-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-700,html[data-netbox-color-mode=light] .btn-green-700:focus{color:#fff;background-color:#0d452b;border-color:#0c4128;box-shadow:0 0 0 .25rem #336b5180}.btn-check:checked+html .btn-green-700,.btn-check:active+html .btn-green-700,html .btn-green-700:active,html .btn-green-700.active,.show>html .btn-green-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-700,html[data-netbox-color-mode=dark] .btn-green-700:active,html[data-netbox-color-mode=dark] .btn-green-700.active,.show>html[data-netbox-color-mode=dark] .btn-green-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-700,html[data-netbox-color-mode=light] .btn-green-700:active,html[data-netbox-color-mode=light] .btn-green-700.active,.show>html[data-netbox-color-mode=light] .btn-green-700.dropdown-toggle{color:#fff;background-color:#0c4128;border-color:#0b3d26}.btn-check:checked+html .btn-green-700:focus,.btn-check:active+html .btn-green-700:focus,html .btn-green-700:active:focus,html .btn-green-700.active:focus,.show>html .btn-green-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-700:focus,html[data-netbox-color-mode=dark] .btn-green-700:active:focus,html[data-netbox-color-mode=dark] .btn-green-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-700:focus,html[data-netbox-color-mode=light] .btn-green-700:active:focus,html[data-netbox-color-mode=light] .btn-green-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #336b5180}html .btn-green-700:disabled,html .btn-green-700.disabled,html[data-netbox-color-mode=dark] .btn-green-700:disabled,html[data-netbox-color-mode=dark] .btn-green-700.disabled,html[data-netbox-color-mode=light] .btn-green-700:disabled,html[data-netbox-color-mode=light] .btn-green-700.disabled{color:#fff;background-color:#0f5132;border-color:#0f5132}}@media print{html .btn-green-800,html[data-netbox-color-mode=dark] .btn-green-800,html[data-netbox-color-mode=light] .btn-green-800{color:#fff;background-color:#0a3622;border-color:#0a3622}html .btn-green-800:hover,html[data-netbox-color-mode=dark] .btn-green-800:hover,html[data-netbox-color-mode=light] .btn-green-800:hover{color:#fff;background-color:#092e1d;border-color:#082b1b}.btn-check:focus+html .btn-green-800,html .btn-green-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-800,html[data-netbox-color-mode=dark] .btn-green-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-800,html[data-netbox-color-mode=light] .btn-green-800:focus{color:#fff;background-color:#092e1d;border-color:#082b1b;box-shadow:0 0 0 .25rem #2f544380}.btn-check:checked+html .btn-green-800,.btn-check:active+html .btn-green-800,html .btn-green-800:active,html .btn-green-800.active,.show>html .btn-green-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-800,html[data-netbox-color-mode=dark] .btn-green-800:active,html[data-netbox-color-mode=dark] .btn-green-800.active,.show>html[data-netbox-color-mode=dark] .btn-green-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-800,html[data-netbox-color-mode=light] .btn-green-800:active,html[data-netbox-color-mode=light] .btn-green-800.active,.show>html[data-netbox-color-mode=light] .btn-green-800.dropdown-toggle{color:#fff;background-color:#082b1b;border-color:#08291a}.btn-check:checked+html .btn-green-800:focus,.btn-check:active+html .btn-green-800:focus,html .btn-green-800:active:focus,html .btn-green-800.active:focus,.show>html .btn-green-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-800:focus,html[data-netbox-color-mode=dark] .btn-green-800:active:focus,html[data-netbox-color-mode=dark] .btn-green-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-800:focus,html[data-netbox-color-mode=light] .btn-green-800:active:focus,html[data-netbox-color-mode=light] .btn-green-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2f544380}html .btn-green-800:disabled,html .btn-green-800.disabled,html[data-netbox-color-mode=dark] .btn-green-800:disabled,html[data-netbox-color-mode=dark] .btn-green-800.disabled,html[data-netbox-color-mode=light] .btn-green-800:disabled,html[data-netbox-color-mode=light] .btn-green-800.disabled{color:#fff;background-color:#0a3622;border-color:#0a3622}}@media print{html .btn-green-900,html[data-netbox-color-mode=dark] .btn-green-900,html[data-netbox-color-mode=light] .btn-green-900{color:#fff;background-color:#051b11;border-color:#051b11}html .btn-green-900:hover,html[data-netbox-color-mode=dark] .btn-green-900:hover,html[data-netbox-color-mode=light] .btn-green-900:hover{color:#fff;background-color:#04170e;border-color:#04160e}.btn-check:focus+html .btn-green-900,html .btn-green-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green-900,html[data-netbox-color-mode=dark] .btn-green-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green-900,html[data-netbox-color-mode=light] .btn-green-900:focus{color:#fff;background-color:#04170e;border-color:#04160e;box-shadow:0 0 0 .25rem #2b3d3580}.btn-check:checked+html .btn-green-900,.btn-check:active+html .btn-green-900,html .btn-green-900:active,html .btn-green-900.active,.show>html .btn-green-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-900,html[data-netbox-color-mode=dark] .btn-green-900:active,html[data-netbox-color-mode=dark] .btn-green-900.active,.show>html[data-netbox-color-mode=dark] .btn-green-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-900,html[data-netbox-color-mode=light] .btn-green-900:active,html[data-netbox-color-mode=light] .btn-green-900.active,.show>html[data-netbox-color-mode=light] .btn-green-900.dropdown-toggle{color:#fff;background-color:#04160e;border-color:#04140d}.btn-check:checked+html .btn-green-900:focus,.btn-check:active+html .btn-green-900:focus,html .btn-green-900:active:focus,html .btn-green-900.active:focus,.show>html .btn-green-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green-900:focus,html[data-netbox-color-mode=dark] .btn-green-900:active:focus,html[data-netbox-color-mode=dark] .btn-green-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green-900:focus,html[data-netbox-color-mode=light] .btn-green-900:active:focus,html[data-netbox-color-mode=light] .btn-green-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-green-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b3d3580}html .btn-green-900:disabled,html .btn-green-900.disabled,html[data-netbox-color-mode=dark] .btn-green-900:disabled,html[data-netbox-color-mode=dark] .btn-green-900.disabled,html[data-netbox-color-mode=light] .btn-green-900:disabled,html[data-netbox-color-mode=light] .btn-green-900.disabled{color:#fff;background-color:#051b11;border-color:#051b11}}@media print{html .btn-blue-100,html[data-netbox-color-mode=dark] .btn-blue-100,html[data-netbox-color-mode=light] .btn-blue-100{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}html .btn-blue-100:hover,html[data-netbox-color-mode=dark] .btn-blue-100:hover,html[data-netbox-color-mode=light] .btn-blue-100:hover{color:#000;background-color:#d6e6ff;border-color:#d4e5ff}.btn-check:focus+html .btn-blue-100,html .btn-blue-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-100,html[data-netbox-color-mode=dark] .btn-blue-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-100,html[data-netbox-color-mode=light] .btn-blue-100:focus{color:#000;background-color:#d6e6ff;border-color:#d4e5ff;box-shadow:0 0 0 .25rem #b0c0d980}.btn-check:checked+html .btn-blue-100,.btn-check:active+html .btn-blue-100,html .btn-blue-100:active,html .btn-blue-100.active,.show>html .btn-blue-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-100,html[data-netbox-color-mode=dark] .btn-blue-100:active,html[data-netbox-color-mode=dark] .btn-blue-100.active,.show>html[data-netbox-color-mode=dark] .btn-blue-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-100,html[data-netbox-color-mode=light] .btn-blue-100:active,html[data-netbox-color-mode=light] .btn-blue-100.active,.show>html[data-netbox-color-mode=light] .btn-blue-100.dropdown-toggle{color:#000;background-color:#d9e8ff;border-color:#d4e5ff}.btn-check:checked+html .btn-blue-100:focus,.btn-check:active+html .btn-blue-100:focus,html .btn-blue-100:active:focus,html .btn-blue-100.active:focus,.show>html .btn-blue-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-100:focus,html[data-netbox-color-mode=dark] .btn-blue-100:active:focus,html[data-netbox-color-mode=dark] .btn-blue-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-100:focus,html[data-netbox-color-mode=light] .btn-blue-100:active:focus,html[data-netbox-color-mode=light] .btn-blue-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b0c0d980}html .btn-blue-100:disabled,html .btn-blue-100.disabled,html[data-netbox-color-mode=dark] .btn-blue-100:disabled,html[data-netbox-color-mode=dark] .btn-blue-100.disabled,html[data-netbox-color-mode=light] .btn-blue-100:disabled,html[data-netbox-color-mode=light] .btn-blue-100.disabled{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}}@media print{html .btn-blue-200,html[data-netbox-color-mode=dark] .btn-blue-200,html[data-netbox-color-mode=light] .btn-blue-200{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}html .btn-blue-200:hover,html[data-netbox-color-mode=dark] .btn-blue-200:hover,html[data-netbox-color-mode=light] .btn-blue-200:hover{color:#000;background-color:#adcefe;border-color:#a8cbfe}.btn-check:focus+html .btn-blue-200,html .btn-blue-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-200,html[data-netbox-color-mode=dark] .btn-blue-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-200,html[data-netbox-color-mode=light] .btn-blue-200:focus{color:#000;background-color:#adcefe;border-color:#a8cbfe;box-shadow:0 0 0 .25rem #86a7d880}.btn-check:checked+html .btn-blue-200,.btn-check:active+html .btn-blue-200,html .btn-blue-200:active,html .btn-blue-200.active,.show>html .btn-blue-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-200,html[data-netbox-color-mode=dark] .btn-blue-200:active,html[data-netbox-color-mode=dark] .btn-blue-200.active,.show>html[data-netbox-color-mode=dark] .btn-blue-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-200,html[data-netbox-color-mode=light] .btn-blue-200:active,html[data-netbox-color-mode=light] .btn-blue-200.active,.show>html[data-netbox-color-mode=light] .btn-blue-200.dropdown-toggle{color:#000;background-color:#b1d1fe;border-color:#a8cbfe}.btn-check:checked+html .btn-blue-200:focus,.btn-check:active+html .btn-blue-200:focus,html .btn-blue-200:active:focus,html .btn-blue-200.active:focus,.show>html .btn-blue-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-200:focus,html[data-netbox-color-mode=dark] .btn-blue-200:active:focus,html[data-netbox-color-mode=dark] .btn-blue-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-200:focus,html[data-netbox-color-mode=light] .btn-blue-200:active:focus,html[data-netbox-color-mode=light] .btn-blue-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #86a7d880}html .btn-blue-200:disabled,html .btn-blue-200.disabled,html[data-netbox-color-mode=dark] .btn-blue-200:disabled,html[data-netbox-color-mode=dark] .btn-blue-200.disabled,html[data-netbox-color-mode=light] .btn-blue-200:disabled,html[data-netbox-color-mode=light] .btn-blue-200.disabled{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}}@media print{html .btn-blue-300,html[data-netbox-color-mode=dark] .btn-blue-300,html[data-netbox-color-mode=light] .btn-blue-300{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}html .btn-blue-300:hover,html[data-netbox-color-mode=dark] .btn-blue-300:hover,html[data-netbox-color-mode=light] .btn-blue-300:hover{color:#000;background-color:#84b5fe;border-color:#7db1fe}.btn-check:focus+html .btn-blue-300,html .btn-blue-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-300,html[data-netbox-color-mode=dark] .btn-blue-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-300,html[data-netbox-color-mode=light] .btn-blue-300:focus{color:#000;background-color:#84b5fe;border-color:#7db1fe;box-shadow:0 0 0 .25rem #5e8fd880}.btn-check:checked+html .btn-blue-300,.btn-check:active+html .btn-blue-300,html .btn-blue-300:active,html .btn-blue-300.active,.show>html .btn-blue-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-300,html[data-netbox-color-mode=dark] .btn-blue-300:active,html[data-netbox-color-mode=dark] .btn-blue-300.active,.show>html[data-netbox-color-mode=dark] .btn-blue-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-300,html[data-netbox-color-mode=light] .btn-blue-300:active,html[data-netbox-color-mode=light] .btn-blue-300.active,.show>html[data-netbox-color-mode=light] .btn-blue-300.dropdown-toggle{color:#000;background-color:#8bb9fe;border-color:#7db1fe}.btn-check:checked+html .btn-blue-300:focus,.btn-check:active+html .btn-blue-300:focus,html .btn-blue-300:active:focus,html .btn-blue-300.active:focus,.show>html .btn-blue-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-300:focus,html[data-netbox-color-mode=dark] .btn-blue-300:active:focus,html[data-netbox-color-mode=dark] .btn-blue-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-300:focus,html[data-netbox-color-mode=light] .btn-blue-300:active:focus,html[data-netbox-color-mode=light] .btn-blue-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5e8fd880}html .btn-blue-300:disabled,html .btn-blue-300.disabled,html[data-netbox-color-mode=dark] .btn-blue-300:disabled,html[data-netbox-color-mode=dark] .btn-blue-300.disabled,html[data-netbox-color-mode=light] .btn-blue-300:disabled,html[data-netbox-color-mode=light] .btn-blue-300.disabled{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}}@media print{html .btn-blue-400,html[data-netbox-color-mode=dark] .btn-blue-400,html[data-netbox-color-mode=light] .btn-blue-400{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}html .btn-blue-400:hover,html[data-netbox-color-mode=dark] .btn-blue-400:hover,html[data-netbox-color-mode=light] .btn-blue-400:hover{color:#000;background-color:#5a9cfd;border-color:#5097fd}.btn-check:focus+html .btn-blue-400,html .btn-blue-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-400,html[data-netbox-color-mode=dark] .btn-blue-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-400,html[data-netbox-color-mode=light] .btn-blue-400:focus{color:#000;background-color:#5a9cfd;border-color:#5097fd;box-shadow:0 0 0 .25rem #3476d780}.btn-check:checked+html .btn-blue-400,.btn-check:active+html .btn-blue-400,html .btn-blue-400:active,html .btn-blue-400.active,.show>html .btn-blue-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-400,html[data-netbox-color-mode=dark] .btn-blue-400:active,html[data-netbox-color-mode=dark] .btn-blue-400.active,.show>html[data-netbox-color-mode=dark] .btn-blue-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-400,html[data-netbox-color-mode=light] .btn-blue-400:active,html[data-netbox-color-mode=light] .btn-blue-400.active,.show>html[data-netbox-color-mode=light] .btn-blue-400.dropdown-toggle{color:#000;background-color:#64a2fd;border-color:#5097fd}.btn-check:checked+html .btn-blue-400:focus,.btn-check:active+html .btn-blue-400:focus,html .btn-blue-400:active:focus,html .btn-blue-400.active:focus,.show>html .btn-blue-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-400:focus,html[data-netbox-color-mode=dark] .btn-blue-400:active:focus,html[data-netbox-color-mode=dark] .btn-blue-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-400:focus,html[data-netbox-color-mode=light] .btn-blue-400:active:focus,html[data-netbox-color-mode=light] .btn-blue-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3476d780}html .btn-blue-400:disabled,html .btn-blue-400.disabled,html[data-netbox-color-mode=dark] .btn-blue-400:disabled,html[data-netbox-color-mode=dark] .btn-blue-400.disabled,html[data-netbox-color-mode=light] .btn-blue-400:disabled,html[data-netbox-color-mode=light] .btn-blue-400.disabled{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}}@media print{html .btn-blue-500,html[data-netbox-color-mode=dark] .btn-blue-500,html[data-netbox-color-mode=light] .btn-blue-500{color:#fff;background-color:#0d6efd;border-color:#0d6efd}html .btn-blue-500:hover,html[data-netbox-color-mode=dark] .btn-blue-500:hover,html[data-netbox-color-mode=light] .btn-blue-500:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+html .btn-blue-500,html .btn-blue-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-500,html[data-netbox-color-mode=dark] .btn-blue-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-500,html[data-netbox-color-mode=light] .btn-blue-500:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem #3184fd80}.btn-check:checked+html .btn-blue-500,.btn-check:active+html .btn-blue-500,html .btn-blue-500:active,html .btn-blue-500.active,.show>html .btn-blue-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-500,html[data-netbox-color-mode=dark] .btn-blue-500:active,html[data-netbox-color-mode=dark] .btn-blue-500.active,.show>html[data-netbox-color-mode=dark] .btn-blue-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-500,html[data-netbox-color-mode=light] .btn-blue-500:active,html[data-netbox-color-mode=light] .btn-blue-500.active,.show>html[data-netbox-color-mode=light] .btn-blue-500.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:checked+html .btn-blue-500:focus,.btn-check:active+html .btn-blue-500:focus,html .btn-blue-500:active:focus,html .btn-blue-500.active:focus,.show>html .btn-blue-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-500:focus,html[data-netbox-color-mode=dark] .btn-blue-500:active:focus,html[data-netbox-color-mode=dark] .btn-blue-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-500:focus,html[data-netbox-color-mode=light] .btn-blue-500:active:focus,html[data-netbox-color-mode=light] .btn-blue-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3184fd80}html .btn-blue-500:disabled,html .btn-blue-500.disabled,html[data-netbox-color-mode=dark] .btn-blue-500:disabled,html[data-netbox-color-mode=dark] .btn-blue-500.disabled,html[data-netbox-color-mode=light] .btn-blue-500:disabled,html[data-netbox-color-mode=light] .btn-blue-500.disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}}@media print{html .btn-blue-600,html[data-netbox-color-mode=dark] .btn-blue-600,html[data-netbox-color-mode=light] .btn-blue-600{color:#fff;background-color:#0a58ca;border-color:#0a58ca}html .btn-blue-600:hover,html[data-netbox-color-mode=dark] .btn-blue-600:hover,html[data-netbox-color-mode=light] .btn-blue-600:hover{color:#fff;background-color:#094bac;border-color:#0846a2}.btn-check:focus+html .btn-blue-600,html .btn-blue-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-600,html[data-netbox-color-mode=dark] .btn-blue-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-600,html[data-netbox-color-mode=light] .btn-blue-600:focus{color:#fff;background-color:#094bac;border-color:#0846a2;box-shadow:0 0 0 .25rem #2f71d280}.btn-check:checked+html .btn-blue-600,.btn-check:active+html .btn-blue-600,html .btn-blue-600:active,html .btn-blue-600.active,.show>html .btn-blue-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-600,html[data-netbox-color-mode=dark] .btn-blue-600:active,html[data-netbox-color-mode=dark] .btn-blue-600.active,.show>html[data-netbox-color-mode=dark] .btn-blue-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-600,html[data-netbox-color-mode=light] .btn-blue-600:active,html[data-netbox-color-mode=light] .btn-blue-600.active,.show>html[data-netbox-color-mode=light] .btn-blue-600.dropdown-toggle{color:#fff;background-color:#0846a2;border-color:#084298}.btn-check:checked+html .btn-blue-600:focus,.btn-check:active+html .btn-blue-600:focus,html .btn-blue-600:active:focus,html .btn-blue-600.active:focus,.show>html .btn-blue-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-600:focus,html[data-netbox-color-mode=dark] .btn-blue-600:active:focus,html[data-netbox-color-mode=dark] .btn-blue-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-600:focus,html[data-netbox-color-mode=light] .btn-blue-600:active:focus,html[data-netbox-color-mode=light] .btn-blue-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2f71d280}html .btn-blue-600:disabled,html .btn-blue-600.disabled,html[data-netbox-color-mode=dark] .btn-blue-600:disabled,html[data-netbox-color-mode=dark] .btn-blue-600.disabled,html[data-netbox-color-mode=light] .btn-blue-600:disabled,html[data-netbox-color-mode=light] .btn-blue-600.disabled{color:#fff;background-color:#0a58ca;border-color:#0a58ca}}@media print{html .btn-blue-700,html[data-netbox-color-mode=dark] .btn-blue-700,html[data-netbox-color-mode=light] .btn-blue-700{color:#fff;background-color:#084298;border-color:#084298}html .btn-blue-700:hover,html[data-netbox-color-mode=dark] .btn-blue-700:hover,html[data-netbox-color-mode=light] .btn-blue-700:hover{color:#fff;background-color:#073881;border-color:#06357a}.btn-check:focus+html .btn-blue-700,html .btn-blue-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-700,html[data-netbox-color-mode=dark] .btn-blue-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-700,html[data-netbox-color-mode=light] .btn-blue-700:focus{color:#fff;background-color:#073881;border-color:#06357a;box-shadow:0 0 0 .25rem #2d5ea780}.btn-check:checked+html .btn-blue-700,.btn-check:active+html .btn-blue-700,html .btn-blue-700:active,html .btn-blue-700.active,.show>html .btn-blue-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-700,html[data-netbox-color-mode=dark] .btn-blue-700:active,html[data-netbox-color-mode=dark] .btn-blue-700.active,.show>html[data-netbox-color-mode=dark] .btn-blue-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-700,html[data-netbox-color-mode=light] .btn-blue-700:active,html[data-netbox-color-mode=light] .btn-blue-700.active,.show>html[data-netbox-color-mode=light] .btn-blue-700.dropdown-toggle{color:#fff;background-color:#06357a;border-color:#063272}.btn-check:checked+html .btn-blue-700:focus,.btn-check:active+html .btn-blue-700:focus,html .btn-blue-700:active:focus,html .btn-blue-700.active:focus,.show>html .btn-blue-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-700:focus,html[data-netbox-color-mode=dark] .btn-blue-700:active:focus,html[data-netbox-color-mode=dark] .btn-blue-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-700:focus,html[data-netbox-color-mode=light] .btn-blue-700:active:focus,html[data-netbox-color-mode=light] .btn-blue-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2d5ea780}html .btn-blue-700:disabled,html .btn-blue-700.disabled,html[data-netbox-color-mode=dark] .btn-blue-700:disabled,html[data-netbox-color-mode=dark] .btn-blue-700.disabled,html[data-netbox-color-mode=light] .btn-blue-700:disabled,html[data-netbox-color-mode=light] .btn-blue-700.disabled{color:#fff;background-color:#084298;border-color:#084298}}@media print{html .btn-blue-800,html[data-netbox-color-mode=dark] .btn-blue-800,html[data-netbox-color-mode=light] .btn-blue-800{color:#fff;background-color:#052c65;border-color:#052c65}html .btn-blue-800:hover,html[data-netbox-color-mode=dark] .btn-blue-800:hover,html[data-netbox-color-mode=light] .btn-blue-800:hover{color:#fff;background-color:#042556;border-color:#042351}.btn-check:focus+html .btn-blue-800,html .btn-blue-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-800,html[data-netbox-color-mode=dark] .btn-blue-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-800,html[data-netbox-color-mode=light] .btn-blue-800:focus{color:#fff;background-color:#042556;border-color:#042351;box-shadow:0 0 0 .25rem #2b4c7c80}.btn-check:checked+html .btn-blue-800,.btn-check:active+html .btn-blue-800,html .btn-blue-800:active,html .btn-blue-800.active,.show>html .btn-blue-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-800,html[data-netbox-color-mode=dark] .btn-blue-800:active,html[data-netbox-color-mode=dark] .btn-blue-800.active,.show>html[data-netbox-color-mode=dark] .btn-blue-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-800,html[data-netbox-color-mode=light] .btn-blue-800:active,html[data-netbox-color-mode=light] .btn-blue-800.active,.show>html[data-netbox-color-mode=light] .btn-blue-800.dropdown-toggle{color:#fff;background-color:#042351;border-color:#04214c}.btn-check:checked+html .btn-blue-800:focus,.btn-check:active+html .btn-blue-800:focus,html .btn-blue-800:active:focus,html .btn-blue-800.active:focus,.show>html .btn-blue-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-800:focus,html[data-netbox-color-mode=dark] .btn-blue-800:active:focus,html[data-netbox-color-mode=dark] .btn-blue-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-800:focus,html[data-netbox-color-mode=light] .btn-blue-800:active:focus,html[data-netbox-color-mode=light] .btn-blue-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b4c7c80}html .btn-blue-800:disabled,html .btn-blue-800.disabled,html[data-netbox-color-mode=dark] .btn-blue-800:disabled,html[data-netbox-color-mode=dark] .btn-blue-800.disabled,html[data-netbox-color-mode=light] .btn-blue-800:disabled,html[data-netbox-color-mode=light] .btn-blue-800.disabled{color:#fff;background-color:#052c65;border-color:#052c65}}@media print{html .btn-blue-900,html[data-netbox-color-mode=dark] .btn-blue-900,html[data-netbox-color-mode=light] .btn-blue-900{color:#fff;background-color:#031633;border-color:#031633}html .btn-blue-900:hover,html[data-netbox-color-mode=dark] .btn-blue-900:hover,html[data-netbox-color-mode=light] .btn-blue-900:hover{color:#fff;background-color:#03132b;border-color:#021229}.btn-check:focus+html .btn-blue-900,html .btn-blue-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue-900,html[data-netbox-color-mode=dark] .btn-blue-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue-900,html[data-netbox-color-mode=light] .btn-blue-900:focus{color:#fff;background-color:#03132b;border-color:#021229;box-shadow:0 0 0 .25rem #29395280}.btn-check:checked+html .btn-blue-900,.btn-check:active+html .btn-blue-900,html .btn-blue-900:active,html .btn-blue-900.active,.show>html .btn-blue-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-900,html[data-netbox-color-mode=dark] .btn-blue-900:active,html[data-netbox-color-mode=dark] .btn-blue-900.active,.show>html[data-netbox-color-mode=dark] .btn-blue-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-900,html[data-netbox-color-mode=light] .btn-blue-900:active,html[data-netbox-color-mode=light] .btn-blue-900.active,.show>html[data-netbox-color-mode=light] .btn-blue-900.dropdown-toggle{color:#fff;background-color:#021229;border-color:#021126}.btn-check:checked+html .btn-blue-900:focus,.btn-check:active+html .btn-blue-900:focus,html .btn-blue-900:active:focus,html .btn-blue-900.active:focus,.show>html .btn-blue-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue-900:focus,html[data-netbox-color-mode=dark] .btn-blue-900:active:focus,html[data-netbox-color-mode=dark] .btn-blue-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue-900:focus,html[data-netbox-color-mode=light] .btn-blue-900:active:focus,html[data-netbox-color-mode=light] .btn-blue-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #29395280}html .btn-blue-900:disabled,html .btn-blue-900.disabled,html[data-netbox-color-mode=dark] .btn-blue-900:disabled,html[data-netbox-color-mode=dark] .btn-blue-900.disabled,html[data-netbox-color-mode=light] .btn-blue-900:disabled,html[data-netbox-color-mode=light] .btn-blue-900.disabled{color:#fff;background-color:#031633;border-color:#031633}}@media print{html .btn-cyan-100,html[data-netbox-color-mode=dark] .btn-cyan-100,html[data-netbox-color-mode=light] .btn-cyan-100{color:#000;background-color:#cff4fc;border-color:#cff4fc}html .btn-cyan-100:hover,html[data-netbox-color-mode=dark] .btn-cyan-100:hover,html[data-netbox-color-mode=light] .btn-cyan-100:hover{color:#000;background-color:#d6f6fc;border-color:#d4f5fc}.btn-check:focus+html .btn-cyan-100,html .btn-cyan-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-100,html[data-netbox-color-mode=dark] .btn-cyan-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-100,html[data-netbox-color-mode=light] .btn-cyan-100:focus{color:#000;background-color:#d6f6fc;border-color:#d4f5fc;box-shadow:0 0 0 .25rem #b0cfd680}.btn-check:checked+html .btn-cyan-100,.btn-check:active+html .btn-cyan-100,html .btn-cyan-100:active,html .btn-cyan-100.active,.show>html .btn-cyan-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-100,html[data-netbox-color-mode=dark] .btn-cyan-100:active,html[data-netbox-color-mode=dark] .btn-cyan-100.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-100,html[data-netbox-color-mode=light] .btn-cyan-100:active,html[data-netbox-color-mode=light] .btn-cyan-100.active,.show>html[data-netbox-color-mode=light] .btn-cyan-100.dropdown-toggle{color:#000;background-color:#d9f6fd;border-color:#d4f5fc}.btn-check:checked+html .btn-cyan-100:focus,.btn-check:active+html .btn-cyan-100:focus,html .btn-cyan-100:active:focus,html .btn-cyan-100.active:focus,.show>html .btn-cyan-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-100:focus,html[data-netbox-color-mode=dark] .btn-cyan-100:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-100:focus,html[data-netbox-color-mode=light] .btn-cyan-100:active:focus,html[data-netbox-color-mode=light] .btn-cyan-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b0cfd680}html .btn-cyan-100:disabled,html .btn-cyan-100.disabled,html[data-netbox-color-mode=dark] .btn-cyan-100:disabled,html[data-netbox-color-mode=dark] .btn-cyan-100.disabled,html[data-netbox-color-mode=light] .btn-cyan-100:disabled,html[data-netbox-color-mode=light] .btn-cyan-100.disabled{color:#000;background-color:#cff4fc;border-color:#cff4fc}}@media print{html .btn-cyan-200,html[data-netbox-color-mode=dark] .btn-cyan-200,html[data-netbox-color-mode=light] .btn-cyan-200{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}html .btn-cyan-200:hover,html[data-netbox-color-mode=dark] .btn-cyan-200:hover,html[data-netbox-color-mode=light] .btn-cyan-200:hover{color:#000;background-color:#adedfa;border-color:#a8ecfa}.btn-check:focus+html .btn-cyan-200,html .btn-cyan-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-200,html[data-netbox-color-mode=dark] .btn-cyan-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-200,html[data-netbox-color-mode=light] .btn-cyan-200:focus{color:#000;background-color:#adedfa;border-color:#a8ecfa;box-shadow:0 0 0 .25rem #86c7d480}.btn-check:checked+html .btn-cyan-200,.btn-check:active+html .btn-cyan-200,html .btn-cyan-200:active,html .btn-cyan-200.active,.show>html .btn-cyan-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-200,html[data-netbox-color-mode=dark] .btn-cyan-200:active,html[data-netbox-color-mode=dark] .btn-cyan-200.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-200,html[data-netbox-color-mode=light] .btn-cyan-200:active,html[data-netbox-color-mode=light] .btn-cyan-200.active,.show>html[data-netbox-color-mode=light] .btn-cyan-200.dropdown-toggle{color:#000;background-color:#b1eefa;border-color:#a8ecfa}.btn-check:checked+html .btn-cyan-200:focus,.btn-check:active+html .btn-cyan-200:focus,html .btn-cyan-200:active:focus,html .btn-cyan-200.active:focus,.show>html .btn-cyan-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-200:focus,html[data-netbox-color-mode=dark] .btn-cyan-200:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-200:focus,html[data-netbox-color-mode=light] .btn-cyan-200:active:focus,html[data-netbox-color-mode=light] .btn-cyan-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #86c7d480}html .btn-cyan-200:disabled,html .btn-cyan-200.disabled,html[data-netbox-color-mode=dark] .btn-cyan-200:disabled,html[data-netbox-color-mode=dark] .btn-cyan-200.disabled,html[data-netbox-color-mode=light] .btn-cyan-200:disabled,html[data-netbox-color-mode=light] .btn-cyan-200.disabled{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}}@media print{html .btn-cyan-300,html[data-netbox-color-mode=dark] .btn-cyan-300,html[data-netbox-color-mode=light] .btn-cyan-300{color:#000;background-color:#6edff6;border-color:#6edff6}html .btn-cyan-300:hover,html[data-netbox-color-mode=dark] .btn-cyan-300:hover,html[data-netbox-color-mode=light] .btn-cyan-300:hover{color:#000;background-color:#84e4f7;border-color:#7de2f7}.btn-check:focus+html .btn-cyan-300,html .btn-cyan-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-300,html[data-netbox-color-mode=dark] .btn-cyan-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-300,html[data-netbox-color-mode=light] .btn-cyan-300:focus{color:#000;background-color:#84e4f7;border-color:#7de2f7;box-shadow:0 0 0 .25rem #5ebed180}.btn-check:checked+html .btn-cyan-300,.btn-check:active+html .btn-cyan-300,html .btn-cyan-300:active,html .btn-cyan-300.active,.show>html .btn-cyan-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-300,html[data-netbox-color-mode=dark] .btn-cyan-300:active,html[data-netbox-color-mode=dark] .btn-cyan-300.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-300,html[data-netbox-color-mode=light] .btn-cyan-300:active,html[data-netbox-color-mode=light] .btn-cyan-300.active,.show>html[data-netbox-color-mode=light] .btn-cyan-300.dropdown-toggle{color:#000;background-color:#8be5f8;border-color:#7de2f7}.btn-check:checked+html .btn-cyan-300:focus,.btn-check:active+html .btn-cyan-300:focus,html .btn-cyan-300:active:focus,html .btn-cyan-300.active:focus,.show>html .btn-cyan-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-300:focus,html[data-netbox-color-mode=dark] .btn-cyan-300:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-300:focus,html[data-netbox-color-mode=light] .btn-cyan-300:active:focus,html[data-netbox-color-mode=light] .btn-cyan-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5ebed180}html .btn-cyan-300:disabled,html .btn-cyan-300.disabled,html[data-netbox-color-mode=dark] .btn-cyan-300:disabled,html[data-netbox-color-mode=dark] .btn-cyan-300.disabled,html[data-netbox-color-mode=light] .btn-cyan-300:disabled,html[data-netbox-color-mode=light] .btn-cyan-300.disabled{color:#000;background-color:#6edff6;border-color:#6edff6}}@media print{html .btn-cyan-400,html[data-netbox-color-mode=dark] .btn-cyan-400,html[data-netbox-color-mode=light] .btn-cyan-400{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}html .btn-cyan-400:hover,html[data-netbox-color-mode=dark] .btn-cyan-400:hover,html[data-netbox-color-mode=light] .btn-cyan-400:hover{color:#000;background-color:#5adbf5;border-color:#50d9f4}.btn-check:focus+html .btn-cyan-400,html .btn-cyan-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-400,html[data-netbox-color-mode=dark] .btn-cyan-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-400,html[data-netbox-color-mode=light] .btn-cyan-400:focus{color:#000;background-color:#5adbf5;border-color:#50d9f4;box-shadow:0 0 0 .25rem #34b5cf80}.btn-check:checked+html .btn-cyan-400,.btn-check:active+html .btn-cyan-400,html .btn-cyan-400:active,html .btn-cyan-400.active,.show>html .btn-cyan-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-400,html[data-netbox-color-mode=dark] .btn-cyan-400:active,html[data-netbox-color-mode=dark] .btn-cyan-400.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-400,html[data-netbox-color-mode=light] .btn-cyan-400:active,html[data-netbox-color-mode=light] .btn-cyan-400.active,.show>html[data-netbox-color-mode=light] .btn-cyan-400.dropdown-toggle{color:#000;background-color:#64ddf5;border-color:#50d9f4}.btn-check:checked+html .btn-cyan-400:focus,.btn-check:active+html .btn-cyan-400:focus,html .btn-cyan-400:active:focus,html .btn-cyan-400.active:focus,.show>html .btn-cyan-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-400:focus,html[data-netbox-color-mode=dark] .btn-cyan-400:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-400:focus,html[data-netbox-color-mode=light] .btn-cyan-400:active:focus,html[data-netbox-color-mode=light] .btn-cyan-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #34b5cf80}html .btn-cyan-400:disabled,html .btn-cyan-400.disabled,html[data-netbox-color-mode=dark] .btn-cyan-400:disabled,html[data-netbox-color-mode=dark] .btn-cyan-400.disabled,html[data-netbox-color-mode=light] .btn-cyan-400:disabled,html[data-netbox-color-mode=light] .btn-cyan-400.disabled{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}}@media print{html .btn-cyan-500,html[data-netbox-color-mode=dark] .btn-cyan-500,html[data-netbox-color-mode=light] .btn-cyan-500{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}html .btn-cyan-500:hover,html[data-netbox-color-mode=dark] .btn-cyan-500:hover,html[data-netbox-color-mode=light] .btn-cyan-500:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+html .btn-cyan-500,html .btn-cyan-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-500,html[data-netbox-color-mode=dark] .btn-cyan-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-500,html[data-netbox-color-mode=light] .btn-cyan-500:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem #0baccc80}.btn-check:checked+html .btn-cyan-500,.btn-check:active+html .btn-cyan-500,html .btn-cyan-500:active,html .btn-cyan-500.active,.show>html .btn-cyan-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-500,html[data-netbox-color-mode=dark] .btn-cyan-500:active,html[data-netbox-color-mode=dark] .btn-cyan-500.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-500,html[data-netbox-color-mode=light] .btn-cyan-500:active,html[data-netbox-color-mode=light] .btn-cyan-500.active,.show>html[data-netbox-color-mode=light] .btn-cyan-500.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+html .btn-cyan-500:focus,.btn-check:active+html .btn-cyan-500:focus,html .btn-cyan-500:active:focus,html .btn-cyan-500.active:focus,.show>html .btn-cyan-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-500:focus,html[data-netbox-color-mode=dark] .btn-cyan-500:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-500:focus,html[data-netbox-color-mode=light] .btn-cyan-500:active:focus,html[data-netbox-color-mode=light] .btn-cyan-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #0baccc80}html .btn-cyan-500:disabled,html .btn-cyan-500.disabled,html[data-netbox-color-mode=dark] .btn-cyan-500:disabled,html[data-netbox-color-mode=dark] .btn-cyan-500.disabled,html[data-netbox-color-mode=light] .btn-cyan-500:disabled,html[data-netbox-color-mode=light] .btn-cyan-500.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}}@media print{html .btn-cyan-600,html[data-netbox-color-mode=dark] .btn-cyan-600,html[data-netbox-color-mode=light] .btn-cyan-600{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}html .btn-cyan-600:hover,html[data-netbox-color-mode=dark] .btn-cyan-600:hover,html[data-netbox-color-mode=light] .btn-cyan-600:hover{color:#000;background-color:#2fb0c9;border-color:#23abc6}.btn-check:focus+html .btn-cyan-600,html .btn-cyan-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-600,html[data-netbox-color-mode=dark] .btn-cyan-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-600,html[data-netbox-color-mode=light] .btn-cyan-600:focus{color:#000;background-color:#2fb0c9;border-color:#23abc6;box-shadow:0 0 0 .25rem #098aa380}.btn-check:checked+html .btn-cyan-600,.btn-check:active+html .btn-cyan-600,html .btn-cyan-600:active,html .btn-cyan-600.active,.show>html .btn-cyan-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-600,html[data-netbox-color-mode=dark] .btn-cyan-600:active,html[data-netbox-color-mode=dark] .btn-cyan-600.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-600,html[data-netbox-color-mode=light] .btn-cyan-600:active,html[data-netbox-color-mode=light] .btn-cyan-600.active,.show>html[data-netbox-color-mode=light] .btn-cyan-600.dropdown-toggle{color:#000;background-color:#3bb5cd;border-color:#23abc6}.btn-check:checked+html .btn-cyan-600:focus,.btn-check:active+html .btn-cyan-600:focus,html .btn-cyan-600:active:focus,html .btn-cyan-600.active:focus,.show>html .btn-cyan-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-600:focus,html[data-netbox-color-mode=dark] .btn-cyan-600:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-600:focus,html[data-netbox-color-mode=light] .btn-cyan-600:active:focus,html[data-netbox-color-mode=light] .btn-cyan-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #098aa380}html .btn-cyan-600:disabled,html .btn-cyan-600.disabled,html[data-netbox-color-mode=dark] .btn-cyan-600:disabled,html[data-netbox-color-mode=dark] .btn-cyan-600.disabled,html[data-netbox-color-mode=light] .btn-cyan-600:disabled,html[data-netbox-color-mode=light] .btn-cyan-600.disabled{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}}@media print{html .btn-cyan-700,html[data-netbox-color-mode=dark] .btn-cyan-700,html[data-netbox-color-mode=light] .btn-cyan-700{color:#fff;background-color:#087990;border-color:#087990}html .btn-cyan-700:hover,html[data-netbox-color-mode=dark] .btn-cyan-700:hover,html[data-netbox-color-mode=light] .btn-cyan-700:hover{color:#fff;background-color:#07677a;border-color:#066173}.btn-check:focus+html .btn-cyan-700,html .btn-cyan-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-700,html[data-netbox-color-mode=dark] .btn-cyan-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-700,html[data-netbox-color-mode=light] .btn-cyan-700:focus{color:#fff;background-color:#07677a;border-color:#066173;box-shadow:0 0 0 .25rem #2d8da180}.btn-check:checked+html .btn-cyan-700,.btn-check:active+html .btn-cyan-700,html .btn-cyan-700:active,html .btn-cyan-700.active,.show>html .btn-cyan-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-700,html[data-netbox-color-mode=dark] .btn-cyan-700:active,html[data-netbox-color-mode=dark] .btn-cyan-700.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-700,html[data-netbox-color-mode=light] .btn-cyan-700:active,html[data-netbox-color-mode=light] .btn-cyan-700.active,.show>html[data-netbox-color-mode=light] .btn-cyan-700.dropdown-toggle{color:#fff;background-color:#066173;border-color:#065b6c}.btn-check:checked+html .btn-cyan-700:focus,.btn-check:active+html .btn-cyan-700:focus,html .btn-cyan-700:active:focus,html .btn-cyan-700.active:focus,.show>html .btn-cyan-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-700:focus,html[data-netbox-color-mode=dark] .btn-cyan-700:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-700:focus,html[data-netbox-color-mode=light] .btn-cyan-700:active:focus,html[data-netbox-color-mode=light] .btn-cyan-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2d8da180}html .btn-cyan-700:disabled,html .btn-cyan-700.disabled,html[data-netbox-color-mode=dark] .btn-cyan-700:disabled,html[data-netbox-color-mode=dark] .btn-cyan-700.disabled,html[data-netbox-color-mode=light] .btn-cyan-700:disabled,html[data-netbox-color-mode=light] .btn-cyan-700.disabled{color:#fff;background-color:#087990;border-color:#087990}}@media print{html .btn-cyan-800,html[data-netbox-color-mode=dark] .btn-cyan-800,html[data-netbox-color-mode=light] .btn-cyan-800{color:#fff;background-color:#055160;border-color:#055160}html .btn-cyan-800:hover,html[data-netbox-color-mode=dark] .btn-cyan-800:hover,html[data-netbox-color-mode=light] .btn-cyan-800:hover{color:#fff;background-color:#044552;border-color:#04414d}.btn-check:focus+html .btn-cyan-800,html .btn-cyan-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-800,html[data-netbox-color-mode=dark] .btn-cyan-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-800,html[data-netbox-color-mode=light] .btn-cyan-800:focus{color:#fff;background-color:#044552;border-color:#04414d;box-shadow:0 0 0 .25rem #2b6b7880}.btn-check:checked+html .btn-cyan-800,.btn-check:active+html .btn-cyan-800,html .btn-cyan-800:active,html .btn-cyan-800.active,.show>html .btn-cyan-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-800,html[data-netbox-color-mode=dark] .btn-cyan-800:active,html[data-netbox-color-mode=dark] .btn-cyan-800.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-800,html[data-netbox-color-mode=light] .btn-cyan-800:active,html[data-netbox-color-mode=light] .btn-cyan-800.active,.show>html[data-netbox-color-mode=light] .btn-cyan-800.dropdown-toggle{color:#fff;background-color:#04414d;border-color:#043d48}.btn-check:checked+html .btn-cyan-800:focus,.btn-check:active+html .btn-cyan-800:focus,html .btn-cyan-800:active:focus,html .btn-cyan-800.active:focus,.show>html .btn-cyan-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-800:focus,html[data-netbox-color-mode=dark] .btn-cyan-800:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-800:focus,html[data-netbox-color-mode=light] .btn-cyan-800:active:focus,html[data-netbox-color-mode=light] .btn-cyan-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #2b6b7880}html .btn-cyan-800:disabled,html .btn-cyan-800.disabled,html[data-netbox-color-mode=dark] .btn-cyan-800:disabled,html[data-netbox-color-mode=dark] .btn-cyan-800.disabled,html[data-netbox-color-mode=light] .btn-cyan-800:disabled,html[data-netbox-color-mode=light] .btn-cyan-800.disabled{color:#fff;background-color:#055160;border-color:#055160}}@media print{html .btn-cyan-900,html[data-netbox-color-mode=dark] .btn-cyan-900,html[data-netbox-color-mode=light] .btn-cyan-900{color:#fff;background-color:#032830;border-color:#032830}html .btn-cyan-900:hover,html[data-netbox-color-mode=dark] .btn-cyan-900:hover,html[data-netbox-color-mode=light] .btn-cyan-900:hover{color:#fff;background-color:#032229;border-color:#022026}.btn-check:focus+html .btn-cyan-900,html .btn-cyan-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan-900,html[data-netbox-color-mode=dark] .btn-cyan-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan-900,html[data-netbox-color-mode=light] .btn-cyan-900:focus{color:#fff;background-color:#032229;border-color:#022026;box-shadow:0 0 0 .25rem #29484f80}.btn-check:checked+html .btn-cyan-900,.btn-check:active+html .btn-cyan-900,html .btn-cyan-900:active,html .btn-cyan-900.active,.show>html .btn-cyan-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-900,html[data-netbox-color-mode=dark] .btn-cyan-900:active,html[data-netbox-color-mode=dark] .btn-cyan-900.active,.show>html[data-netbox-color-mode=dark] .btn-cyan-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-900,html[data-netbox-color-mode=light] .btn-cyan-900:active,html[data-netbox-color-mode=light] .btn-cyan-900.active,.show>html[data-netbox-color-mode=light] .btn-cyan-900.dropdown-toggle{color:#fff;background-color:#022026;border-color:#021e24}.btn-check:checked+html .btn-cyan-900:focus,.btn-check:active+html .btn-cyan-900:focus,html .btn-cyan-900:active:focus,html .btn-cyan-900.active:focus,.show>html .btn-cyan-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan-900:focus,html[data-netbox-color-mode=dark] .btn-cyan-900:active:focus,html[data-netbox-color-mode=dark] .btn-cyan-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan-900:focus,html[data-netbox-color-mode=light] .btn-cyan-900:active:focus,html[data-netbox-color-mode=light] .btn-cyan-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #29484f80}html .btn-cyan-900:disabled,html .btn-cyan-900.disabled,html[data-netbox-color-mode=dark] .btn-cyan-900:disabled,html[data-netbox-color-mode=dark] .btn-cyan-900.disabled,html[data-netbox-color-mode=light] .btn-cyan-900:disabled,html[data-netbox-color-mode=light] .btn-cyan-900.disabled{color:#fff;background-color:#032830;border-color:#032830}}@media print{html .btn-indigo-100,html[data-netbox-color-mode=dark] .btn-indigo-100,html[data-netbox-color-mode=light] .btn-indigo-100{color:#000;background-color:#e0cffc;border-color:#e0cffc}html .btn-indigo-100:hover,html[data-netbox-color-mode=dark] .btn-indigo-100:hover,html[data-netbox-color-mode=light] .btn-indigo-100:hover{color:#000;background-color:#e5d6fc;border-color:#e3d4fc}.btn-check:focus+html .btn-indigo-100,html .btn-indigo-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-100,html[data-netbox-color-mode=dark] .btn-indigo-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-100,html[data-netbox-color-mode=light] .btn-indigo-100:focus{color:#000;background-color:#e5d6fc;border-color:#e3d4fc;box-shadow:0 0 0 .25rem #beb0d680}.btn-check:checked+html .btn-indigo-100,.btn-check:active+html .btn-indigo-100,html .btn-indigo-100:active,html .btn-indigo-100.active,.show>html .btn-indigo-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-100,html[data-netbox-color-mode=dark] .btn-indigo-100:active,html[data-netbox-color-mode=dark] .btn-indigo-100.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-100,html[data-netbox-color-mode=light] .btn-indigo-100:active,html[data-netbox-color-mode=light] .btn-indigo-100.active,.show>html[data-netbox-color-mode=light] .btn-indigo-100.dropdown-toggle{color:#000;background-color:#e6d9fd;border-color:#e3d4fc}.btn-check:checked+html .btn-indigo-100:focus,.btn-check:active+html .btn-indigo-100:focus,html .btn-indigo-100:active:focus,html .btn-indigo-100.active:focus,.show>html .btn-indigo-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-100:focus,html[data-netbox-color-mode=dark] .btn-indigo-100:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-100:focus,html[data-netbox-color-mode=light] .btn-indigo-100:active:focus,html[data-netbox-color-mode=light] .btn-indigo-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #beb0d680}html .btn-indigo-100:disabled,html .btn-indigo-100.disabled,html[data-netbox-color-mode=dark] .btn-indigo-100:disabled,html[data-netbox-color-mode=dark] .btn-indigo-100.disabled,html[data-netbox-color-mode=light] .btn-indigo-100:disabled,html[data-netbox-color-mode=light] .btn-indigo-100.disabled{color:#000;background-color:#e0cffc;border-color:#e0cffc}}@media print{html .btn-indigo-200,html[data-netbox-color-mode=dark] .btn-indigo-200,html[data-netbox-color-mode=light] .btn-indigo-200{color:#000;background-color:#c29ffa;border-color:#c29ffa}html .btn-indigo-200:hover,html[data-netbox-color-mode=dark] .btn-indigo-200:hover,html[data-netbox-color-mode=light] .btn-indigo-200:hover{color:#000;background-color:#cbadfb;border-color:#c8a9fb}.btn-check:focus+html .btn-indigo-200,html .btn-indigo-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-200,html[data-netbox-color-mode=dark] .btn-indigo-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-200,html[data-netbox-color-mode=light] .btn-indigo-200:focus{color:#000;background-color:#cbadfb;border-color:#c8a9fb;box-shadow:0 0 0 .25rem #a587d580}.btn-check:checked+html .btn-indigo-200,.btn-check:active+html .btn-indigo-200,html .btn-indigo-200:active,html .btn-indigo-200.active,.show>html .btn-indigo-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-200,html[data-netbox-color-mode=dark] .btn-indigo-200:active,html[data-netbox-color-mode=dark] .btn-indigo-200.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-200,html[data-netbox-color-mode=light] .btn-indigo-200:active,html[data-netbox-color-mode=light] .btn-indigo-200.active,.show>html[data-netbox-color-mode=light] .btn-indigo-200.dropdown-toggle{color:#000;background-color:#ceb2fb;border-color:#c8a9fb}.btn-check:checked+html .btn-indigo-200:focus,.btn-check:active+html .btn-indigo-200:focus,html .btn-indigo-200:active:focus,html .btn-indigo-200.active:focus,.show>html .btn-indigo-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-200:focus,html[data-netbox-color-mode=dark] .btn-indigo-200:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-200:focus,html[data-netbox-color-mode=light] .btn-indigo-200:active:focus,html[data-netbox-color-mode=light] .btn-indigo-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #a587d580}html .btn-indigo-200:disabled,html .btn-indigo-200.disabled,html[data-netbox-color-mode=dark] .btn-indigo-200:disabled,html[data-netbox-color-mode=dark] .btn-indigo-200.disabled,html[data-netbox-color-mode=light] .btn-indigo-200:disabled,html[data-netbox-color-mode=light] .btn-indigo-200.disabled{color:#000;background-color:#c29ffa;border-color:#c29ffa}}@media print{html .btn-indigo-300,html[data-netbox-color-mode=dark] .btn-indigo-300,html[data-netbox-color-mode=light] .btn-indigo-300{color:#000;background-color:#a370f7;border-color:#a370f7}html .btn-indigo-300:hover,html[data-netbox-color-mode=dark] .btn-indigo-300:hover,html[data-netbox-color-mode=light] .btn-indigo-300:hover{color:#000;background-color:#b185f8;border-color:#ac7ef8}.btn-check:focus+html .btn-indigo-300,html .btn-indigo-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-300,html[data-netbox-color-mode=dark] .btn-indigo-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-300,html[data-netbox-color-mode=light] .btn-indigo-300:focus{color:#000;background-color:#b185f8;border-color:#ac7ef8;box-shadow:0 0 0 .25rem #8b5fd280}.btn-check:checked+html .btn-indigo-300,.btn-check:active+html .btn-indigo-300,html .btn-indigo-300:active,html .btn-indigo-300.active,.show>html .btn-indigo-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-300,html[data-netbox-color-mode=dark] .btn-indigo-300:active,html[data-netbox-color-mode=dark] .btn-indigo-300.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-300,html[data-netbox-color-mode=light] .btn-indigo-300:active,html[data-netbox-color-mode=light] .btn-indigo-300.active,.show>html[data-netbox-color-mode=light] .btn-indigo-300.dropdown-toggle{color:#000;background-color:#b58df9;border-color:#ac7ef8}.btn-check:checked+html .btn-indigo-300:focus,.btn-check:active+html .btn-indigo-300:focus,html .btn-indigo-300:active:focus,html .btn-indigo-300.active:focus,.show>html .btn-indigo-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-300:focus,html[data-netbox-color-mode=dark] .btn-indigo-300:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-300:focus,html[data-netbox-color-mode=light] .btn-indigo-300:active:focus,html[data-netbox-color-mode=light] .btn-indigo-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #8b5fd280}html .btn-indigo-300:disabled,html .btn-indigo-300.disabled,html[data-netbox-color-mode=dark] .btn-indigo-300:disabled,html[data-netbox-color-mode=dark] .btn-indigo-300.disabled,html[data-netbox-color-mode=light] .btn-indigo-300:disabled,html[data-netbox-color-mode=light] .btn-indigo-300.disabled{color:#000;background-color:#a370f7;border-color:#a370f7}}@media print{html .btn-indigo-400,html[data-netbox-color-mode=dark] .btn-indigo-400,html[data-netbox-color-mode=light] .btn-indigo-400{color:#fff;background-color:#8540f5;border-color:#8540f5}html .btn-indigo-400:hover,html[data-netbox-color-mode=dark] .btn-indigo-400:hover,html[data-netbox-color-mode=light] .btn-indigo-400:hover{color:#fff;background-color:#7136d0;border-color:#6a33c4}.btn-check:focus+html .btn-indigo-400,html .btn-indigo-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-400,html[data-netbox-color-mode=dark] .btn-indigo-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-400,html[data-netbox-color-mode=light] .btn-indigo-400:focus{color:#fff;background-color:#7136d0;border-color:#6a33c4;box-shadow:0 0 0 .25rem #975df780}.btn-check:checked+html .btn-indigo-400,.btn-check:active+html .btn-indigo-400,html .btn-indigo-400:active,html .btn-indigo-400.active,.show>html .btn-indigo-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-400,html[data-netbox-color-mode=dark] .btn-indigo-400:active,html[data-netbox-color-mode=dark] .btn-indigo-400.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-400,html[data-netbox-color-mode=light] .btn-indigo-400:active,html[data-netbox-color-mode=light] .btn-indigo-400.active,.show>html[data-netbox-color-mode=light] .btn-indigo-400.dropdown-toggle{color:#fff;background-color:#6a33c4;border-color:#6430b8}.btn-check:checked+html .btn-indigo-400:focus,.btn-check:active+html .btn-indigo-400:focus,html .btn-indigo-400:active:focus,html .btn-indigo-400.active:focus,.show>html .btn-indigo-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-400:focus,html[data-netbox-color-mode=dark] .btn-indigo-400:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-400:focus,html[data-netbox-color-mode=light] .btn-indigo-400:active:focus,html[data-netbox-color-mode=light] .btn-indigo-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #975df780}html .btn-indigo-400:disabled,html .btn-indigo-400.disabled,html[data-netbox-color-mode=dark] .btn-indigo-400:disabled,html[data-netbox-color-mode=dark] .btn-indigo-400.disabled,html[data-netbox-color-mode=light] .btn-indigo-400:disabled,html[data-netbox-color-mode=light] .btn-indigo-400.disabled{color:#fff;background-color:#8540f5;border-color:#8540f5}}@media print{html .btn-indigo-500,html[data-netbox-color-mode=dark] .btn-indigo-500,html[data-netbox-color-mode=light] .btn-indigo-500{color:#fff;background-color:#6610f2;border-color:#6610f2}html .btn-indigo-500:hover,html[data-netbox-color-mode=dark] .btn-indigo-500:hover,html[data-netbox-color-mode=light] .btn-indigo-500:hover{color:#fff;background-color:#570ece;border-color:#520dc2}.btn-check:focus+html .btn-indigo-500,html .btn-indigo-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-500,html[data-netbox-color-mode=dark] .btn-indigo-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-500,html[data-netbox-color-mode=light] .btn-indigo-500:focus{color:#fff;background-color:#570ece;border-color:#520dc2;box-shadow:0 0 0 .25rem #7d34f480}.btn-check:checked+html .btn-indigo-500,.btn-check:active+html .btn-indigo-500,html .btn-indigo-500:active,html .btn-indigo-500.active,.show>html .btn-indigo-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-500,html[data-netbox-color-mode=dark] .btn-indigo-500:active,html[data-netbox-color-mode=dark] .btn-indigo-500.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-500,html[data-netbox-color-mode=light] .btn-indigo-500:active,html[data-netbox-color-mode=light] .btn-indigo-500.active,.show>html[data-netbox-color-mode=light] .btn-indigo-500.dropdown-toggle{color:#fff;background-color:#520dc2;border-color:#4d0cb6}.btn-check:checked+html .btn-indigo-500:focus,.btn-check:active+html .btn-indigo-500:focus,html .btn-indigo-500:active:focus,html .btn-indigo-500.active:focus,.show>html .btn-indigo-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-500:focus,html[data-netbox-color-mode=dark] .btn-indigo-500:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-500:focus,html[data-netbox-color-mode=light] .btn-indigo-500:active:focus,html[data-netbox-color-mode=light] .btn-indigo-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d34f480}html .btn-indigo-500:disabled,html .btn-indigo-500.disabled,html[data-netbox-color-mode=dark] .btn-indigo-500:disabled,html[data-netbox-color-mode=dark] .btn-indigo-500.disabled,html[data-netbox-color-mode=light] .btn-indigo-500:disabled,html[data-netbox-color-mode=light] .btn-indigo-500.disabled{color:#fff;background-color:#6610f2;border-color:#6610f2}}@media print{html .btn-indigo-600,html[data-netbox-color-mode=dark] .btn-indigo-600,html[data-netbox-color-mode=light] .btn-indigo-600{color:#fff;background-color:#520dc2;border-color:#520dc2}html .btn-indigo-600:hover,html[data-netbox-color-mode=dark] .btn-indigo-600:hover,html[data-netbox-color-mode=light] .btn-indigo-600:hover{color:#fff;background-color:#460ba5;border-color:#420a9b}.btn-check:focus+html .btn-indigo-600,html .btn-indigo-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-600,html[data-netbox-color-mode=dark] .btn-indigo-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-600,html[data-netbox-color-mode=light] .btn-indigo-600:focus{color:#fff;background-color:#460ba5;border-color:#420a9b;box-shadow:0 0 0 .25rem #6c31cb80}.btn-check:checked+html .btn-indigo-600,.btn-check:active+html .btn-indigo-600,html .btn-indigo-600:active,html .btn-indigo-600.active,.show>html .btn-indigo-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-600,html[data-netbox-color-mode=dark] .btn-indigo-600:active,html[data-netbox-color-mode=dark] .btn-indigo-600.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-600,html[data-netbox-color-mode=light] .btn-indigo-600:active,html[data-netbox-color-mode=light] .btn-indigo-600.active,.show>html[data-netbox-color-mode=light] .btn-indigo-600.dropdown-toggle{color:#fff;background-color:#420a9b;border-color:#3e0a92}.btn-check:checked+html .btn-indigo-600:focus,.btn-check:active+html .btn-indigo-600:focus,html .btn-indigo-600:active:focus,html .btn-indigo-600.active:focus,.show>html .btn-indigo-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-600:focus,html[data-netbox-color-mode=dark] .btn-indigo-600:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-600:focus,html[data-netbox-color-mode=light] .btn-indigo-600:active:focus,html[data-netbox-color-mode=light] .btn-indigo-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #6c31cb80}html .btn-indigo-600:disabled,html .btn-indigo-600.disabled,html[data-netbox-color-mode=dark] .btn-indigo-600:disabled,html[data-netbox-color-mode=dark] .btn-indigo-600.disabled,html[data-netbox-color-mode=light] .btn-indigo-600:disabled,html[data-netbox-color-mode=light] .btn-indigo-600.disabled{color:#fff;background-color:#520dc2;border-color:#520dc2}}@media print{html .btn-indigo-700,html[data-netbox-color-mode=dark] .btn-indigo-700,html[data-netbox-color-mode=light] .btn-indigo-700{color:#fff;background-color:#3d0a91;border-color:#3d0a91}html .btn-indigo-700:hover,html[data-netbox-color-mode=dark] .btn-indigo-700:hover,html[data-netbox-color-mode=light] .btn-indigo-700:hover{color:#fff;background-color:#34097b;border-color:#310874}.btn-check:focus+html .btn-indigo-700,html .btn-indigo-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-700,html[data-netbox-color-mode=dark] .btn-indigo-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-700,html[data-netbox-color-mode=light] .btn-indigo-700:focus{color:#fff;background-color:#34097b;border-color:#310874;box-shadow:0 0 0 .25rem #5a2fa280}.btn-check:checked+html .btn-indigo-700,.btn-check:active+html .btn-indigo-700,html .btn-indigo-700:active,html .btn-indigo-700.active,.show>html .btn-indigo-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-700,html[data-netbox-color-mode=dark] .btn-indigo-700:active,html[data-netbox-color-mode=dark] .btn-indigo-700.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-700,html[data-netbox-color-mode=light] .btn-indigo-700:active,html[data-netbox-color-mode=light] .btn-indigo-700.active,.show>html[data-netbox-color-mode=light] .btn-indigo-700.dropdown-toggle{color:#fff;background-color:#310874;border-color:#2e086d}.btn-check:checked+html .btn-indigo-700:focus,.btn-check:active+html .btn-indigo-700:focus,html .btn-indigo-700:active:focus,html .btn-indigo-700.active:focus,.show>html .btn-indigo-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-700:focus,html[data-netbox-color-mode=dark] .btn-indigo-700:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-700:focus,html[data-netbox-color-mode=light] .btn-indigo-700:active:focus,html[data-netbox-color-mode=light] .btn-indigo-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5a2fa280}html .btn-indigo-700:disabled,html .btn-indigo-700.disabled,html[data-netbox-color-mode=dark] .btn-indigo-700:disabled,html[data-netbox-color-mode=dark] .btn-indigo-700.disabled,html[data-netbox-color-mode=light] .btn-indigo-700:disabled,html[data-netbox-color-mode=light] .btn-indigo-700.disabled{color:#fff;background-color:#3d0a91;border-color:#3d0a91}}@media print{html .btn-indigo-800,html[data-netbox-color-mode=dark] .btn-indigo-800,html[data-netbox-color-mode=light] .btn-indigo-800{color:#fff;background-color:#290661;border-color:#290661}html .btn-indigo-800:hover,html[data-netbox-color-mode=dark] .btn-indigo-800:hover,html[data-netbox-color-mode=light] .btn-indigo-800:hover{color:#fff;background-color:#230552;border-color:#21054e}.btn-check:focus+html .btn-indigo-800,html .btn-indigo-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-800,html[data-netbox-color-mode=dark] .btn-indigo-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-800,html[data-netbox-color-mode=light] .btn-indigo-800:focus{color:#fff;background-color:#230552;border-color:#21054e;box-shadow:0 0 0 .25rem #492b7980}.btn-check:checked+html .btn-indigo-800,.btn-check:active+html .btn-indigo-800,html .btn-indigo-800:active,html .btn-indigo-800.active,.show>html .btn-indigo-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-800,html[data-netbox-color-mode=dark] .btn-indigo-800:active,html[data-netbox-color-mode=dark] .btn-indigo-800.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-800,html[data-netbox-color-mode=light] .btn-indigo-800:active,html[data-netbox-color-mode=light] .btn-indigo-800.active,.show>html[data-netbox-color-mode=light] .btn-indigo-800.dropdown-toggle{color:#fff;background-color:#21054e;border-color:#1f0549}.btn-check:checked+html .btn-indigo-800:focus,.btn-check:active+html .btn-indigo-800:focus,html .btn-indigo-800:active:focus,html .btn-indigo-800.active:focus,.show>html .btn-indigo-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-800:focus,html[data-netbox-color-mode=dark] .btn-indigo-800:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-800:focus,html[data-netbox-color-mode=light] .btn-indigo-800:active:focus,html[data-netbox-color-mode=light] .btn-indigo-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #492b7980}html .btn-indigo-800:disabled,html .btn-indigo-800.disabled,html[data-netbox-color-mode=dark] .btn-indigo-800:disabled,html[data-netbox-color-mode=dark] .btn-indigo-800.disabled,html[data-netbox-color-mode=light] .btn-indigo-800:disabled,html[data-netbox-color-mode=light] .btn-indigo-800.disabled{color:#fff;background-color:#290661;border-color:#290661}}@media print{html .btn-indigo-900,html[data-netbox-color-mode=dark] .btn-indigo-900,html[data-netbox-color-mode=light] .btn-indigo-900{color:#fff;background-color:#140330;border-color:#140330}html .btn-indigo-900:hover,html[data-netbox-color-mode=dark] .btn-indigo-900:hover,html[data-netbox-color-mode=light] .btn-indigo-900:hover{color:#fff;background-color:#110329;border-color:#100226}.btn-check:focus+html .btn-indigo-900,html .btn-indigo-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo-900,html[data-netbox-color-mode=dark] .btn-indigo-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo-900,html[data-netbox-color-mode=light] .btn-indigo-900:focus{color:#fff;background-color:#110329;border-color:#100226;box-shadow:0 0 0 .25rem #37294f80}.btn-check:checked+html .btn-indigo-900,.btn-check:active+html .btn-indigo-900,html .btn-indigo-900:active,html .btn-indigo-900.active,.show>html .btn-indigo-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-900,html[data-netbox-color-mode=dark] .btn-indigo-900:active,html[data-netbox-color-mode=dark] .btn-indigo-900.active,.show>html[data-netbox-color-mode=dark] .btn-indigo-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-900,html[data-netbox-color-mode=light] .btn-indigo-900:active,html[data-netbox-color-mode=light] .btn-indigo-900.active,.show>html[data-netbox-color-mode=light] .btn-indigo-900.dropdown-toggle{color:#fff;background-color:#100226;border-color:#0f0224}.btn-check:checked+html .btn-indigo-900:focus,.btn-check:active+html .btn-indigo-900:focus,html .btn-indigo-900:active:focus,html .btn-indigo-900.active:focus,.show>html .btn-indigo-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo-900:focus,html[data-netbox-color-mode=dark] .btn-indigo-900:active:focus,html[data-netbox-color-mode=dark] .btn-indigo-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo-900:focus,html[data-netbox-color-mode=light] .btn-indigo-900:active:focus,html[data-netbox-color-mode=light] .btn-indigo-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #37294f80}html .btn-indigo-900:disabled,html .btn-indigo-900.disabled,html[data-netbox-color-mode=dark] .btn-indigo-900:disabled,html[data-netbox-color-mode=dark] .btn-indigo-900.disabled,html[data-netbox-color-mode=light] .btn-indigo-900:disabled,html[data-netbox-color-mode=light] .btn-indigo-900.disabled{color:#fff;background-color:#140330;border-color:#140330}}@media print{html .btn-purple-100,html[data-netbox-color-mode=dark] .btn-purple-100,html[data-netbox-color-mode=light] .btn-purple-100{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}html .btn-purple-100:hover,html[data-netbox-color-mode=dark] .btn-purple-100:hover,html[data-netbox-color-mode=light] .btn-purple-100:hover{color:#000;background-color:#e6dff5;border-color:#e5ddf4}.btn-check:focus+html .btn-purple-100,html .btn-purple-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-100,html[data-netbox-color-mode=dark] .btn-purple-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-100,html[data-netbox-color-mode=light] .btn-purple-100:focus{color:#000;background-color:#e6dff5;border-color:#e5ddf4;box-shadow:0 0 0 .25rem #c0b8cf80}.btn-check:checked+html .btn-purple-100,.btn-check:active+html .btn-purple-100,html .btn-purple-100:active,html .btn-purple-100.active,.show>html .btn-purple-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-100,html[data-netbox-color-mode=dark] .btn-purple-100:active,html[data-netbox-color-mode=dark] .btn-purple-100.active,.show>html[data-netbox-color-mode=dark] .btn-purple-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-100,html[data-netbox-color-mode=light] .btn-purple-100:active,html[data-netbox-color-mode=light] .btn-purple-100.active,.show>html[data-netbox-color-mode=light] .btn-purple-100.dropdown-toggle{color:#000;background-color:#e8e1f5;border-color:#e5ddf4}.btn-check:checked+html .btn-purple-100:focus,.btn-check:active+html .btn-purple-100:focus,html .btn-purple-100:active:focus,html .btn-purple-100.active:focus,.show>html .btn-purple-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-100:focus,html[data-netbox-color-mode=dark] .btn-purple-100:active:focus,html[data-netbox-color-mode=dark] .btn-purple-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-100:focus,html[data-netbox-color-mode=light] .btn-purple-100:active:focus,html[data-netbox-color-mode=light] .btn-purple-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c0b8cf80}html .btn-purple-100:disabled,html .btn-purple-100.disabled,html[data-netbox-color-mode=dark] .btn-purple-100:disabled,html[data-netbox-color-mode=dark] .btn-purple-100.disabled,html[data-netbox-color-mode=light] .btn-purple-100:disabled,html[data-netbox-color-mode=light] .btn-purple-100.disabled{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}}@media print{html .btn-purple-200,html[data-netbox-color-mode=dark] .btn-purple-200,html[data-netbox-color-mode=light] .btn-purple-200{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}html .btn-purple-200:hover,html[data-netbox-color-mode=dark] .btn-purple-200:hover,html[data-netbox-color-mode=light] .btn-purple-200:hover{color:#000;background-color:#cebeea;border-color:#cbbbe9}.btn-check:focus+html .btn-purple-200,html .btn-purple-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-200,html[data-netbox-color-mode=dark] .btn-purple-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-200,html[data-netbox-color-mode=light] .btn-purple-200:focus{color:#000;background-color:#cebeea;border-color:#cbbbe9;box-shadow:0 0 0 .25rem #a798c480}.btn-check:checked+html .btn-purple-200,.btn-check:active+html .btn-purple-200,html .btn-purple-200:active,html .btn-purple-200.active,.show>html .btn-purple-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-200,html[data-netbox-color-mode=dark] .btn-purple-200:active,html[data-netbox-color-mode=dark] .btn-purple-200.active,.show>html[data-netbox-color-mode=dark] .btn-purple-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-200,html[data-netbox-color-mode=light] .btn-purple-200:active,html[data-netbox-color-mode=light] .btn-purple-200.active,.show>html[data-netbox-color-mode=light] .btn-purple-200.dropdown-toggle{color:#000;background-color:#d1c2eb;border-color:#cbbbe9}.btn-check:checked+html .btn-purple-200:focus,.btn-check:active+html .btn-purple-200:focus,html .btn-purple-200:active:focus,html .btn-purple-200.active:focus,.show>html .btn-purple-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-200:focus,html[data-netbox-color-mode=dark] .btn-purple-200:active:focus,html[data-netbox-color-mode=dark] .btn-purple-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-200:focus,html[data-netbox-color-mode=light] .btn-purple-200:active:focus,html[data-netbox-color-mode=light] .btn-purple-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #a798c480}html .btn-purple-200:disabled,html .btn-purple-200.disabled,html[data-netbox-color-mode=dark] .btn-purple-200:disabled,html[data-netbox-color-mode=dark] .btn-purple-200.disabled,html[data-netbox-color-mode=light] .btn-purple-200:disabled,html[data-netbox-color-mode=light] .btn-purple-200.disabled{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}}@media print{html .btn-purple-300,html[data-netbox-color-mode=dark] .btn-purple-300,html[data-netbox-color-mode=light] .btn-purple-300{color:#000;background-color:#a98eda;border-color:#a98eda}html .btn-purple-300:hover,html[data-netbox-color-mode=dark] .btn-purple-300:hover,html[data-netbox-color-mode=light] .btn-purple-300:hover{color:#000;background-color:#b69fe0;border-color:#b299de}.btn-check:focus+html .btn-purple-300,html .btn-purple-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-300,html[data-netbox-color-mode=dark] .btn-purple-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-300,html[data-netbox-color-mode=light] .btn-purple-300:focus{color:#000;background-color:#b69fe0;border-color:#b299de;box-shadow:0 0 0 .25rem #9079b980}.btn-check:checked+html .btn-purple-300,.btn-check:active+html .btn-purple-300,html .btn-purple-300:active,html .btn-purple-300.active,.show>html .btn-purple-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-300,html[data-netbox-color-mode=dark] .btn-purple-300:active,html[data-netbox-color-mode=dark] .btn-purple-300.active,.show>html[data-netbox-color-mode=dark] .btn-purple-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-300,html[data-netbox-color-mode=light] .btn-purple-300:active,html[data-netbox-color-mode=light] .btn-purple-300.active,.show>html[data-netbox-color-mode=light] .btn-purple-300.dropdown-toggle{color:#000;background-color:#baa5e1;border-color:#b299de}.btn-check:checked+html .btn-purple-300:focus,.btn-check:active+html .btn-purple-300:focus,html .btn-purple-300:active:focus,html .btn-purple-300.active:focus,.show>html .btn-purple-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-300:focus,html[data-netbox-color-mode=dark] .btn-purple-300:active:focus,html[data-netbox-color-mode=dark] .btn-purple-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-300:focus,html[data-netbox-color-mode=light] .btn-purple-300:active:focus,html[data-netbox-color-mode=light] .btn-purple-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #9079b980}html .btn-purple-300:disabled,html .btn-purple-300.disabled,html[data-netbox-color-mode=dark] .btn-purple-300:disabled,html[data-netbox-color-mode=dark] .btn-purple-300.disabled,html[data-netbox-color-mode=light] .btn-purple-300:disabled,html[data-netbox-color-mode=light] .btn-purple-300.disabled{color:#000;background-color:#a98eda;border-color:#a98eda}}@media print{html .btn-purple-400,html[data-netbox-color-mode=dark] .btn-purple-400,html[data-netbox-color-mode=light] .btn-purple-400{color:#000;background-color:#8c68cd;border-color:#8c68cd}html .btn-purple-400:hover,html[data-netbox-color-mode=dark] .btn-purple-400:hover,html[data-netbox-color-mode=light] .btn-purple-400:hover{color:#000;background-color:#9d7fd5;border-color:#9877d2}.btn-check:focus+html .btn-purple-400,html .btn-purple-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-400,html[data-netbox-color-mode=dark] .btn-purple-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-400,html[data-netbox-color-mode=light] .btn-purple-400:focus{color:#000;background-color:#9d7fd5;border-color:#9877d2;box-shadow:0 0 0 .25rem #7758ae80}.btn-check:checked+html .btn-purple-400,.btn-check:active+html .btn-purple-400,html .btn-purple-400:active,html .btn-purple-400.active,.show>html .btn-purple-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-400,html[data-netbox-color-mode=dark] .btn-purple-400:active,html[data-netbox-color-mode=dark] .btn-purple-400.active,.show>html[data-netbox-color-mode=dark] .btn-purple-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-400,html[data-netbox-color-mode=light] .btn-purple-400:active,html[data-netbox-color-mode=light] .btn-purple-400.active,.show>html[data-netbox-color-mode=light] .btn-purple-400.dropdown-toggle{color:#000;background-color:#a386d7;border-color:#9877d2}.btn-check:checked+html .btn-purple-400:focus,.btn-check:active+html .btn-purple-400:focus,html .btn-purple-400:active:focus,html .btn-purple-400.active:focus,.show>html .btn-purple-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-400:focus,html[data-netbox-color-mode=dark] .btn-purple-400:active:focus,html[data-netbox-color-mode=dark] .btn-purple-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-400:focus,html[data-netbox-color-mode=light] .btn-purple-400:active:focus,html[data-netbox-color-mode=light] .btn-purple-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7758ae80}html .btn-purple-400:disabled,html .btn-purple-400.disabled,html[data-netbox-color-mode=dark] .btn-purple-400:disabled,html[data-netbox-color-mode=dark] .btn-purple-400.disabled,html[data-netbox-color-mode=light] .btn-purple-400:disabled,html[data-netbox-color-mode=light] .btn-purple-400.disabled{color:#000;background-color:#8c68cd;border-color:#8c68cd}}@media print{html .btn-purple-500,html[data-netbox-color-mode=dark] .btn-purple-500,html[data-netbox-color-mode=light] .btn-purple-500{color:#fff;background-color:#6f42c1;border-color:#6f42c1}html .btn-purple-500:hover,html[data-netbox-color-mode=dark] .btn-purple-500:hover,html[data-netbox-color-mode=light] .btn-purple-500:hover{color:#fff;background-color:#5e38a4;border-color:#59359a}.btn-check:focus+html .btn-purple-500,html .btn-purple-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-500,html[data-netbox-color-mode=dark] .btn-purple-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-500,html[data-netbox-color-mode=light] .btn-purple-500:focus{color:#fff;background-color:#5e38a4;border-color:#59359a;box-shadow:0 0 0 .25rem #855eca80}.btn-check:checked+html .btn-purple-500,.btn-check:active+html .btn-purple-500,html .btn-purple-500:active,html .btn-purple-500.active,.show>html .btn-purple-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-500,html[data-netbox-color-mode=dark] .btn-purple-500:active,html[data-netbox-color-mode=dark] .btn-purple-500.active,.show>html[data-netbox-color-mode=dark] .btn-purple-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-500,html[data-netbox-color-mode=light] .btn-purple-500:active,html[data-netbox-color-mode=light] .btn-purple-500.active,.show>html[data-netbox-color-mode=light] .btn-purple-500.dropdown-toggle{color:#fff;background-color:#59359a;border-color:#533291}.btn-check:checked+html .btn-purple-500:focus,.btn-check:active+html .btn-purple-500:focus,html .btn-purple-500:active:focus,html .btn-purple-500.active:focus,.show>html .btn-purple-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-500:focus,html[data-netbox-color-mode=dark] .btn-purple-500:active:focus,html[data-netbox-color-mode=dark] .btn-purple-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-500:focus,html[data-netbox-color-mode=light] .btn-purple-500:active:focus,html[data-netbox-color-mode=light] .btn-purple-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #855eca80}html .btn-purple-500:disabled,html .btn-purple-500.disabled,html[data-netbox-color-mode=dark] .btn-purple-500:disabled,html[data-netbox-color-mode=dark] .btn-purple-500.disabled,html[data-netbox-color-mode=light] .btn-purple-500:disabled,html[data-netbox-color-mode=light] .btn-purple-500.disabled{color:#fff;background-color:#6f42c1;border-color:#6f42c1}}@media print{html .btn-purple-600,html[data-netbox-color-mode=dark] .btn-purple-600,html[data-netbox-color-mode=light] .btn-purple-600{color:#fff;background-color:#59359a;border-color:#59359a}html .btn-purple-600:hover,html[data-netbox-color-mode=dark] .btn-purple-600:hover,html[data-netbox-color-mode=light] .btn-purple-600:hover{color:#fff;background-color:#4c2d83;border-color:#472a7b}.btn-check:focus+html .btn-purple-600,html .btn-purple-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-600,html[data-netbox-color-mode=dark] .btn-purple-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-600,html[data-netbox-color-mode=light] .btn-purple-600:focus{color:#fff;background-color:#4c2d83;border-color:#472a7b;box-shadow:0 0 0 .25rem #7253a980}.btn-check:checked+html .btn-purple-600,.btn-check:active+html .btn-purple-600,html .btn-purple-600:active,html .btn-purple-600.active,.show>html .btn-purple-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-600,html[data-netbox-color-mode=dark] .btn-purple-600:active,html[data-netbox-color-mode=dark] .btn-purple-600.active,.show>html[data-netbox-color-mode=dark] .btn-purple-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-600,html[data-netbox-color-mode=light] .btn-purple-600:active,html[data-netbox-color-mode=light] .btn-purple-600.active,.show>html[data-netbox-color-mode=light] .btn-purple-600.dropdown-toggle{color:#fff;background-color:#472a7b;border-color:#432874}.btn-check:checked+html .btn-purple-600:focus,.btn-check:active+html .btn-purple-600:focus,html .btn-purple-600:active:focus,html .btn-purple-600.active:focus,.show>html .btn-purple-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-600:focus,html[data-netbox-color-mode=dark] .btn-purple-600:active:focus,html[data-netbox-color-mode=dark] .btn-purple-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-600:focus,html[data-netbox-color-mode=light] .btn-purple-600:active:focus,html[data-netbox-color-mode=light] .btn-purple-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7253a980}html .btn-purple-600:disabled,html .btn-purple-600.disabled,html[data-netbox-color-mode=dark] .btn-purple-600:disabled,html[data-netbox-color-mode=dark] .btn-purple-600.disabled,html[data-netbox-color-mode=light] .btn-purple-600:disabled,html[data-netbox-color-mode=light] .btn-purple-600.disabled{color:#fff;background-color:#59359a;border-color:#59359a}}@media print{html .btn-purple-700,html[data-netbox-color-mode=dark] .btn-purple-700,html[data-netbox-color-mode=light] .btn-purple-700{color:#fff;background-color:#432874;border-color:#432874}html .btn-purple-700:hover,html[data-netbox-color-mode=dark] .btn-purple-700:hover,html[data-netbox-color-mode=light] .btn-purple-700:hover{color:#fff;background-color:#392263;border-color:#36205d}.btn-check:focus+html .btn-purple-700,html .btn-purple-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-700,html[data-netbox-color-mode=dark] .btn-purple-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-700,html[data-netbox-color-mode=light] .btn-purple-700:focus{color:#fff;background-color:#392263;border-color:#36205d;box-shadow:0 0 0 .25rem #5f488980}.btn-check:checked+html .btn-purple-700,.btn-check:active+html .btn-purple-700,html .btn-purple-700:active,html .btn-purple-700.active,.show>html .btn-purple-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-700,html[data-netbox-color-mode=dark] .btn-purple-700:active,html[data-netbox-color-mode=dark] .btn-purple-700.active,.show>html[data-netbox-color-mode=dark] .btn-purple-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-700,html[data-netbox-color-mode=light] .btn-purple-700:active,html[data-netbox-color-mode=light] .btn-purple-700.active,.show>html[data-netbox-color-mode=light] .btn-purple-700.dropdown-toggle{color:#fff;background-color:#36205d;border-color:#321e57}.btn-check:checked+html .btn-purple-700:focus,.btn-check:active+html .btn-purple-700:focus,html .btn-purple-700:active:focus,html .btn-purple-700.active:focus,.show>html .btn-purple-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-700:focus,html[data-netbox-color-mode=dark] .btn-purple-700:active:focus,html[data-netbox-color-mode=dark] .btn-purple-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-700:focus,html[data-netbox-color-mode=light] .btn-purple-700:active:focus,html[data-netbox-color-mode=light] .btn-purple-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #5f488980}html .btn-purple-700:disabled,html .btn-purple-700.disabled,html[data-netbox-color-mode=dark] .btn-purple-700:disabled,html[data-netbox-color-mode=dark] .btn-purple-700.disabled,html[data-netbox-color-mode=light] .btn-purple-700:disabled,html[data-netbox-color-mode=light] .btn-purple-700.disabled{color:#fff;background-color:#432874;border-color:#432874}}@media print{html .btn-purple-800,html[data-netbox-color-mode=dark] .btn-purple-800,html[data-netbox-color-mode=light] .btn-purple-800{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}html .btn-purple-800:hover,html[data-netbox-color-mode=dark] .btn-purple-800:hover,html[data-netbox-color-mode=light] .btn-purple-800:hover{color:#fff;background-color:#251641;border-color:#23153e}.btn-check:focus+html .btn-purple-800,html .btn-purple-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-800,html[data-netbox-color-mode=dark] .btn-purple-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-800,html[data-netbox-color-mode=light] .btn-purple-800:focus{color:#fff;background-color:#251641;border-color:#23153e;box-shadow:0 0 0 .25rem #4c3c6880}.btn-check:checked+html .btn-purple-800,.btn-check:active+html .btn-purple-800,html .btn-purple-800:active,html .btn-purple-800.active,.show>html .btn-purple-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-800,html[data-netbox-color-mode=dark] .btn-purple-800:active,html[data-netbox-color-mode=dark] .btn-purple-800.active,.show>html[data-netbox-color-mode=dark] .btn-purple-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-800,html[data-netbox-color-mode=light] .btn-purple-800:active,html[data-netbox-color-mode=light] .btn-purple-800.active,.show>html[data-netbox-color-mode=light] .btn-purple-800.dropdown-toggle{color:#fff;background-color:#23153e;border-color:#21143a}.btn-check:checked+html .btn-purple-800:focus,.btn-check:active+html .btn-purple-800:focus,html .btn-purple-800:active:focus,html .btn-purple-800.active:focus,.show>html .btn-purple-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-800:focus,html[data-netbox-color-mode=dark] .btn-purple-800:active:focus,html[data-netbox-color-mode=dark] .btn-purple-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-800:focus,html[data-netbox-color-mode=light] .btn-purple-800:active:focus,html[data-netbox-color-mode=light] .btn-purple-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4c3c6880}html .btn-purple-800:disabled,html .btn-purple-800.disabled,html[data-netbox-color-mode=dark] .btn-purple-800:disabled,html[data-netbox-color-mode=dark] .btn-purple-800.disabled,html[data-netbox-color-mode=light] .btn-purple-800:disabled,html[data-netbox-color-mode=light] .btn-purple-800.disabled{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}}@media print{html .btn-purple-900,html[data-netbox-color-mode=dark] .btn-purple-900,html[data-netbox-color-mode=light] .btn-purple-900{color:#fff;background-color:#160d27;border-color:#160d27}html .btn-purple-900:hover,html[data-netbox-color-mode=dark] .btn-purple-900:hover,html[data-netbox-color-mode=light] .btn-purple-900:hover{color:#fff;background-color:#130b21;border-color:#120a1f}.btn-check:focus+html .btn-purple-900,html .btn-purple-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple-900,html[data-netbox-color-mode=dark] .btn-purple-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple-900,html[data-netbox-color-mode=light] .btn-purple-900:focus{color:#fff;background-color:#130b21;border-color:#120a1f;box-shadow:0 0 0 .25rem #39314780}.btn-check:checked+html .btn-purple-900,.btn-check:active+html .btn-purple-900,html .btn-purple-900:active,html .btn-purple-900.active,.show>html .btn-purple-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-900,html[data-netbox-color-mode=dark] .btn-purple-900:active,html[data-netbox-color-mode=dark] .btn-purple-900.active,.show>html[data-netbox-color-mode=dark] .btn-purple-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-900,html[data-netbox-color-mode=light] .btn-purple-900:active,html[data-netbox-color-mode=light] .btn-purple-900.active,.show>html[data-netbox-color-mode=light] .btn-purple-900.dropdown-toggle{color:#fff;background-color:#120a1f;border-color:#110a1d}.btn-check:checked+html .btn-purple-900:focus,.btn-check:active+html .btn-purple-900:focus,html .btn-purple-900:active:focus,html .btn-purple-900.active:focus,.show>html .btn-purple-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple-900:focus,html[data-netbox-color-mode=dark] .btn-purple-900:active:focus,html[data-netbox-color-mode=dark] .btn-purple-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple-900:focus,html[data-netbox-color-mode=light] .btn-purple-900:active:focus,html[data-netbox-color-mode=light] .btn-purple-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #39314780}html .btn-purple-900:disabled,html .btn-purple-900.disabled,html[data-netbox-color-mode=dark] .btn-purple-900:disabled,html[data-netbox-color-mode=dark] .btn-purple-900.disabled,html[data-netbox-color-mode=light] .btn-purple-900:disabled,html[data-netbox-color-mode=light] .btn-purple-900.disabled{color:#fff;background-color:#160d27;border-color:#160d27}}@media print{html .btn-pink-100,html[data-netbox-color-mode=dark] .btn-pink-100,html[data-netbox-color-mode=light] .btn-pink-100{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}html .btn-pink-100:hover,html[data-netbox-color-mode=dark] .btn-pink-100:hover,html[data-netbox-color-mode=light] .btn-pink-100:hover{color:#000;background-color:#f8dcea;border-color:#f8dae9}.btn-check:focus+html .btn-pink-100,html .btn-pink-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-100,html[data-netbox-color-mode=dark] .btn-pink-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-100,html[data-netbox-color-mode=light] .btn-pink-100:focus{color:#000;background-color:#f8dcea;border-color:#f8dae9;box-shadow:0 0 0 .25rem #d2b6c480}.btn-check:checked+html .btn-pink-100,.btn-check:active+html .btn-pink-100,html .btn-pink-100:active,html .btn-pink-100.active,.show>html .btn-pink-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-100,html[data-netbox-color-mode=dark] .btn-pink-100:active,html[data-netbox-color-mode=dark] .btn-pink-100.active,.show>html[data-netbox-color-mode=dark] .btn-pink-100.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-100,html[data-netbox-color-mode=light] .btn-pink-100:active,html[data-netbox-color-mode=light] .btn-pink-100.active,.show>html[data-netbox-color-mode=light] .btn-pink-100.dropdown-toggle{color:#000;background-color:#f9deeb;border-color:#f8dae9}.btn-check:checked+html .btn-pink-100:focus,.btn-check:active+html .btn-pink-100:focus,html .btn-pink-100:active:focus,html .btn-pink-100.active:focus,.show>html .btn-pink-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-100:focus,html[data-netbox-color-mode=dark] .btn-pink-100:active:focus,html[data-netbox-color-mode=dark] .btn-pink-100.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-100.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-100:focus,html[data-netbox-color-mode=light] .btn-pink-100:active:focus,html[data-netbox-color-mode=light] .btn-pink-100.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-100.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d2b6c480}html .btn-pink-100:disabled,html .btn-pink-100.disabled,html[data-netbox-color-mode=dark] .btn-pink-100:disabled,html[data-netbox-color-mode=dark] .btn-pink-100.disabled,html[data-netbox-color-mode=light] .btn-pink-100:disabled,html[data-netbox-color-mode=light] .btn-pink-100.disabled{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}}@media print{html .btn-pink-200,html[data-netbox-color-mode=dark] .btn-pink-200,html[data-netbox-color-mode=light] .btn-pink-200{color:#000;background-color:#efadce;border-color:#efadce}html .btn-pink-200:hover,html[data-netbox-color-mode=dark] .btn-pink-200:hover,html[data-netbox-color-mode=light] .btn-pink-200:hover{color:#000;background-color:#f1b9d5;border-color:#f1b5d3}.btn-check:focus+html .btn-pink-200,html .btn-pink-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-200,html[data-netbox-color-mode=dark] .btn-pink-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-200,html[data-netbox-color-mode=light] .btn-pink-200:focus{color:#000;background-color:#f1b9d5;border-color:#f1b5d3;box-shadow:0 0 0 .25rem #cb93af80}.btn-check:checked+html .btn-pink-200,.btn-check:active+html .btn-pink-200,html .btn-pink-200:active,html .btn-pink-200.active,.show>html .btn-pink-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-200,html[data-netbox-color-mode=dark] .btn-pink-200:active,html[data-netbox-color-mode=dark] .btn-pink-200.active,.show>html[data-netbox-color-mode=dark] .btn-pink-200.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-200,html[data-netbox-color-mode=light] .btn-pink-200:active,html[data-netbox-color-mode=light] .btn-pink-200.active,.show>html[data-netbox-color-mode=light] .btn-pink-200.dropdown-toggle{color:#000;background-color:#f2bdd8;border-color:#f1b5d3}.btn-check:checked+html .btn-pink-200:focus,.btn-check:active+html .btn-pink-200:focus,html .btn-pink-200:active:focus,html .btn-pink-200.active:focus,.show>html .btn-pink-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-200:focus,html[data-netbox-color-mode=dark] .btn-pink-200:active:focus,html[data-netbox-color-mode=dark] .btn-pink-200.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-200.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-200:focus,html[data-netbox-color-mode=light] .btn-pink-200:active:focus,html[data-netbox-color-mode=light] .btn-pink-200.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-200.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #cb93af80}html .btn-pink-200:disabled,html .btn-pink-200.disabled,html[data-netbox-color-mode=dark] .btn-pink-200:disabled,html[data-netbox-color-mode=dark] .btn-pink-200.disabled,html[data-netbox-color-mode=light] .btn-pink-200:disabled,html[data-netbox-color-mode=light] .btn-pink-200.disabled{color:#000;background-color:#efadce;border-color:#efadce}}@media print{html .btn-pink-300,html[data-netbox-color-mode=dark] .btn-pink-300,html[data-netbox-color-mode=light] .btn-pink-300{color:#000;background-color:#e685b5;border-color:#e685b5}html .btn-pink-300:hover,html[data-netbox-color-mode=dark] .btn-pink-300:hover,html[data-netbox-color-mode=light] .btn-pink-300:hover{color:#000;background-color:#ea97c0;border-color:#e991bc}.btn-check:focus+html .btn-pink-300,html .btn-pink-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-300,html[data-netbox-color-mode=dark] .btn-pink-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-300,html[data-netbox-color-mode=light] .btn-pink-300:focus{color:#000;background-color:#ea97c0;border-color:#e991bc;box-shadow:0 0 0 .25rem #c4719a80}.btn-check:checked+html .btn-pink-300,.btn-check:active+html .btn-pink-300,html .btn-pink-300:active,html .btn-pink-300.active,.show>html .btn-pink-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-300,html[data-netbox-color-mode=dark] .btn-pink-300:active,html[data-netbox-color-mode=dark] .btn-pink-300.active,.show>html[data-netbox-color-mode=dark] .btn-pink-300.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-300,html[data-netbox-color-mode=light] .btn-pink-300:active,html[data-netbox-color-mode=light] .btn-pink-300.active,.show>html[data-netbox-color-mode=light] .btn-pink-300.dropdown-toggle{color:#000;background-color:#eb9dc4;border-color:#e991bc}.btn-check:checked+html .btn-pink-300:focus,.btn-check:active+html .btn-pink-300:focus,html .btn-pink-300:active:focus,html .btn-pink-300.active:focus,.show>html .btn-pink-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-300:focus,html[data-netbox-color-mode=dark] .btn-pink-300:active:focus,html[data-netbox-color-mode=dark] .btn-pink-300.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-300.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-300:focus,html[data-netbox-color-mode=light] .btn-pink-300:active:focus,html[data-netbox-color-mode=light] .btn-pink-300.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-300.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c4719a80}html .btn-pink-300:disabled,html .btn-pink-300.disabled,html[data-netbox-color-mode=dark] .btn-pink-300:disabled,html[data-netbox-color-mode=dark] .btn-pink-300.disabled,html[data-netbox-color-mode=light] .btn-pink-300:disabled,html[data-netbox-color-mode=light] .btn-pink-300.disabled{color:#000;background-color:#e685b5;border-color:#e685b5}}@media print{html .btn-pink-400,html[data-netbox-color-mode=dark] .btn-pink-400,html[data-netbox-color-mode=light] .btn-pink-400{color:#000;background-color:#de5c9d;border-color:#de5c9d}html .btn-pink-400:hover,html[data-netbox-color-mode=dark] .btn-pink-400:hover,html[data-netbox-color-mode=light] .btn-pink-400:hover{color:#000;background-color:#e374ac;border-color:#e16ca7}.btn-check:focus+html .btn-pink-400,html .btn-pink-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-400,html[data-netbox-color-mode=dark] .btn-pink-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-400,html[data-netbox-color-mode=light] .btn-pink-400:focus{color:#000;background-color:#e374ac;border-color:#e16ca7;box-shadow:0 0 0 .25rem #bd4e8580}.btn-check:checked+html .btn-pink-400,.btn-check:active+html .btn-pink-400,html .btn-pink-400:active,html .btn-pink-400.active,.show>html .btn-pink-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-400,html[data-netbox-color-mode=dark] .btn-pink-400:active,html[data-netbox-color-mode=dark] .btn-pink-400.active,.show>html[data-netbox-color-mode=dark] .btn-pink-400.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-400,html[data-netbox-color-mode=light] .btn-pink-400:active,html[data-netbox-color-mode=light] .btn-pink-400.active,.show>html[data-netbox-color-mode=light] .btn-pink-400.dropdown-toggle{color:#000;background-color:#e57db1;border-color:#e16ca7}.btn-check:checked+html .btn-pink-400:focus,.btn-check:active+html .btn-pink-400:focus,html .btn-pink-400:active:focus,html .btn-pink-400.active:focus,.show>html .btn-pink-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-400:focus,html[data-netbox-color-mode=dark] .btn-pink-400:active:focus,html[data-netbox-color-mode=dark] .btn-pink-400.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-400.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-400:focus,html[data-netbox-color-mode=light] .btn-pink-400:active:focus,html[data-netbox-color-mode=light] .btn-pink-400.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-400.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #bd4e8580}html .btn-pink-400:disabled,html .btn-pink-400.disabled,html[data-netbox-color-mode=dark] .btn-pink-400:disabled,html[data-netbox-color-mode=dark] .btn-pink-400.disabled,html[data-netbox-color-mode=light] .btn-pink-400:disabled,html[data-netbox-color-mode=light] .btn-pink-400.disabled{color:#000;background-color:#de5c9d;border-color:#de5c9d}}@media print{html .btn-pink-500,html[data-netbox-color-mode=dark] .btn-pink-500,html[data-netbox-color-mode=light] .btn-pink-500{color:#fff;background-color:#d63384;border-color:#d63384}html .btn-pink-500:hover,html[data-netbox-color-mode=dark] .btn-pink-500:hover,html[data-netbox-color-mode=light] .btn-pink-500:hover{color:#fff;background-color:#b62b70;border-color:#ab296a}.btn-check:focus+html .btn-pink-500,html .btn-pink-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-500,html[data-netbox-color-mode=dark] .btn-pink-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-500,html[data-netbox-color-mode=light] .btn-pink-500:focus{color:#fff;background-color:#b62b70;border-color:#ab296a;box-shadow:0 0 0 .25rem #dc529680}.btn-check:checked+html .btn-pink-500,.btn-check:active+html .btn-pink-500,html .btn-pink-500:active,html .btn-pink-500.active,.show>html .btn-pink-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-500,html[data-netbox-color-mode=dark] .btn-pink-500:active,html[data-netbox-color-mode=dark] .btn-pink-500.active,.show>html[data-netbox-color-mode=dark] .btn-pink-500.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-500,html[data-netbox-color-mode=light] .btn-pink-500:active,html[data-netbox-color-mode=light] .btn-pink-500.active,.show>html[data-netbox-color-mode=light] .btn-pink-500.dropdown-toggle{color:#fff;background-color:#ab296a;border-color:#a12663}.btn-check:checked+html .btn-pink-500:focus,.btn-check:active+html .btn-pink-500:focus,html .btn-pink-500:active:focus,html .btn-pink-500.active:focus,.show>html .btn-pink-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-500:focus,html[data-netbox-color-mode=dark] .btn-pink-500:active:focus,html[data-netbox-color-mode=dark] .btn-pink-500.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-500.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-500:focus,html[data-netbox-color-mode=light] .btn-pink-500:active:focus,html[data-netbox-color-mode=light] .btn-pink-500.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-500.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #dc529680}html .btn-pink-500:disabled,html .btn-pink-500.disabled,html[data-netbox-color-mode=dark] .btn-pink-500:disabled,html[data-netbox-color-mode=dark] .btn-pink-500.disabled,html[data-netbox-color-mode=light] .btn-pink-500:disabled,html[data-netbox-color-mode=light] .btn-pink-500.disabled{color:#fff;background-color:#d63384;border-color:#d63384}}@media print{html .btn-pink-600,html[data-netbox-color-mode=dark] .btn-pink-600,html[data-netbox-color-mode=light] .btn-pink-600{color:#fff;background-color:#ab296a;border-color:#ab296a}html .btn-pink-600:hover,html[data-netbox-color-mode=dark] .btn-pink-600:hover,html[data-netbox-color-mode=light] .btn-pink-600:hover{color:#fff;background-color:#91235a;border-color:#892155}.btn-check:focus+html .btn-pink-600,html .btn-pink-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-600,html[data-netbox-color-mode=dark] .btn-pink-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-600,html[data-netbox-color-mode=light] .btn-pink-600:focus{color:#fff;background-color:#91235a;border-color:#892155;box-shadow:0 0 0 .25rem #b8498080}.btn-check:checked+html .btn-pink-600,.btn-check:active+html .btn-pink-600,html .btn-pink-600:active,html .btn-pink-600.active,.show>html .btn-pink-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-600,html[data-netbox-color-mode=dark] .btn-pink-600:active,html[data-netbox-color-mode=dark] .btn-pink-600.active,.show>html[data-netbox-color-mode=dark] .btn-pink-600.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-600,html[data-netbox-color-mode=light] .btn-pink-600:active,html[data-netbox-color-mode=light] .btn-pink-600.active,.show>html[data-netbox-color-mode=light] .btn-pink-600.dropdown-toggle{color:#fff;background-color:#892155;border-color:#801f50}.btn-check:checked+html .btn-pink-600:focus,.btn-check:active+html .btn-pink-600:focus,html .btn-pink-600:active:focus,html .btn-pink-600.active:focus,.show>html .btn-pink-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-600:focus,html[data-netbox-color-mode=dark] .btn-pink-600:active:focus,html[data-netbox-color-mode=dark] .btn-pink-600.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-600.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-600:focus,html[data-netbox-color-mode=light] .btn-pink-600:active:focus,html[data-netbox-color-mode=light] .btn-pink-600.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-600.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b8498080}html .btn-pink-600:disabled,html .btn-pink-600.disabled,html[data-netbox-color-mode=dark] .btn-pink-600:disabled,html[data-netbox-color-mode=dark] .btn-pink-600.disabled,html[data-netbox-color-mode=light] .btn-pink-600:disabled,html[data-netbox-color-mode=light] .btn-pink-600.disabled{color:#fff;background-color:#ab296a;border-color:#ab296a}}@media print{html .btn-pink-700,html[data-netbox-color-mode=dark] .btn-pink-700,html[data-netbox-color-mode=light] .btn-pink-700{color:#fff;background-color:#801f4f;border-color:#801f4f}html .btn-pink-700:hover,html[data-netbox-color-mode=dark] .btn-pink-700:hover,html[data-netbox-color-mode=light] .btn-pink-700:hover{color:#fff;background-color:#6d1a43;border-color:#66193f}.btn-check:focus+html .btn-pink-700,html .btn-pink-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-700,html[data-netbox-color-mode=dark] .btn-pink-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-700,html[data-netbox-color-mode=light] .btn-pink-700:focus{color:#fff;background-color:#6d1a43;border-color:#66193f;box-shadow:0 0 0 .25rem #93416980}.btn-check:checked+html .btn-pink-700,.btn-check:active+html .btn-pink-700,html .btn-pink-700:active,html .btn-pink-700.active,.show>html .btn-pink-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-700,html[data-netbox-color-mode=dark] .btn-pink-700:active,html[data-netbox-color-mode=dark] .btn-pink-700.active,.show>html[data-netbox-color-mode=dark] .btn-pink-700.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-700,html[data-netbox-color-mode=light] .btn-pink-700:active,html[data-netbox-color-mode=light] .btn-pink-700.active,.show>html[data-netbox-color-mode=light] .btn-pink-700.dropdown-toggle{color:#fff;background-color:#66193f;border-color:#60173b}.btn-check:checked+html .btn-pink-700:focus,.btn-check:active+html .btn-pink-700:focus,html .btn-pink-700:active:focus,html .btn-pink-700.active:focus,.show>html .btn-pink-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-700:focus,html[data-netbox-color-mode=dark] .btn-pink-700:active:focus,html[data-netbox-color-mode=dark] .btn-pink-700.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-700.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-700:focus,html[data-netbox-color-mode=light] .btn-pink-700:active:focus,html[data-netbox-color-mode=light] .btn-pink-700.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-700.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #93416980}html .btn-pink-700:disabled,html .btn-pink-700.disabled,html[data-netbox-color-mode=dark] .btn-pink-700:disabled,html[data-netbox-color-mode=dark] .btn-pink-700.disabled,html[data-netbox-color-mode=light] .btn-pink-700:disabled,html[data-netbox-color-mode=light] .btn-pink-700.disabled{color:#fff;background-color:#801f4f;border-color:#801f4f}}@media print{html .btn-pink-800,html[data-netbox-color-mode=dark] .btn-pink-800,html[data-netbox-color-mode=light] .btn-pink-800{color:#fff;background-color:#561435;border-color:#561435}html .btn-pink-800:hover,html[data-netbox-color-mode=dark] .btn-pink-800:hover,html[data-netbox-color-mode=light] .btn-pink-800:hover{color:#fff;background-color:#49112d;border-color:#45102a}.btn-check:focus+html .btn-pink-800,html .btn-pink-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-800,html[data-netbox-color-mode=dark] .btn-pink-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-800,html[data-netbox-color-mode=light] .btn-pink-800:focus{color:#fff;background-color:#49112d;border-color:#45102a;box-shadow:0 0 0 .25rem #6f375380}.btn-check:checked+html .btn-pink-800,.btn-check:active+html .btn-pink-800,html .btn-pink-800:active,html .btn-pink-800.active,.show>html .btn-pink-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-800,html[data-netbox-color-mode=dark] .btn-pink-800:active,html[data-netbox-color-mode=dark] .btn-pink-800.active,.show>html[data-netbox-color-mode=dark] .btn-pink-800.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-800,html[data-netbox-color-mode=light] .btn-pink-800:active,html[data-netbox-color-mode=light] .btn-pink-800.active,.show>html[data-netbox-color-mode=light] .btn-pink-800.dropdown-toggle{color:#fff;background-color:#45102a;border-color:#410f28}.btn-check:checked+html .btn-pink-800:focus,.btn-check:active+html .btn-pink-800:focus,html .btn-pink-800:active:focus,html .btn-pink-800.active:focus,.show>html .btn-pink-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-800:focus,html[data-netbox-color-mode=dark] .btn-pink-800:active:focus,html[data-netbox-color-mode=dark] .btn-pink-800.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-800.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-800:focus,html[data-netbox-color-mode=light] .btn-pink-800:active:focus,html[data-netbox-color-mode=light] .btn-pink-800.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-800.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #6f375380}html .btn-pink-800:disabled,html .btn-pink-800.disabled,html[data-netbox-color-mode=dark] .btn-pink-800:disabled,html[data-netbox-color-mode=dark] .btn-pink-800.disabled,html[data-netbox-color-mode=light] .btn-pink-800:disabled,html[data-netbox-color-mode=light] .btn-pink-800.disabled{color:#fff;background-color:#561435;border-color:#561435}}@media print{html .btn-pink-900,html[data-netbox-color-mode=dark] .btn-pink-900,html[data-netbox-color-mode=light] .btn-pink-900{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}html .btn-pink-900:hover,html[data-netbox-color-mode=dark] .btn-pink-900:hover,html[data-netbox-color-mode=light] .btn-pink-900:hover{color:#fff;background-color:#250916;border-color:#220815}.btn-check:focus+html .btn-pink-900,html .btn-pink-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink-900,html[data-netbox-color-mode=dark] .btn-pink-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink-900,html[data-netbox-color-mode=light] .btn-pink-900:focus{color:#fff;background-color:#250916;border-color:#220815;box-shadow:0 0 0 .25rem #4b2f3c80}.btn-check:checked+html .btn-pink-900,.btn-check:active+html .btn-pink-900,html .btn-pink-900:active,html .btn-pink-900.active,.show>html .btn-pink-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-900,html[data-netbox-color-mode=dark] .btn-pink-900:active,html[data-netbox-color-mode=dark] .btn-pink-900.active,.show>html[data-netbox-color-mode=dark] .btn-pink-900.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-900,html[data-netbox-color-mode=light] .btn-pink-900:active,html[data-netbox-color-mode=light] .btn-pink-900.active,.show>html[data-netbox-color-mode=light] .btn-pink-900.dropdown-toggle{color:#fff;background-color:#220815;border-color:#200814}.btn-check:checked+html .btn-pink-900:focus,.btn-check:active+html .btn-pink-900:focus,html .btn-pink-900:active:focus,html .btn-pink-900.active:focus,.show>html .btn-pink-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink-900:focus,html[data-netbox-color-mode=dark] .btn-pink-900:active:focus,html[data-netbox-color-mode=dark] .btn-pink-900.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink-900.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink-900:focus,html[data-netbox-color-mode=light] .btn-pink-900:active:focus,html[data-netbox-color-mode=light] .btn-pink-900.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink-900.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #4b2f3c80}html .btn-pink-900:disabled,html .btn-pink-900.disabled,html[data-netbox-color-mode=dark] .btn-pink-900:disabled,html[data-netbox-color-mode=dark] .btn-pink-900.disabled,html[data-netbox-color-mode=light] .btn-pink-900:disabled,html[data-netbox-color-mode=light] .btn-pink-900.disabled{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}}@media print{html .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=light] .btn-outline-primary{color:#337ab7;border-color:#337ab7}html .btn-outline-primary:hover,html[data-netbox-color-mode=dark] .btn-outline-primary:hover,html[data-netbox-color-mode=light] .btn-outline-primary:hover{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-check:focus+html .btn-outline-primary,html .btn-outline-primary:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-primary,html[data-netbox-color-mode=light] .btn-outline-primary:focus{box-shadow:0 0 0 .25rem #337ab780}.btn-check:checked+html .btn-outline-primary,.btn-check:active+html .btn-outline-primary,html .btn-outline-primary:active,html .btn-outline-primary.active,html .btn-outline-primary.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-primary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary:active,html[data-netbox-color-mode=dark] .btn-outline-primary.active,html[data-netbox-color-mode=dark] .btn-outline-primary.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-primary,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-primary,html[data-netbox-color-mode=light] .btn-outline-primary:active,html[data-netbox-color-mode=light] .btn-outline-primary.active,html[data-netbox-color-mode=light] .btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-check:checked+html .btn-outline-primary:focus,.btn-check:active+html .btn-outline-primary:focus,html .btn-outline-primary:active:focus,html .btn-outline-primary.active:focus,html .btn-outline-primary.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-primary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-primary:focus,html[data-netbox-color-mode=dark] .btn-outline-primary:active:focus,html[data-netbox-color-mode=dark] .btn-outline-primary.active:focus,html[data-netbox-color-mode=dark] .btn-outline-primary.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-primary:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-primary:focus,html[data-netbox-color-mode=light] .btn-outline-primary:active:focus,html[data-netbox-color-mode=light] .btn-outline-primary.active:focus,html[data-netbox-color-mode=light] .btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #337ab780}html .btn-outline-primary:disabled,html .btn-outline-primary.disabled,html[data-netbox-color-mode=dark] .btn-outline-primary:disabled,html[data-netbox-color-mode=dark] .btn-outline-primary.disabled,html[data-netbox-color-mode=light] .btn-outline-primary:disabled,html[data-netbox-color-mode=light] .btn-outline-primary.disabled{color:#337ab7;background-color:transparent}}@media print{html .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=light] .btn-outline-secondary{color:#6c757d;border-color:#6c757d}html .btn-outline-secondary:hover,html[data-netbox-color-mode=dark] .btn-outline-secondary:hover,html[data-netbox-color-mode=light] .btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+html .btn-outline-secondary,html .btn-outline-secondary:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-secondary,html[data-netbox-color-mode=light] .btn-outline-secondary:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-check:checked+html .btn-outline-secondary,.btn-check:active+html .btn-outline-secondary,html .btn-outline-secondary:active,html .btn-outline-secondary.active,html .btn-outline-secondary.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-secondary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary:active,html[data-netbox-color-mode=dark] .btn-outline-secondary.active,html[data-netbox-color-mode=dark] .btn-outline-secondary.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-secondary,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-secondary,html[data-netbox-color-mode=light] .btn-outline-secondary:active,html[data-netbox-color-mode=light] .btn-outline-secondary.active,html[data-netbox-color-mode=light] .btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:checked+html .btn-outline-secondary:focus,.btn-check:active+html .btn-outline-secondary:focus,html .btn-outline-secondary:active:focus,html .btn-outline-secondary.active:focus,html .btn-outline-secondary.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary:active:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary.active:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-secondary:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-secondary:focus,html[data-netbox-color-mode=light] .btn-outline-secondary:active:focus,html[data-netbox-color-mode=light] .btn-outline-secondary.active:focus,html[data-netbox-color-mode=light] .btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6c757d80}html .btn-outline-secondary:disabled,html .btn-outline-secondary.disabled,html[data-netbox-color-mode=dark] .btn-outline-secondary:disabled,html[data-netbox-color-mode=dark] .btn-outline-secondary.disabled,html[data-netbox-color-mode=light] .btn-outline-secondary:disabled,html[data-netbox-color-mode=light] .btn-outline-secondary.disabled{color:#6c757d;background-color:transparent}}@media print{html .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=light] .btn-outline-success{color:#198754;border-color:#198754}html .btn-outline-success:hover,html[data-netbox-color-mode=dark] .btn-outline-success:hover,html[data-netbox-color-mode=light] .btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+html .btn-outline-success,html .btn-outline-success:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-success,html[data-netbox-color-mode=light] .btn-outline-success:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+html .btn-outline-success,.btn-check:active+html .btn-outline-success,html .btn-outline-success:active,html .btn-outline-success.active,html .btn-outline-success.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-success,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success:active,html[data-netbox-color-mode=dark] .btn-outline-success.active,html[data-netbox-color-mode=dark] .btn-outline-success.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-success,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-success,html[data-netbox-color-mode=light] .btn-outline-success:active,html[data-netbox-color-mode=light] .btn-outline-success.active,html[data-netbox-color-mode=light] .btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+html .btn-outline-success:focus,.btn-check:active+html .btn-outline-success:focus,html .btn-outline-success:active:focus,html .btn-outline-success.active:focus,html .btn-outline-success.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-success:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-success:focus,html[data-netbox-color-mode=dark] .btn-outline-success:active:focus,html[data-netbox-color-mode=dark] .btn-outline-success.active:focus,html[data-netbox-color-mode=dark] .btn-outline-success.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-success:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-success:focus,html[data-netbox-color-mode=light] .btn-outline-success:active:focus,html[data-netbox-color-mode=light] .btn-outline-success.active:focus,html[data-netbox-color-mode=light] .btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}html .btn-outline-success:disabled,html .btn-outline-success.disabled,html[data-netbox-color-mode=dark] .btn-outline-success:disabled,html[data-netbox-color-mode=dark] .btn-outline-success.disabled,html[data-netbox-color-mode=light] .btn-outline-success:disabled,html[data-netbox-color-mode=light] .btn-outline-success.disabled{color:#198754;background-color:transparent}}@media print{html .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=light] .btn-outline-info{color:#54d6f0;border-color:#54d6f0}html .btn-outline-info:hover,html[data-netbox-color-mode=dark] .btn-outline-info:hover,html[data-netbox-color-mode=light] .btn-outline-info:hover{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-check:focus+html .btn-outline-info,html .btn-outline-info:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-info,html[data-netbox-color-mode=light] .btn-outline-info:focus{box-shadow:0 0 0 .25rem #54d6f080}.btn-check:checked+html .btn-outline-info,.btn-check:active+html .btn-outline-info,html .btn-outline-info:active,html .btn-outline-info.active,html .btn-outline-info.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-info,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info:active,html[data-netbox-color-mode=dark] .btn-outline-info.active,html[data-netbox-color-mode=dark] .btn-outline-info.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-info,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-info,html[data-netbox-color-mode=light] .btn-outline-info:active,html[data-netbox-color-mode=light] .btn-outline-info.active,html[data-netbox-color-mode=light] .btn-outline-info.dropdown-toggle.show{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-check:checked+html .btn-outline-info:focus,.btn-check:active+html .btn-outline-info:focus,html .btn-outline-info:active:focus,html .btn-outline-info.active:focus,html .btn-outline-info.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-info:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-info:focus,html[data-netbox-color-mode=dark] .btn-outline-info:active:focus,html[data-netbox-color-mode=dark] .btn-outline-info.active:focus,html[data-netbox-color-mode=dark] .btn-outline-info.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-info:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-info:focus,html[data-netbox-color-mode=light] .btn-outline-info:active:focus,html[data-netbox-color-mode=light] .btn-outline-info.active:focus,html[data-netbox-color-mode=light] .btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #54d6f080}html .btn-outline-info:disabled,html .btn-outline-info.disabled,html[data-netbox-color-mode=dark] .btn-outline-info:disabled,html[data-netbox-color-mode=dark] .btn-outline-info.disabled,html[data-netbox-color-mode=light] .btn-outline-info:disabled,html[data-netbox-color-mode=light] .btn-outline-info.disabled{color:#54d6f0;background-color:transparent}}@media print{html .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=light] .btn-outline-warning{color:#ffc107;border-color:#ffc107}html .btn-outline-warning:hover,html[data-netbox-color-mode=dark] .btn-outline-warning:hover,html[data-netbox-color-mode=light] .btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+html .btn-outline-warning,html .btn-outline-warning:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-warning,html[data-netbox-color-mode=light] .btn-outline-warning:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+html .btn-outline-warning,.btn-check:active+html .btn-outline-warning,html .btn-outline-warning:active,html .btn-outline-warning.active,html .btn-outline-warning.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-warning,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning:active,html[data-netbox-color-mode=dark] .btn-outline-warning.active,html[data-netbox-color-mode=dark] .btn-outline-warning.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-warning,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-warning,html[data-netbox-color-mode=light] .btn-outline-warning:active,html[data-netbox-color-mode=light] .btn-outline-warning.active,html[data-netbox-color-mode=light] .btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+html .btn-outline-warning:focus,.btn-check:active+html .btn-outline-warning:focus,html .btn-outline-warning:active:focus,html .btn-outline-warning.active:focus,html .btn-outline-warning.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-warning:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-warning:focus,html[data-netbox-color-mode=dark] .btn-outline-warning:active:focus,html[data-netbox-color-mode=dark] .btn-outline-warning.active:focus,html[data-netbox-color-mode=dark] .btn-outline-warning.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-warning:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-warning:focus,html[data-netbox-color-mode=light] .btn-outline-warning:active:focus,html[data-netbox-color-mode=light] .btn-outline-warning.active:focus,html[data-netbox-color-mode=light] .btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}html .btn-outline-warning:disabled,html .btn-outline-warning.disabled,html[data-netbox-color-mode=dark] .btn-outline-warning:disabled,html[data-netbox-color-mode=dark] .btn-outline-warning.disabled,html[data-netbox-color-mode=light] .btn-outline-warning:disabled,html[data-netbox-color-mode=light] .btn-outline-warning.disabled{color:#ffc107;background-color:transparent}}@media print{html .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=light] .btn-outline-danger{color:#dc3545;border-color:#dc3545}html .btn-outline-danger:hover,html[data-netbox-color-mode=dark] .btn-outline-danger:hover,html[data-netbox-color-mode=light] .btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+html .btn-outline-danger,html .btn-outline-danger:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-danger,html[data-netbox-color-mode=light] .btn-outline-danger:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+html .btn-outline-danger,.btn-check:active+html .btn-outline-danger,html .btn-outline-danger:active,html .btn-outline-danger.active,html .btn-outline-danger.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-danger,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger:active,html[data-netbox-color-mode=dark] .btn-outline-danger.active,html[data-netbox-color-mode=dark] .btn-outline-danger.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-danger,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-danger,html[data-netbox-color-mode=light] .btn-outline-danger:active,html[data-netbox-color-mode=light] .btn-outline-danger.active,html[data-netbox-color-mode=light] .btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+html .btn-outline-danger:focus,.btn-check:active+html .btn-outline-danger:focus,html .btn-outline-danger:active:focus,html .btn-outline-danger.active:focus,html .btn-outline-danger.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-danger:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-danger:focus,html[data-netbox-color-mode=dark] .btn-outline-danger:active:focus,html[data-netbox-color-mode=dark] .btn-outline-danger.active:focus,html[data-netbox-color-mode=dark] .btn-outline-danger.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-danger:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-danger:focus,html[data-netbox-color-mode=light] .btn-outline-danger:active:focus,html[data-netbox-color-mode=light] .btn-outline-danger.active:focus,html[data-netbox-color-mode=light] .btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}html .btn-outline-danger:disabled,html .btn-outline-danger.disabled,html[data-netbox-color-mode=dark] .btn-outline-danger:disabled,html[data-netbox-color-mode=dark] .btn-outline-danger.disabled,html[data-netbox-color-mode=light] .btn-outline-danger:disabled,html[data-netbox-color-mode=light] .btn-outline-danger.disabled{color:#dc3545;background-color:transparent}}@media print{html .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=light] .btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}html .btn-outline-light:hover,html[data-netbox-color-mode=dark] .btn-outline-light:hover,html[data-netbox-color-mode=light] .btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+html .btn-outline-light,html .btn-outline-light:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-light,html[data-netbox-color-mode=light] .btn-outline-light:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-check:checked+html .btn-outline-light,.btn-check:active+html .btn-outline-light,html .btn-outline-light:active,html .btn-outline-light.active,html .btn-outline-light.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-light,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light:active,html[data-netbox-color-mode=dark] .btn-outline-light.active,html[data-netbox-color-mode=dark] .btn-outline-light.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-light,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-light,html[data-netbox-color-mode=light] .btn-outline-light:active,html[data-netbox-color-mode=light] .btn-outline-light.active,html[data-netbox-color-mode=light] .btn-outline-light.dropdown-toggle.show{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:checked+html .btn-outline-light:focus,.btn-check:active+html .btn-outline-light:focus,html .btn-outline-light:active:focus,html .btn-outline-light.active:focus,html .btn-outline-light.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-light:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-light:focus,html[data-netbox-color-mode=dark] .btn-outline-light:active:focus,html[data-netbox-color-mode=dark] .btn-outline-light.active:focus,html[data-netbox-color-mode=dark] .btn-outline-light.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-light:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-light:focus,html[data-netbox-color-mode=light] .btn-outline-light:active:focus,html[data-netbox-color-mode=light] .btn-outline-light.active:focus,html[data-netbox-color-mode=light] .btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8f9fa80}html .btn-outline-light:disabled,html .btn-outline-light.disabled,html[data-netbox-color-mode=dark] .btn-outline-light:disabled,html[data-netbox-color-mode=dark] .btn-outline-light.disabled,html[data-netbox-color-mode=light] .btn-outline-light:disabled,html[data-netbox-color-mode=light] .btn-outline-light.disabled{color:#f8f9fa;background-color:transparent}}@media print{html .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=light] .btn-outline-dark{color:#212529;border-color:#212529}html .btn-outline-dark:hover,html[data-netbox-color-mode=dark] .btn-outline-dark:hover,html[data-netbox-color-mode=light] .btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+html .btn-outline-dark,html .btn-outline-dark:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-dark,html[data-netbox-color-mode=light] .btn-outline-dark:focus{box-shadow:0 0 0 .25rem #21252980}.btn-check:checked+html .btn-outline-dark,.btn-check:active+html .btn-outline-dark,html .btn-outline-dark:active,html .btn-outline-dark.active,html .btn-outline-dark.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-dark,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark:active,html[data-netbox-color-mode=dark] .btn-outline-dark.active,html[data-netbox-color-mode=dark] .btn-outline-dark.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-dark,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-dark,html[data-netbox-color-mode=light] .btn-outline-dark:active,html[data-netbox-color-mode=light] .btn-outline-dark.active,html[data-netbox-color-mode=light] .btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#212529;border-color:#212529}.btn-check:checked+html .btn-outline-dark:focus,.btn-check:active+html .btn-outline-dark:focus,html .btn-outline-dark:active:focus,html .btn-outline-dark.active:focus,html .btn-outline-dark.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-dark:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-dark:focus,html[data-netbox-color-mode=dark] .btn-outline-dark:active:focus,html[data-netbox-color-mode=dark] .btn-outline-dark.active:focus,html[data-netbox-color-mode=dark] .btn-outline-dark.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-dark:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-dark:focus,html[data-netbox-color-mode=light] .btn-outline-dark:active:focus,html[data-netbox-color-mode=light] .btn-outline-dark.active:focus,html[data-netbox-color-mode=light] .btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #21252980}html .btn-outline-dark:disabled,html .btn-outline-dark.disabled,html[data-netbox-color-mode=dark] .btn-outline-dark:disabled,html[data-netbox-color-mode=dark] .btn-outline-dark.disabled,html[data-netbox-color-mode=light] .btn-outline-dark:disabled,html[data-netbox-color-mode=light] .btn-outline-dark.disabled{color:#212529;background-color:transparent}}@media print{html .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=light] .btn-outline-red{color:#dc3545;border-color:#dc3545}html .btn-outline-red:hover,html[data-netbox-color-mode=dark] .btn-outline-red:hover,html[data-netbox-color-mode=light] .btn-outline-red:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+html .btn-outline-red,html .btn-outline-red:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red,html[data-netbox-color-mode=light] .btn-outline-red:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+html .btn-outline-red,.btn-check:active+html .btn-outline-red,html .btn-outline-red:active,html .btn-outline-red.active,html .btn-outline-red.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red:active,html[data-netbox-color-mode=dark] .btn-outline-red.active,html[data-netbox-color-mode=dark] .btn-outline-red.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red,html[data-netbox-color-mode=light] .btn-outline-red:active,html[data-netbox-color-mode=light] .btn-outline-red.active,html[data-netbox-color-mode=light] .btn-outline-red.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+html .btn-outline-red:focus,.btn-check:active+html .btn-outline-red:focus,html .btn-outline-red:active:focus,html .btn-outline-red.active:focus,html .btn-outline-red.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red:focus,html[data-netbox-color-mode=dark] .btn-outline-red:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red:focus,html[data-netbox-color-mode=light] .btn-outline-red:active:focus,html[data-netbox-color-mode=light] .btn-outline-red.active:focus,html[data-netbox-color-mode=light] .btn-outline-red.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}html .btn-outline-red:disabled,html .btn-outline-red.disabled,html[data-netbox-color-mode=dark] .btn-outline-red:disabled,html[data-netbox-color-mode=dark] .btn-outline-red.disabled,html[data-netbox-color-mode=light] .btn-outline-red:disabled,html[data-netbox-color-mode=light] .btn-outline-red.disabled{color:#dc3545;background-color:transparent}}@media print{html .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=light] .btn-outline-yellow{color:#ffc107;border-color:#ffc107}html .btn-outline-yellow:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow:hover,html[data-netbox-color-mode=light] .btn-outline-yellow:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+html .btn-outline-yellow,html .btn-outline-yellow:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow,html[data-netbox-color-mode=light] .btn-outline-yellow:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+html .btn-outline-yellow,.btn-check:active+html .btn-outline-yellow,html .btn-outline-yellow:active,html .btn-outline-yellow.active,html .btn-outline-yellow.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow:active,html[data-netbox-color-mode=dark] .btn-outline-yellow.active,html[data-netbox-color-mode=dark] .btn-outline-yellow.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow,html[data-netbox-color-mode=light] .btn-outline-yellow:active,html[data-netbox-color-mode=light] .btn-outline-yellow.active,html[data-netbox-color-mode=light] .btn-outline-yellow.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+html .btn-outline-yellow:focus,.btn-check:active+html .btn-outline-yellow:focus,html .btn-outline-yellow:active:focus,html .btn-outline-yellow.active:focus,html .btn-outline-yellow.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow:focus,html[data-netbox-color-mode=light] .btn-outline-yellow:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}html .btn-outline-yellow:disabled,html .btn-outline-yellow.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow.disabled{color:#ffc107;background-color:transparent}}@media print{html .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=light] .btn-outline-green{color:#198754;border-color:#198754}html .btn-outline-green:hover,html[data-netbox-color-mode=dark] .btn-outline-green:hover,html[data-netbox-color-mode=light] .btn-outline-green:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+html .btn-outline-green,html .btn-outline-green:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green,html[data-netbox-color-mode=light] .btn-outline-green:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+html .btn-outline-green,.btn-check:active+html .btn-outline-green,html .btn-outline-green:active,html .btn-outline-green.active,html .btn-outline-green.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green:active,html[data-netbox-color-mode=dark] .btn-outline-green.active,html[data-netbox-color-mode=dark] .btn-outline-green.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green,html[data-netbox-color-mode=light] .btn-outline-green:active,html[data-netbox-color-mode=light] .btn-outline-green.active,html[data-netbox-color-mode=light] .btn-outline-green.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+html .btn-outline-green:focus,.btn-check:active+html .btn-outline-green:focus,html .btn-outline-green:active:focus,html .btn-outline-green.active:focus,html .btn-outline-green.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green:focus,html[data-netbox-color-mode=dark] .btn-outline-green:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green:focus,html[data-netbox-color-mode=light] .btn-outline-green:active:focus,html[data-netbox-color-mode=light] .btn-outline-green.active:focus,html[data-netbox-color-mode=light] .btn-outline-green.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}html .btn-outline-green:disabled,html .btn-outline-green.disabled,html[data-netbox-color-mode=dark] .btn-outline-green:disabled,html[data-netbox-color-mode=dark] .btn-outline-green.disabled,html[data-netbox-color-mode=light] .btn-outline-green:disabled,html[data-netbox-color-mode=light] .btn-outline-green.disabled{color:#198754;background-color:transparent}}@media print{html .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=light] .btn-outline-blue{color:#0d6efd;border-color:#0d6efd}html .btn-outline-blue:hover,html[data-netbox-color-mode=dark] .btn-outline-blue:hover,html[data-netbox-color-mode=light] .btn-outline-blue:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+html .btn-outline-blue,html .btn-outline-blue:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue,html[data-netbox-color-mode=light] .btn-outline-blue:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-check:checked+html .btn-outline-blue,.btn-check:active+html .btn-outline-blue,html .btn-outline-blue:active,html .btn-outline-blue.active,html .btn-outline-blue.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue:active,html[data-netbox-color-mode=dark] .btn-outline-blue.active,html[data-netbox-color-mode=dark] .btn-outline-blue.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue,html[data-netbox-color-mode=light] .btn-outline-blue:active,html[data-netbox-color-mode=light] .btn-outline-blue.active,html[data-netbox-color-mode=light] .btn-outline-blue.dropdown-toggle.show{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:checked+html .btn-outline-blue:focus,.btn-check:active+html .btn-outline-blue:focus,html .btn-outline-blue:active:focus,html .btn-outline-blue.active:focus,html .btn-outline-blue.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue:focus,html[data-netbox-color-mode=dark] .btn-outline-blue:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue:focus,html[data-netbox-color-mode=light] .btn-outline-blue:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0d6efd80}html .btn-outline-blue:disabled,html .btn-outline-blue.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue.disabled,html[data-netbox-color-mode=light] .btn-outline-blue:disabled,html[data-netbox-color-mode=light] .btn-outline-blue.disabled{color:#0d6efd;background-color:transparent}}@media print{html .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=light] .btn-outline-cyan{color:#0dcaf0;border-color:#0dcaf0}html .btn-outline-cyan:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan:hover,html[data-netbox-color-mode=light] .btn-outline-cyan:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+html .btn-outline-cyan,html .btn-outline-cyan:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan,html[data-netbox-color-mode=light] .btn-outline-cyan:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-check:checked+html .btn-outline-cyan,.btn-check:active+html .btn-outline-cyan,html .btn-outline-cyan:active,html .btn-outline-cyan.active,html .btn-outline-cyan.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan:active,html[data-netbox-color-mode=dark] .btn-outline-cyan.active,html[data-netbox-color-mode=dark] .btn-outline-cyan.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan,html[data-netbox-color-mode=light] .btn-outline-cyan:active,html[data-netbox-color-mode=light] .btn-outline-cyan.active,html[data-netbox-color-mode=light] .btn-outline-cyan.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+html .btn-outline-cyan:focus,.btn-check:active+html .btn-outline-cyan:focus,html .btn-outline-cyan:active:focus,html .btn-outline-cyan.active:focus,html .btn-outline-cyan.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan:focus,html[data-netbox-color-mode=light] .btn-outline-cyan:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0dcaf080}html .btn-outline-cyan:disabled,html .btn-outline-cyan.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan.disabled{color:#0dcaf0;background-color:transparent}}@media print{html .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=light] .btn-outline-indigo{color:#6610f2;border-color:#6610f2}html .btn-outline-indigo:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo:hover,html[data-netbox-color-mode=light] .btn-outline-indigo:hover{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:focus+html .btn-outline-indigo,html .btn-outline-indigo:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo,html[data-netbox-color-mode=light] .btn-outline-indigo:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-check:checked+html .btn-outline-indigo,.btn-check:active+html .btn-outline-indigo,html .btn-outline-indigo:active,html .btn-outline-indigo.active,html .btn-outline-indigo.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo:active,html[data-netbox-color-mode=dark] .btn-outline-indigo.active,html[data-netbox-color-mode=dark] .btn-outline-indigo.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo,html[data-netbox-color-mode=light] .btn-outline-indigo:active,html[data-netbox-color-mode=light] .btn-outline-indigo.active,html[data-netbox-color-mode=light] .btn-outline-indigo.dropdown-toggle.show{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:checked+html .btn-outline-indigo:focus,.btn-check:active+html .btn-outline-indigo:focus,html .btn-outline-indigo:active:focus,html .btn-outline-indigo.active:focus,html .btn-outline-indigo.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo:focus,html[data-netbox-color-mode=light] .btn-outline-indigo:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6610f280}html .btn-outline-indigo:disabled,html .btn-outline-indigo.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo.disabled{color:#6610f2;background-color:transparent}}@media print{html .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=light] .btn-outline-purple{color:#6f42c1;border-color:#6f42c1}html .btn-outline-purple:hover,html[data-netbox-color-mode=dark] .btn-outline-purple:hover,html[data-netbox-color-mode=light] .btn-outline-purple:hover{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:focus+html .btn-outline-purple,html .btn-outline-purple:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple,html[data-netbox-color-mode=light] .btn-outline-purple:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-check:checked+html .btn-outline-purple,.btn-check:active+html .btn-outline-purple,html .btn-outline-purple:active,html .btn-outline-purple.active,html .btn-outline-purple.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple:active,html[data-netbox-color-mode=dark] .btn-outline-purple.active,html[data-netbox-color-mode=dark] .btn-outline-purple.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple,html[data-netbox-color-mode=light] .btn-outline-purple:active,html[data-netbox-color-mode=light] .btn-outline-purple.active,html[data-netbox-color-mode=light] .btn-outline-purple.dropdown-toggle.show{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:checked+html .btn-outline-purple:focus,.btn-check:active+html .btn-outline-purple:focus,html .btn-outline-purple:active:focus,html .btn-outline-purple.active:focus,html .btn-outline-purple.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple:focus,html[data-netbox-color-mode=dark] .btn-outline-purple:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple:focus,html[data-netbox-color-mode=light] .btn-outline-purple:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6f42c180}html .btn-outline-purple:disabled,html .btn-outline-purple.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple.disabled,html[data-netbox-color-mode=light] .btn-outline-purple:disabled,html[data-netbox-color-mode=light] .btn-outline-purple.disabled{color:#6f42c1;background-color:transparent}}@media print{html .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=light] .btn-outline-pink{color:#d63384;border-color:#d63384}html .btn-outline-pink:hover,html[data-netbox-color-mode=dark] .btn-outline-pink:hover,html[data-netbox-color-mode=light] .btn-outline-pink:hover{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:focus+html .btn-outline-pink,html .btn-outline-pink:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink,html[data-netbox-color-mode=light] .btn-outline-pink:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-check:checked+html .btn-outline-pink,.btn-check:active+html .btn-outline-pink,html .btn-outline-pink:active,html .btn-outline-pink.active,html .btn-outline-pink.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink:active,html[data-netbox-color-mode=dark] .btn-outline-pink.active,html[data-netbox-color-mode=dark] .btn-outline-pink.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink,html[data-netbox-color-mode=light] .btn-outline-pink:active,html[data-netbox-color-mode=light] .btn-outline-pink.active,html[data-netbox-color-mode=light] .btn-outline-pink.dropdown-toggle.show{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:checked+html .btn-outline-pink:focus,.btn-check:active+html .btn-outline-pink:focus,html .btn-outline-pink:active:focus,html .btn-outline-pink.active:focus,html .btn-outline-pink.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink:focus,html[data-netbox-color-mode=dark] .btn-outline-pink:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink:focus,html[data-netbox-color-mode=light] .btn-outline-pink:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d6338480}html .btn-outline-pink:disabled,html .btn-outline-pink.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink.disabled,html[data-netbox-color-mode=light] .btn-outline-pink:disabled,html[data-netbox-color-mode=light] .btn-outline-pink.disabled{color:#d63384;background-color:transparent}}@media print{html .btn-outline-darker,html[data-netbox-color-mode=dark] .btn-outline-darker,html[data-netbox-color-mode=light] .btn-outline-darker{color:#1b1f22;border-color:#1b1f22}html .btn-outline-darker:hover,html[data-netbox-color-mode=dark] .btn-outline-darker:hover,html[data-netbox-color-mode=light] .btn-outline-darker:hover{color:#fff;background-color:#1b1f22;border-color:#1b1f22}.btn-check:focus+html .btn-outline-darker,html .btn-outline-darker:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-darker,html[data-netbox-color-mode=dark] .btn-outline-darker:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-darker,html[data-netbox-color-mode=light] .btn-outline-darker:focus{box-shadow:0 0 0 .25rem #1b1f2280}.btn-check:checked+html .btn-outline-darker,.btn-check:active+html .btn-outline-darker,html .btn-outline-darker:active,html .btn-outline-darker.active,html .btn-outline-darker.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-darker,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-darker,html[data-netbox-color-mode=dark] .btn-outline-darker:active,html[data-netbox-color-mode=dark] .btn-outline-darker.active,html[data-netbox-color-mode=dark] .btn-outline-darker.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-darker,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-darker,html[data-netbox-color-mode=light] .btn-outline-darker:active,html[data-netbox-color-mode=light] .btn-outline-darker.active,html[data-netbox-color-mode=light] .btn-outline-darker.dropdown-toggle.show{color:#fff;background-color:#1b1f22;border-color:#1b1f22}.btn-check:checked+html .btn-outline-darker:focus,.btn-check:active+html .btn-outline-darker:focus,html .btn-outline-darker:active:focus,html .btn-outline-darker.active:focus,html .btn-outline-darker.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-darker:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-darker:focus,html[data-netbox-color-mode=dark] .btn-outline-darker:active:focus,html[data-netbox-color-mode=dark] .btn-outline-darker.active:focus,html[data-netbox-color-mode=dark] .btn-outline-darker.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-darker:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-darker:focus,html[data-netbox-color-mode=light] .btn-outline-darker:active:focus,html[data-netbox-color-mode=light] .btn-outline-darker.active:focus,html[data-netbox-color-mode=light] .btn-outline-darker.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #1b1f2280}html .btn-outline-darker:disabled,html .btn-outline-darker.disabled,html[data-netbox-color-mode=dark] .btn-outline-darker:disabled,html[data-netbox-color-mode=dark] .btn-outline-darker.disabled,html[data-netbox-color-mode=light] .btn-outline-darker:disabled,html[data-netbox-color-mode=light] .btn-outline-darker.disabled{color:#1b1f22;background-color:transparent}}@media print{html .btn-outline-darkest,html[data-netbox-color-mode=dark] .btn-outline-darkest,html[data-netbox-color-mode=light] .btn-outline-darkest{color:#171b1d;border-color:#171b1d}html .btn-outline-darkest:hover,html[data-netbox-color-mode=dark] .btn-outline-darkest:hover,html[data-netbox-color-mode=light] .btn-outline-darkest:hover{color:#fff;background-color:#171b1d;border-color:#171b1d}.btn-check:focus+html .btn-outline-darkest,html .btn-outline-darkest:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-darkest,html[data-netbox-color-mode=dark] .btn-outline-darkest:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-darkest,html[data-netbox-color-mode=light] .btn-outline-darkest:focus{box-shadow:0 0 0 .25rem #171b1d80}.btn-check:checked+html .btn-outline-darkest,.btn-check:active+html .btn-outline-darkest,html .btn-outline-darkest:active,html .btn-outline-darkest.active,html .btn-outline-darkest.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-darkest,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-darkest,html[data-netbox-color-mode=dark] .btn-outline-darkest:active,html[data-netbox-color-mode=dark] .btn-outline-darkest.active,html[data-netbox-color-mode=dark] .btn-outline-darkest.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-darkest,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-darkest,html[data-netbox-color-mode=light] .btn-outline-darkest:active,html[data-netbox-color-mode=light] .btn-outline-darkest.active,html[data-netbox-color-mode=light] .btn-outline-darkest.dropdown-toggle.show{color:#fff;background-color:#171b1d;border-color:#171b1d}.btn-check:checked+html .btn-outline-darkest:focus,.btn-check:active+html .btn-outline-darkest:focus,html .btn-outline-darkest:active:focus,html .btn-outline-darkest.active:focus,html .btn-outline-darkest.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-darkest:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-darkest:focus,html[data-netbox-color-mode=dark] .btn-outline-darkest:active:focus,html[data-netbox-color-mode=dark] .btn-outline-darkest.active:focus,html[data-netbox-color-mode=dark] .btn-outline-darkest.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-darkest:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-darkest:focus,html[data-netbox-color-mode=light] .btn-outline-darkest:active:focus,html[data-netbox-color-mode=light] .btn-outline-darkest.active:focus,html[data-netbox-color-mode=light] .btn-outline-darkest.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #171b1d80}html .btn-outline-darkest:disabled,html .btn-outline-darkest.disabled,html[data-netbox-color-mode=dark] .btn-outline-darkest:disabled,html[data-netbox-color-mode=dark] .btn-outline-darkest.disabled,html[data-netbox-color-mode=light] .btn-outline-darkest:disabled,html[data-netbox-color-mode=light] .btn-outline-darkest.disabled{color:#171b1d;background-color:transparent}}@media print{html .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=light] .btn-outline-gray{color:#ced4da;border-color:#ced4da}html .btn-outline-gray:hover,html[data-netbox-color-mode=dark] .btn-outline-gray:hover,html[data-netbox-color-mode=light] .btn-outline-gray:hover{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:focus+html .btn-outline-gray,html .btn-outline-gray:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray,html[data-netbox-color-mode=light] .btn-outline-gray:focus{box-shadow:0 0 0 .25rem #ced4da80}.btn-check:checked+html .btn-outline-gray,.btn-check:active+html .btn-outline-gray,html .btn-outline-gray:active,html .btn-outline-gray.active,html .btn-outline-gray.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray:active,html[data-netbox-color-mode=dark] .btn-outline-gray.active,html[data-netbox-color-mode=dark] .btn-outline-gray.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray,html[data-netbox-color-mode=light] .btn-outline-gray:active,html[data-netbox-color-mode=light] .btn-outline-gray.active,html[data-netbox-color-mode=light] .btn-outline-gray.dropdown-toggle.show{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:checked+html .btn-outline-gray:focus,.btn-check:active+html .btn-outline-gray:focus,html .btn-outline-gray:active:focus,html .btn-outline-gray.active:focus,html .btn-outline-gray.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray:focus,html[data-netbox-color-mode=dark] .btn-outline-gray:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray:focus,html[data-netbox-color-mode=light] .btn-outline-gray:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ced4da80}html .btn-outline-gray:disabled,html .btn-outline-gray.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray.disabled,html[data-netbox-color-mode=light] .btn-outline-gray:disabled,html[data-netbox-color-mode=light] .btn-outline-gray.disabled{color:#ced4da;background-color:transparent}}@media print{html .btn-outline-gray-100,html[data-netbox-color-mode=dark] .btn-outline-gray-100,html[data-netbox-color-mode=light] .btn-outline-gray-100{color:#f8f9fa;border-color:#f8f9fa}html .btn-outline-gray-100:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-100:hover,html[data-netbox-color-mode=light] .btn-outline-gray-100:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+html .btn-outline-gray-100,html .btn-outline-gray-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-100,html[data-netbox-color-mode=dark] .btn-outline-gray-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-100,html[data-netbox-color-mode=light] .btn-outline-gray-100:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-check:checked+html .btn-outline-gray-100,.btn-check:active+html .btn-outline-gray-100,html .btn-outline-gray-100:active,html .btn-outline-gray-100.active,html .btn-outline-gray-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-100,html[data-netbox-color-mode=dark] .btn-outline-gray-100:active,html[data-netbox-color-mode=dark] .btn-outline-gray-100.active,html[data-netbox-color-mode=dark] .btn-outline-gray-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-100,html[data-netbox-color-mode=light] .btn-outline-gray-100:active,html[data-netbox-color-mode=light] .btn-outline-gray-100.active,html[data-netbox-color-mode=light] .btn-outline-gray-100.dropdown-toggle.show{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:checked+html .btn-outline-gray-100:focus,.btn-check:active+html .btn-outline-gray-100:focus,html .btn-outline-gray-100:active:focus,html .btn-outline-gray-100.active:focus,html .btn-outline-gray-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-100:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-100:focus,html[data-netbox-color-mode=light] .btn-outline-gray-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8f9fa80}html .btn-outline-gray-100:disabled,html .btn-outline-gray-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-100.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-100:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-100.disabled{color:#f8f9fa;background-color:transparent}}@media print{html .btn-outline-gray-200,html[data-netbox-color-mode=dark] .btn-outline-gray-200,html[data-netbox-color-mode=light] .btn-outline-gray-200{color:#e9ecef;border-color:#e9ecef}html .btn-outline-gray-200:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-200:hover,html[data-netbox-color-mode=light] .btn-outline-gray-200:hover{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:focus+html .btn-outline-gray-200,html .btn-outline-gray-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-200,html[data-netbox-color-mode=dark] .btn-outline-gray-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-200,html[data-netbox-color-mode=light] .btn-outline-gray-200:focus{box-shadow:0 0 0 .25rem #e9ecef80}.btn-check:checked+html .btn-outline-gray-200,.btn-check:active+html .btn-outline-gray-200,html .btn-outline-gray-200:active,html .btn-outline-gray-200.active,html .btn-outline-gray-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-200,html[data-netbox-color-mode=dark] .btn-outline-gray-200:active,html[data-netbox-color-mode=dark] .btn-outline-gray-200.active,html[data-netbox-color-mode=dark] .btn-outline-gray-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-200,html[data-netbox-color-mode=light] .btn-outline-gray-200:active,html[data-netbox-color-mode=light] .btn-outline-gray-200.active,html[data-netbox-color-mode=light] .btn-outline-gray-200.dropdown-toggle.show{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:checked+html .btn-outline-gray-200:focus,.btn-check:active+html .btn-outline-gray-200:focus,html .btn-outline-gray-200:active:focus,html .btn-outline-gray-200.active:focus,html .btn-outline-gray-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-200:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-200:focus,html[data-netbox-color-mode=light] .btn-outline-gray-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e9ecef80}html .btn-outline-gray-200:disabled,html .btn-outline-gray-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-200.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-200:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-200.disabled{color:#e9ecef;background-color:transparent}}@media print{html .btn-outline-gray-300,html[data-netbox-color-mode=dark] .btn-outline-gray-300,html[data-netbox-color-mode=light] .btn-outline-gray-300{color:#dee2e6;border-color:#dee2e6}html .btn-outline-gray-300:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-300:hover,html[data-netbox-color-mode=light] .btn-outline-gray-300:hover{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:focus+html .btn-outline-gray-300,html .btn-outline-gray-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-300,html[data-netbox-color-mode=dark] .btn-outline-gray-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-300,html[data-netbox-color-mode=light] .btn-outline-gray-300:focus{box-shadow:0 0 0 .25rem #dee2e680}.btn-check:checked+html .btn-outline-gray-300,.btn-check:active+html .btn-outline-gray-300,html .btn-outline-gray-300:active,html .btn-outline-gray-300.active,html .btn-outline-gray-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-300,html[data-netbox-color-mode=dark] .btn-outline-gray-300:active,html[data-netbox-color-mode=dark] .btn-outline-gray-300.active,html[data-netbox-color-mode=dark] .btn-outline-gray-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-300,html[data-netbox-color-mode=light] .btn-outline-gray-300:active,html[data-netbox-color-mode=light] .btn-outline-gray-300.active,html[data-netbox-color-mode=light] .btn-outline-gray-300.dropdown-toggle.show{color:#000;background-color:#dee2e6;border-color:#dee2e6}.btn-check:checked+html .btn-outline-gray-300:focus,.btn-check:active+html .btn-outline-gray-300:focus,html .btn-outline-gray-300:active:focus,html .btn-outline-gray-300.active:focus,html .btn-outline-gray-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-300:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-300:focus,html[data-netbox-color-mode=light] .btn-outline-gray-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dee2e680}html .btn-outline-gray-300:disabled,html .btn-outline-gray-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-300.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-300:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-300.disabled{color:#dee2e6;background-color:transparent}}@media print{html .btn-outline-gray-400,html[data-netbox-color-mode=dark] .btn-outline-gray-400,html[data-netbox-color-mode=light] .btn-outline-gray-400{color:#ced4da;border-color:#ced4da}html .btn-outline-gray-400:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-400:hover,html[data-netbox-color-mode=light] .btn-outline-gray-400:hover{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:focus+html .btn-outline-gray-400,html .btn-outline-gray-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-400,html[data-netbox-color-mode=dark] .btn-outline-gray-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-400,html[data-netbox-color-mode=light] .btn-outline-gray-400:focus{box-shadow:0 0 0 .25rem #ced4da80}.btn-check:checked+html .btn-outline-gray-400,.btn-check:active+html .btn-outline-gray-400,html .btn-outline-gray-400:active,html .btn-outline-gray-400.active,html .btn-outline-gray-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-400,html[data-netbox-color-mode=dark] .btn-outline-gray-400:active,html[data-netbox-color-mode=dark] .btn-outline-gray-400.active,html[data-netbox-color-mode=dark] .btn-outline-gray-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-400,html[data-netbox-color-mode=light] .btn-outline-gray-400:active,html[data-netbox-color-mode=light] .btn-outline-gray-400.active,html[data-netbox-color-mode=light] .btn-outline-gray-400.dropdown-toggle.show{color:#000;background-color:#ced4da;border-color:#ced4da}.btn-check:checked+html .btn-outline-gray-400:focus,.btn-check:active+html .btn-outline-gray-400:focus,html .btn-outline-gray-400:active:focus,html .btn-outline-gray-400.active:focus,html .btn-outline-gray-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-400:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-400:focus,html[data-netbox-color-mode=light] .btn-outline-gray-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ced4da80}html .btn-outline-gray-400:disabled,html .btn-outline-gray-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-400.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-400:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-400.disabled{color:#ced4da;background-color:transparent}}@media print{html .btn-outline-gray-500,html[data-netbox-color-mode=dark] .btn-outline-gray-500,html[data-netbox-color-mode=light] .btn-outline-gray-500{color:#adb5bd;border-color:#adb5bd}html .btn-outline-gray-500:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-500:hover,html[data-netbox-color-mode=light] .btn-outline-gray-500:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+html .btn-outline-gray-500,html .btn-outline-gray-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-500,html[data-netbox-color-mode=dark] .btn-outline-gray-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-500,html[data-netbox-color-mode=light] .btn-outline-gray-500:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+html .btn-outline-gray-500,.btn-check:active+html .btn-outline-gray-500,html .btn-outline-gray-500:active,html .btn-outline-gray-500.active,html .btn-outline-gray-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-500,html[data-netbox-color-mode=dark] .btn-outline-gray-500:active,html[data-netbox-color-mode=dark] .btn-outline-gray-500.active,html[data-netbox-color-mode=dark] .btn-outline-gray-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-500,html[data-netbox-color-mode=light] .btn-outline-gray-500:active,html[data-netbox-color-mode=light] .btn-outline-gray-500.active,html[data-netbox-color-mode=light] .btn-outline-gray-500.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+html .btn-outline-gray-500:focus,.btn-check:active+html .btn-outline-gray-500:focus,html .btn-outline-gray-500:active:focus,html .btn-outline-gray-500.active:focus,html .btn-outline-gray-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-500:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-500:focus,html[data-netbox-color-mode=light] .btn-outline-gray-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}html .btn-outline-gray-500:disabled,html .btn-outline-gray-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-500.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-500:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-500.disabled{color:#adb5bd;background-color:transparent}}@media print{html .btn-outline-gray-600,html[data-netbox-color-mode=dark] .btn-outline-gray-600,html[data-netbox-color-mode=light] .btn-outline-gray-600{color:#6c757d;border-color:#6c757d}html .btn-outline-gray-600:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-600:hover,html[data-netbox-color-mode=light] .btn-outline-gray-600:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+html .btn-outline-gray-600,html .btn-outline-gray-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-600,html[data-netbox-color-mode=dark] .btn-outline-gray-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-600,html[data-netbox-color-mode=light] .btn-outline-gray-600:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-check:checked+html .btn-outline-gray-600,.btn-check:active+html .btn-outline-gray-600,html .btn-outline-gray-600:active,html .btn-outline-gray-600.active,html .btn-outline-gray-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-600,html[data-netbox-color-mode=dark] .btn-outline-gray-600:active,html[data-netbox-color-mode=dark] .btn-outline-gray-600.active,html[data-netbox-color-mode=dark] .btn-outline-gray-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-600,html[data-netbox-color-mode=light] .btn-outline-gray-600:active,html[data-netbox-color-mode=light] .btn-outline-gray-600.active,html[data-netbox-color-mode=light] .btn-outline-gray-600.dropdown-toggle.show{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:checked+html .btn-outline-gray-600:focus,.btn-check:active+html .btn-outline-gray-600:focus,html .btn-outline-gray-600:active:focus,html .btn-outline-gray-600.active:focus,html .btn-outline-gray-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-600:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-600:focus,html[data-netbox-color-mode=light] .btn-outline-gray-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6c757d80}html .btn-outline-gray-600:disabled,html .btn-outline-gray-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-600.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-600:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-600.disabled{color:#6c757d;background-color:transparent}}@media print{html .btn-outline-gray-700,html[data-netbox-color-mode=dark] .btn-outline-gray-700,html[data-netbox-color-mode=light] .btn-outline-gray-700{color:#495057;border-color:#495057}html .btn-outline-gray-700:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-700:hover,html[data-netbox-color-mode=light] .btn-outline-gray-700:hover{color:#fff;background-color:#495057;border-color:#495057}.btn-check:focus+html .btn-outline-gray-700,html .btn-outline-gray-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-700,html[data-netbox-color-mode=dark] .btn-outline-gray-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-700,html[data-netbox-color-mode=light] .btn-outline-gray-700:focus{box-shadow:0 0 0 .25rem #49505780}.btn-check:checked+html .btn-outline-gray-700,.btn-check:active+html .btn-outline-gray-700,html .btn-outline-gray-700:active,html .btn-outline-gray-700.active,html .btn-outline-gray-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-700,html[data-netbox-color-mode=dark] .btn-outline-gray-700:active,html[data-netbox-color-mode=dark] .btn-outline-gray-700.active,html[data-netbox-color-mode=dark] .btn-outline-gray-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-700,html[data-netbox-color-mode=light] .btn-outline-gray-700:active,html[data-netbox-color-mode=light] .btn-outline-gray-700.active,html[data-netbox-color-mode=light] .btn-outline-gray-700.dropdown-toggle.show{color:#fff;background-color:#495057;border-color:#495057}.btn-check:checked+html .btn-outline-gray-700:focus,.btn-check:active+html .btn-outline-gray-700:focus,html .btn-outline-gray-700:active:focus,html .btn-outline-gray-700.active:focus,html .btn-outline-gray-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-700:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-700:focus,html[data-netbox-color-mode=light] .btn-outline-gray-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #49505780}html .btn-outline-gray-700:disabled,html .btn-outline-gray-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-700.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-700:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-700.disabled{color:#495057;background-color:transparent}}@media print{html .btn-outline-gray-800,html[data-netbox-color-mode=dark] .btn-outline-gray-800,html[data-netbox-color-mode=light] .btn-outline-gray-800{color:#343a40;border-color:#343a40}html .btn-outline-gray-800:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-800:hover,html[data-netbox-color-mode=light] .btn-outline-gray-800:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:focus+html .btn-outline-gray-800,html .btn-outline-gray-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-800,html[data-netbox-color-mode=dark] .btn-outline-gray-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-800,html[data-netbox-color-mode=light] .btn-outline-gray-800:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-check:checked+html .btn-outline-gray-800,.btn-check:active+html .btn-outline-gray-800,html .btn-outline-gray-800:active,html .btn-outline-gray-800.active,html .btn-outline-gray-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-800,html[data-netbox-color-mode=dark] .btn-outline-gray-800:active,html[data-netbox-color-mode=dark] .btn-outline-gray-800.active,html[data-netbox-color-mode=dark] .btn-outline-gray-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-800,html[data-netbox-color-mode=light] .btn-outline-gray-800:active,html[data-netbox-color-mode=light] .btn-outline-gray-800.active,html[data-netbox-color-mode=light] .btn-outline-gray-800.dropdown-toggle.show{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:checked+html .btn-outline-gray-800:focus,.btn-check:active+html .btn-outline-gray-800:focus,html .btn-outline-gray-800:active:focus,html .btn-outline-gray-800.active:focus,html .btn-outline-gray-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-800:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-800:focus,html[data-netbox-color-mode=light] .btn-outline-gray-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #343a4080}html .btn-outline-gray-800:disabled,html .btn-outline-gray-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-800.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-800:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-800.disabled{color:#343a40;background-color:transparent}}@media print{html .btn-outline-gray-900,html[data-netbox-color-mode=dark] .btn-outline-gray-900,html[data-netbox-color-mode=light] .btn-outline-gray-900{color:#212529;border-color:#212529}html .btn-outline-gray-900:hover,html[data-netbox-color-mode=dark] .btn-outline-gray-900:hover,html[data-netbox-color-mode=light] .btn-outline-gray-900:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+html .btn-outline-gray-900,html .btn-outline-gray-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray-900,html[data-netbox-color-mode=dark] .btn-outline-gray-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray-900,html[data-netbox-color-mode=light] .btn-outline-gray-900:focus{box-shadow:0 0 0 .25rem #21252980}.btn-check:checked+html .btn-outline-gray-900,.btn-check:active+html .btn-outline-gray-900,html .btn-outline-gray-900:active,html .btn-outline-gray-900.active,html .btn-outline-gray-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-900,html[data-netbox-color-mode=dark] .btn-outline-gray-900:active,html[data-netbox-color-mode=dark] .btn-outline-gray-900.active,html[data-netbox-color-mode=dark] .btn-outline-gray-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-900,html[data-netbox-color-mode=light] .btn-outline-gray-900:active,html[data-netbox-color-mode=light] .btn-outline-gray-900.active,html[data-netbox-color-mode=light] .btn-outline-gray-900.dropdown-toggle.show{color:#fff;background-color:#212529;border-color:#212529}.btn-check:checked+html .btn-outline-gray-900:focus,.btn-check:active+html .btn-outline-gray-900:focus,html .btn-outline-gray-900:active:focus,html .btn-outline-gray-900.active:focus,html .btn-outline-gray-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray-900:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray-900:focus,html[data-netbox-color-mode=light] .btn-outline-gray-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #21252980}html .btn-outline-gray-900:disabled,html .btn-outline-gray-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray-900.disabled,html[data-netbox-color-mode=light] .btn-outline-gray-900:disabled,html[data-netbox-color-mode=light] .btn-outline-gray-900.disabled{color:#212529;background-color:transparent}}@media print{html .btn-outline-red-100,html[data-netbox-color-mode=dark] .btn-outline-red-100,html[data-netbox-color-mode=light] .btn-outline-red-100{color:#f8d7da;border-color:#f8d7da}html .btn-outline-red-100:hover,html[data-netbox-color-mode=dark] .btn-outline-red-100:hover,html[data-netbox-color-mode=light] .btn-outline-red-100:hover{color:#000;background-color:#f8d7da;border-color:#f8d7da}.btn-check:focus+html .btn-outline-red-100,html .btn-outline-red-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-100,html[data-netbox-color-mode=dark] .btn-outline-red-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-100,html[data-netbox-color-mode=light] .btn-outline-red-100:focus{box-shadow:0 0 0 .25rem #f8d7da80}.btn-check:checked+html .btn-outline-red-100,.btn-check:active+html .btn-outline-red-100,html .btn-outline-red-100:active,html .btn-outline-red-100.active,html .btn-outline-red-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-100,html[data-netbox-color-mode=dark] .btn-outline-red-100:active,html[data-netbox-color-mode=dark] .btn-outline-red-100.active,html[data-netbox-color-mode=dark] .btn-outline-red-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-100,html[data-netbox-color-mode=light] .btn-outline-red-100:active,html[data-netbox-color-mode=light] .btn-outline-red-100.active,html[data-netbox-color-mode=light] .btn-outline-red-100.dropdown-toggle.show{color:#000;background-color:#f8d7da;border-color:#f8d7da}.btn-check:checked+html .btn-outline-red-100:focus,.btn-check:active+html .btn-outline-red-100:focus,html .btn-outline-red-100:active:focus,html .btn-outline-red-100.active:focus,html .btn-outline-red-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-100:focus,html[data-netbox-color-mode=dark] .btn-outline-red-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-100:focus,html[data-netbox-color-mode=light] .btn-outline-red-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8d7da80}html .btn-outline-red-100:disabled,html .btn-outline-red-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-100.disabled,html[data-netbox-color-mode=light] .btn-outline-red-100:disabled,html[data-netbox-color-mode=light] .btn-outline-red-100.disabled{color:#f8d7da;background-color:transparent}}@media print{html .btn-outline-red-200,html[data-netbox-color-mode=dark] .btn-outline-red-200,html[data-netbox-color-mode=light] .btn-outline-red-200{color:#f1aeb5;border-color:#f1aeb5}html .btn-outline-red-200:hover,html[data-netbox-color-mode=dark] .btn-outline-red-200:hover,html[data-netbox-color-mode=light] .btn-outline-red-200:hover{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}.btn-check:focus+html .btn-outline-red-200,html .btn-outline-red-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-200,html[data-netbox-color-mode=dark] .btn-outline-red-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-200,html[data-netbox-color-mode=light] .btn-outline-red-200:focus{box-shadow:0 0 0 .25rem #f1aeb580}.btn-check:checked+html .btn-outline-red-200,.btn-check:active+html .btn-outline-red-200,html .btn-outline-red-200:active,html .btn-outline-red-200.active,html .btn-outline-red-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-200,html[data-netbox-color-mode=dark] .btn-outline-red-200:active,html[data-netbox-color-mode=dark] .btn-outline-red-200.active,html[data-netbox-color-mode=dark] .btn-outline-red-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-200,html[data-netbox-color-mode=light] .btn-outline-red-200:active,html[data-netbox-color-mode=light] .btn-outline-red-200.active,html[data-netbox-color-mode=light] .btn-outline-red-200.dropdown-toggle.show{color:#000;background-color:#f1aeb5;border-color:#f1aeb5}.btn-check:checked+html .btn-outline-red-200:focus,.btn-check:active+html .btn-outline-red-200:focus,html .btn-outline-red-200:active:focus,html .btn-outline-red-200.active:focus,html .btn-outline-red-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-200:focus,html[data-netbox-color-mode=dark] .btn-outline-red-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-200:focus,html[data-netbox-color-mode=light] .btn-outline-red-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f1aeb580}html .btn-outline-red-200:disabled,html .btn-outline-red-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-200.disabled,html[data-netbox-color-mode=light] .btn-outline-red-200:disabled,html[data-netbox-color-mode=light] .btn-outline-red-200.disabled{color:#f1aeb5;background-color:transparent}}@media print{html .btn-outline-red-300,html[data-netbox-color-mode=dark] .btn-outline-red-300,html[data-netbox-color-mode=light] .btn-outline-red-300{color:#ea868f;border-color:#ea868f}html .btn-outline-red-300:hover,html[data-netbox-color-mode=dark] .btn-outline-red-300:hover,html[data-netbox-color-mode=light] .btn-outline-red-300:hover{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:focus+html .btn-outline-red-300,html .btn-outline-red-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-300,html[data-netbox-color-mode=dark] .btn-outline-red-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-300,html[data-netbox-color-mode=light] .btn-outline-red-300:focus{box-shadow:0 0 0 .25rem #ea868f80}.btn-check:checked+html .btn-outline-red-300,.btn-check:active+html .btn-outline-red-300,html .btn-outline-red-300:active,html .btn-outline-red-300.active,html .btn-outline-red-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-300,html[data-netbox-color-mode=dark] .btn-outline-red-300:active,html[data-netbox-color-mode=dark] .btn-outline-red-300.active,html[data-netbox-color-mode=dark] .btn-outline-red-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-300,html[data-netbox-color-mode=light] .btn-outline-red-300:active,html[data-netbox-color-mode=light] .btn-outline-red-300.active,html[data-netbox-color-mode=light] .btn-outline-red-300.dropdown-toggle.show{color:#000;background-color:#ea868f;border-color:#ea868f}.btn-check:checked+html .btn-outline-red-300:focus,.btn-check:active+html .btn-outline-red-300:focus,html .btn-outline-red-300:active:focus,html .btn-outline-red-300.active:focus,html .btn-outline-red-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-300:focus,html[data-netbox-color-mode=dark] .btn-outline-red-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-300:focus,html[data-netbox-color-mode=light] .btn-outline-red-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ea868f80}html .btn-outline-red-300:disabled,html .btn-outline-red-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-300.disabled,html[data-netbox-color-mode=light] .btn-outline-red-300:disabled,html[data-netbox-color-mode=light] .btn-outline-red-300.disabled{color:#ea868f;background-color:transparent}}@media print{html .btn-outline-red-400,html[data-netbox-color-mode=dark] .btn-outline-red-400,html[data-netbox-color-mode=light] .btn-outline-red-400{color:#e35d6a;border-color:#e35d6a}html .btn-outline-red-400:hover,html[data-netbox-color-mode=dark] .btn-outline-red-400:hover,html[data-netbox-color-mode=light] .btn-outline-red-400:hover{color:#000;background-color:#e35d6a;border-color:#e35d6a}.btn-check:focus+html .btn-outline-red-400,html .btn-outline-red-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-400,html[data-netbox-color-mode=dark] .btn-outline-red-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-400,html[data-netbox-color-mode=light] .btn-outline-red-400:focus{box-shadow:0 0 0 .25rem #e35d6a80}.btn-check:checked+html .btn-outline-red-400,.btn-check:active+html .btn-outline-red-400,html .btn-outline-red-400:active,html .btn-outline-red-400.active,html .btn-outline-red-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-400,html[data-netbox-color-mode=dark] .btn-outline-red-400:active,html[data-netbox-color-mode=dark] .btn-outline-red-400.active,html[data-netbox-color-mode=dark] .btn-outline-red-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-400,html[data-netbox-color-mode=light] .btn-outline-red-400:active,html[data-netbox-color-mode=light] .btn-outline-red-400.active,html[data-netbox-color-mode=light] .btn-outline-red-400.dropdown-toggle.show{color:#000;background-color:#e35d6a;border-color:#e35d6a}.btn-check:checked+html .btn-outline-red-400:focus,.btn-check:active+html .btn-outline-red-400:focus,html .btn-outline-red-400:active:focus,html .btn-outline-red-400.active:focus,html .btn-outline-red-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-400:focus,html[data-netbox-color-mode=dark] .btn-outline-red-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-400:focus,html[data-netbox-color-mode=light] .btn-outline-red-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e35d6a80}html .btn-outline-red-400:disabled,html .btn-outline-red-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-400.disabled,html[data-netbox-color-mode=light] .btn-outline-red-400:disabled,html[data-netbox-color-mode=light] .btn-outline-red-400.disabled{color:#e35d6a;background-color:transparent}}@media print{html .btn-outline-red-500,html[data-netbox-color-mode=dark] .btn-outline-red-500,html[data-netbox-color-mode=light] .btn-outline-red-500{color:#dc3545;border-color:#dc3545}html .btn-outline-red-500:hover,html[data-netbox-color-mode=dark] .btn-outline-red-500:hover,html[data-netbox-color-mode=light] .btn-outline-red-500:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+html .btn-outline-red-500,html .btn-outline-red-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-500,html[data-netbox-color-mode=dark] .btn-outline-red-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-500,html[data-netbox-color-mode=light] .btn-outline-red-500:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+html .btn-outline-red-500,.btn-check:active+html .btn-outline-red-500,html .btn-outline-red-500:active,html .btn-outline-red-500.active,html .btn-outline-red-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-500,html[data-netbox-color-mode=dark] .btn-outline-red-500:active,html[data-netbox-color-mode=dark] .btn-outline-red-500.active,html[data-netbox-color-mode=dark] .btn-outline-red-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-500,html[data-netbox-color-mode=light] .btn-outline-red-500:active,html[data-netbox-color-mode=light] .btn-outline-red-500.active,html[data-netbox-color-mode=light] .btn-outline-red-500.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+html .btn-outline-red-500:focus,.btn-check:active+html .btn-outline-red-500:focus,html .btn-outline-red-500:active:focus,html .btn-outline-red-500.active:focus,html .btn-outline-red-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-500:focus,html[data-netbox-color-mode=dark] .btn-outline-red-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-500:focus,html[data-netbox-color-mode=light] .btn-outline-red-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}html .btn-outline-red-500:disabled,html .btn-outline-red-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-500.disabled,html[data-netbox-color-mode=light] .btn-outline-red-500:disabled,html[data-netbox-color-mode=light] .btn-outline-red-500.disabled{color:#dc3545;background-color:transparent}}@media print{html .btn-outline-red-600,html[data-netbox-color-mode=dark] .btn-outline-red-600,html[data-netbox-color-mode=light] .btn-outline-red-600{color:#b02a37;border-color:#b02a37}html .btn-outline-red-600:hover,html[data-netbox-color-mode=dark] .btn-outline-red-600:hover,html[data-netbox-color-mode=light] .btn-outline-red-600:hover{color:#fff;background-color:#b02a37;border-color:#b02a37}.btn-check:focus+html .btn-outline-red-600,html .btn-outline-red-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-600,html[data-netbox-color-mode=dark] .btn-outline-red-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-600,html[data-netbox-color-mode=light] .btn-outline-red-600:focus{box-shadow:0 0 0 .25rem #b02a3780}.btn-check:checked+html .btn-outline-red-600,.btn-check:active+html .btn-outline-red-600,html .btn-outline-red-600:active,html .btn-outline-red-600.active,html .btn-outline-red-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-600,html[data-netbox-color-mode=dark] .btn-outline-red-600:active,html[data-netbox-color-mode=dark] .btn-outline-red-600.active,html[data-netbox-color-mode=dark] .btn-outline-red-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-600,html[data-netbox-color-mode=light] .btn-outline-red-600:active,html[data-netbox-color-mode=light] .btn-outline-red-600.active,html[data-netbox-color-mode=light] .btn-outline-red-600.dropdown-toggle.show{color:#fff;background-color:#b02a37;border-color:#b02a37}.btn-check:checked+html .btn-outline-red-600:focus,.btn-check:active+html .btn-outline-red-600:focus,html .btn-outline-red-600:active:focus,html .btn-outline-red-600.active:focus,html .btn-outline-red-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-600:focus,html[data-netbox-color-mode=dark] .btn-outline-red-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-600:focus,html[data-netbox-color-mode=light] .btn-outline-red-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #b02a3780}html .btn-outline-red-600:disabled,html .btn-outline-red-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-600.disabled,html[data-netbox-color-mode=light] .btn-outline-red-600:disabled,html[data-netbox-color-mode=light] .btn-outline-red-600.disabled{color:#b02a37;background-color:transparent}}@media print{html .btn-outline-red-700,html[data-netbox-color-mode=dark] .btn-outline-red-700,html[data-netbox-color-mode=light] .btn-outline-red-700{color:#842029;border-color:#842029}html .btn-outline-red-700:hover,html[data-netbox-color-mode=dark] .btn-outline-red-700:hover,html[data-netbox-color-mode=light] .btn-outline-red-700:hover{color:#fff;background-color:#842029;border-color:#842029}.btn-check:focus+html .btn-outline-red-700,html .btn-outline-red-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-700,html[data-netbox-color-mode=dark] .btn-outline-red-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-700,html[data-netbox-color-mode=light] .btn-outline-red-700:focus{box-shadow:0 0 0 .25rem #84202980}.btn-check:checked+html .btn-outline-red-700,.btn-check:active+html .btn-outline-red-700,html .btn-outline-red-700:active,html .btn-outline-red-700.active,html .btn-outline-red-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-700,html[data-netbox-color-mode=dark] .btn-outline-red-700:active,html[data-netbox-color-mode=dark] .btn-outline-red-700.active,html[data-netbox-color-mode=dark] .btn-outline-red-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-700,html[data-netbox-color-mode=light] .btn-outline-red-700:active,html[data-netbox-color-mode=light] .btn-outline-red-700.active,html[data-netbox-color-mode=light] .btn-outline-red-700.dropdown-toggle.show{color:#fff;background-color:#842029;border-color:#842029}.btn-check:checked+html .btn-outline-red-700:focus,.btn-check:active+html .btn-outline-red-700:focus,html .btn-outline-red-700:active:focus,html .btn-outline-red-700.active:focus,html .btn-outline-red-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-700:focus,html[data-netbox-color-mode=dark] .btn-outline-red-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-700:focus,html[data-netbox-color-mode=light] .btn-outline-red-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #84202980}html .btn-outline-red-700:disabled,html .btn-outline-red-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-700.disabled,html[data-netbox-color-mode=light] .btn-outline-red-700:disabled,html[data-netbox-color-mode=light] .btn-outline-red-700.disabled{color:#842029;background-color:transparent}}@media print{html .btn-outline-red-800,html[data-netbox-color-mode=dark] .btn-outline-red-800,html[data-netbox-color-mode=light] .btn-outline-red-800{color:#58151c;border-color:#58151c}html .btn-outline-red-800:hover,html[data-netbox-color-mode=dark] .btn-outline-red-800:hover,html[data-netbox-color-mode=light] .btn-outline-red-800:hover{color:#fff;background-color:#58151c;border-color:#58151c}.btn-check:focus+html .btn-outline-red-800,html .btn-outline-red-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-800,html[data-netbox-color-mode=dark] .btn-outline-red-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-800,html[data-netbox-color-mode=light] .btn-outline-red-800:focus{box-shadow:0 0 0 .25rem #58151c80}.btn-check:checked+html .btn-outline-red-800,.btn-check:active+html .btn-outline-red-800,html .btn-outline-red-800:active,html .btn-outline-red-800.active,html .btn-outline-red-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-800,html[data-netbox-color-mode=dark] .btn-outline-red-800:active,html[data-netbox-color-mode=dark] .btn-outline-red-800.active,html[data-netbox-color-mode=dark] .btn-outline-red-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-800,html[data-netbox-color-mode=light] .btn-outline-red-800:active,html[data-netbox-color-mode=light] .btn-outline-red-800.active,html[data-netbox-color-mode=light] .btn-outline-red-800.dropdown-toggle.show{color:#fff;background-color:#58151c;border-color:#58151c}.btn-check:checked+html .btn-outline-red-800:focus,.btn-check:active+html .btn-outline-red-800:focus,html .btn-outline-red-800:active:focus,html .btn-outline-red-800.active:focus,html .btn-outline-red-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-800:focus,html[data-netbox-color-mode=dark] .btn-outline-red-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-800:focus,html[data-netbox-color-mode=light] .btn-outline-red-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #58151c80}html .btn-outline-red-800:disabled,html .btn-outline-red-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-800.disabled,html[data-netbox-color-mode=light] .btn-outline-red-800:disabled,html[data-netbox-color-mode=light] .btn-outline-red-800.disabled{color:#58151c;background-color:transparent}}@media print{html .btn-outline-red-900,html[data-netbox-color-mode=dark] .btn-outline-red-900,html[data-netbox-color-mode=light] .btn-outline-red-900{color:#2c0b0e;border-color:#2c0b0e}html .btn-outline-red-900:hover,html[data-netbox-color-mode=dark] .btn-outline-red-900:hover,html[data-netbox-color-mode=light] .btn-outline-red-900:hover{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}.btn-check:focus+html .btn-outline-red-900,html .btn-outline-red-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red-900,html[data-netbox-color-mode=dark] .btn-outline-red-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red-900,html[data-netbox-color-mode=light] .btn-outline-red-900:focus{box-shadow:0 0 0 .25rem #2c0b0e80}.btn-check:checked+html .btn-outline-red-900,.btn-check:active+html .btn-outline-red-900,html .btn-outline-red-900:active,html .btn-outline-red-900.active,html .btn-outline-red-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-900,html[data-netbox-color-mode=dark] .btn-outline-red-900:active,html[data-netbox-color-mode=dark] .btn-outline-red-900.active,html[data-netbox-color-mode=dark] .btn-outline-red-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-900,html[data-netbox-color-mode=light] .btn-outline-red-900:active,html[data-netbox-color-mode=light] .btn-outline-red-900.active,html[data-netbox-color-mode=light] .btn-outline-red-900.dropdown-toggle.show{color:#fff;background-color:#2c0b0e;border-color:#2c0b0e}.btn-check:checked+html .btn-outline-red-900:focus,.btn-check:active+html .btn-outline-red-900:focus,html .btn-outline-red-900:active:focus,html .btn-outline-red-900.active:focus,html .btn-outline-red-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red-900:focus,html[data-netbox-color-mode=dark] .btn-outline-red-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red-900:focus,html[data-netbox-color-mode=light] .btn-outline-red-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-red-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-red-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2c0b0e80}html .btn-outline-red-900:disabled,html .btn-outline-red-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-red-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-red-900.disabled,html[data-netbox-color-mode=light] .btn-outline-red-900:disabled,html[data-netbox-color-mode=light] .btn-outline-red-900.disabled{color:#2c0b0e;background-color:transparent}}@media print{html .btn-outline-yellow-100,html[data-netbox-color-mode=dark] .btn-outline-yellow-100,html[data-netbox-color-mode=light] .btn-outline-yellow-100{color:#fff3cd;border-color:#fff3cd}html .btn-outline-yellow-100:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-100:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-100:hover{color:#000;background-color:#fff3cd;border-color:#fff3cd}.btn-check:focus+html .btn-outline-yellow-100,html .btn-outline-yellow-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-100,html[data-netbox-color-mode=dark] .btn-outline-yellow-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-100,html[data-netbox-color-mode=light] .btn-outline-yellow-100:focus{box-shadow:0 0 0 .25rem #fff3cd80}.btn-check:checked+html .btn-outline-yellow-100,.btn-check:active+html .btn-outline-yellow-100,html .btn-outline-yellow-100:active,html .btn-outline-yellow-100.active,html .btn-outline-yellow-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-100,html[data-netbox-color-mode=dark] .btn-outline-yellow-100:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-100,html[data-netbox-color-mode=light] .btn-outline-yellow-100:active,html[data-netbox-color-mode=light] .btn-outline-yellow-100.active,html[data-netbox-color-mode=light] .btn-outline-yellow-100.dropdown-toggle.show{color:#000;background-color:#fff3cd;border-color:#fff3cd}.btn-check:checked+html .btn-outline-yellow-100:focus,.btn-check:active+html .btn-outline-yellow-100:focus,html .btn-outline-yellow-100:active:focus,html .btn-outline-yellow-100.active:focus,html .btn-outline-yellow-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-100:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-100:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #fff3cd80}html .btn-outline-yellow-100:disabled,html .btn-outline-yellow-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-100.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-100:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-100.disabled{color:#fff3cd;background-color:transparent}}@media print{html .btn-outline-yellow-200,html[data-netbox-color-mode=dark] .btn-outline-yellow-200,html[data-netbox-color-mode=light] .btn-outline-yellow-200{color:#ffe69c;border-color:#ffe69c}html .btn-outline-yellow-200:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-200:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-200:hover{color:#000;background-color:#ffe69c;border-color:#ffe69c}.btn-check:focus+html .btn-outline-yellow-200,html .btn-outline-yellow-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-200,html[data-netbox-color-mode=dark] .btn-outline-yellow-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-200,html[data-netbox-color-mode=light] .btn-outline-yellow-200:focus{box-shadow:0 0 0 .25rem #ffe69c80}.btn-check:checked+html .btn-outline-yellow-200,.btn-check:active+html .btn-outline-yellow-200,html .btn-outline-yellow-200:active,html .btn-outline-yellow-200.active,html .btn-outline-yellow-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-200,html[data-netbox-color-mode=dark] .btn-outline-yellow-200:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-200,html[data-netbox-color-mode=light] .btn-outline-yellow-200:active,html[data-netbox-color-mode=light] .btn-outline-yellow-200.active,html[data-netbox-color-mode=light] .btn-outline-yellow-200.dropdown-toggle.show{color:#000;background-color:#ffe69c;border-color:#ffe69c}.btn-check:checked+html .btn-outline-yellow-200:focus,.btn-check:active+html .btn-outline-yellow-200:focus,html .btn-outline-yellow-200:active:focus,html .btn-outline-yellow-200.active:focus,html .btn-outline-yellow-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-200:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-200:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffe69c80}html .btn-outline-yellow-200:disabled,html .btn-outline-yellow-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-200.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-200:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-200.disabled{color:#ffe69c;background-color:transparent}}@media print{html .btn-outline-yellow-300,html[data-netbox-color-mode=dark] .btn-outline-yellow-300,html[data-netbox-color-mode=light] .btn-outline-yellow-300{color:#ffda6a;border-color:#ffda6a}html .btn-outline-yellow-300:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-300:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-300:hover{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:focus+html .btn-outline-yellow-300,html .btn-outline-yellow-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-300,html[data-netbox-color-mode=dark] .btn-outline-yellow-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-300,html[data-netbox-color-mode=light] .btn-outline-yellow-300:focus{box-shadow:0 0 0 .25rem #ffda6a80}.btn-check:checked+html .btn-outline-yellow-300,.btn-check:active+html .btn-outline-yellow-300,html .btn-outline-yellow-300:active,html .btn-outline-yellow-300.active,html .btn-outline-yellow-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-300,html[data-netbox-color-mode=dark] .btn-outline-yellow-300:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-300,html[data-netbox-color-mode=light] .btn-outline-yellow-300:active,html[data-netbox-color-mode=light] .btn-outline-yellow-300.active,html[data-netbox-color-mode=light] .btn-outline-yellow-300.dropdown-toggle.show{color:#000;background-color:#ffda6a;border-color:#ffda6a}.btn-check:checked+html .btn-outline-yellow-300:focus,.btn-check:active+html .btn-outline-yellow-300:focus,html .btn-outline-yellow-300:active:focus,html .btn-outline-yellow-300.active:focus,html .btn-outline-yellow-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-300:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-300:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffda6a80}html .btn-outline-yellow-300:disabled,html .btn-outline-yellow-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-300.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-300:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-300.disabled{color:#ffda6a;background-color:transparent}}@media print{html .btn-outline-yellow-400,html[data-netbox-color-mode=dark] .btn-outline-yellow-400,html[data-netbox-color-mode=light] .btn-outline-yellow-400{color:#ffcd39;border-color:#ffcd39}html .btn-outline-yellow-400:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-400:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-400:hover{color:#000;background-color:#ffcd39;border-color:#ffcd39}.btn-check:focus+html .btn-outline-yellow-400,html .btn-outline-yellow-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-400,html[data-netbox-color-mode=dark] .btn-outline-yellow-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-400,html[data-netbox-color-mode=light] .btn-outline-yellow-400:focus{box-shadow:0 0 0 .25rem #ffcd3980}.btn-check:checked+html .btn-outline-yellow-400,.btn-check:active+html .btn-outline-yellow-400,html .btn-outline-yellow-400:active,html .btn-outline-yellow-400.active,html .btn-outline-yellow-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-400,html[data-netbox-color-mode=dark] .btn-outline-yellow-400:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-400,html[data-netbox-color-mode=light] .btn-outline-yellow-400:active,html[data-netbox-color-mode=light] .btn-outline-yellow-400.active,html[data-netbox-color-mode=light] .btn-outline-yellow-400.dropdown-toggle.show{color:#000;background-color:#ffcd39;border-color:#ffcd39}.btn-check:checked+html .btn-outline-yellow-400:focus,.btn-check:active+html .btn-outline-yellow-400:focus,html .btn-outline-yellow-400:active:focus,html .btn-outline-yellow-400.active:focus,html .btn-outline-yellow-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-400:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-400:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffcd3980}html .btn-outline-yellow-400:disabled,html .btn-outline-yellow-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-400.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-400:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-400.disabled{color:#ffcd39;background-color:transparent}}@media print{html .btn-outline-yellow-500,html[data-netbox-color-mode=dark] .btn-outline-yellow-500,html[data-netbox-color-mode=light] .btn-outline-yellow-500{color:#ffc107;border-color:#ffc107}html .btn-outline-yellow-500:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-500:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-500:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+html .btn-outline-yellow-500,html .btn-outline-yellow-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-500,html[data-netbox-color-mode=dark] .btn-outline-yellow-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-500,html[data-netbox-color-mode=light] .btn-outline-yellow-500:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+html .btn-outline-yellow-500,.btn-check:active+html .btn-outline-yellow-500,html .btn-outline-yellow-500:active,html .btn-outline-yellow-500.active,html .btn-outline-yellow-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-500,html[data-netbox-color-mode=dark] .btn-outline-yellow-500:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-500,html[data-netbox-color-mode=light] .btn-outline-yellow-500:active,html[data-netbox-color-mode=light] .btn-outline-yellow-500.active,html[data-netbox-color-mode=light] .btn-outline-yellow-500.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+html .btn-outline-yellow-500:focus,.btn-check:active+html .btn-outline-yellow-500:focus,html .btn-outline-yellow-500:active:focus,html .btn-outline-yellow-500.active:focus,html .btn-outline-yellow-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-500:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-500:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}html .btn-outline-yellow-500:disabled,html .btn-outline-yellow-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-500.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-500:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-500.disabled{color:#ffc107;background-color:transparent}}@media print{html .btn-outline-yellow-600,html[data-netbox-color-mode=dark] .btn-outline-yellow-600,html[data-netbox-color-mode=light] .btn-outline-yellow-600{color:#cc9a06;border-color:#cc9a06}html .btn-outline-yellow-600:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-600:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-600:hover{color:#000;background-color:#cc9a06;border-color:#cc9a06}.btn-check:focus+html .btn-outline-yellow-600,html .btn-outline-yellow-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-600,html[data-netbox-color-mode=dark] .btn-outline-yellow-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-600,html[data-netbox-color-mode=light] .btn-outline-yellow-600:focus{box-shadow:0 0 0 .25rem #cc9a0680}.btn-check:checked+html .btn-outline-yellow-600,.btn-check:active+html .btn-outline-yellow-600,html .btn-outline-yellow-600:active,html .btn-outline-yellow-600.active,html .btn-outline-yellow-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-600,html[data-netbox-color-mode=dark] .btn-outline-yellow-600:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-600,html[data-netbox-color-mode=light] .btn-outline-yellow-600:active,html[data-netbox-color-mode=light] .btn-outline-yellow-600.active,html[data-netbox-color-mode=light] .btn-outline-yellow-600.dropdown-toggle.show{color:#000;background-color:#cc9a06;border-color:#cc9a06}.btn-check:checked+html .btn-outline-yellow-600:focus,.btn-check:active+html .btn-outline-yellow-600:focus,html .btn-outline-yellow-600:active:focus,html .btn-outline-yellow-600.active:focus,html .btn-outline-yellow-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-600:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-600:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cc9a0680}html .btn-outline-yellow-600:disabled,html .btn-outline-yellow-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-600.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-600:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-600.disabled{color:#cc9a06;background-color:transparent}}@media print{html .btn-outline-yellow-700,html[data-netbox-color-mode=dark] .btn-outline-yellow-700,html[data-netbox-color-mode=light] .btn-outline-yellow-700{color:#997404;border-color:#997404}html .btn-outline-yellow-700:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-700:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-700:hover{color:#000;background-color:#997404;border-color:#997404}.btn-check:focus+html .btn-outline-yellow-700,html .btn-outline-yellow-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-700,html[data-netbox-color-mode=dark] .btn-outline-yellow-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-700,html[data-netbox-color-mode=light] .btn-outline-yellow-700:focus{box-shadow:0 0 0 .25rem #99740480}.btn-check:checked+html .btn-outline-yellow-700,.btn-check:active+html .btn-outline-yellow-700,html .btn-outline-yellow-700:active,html .btn-outline-yellow-700.active,html .btn-outline-yellow-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-700,html[data-netbox-color-mode=dark] .btn-outline-yellow-700:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-700,html[data-netbox-color-mode=light] .btn-outline-yellow-700:active,html[data-netbox-color-mode=light] .btn-outline-yellow-700.active,html[data-netbox-color-mode=light] .btn-outline-yellow-700.dropdown-toggle.show{color:#000;background-color:#997404;border-color:#997404}.btn-check:checked+html .btn-outline-yellow-700:focus,.btn-check:active+html .btn-outline-yellow-700:focus,html .btn-outline-yellow-700:active:focus,html .btn-outline-yellow-700.active:focus,html .btn-outline-yellow-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-700:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-700:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #99740480}html .btn-outline-yellow-700:disabled,html .btn-outline-yellow-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-700.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-700:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-700.disabled{color:#997404;background-color:transparent}}@media print{html .btn-outline-yellow-800,html[data-netbox-color-mode=dark] .btn-outline-yellow-800,html[data-netbox-color-mode=light] .btn-outline-yellow-800{color:#664d03;border-color:#664d03}html .btn-outline-yellow-800:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-800:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-800:hover{color:#fff;background-color:#664d03;border-color:#664d03}.btn-check:focus+html .btn-outline-yellow-800,html .btn-outline-yellow-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-800,html[data-netbox-color-mode=dark] .btn-outline-yellow-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-800,html[data-netbox-color-mode=light] .btn-outline-yellow-800:focus{box-shadow:0 0 0 .25rem #664d0380}.btn-check:checked+html .btn-outline-yellow-800,.btn-check:active+html .btn-outline-yellow-800,html .btn-outline-yellow-800:active,html .btn-outline-yellow-800.active,html .btn-outline-yellow-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-800,html[data-netbox-color-mode=dark] .btn-outline-yellow-800:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-800,html[data-netbox-color-mode=light] .btn-outline-yellow-800:active,html[data-netbox-color-mode=light] .btn-outline-yellow-800.active,html[data-netbox-color-mode=light] .btn-outline-yellow-800.dropdown-toggle.show{color:#fff;background-color:#664d03;border-color:#664d03}.btn-check:checked+html .btn-outline-yellow-800:focus,.btn-check:active+html .btn-outline-yellow-800:focus,html .btn-outline-yellow-800:active:focus,html .btn-outline-yellow-800.active:focus,html .btn-outline-yellow-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-800:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-800:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #664d0380}html .btn-outline-yellow-800:disabled,html .btn-outline-yellow-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-800.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-800:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-800.disabled{color:#664d03;background-color:transparent}}@media print{html .btn-outline-yellow-900,html[data-netbox-color-mode=dark] .btn-outline-yellow-900,html[data-netbox-color-mode=light] .btn-outline-yellow-900{color:#332701;border-color:#332701}html .btn-outline-yellow-900:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow-900:hover,html[data-netbox-color-mode=light] .btn-outline-yellow-900:hover{color:#fff;background-color:#332701;border-color:#332701}.btn-check:focus+html .btn-outline-yellow-900,html .btn-outline-yellow-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow-900,html[data-netbox-color-mode=dark] .btn-outline-yellow-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow-900,html[data-netbox-color-mode=light] .btn-outline-yellow-900:focus{box-shadow:0 0 0 .25rem #33270180}.btn-check:checked+html .btn-outline-yellow-900,.btn-check:active+html .btn-outline-yellow-900,html .btn-outline-yellow-900:active,html .btn-outline-yellow-900.active,html .btn-outline-yellow-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-900,html[data-netbox-color-mode=dark] .btn-outline-yellow-900:active,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.active,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-900,html[data-netbox-color-mode=light] .btn-outline-yellow-900:active,html[data-netbox-color-mode=light] .btn-outline-yellow-900.active,html[data-netbox-color-mode=light] .btn-outline-yellow-900.dropdown-toggle.show{color:#fff;background-color:#332701;border-color:#332701}.btn-check:checked+html .btn-outline-yellow-900:focus,.btn-check:active+html .btn-outline-yellow-900:focus,html .btn-outline-yellow-900:active:focus,html .btn-outline-yellow-900.active:focus,html .btn-outline-yellow-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow-900:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow-900:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #33270180}html .btn-outline-yellow-900:disabled,html .btn-outline-yellow-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow-900.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-900:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow-900.disabled{color:#332701;background-color:transparent}}@media print{html .btn-outline-green-100,html[data-netbox-color-mode=dark] .btn-outline-green-100,html[data-netbox-color-mode=light] .btn-outline-green-100{color:#d1e7dd;border-color:#d1e7dd}html .btn-outline-green-100:hover,html[data-netbox-color-mode=dark] .btn-outline-green-100:hover,html[data-netbox-color-mode=light] .btn-outline-green-100:hover{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}.btn-check:focus+html .btn-outline-green-100,html .btn-outline-green-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-100,html[data-netbox-color-mode=dark] .btn-outline-green-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-100,html[data-netbox-color-mode=light] .btn-outline-green-100:focus{box-shadow:0 0 0 .25rem #d1e7dd80}.btn-check:checked+html .btn-outline-green-100,.btn-check:active+html .btn-outline-green-100,html .btn-outline-green-100:active,html .btn-outline-green-100.active,html .btn-outline-green-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-100,html[data-netbox-color-mode=dark] .btn-outline-green-100:active,html[data-netbox-color-mode=dark] .btn-outline-green-100.active,html[data-netbox-color-mode=dark] .btn-outline-green-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-100,html[data-netbox-color-mode=light] .btn-outline-green-100:active,html[data-netbox-color-mode=light] .btn-outline-green-100.active,html[data-netbox-color-mode=light] .btn-outline-green-100.dropdown-toggle.show{color:#000;background-color:#d1e7dd;border-color:#d1e7dd}.btn-check:checked+html .btn-outline-green-100:focus,.btn-check:active+html .btn-outline-green-100:focus,html .btn-outline-green-100:active:focus,html .btn-outline-green-100.active:focus,html .btn-outline-green-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-100:focus,html[data-netbox-color-mode=dark] .btn-outline-green-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-100:focus,html[data-netbox-color-mode=light] .btn-outline-green-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d1e7dd80}html .btn-outline-green-100:disabled,html .btn-outline-green-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-100.disabled,html[data-netbox-color-mode=light] .btn-outline-green-100:disabled,html[data-netbox-color-mode=light] .btn-outline-green-100.disabled{color:#d1e7dd;background-color:transparent}}@media print{html .btn-outline-green-200,html[data-netbox-color-mode=dark] .btn-outline-green-200,html[data-netbox-color-mode=light] .btn-outline-green-200{color:#a3cfbb;border-color:#a3cfbb}html .btn-outline-green-200:hover,html[data-netbox-color-mode=dark] .btn-outline-green-200:hover,html[data-netbox-color-mode=light] .btn-outline-green-200:hover{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}.btn-check:focus+html .btn-outline-green-200,html .btn-outline-green-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-200,html[data-netbox-color-mode=dark] .btn-outline-green-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-200,html[data-netbox-color-mode=light] .btn-outline-green-200:focus{box-shadow:0 0 0 .25rem #a3cfbb80}.btn-check:checked+html .btn-outline-green-200,.btn-check:active+html .btn-outline-green-200,html .btn-outline-green-200:active,html .btn-outline-green-200.active,html .btn-outline-green-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-200,html[data-netbox-color-mode=dark] .btn-outline-green-200:active,html[data-netbox-color-mode=dark] .btn-outline-green-200.active,html[data-netbox-color-mode=dark] .btn-outline-green-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-200,html[data-netbox-color-mode=light] .btn-outline-green-200:active,html[data-netbox-color-mode=light] .btn-outline-green-200.active,html[data-netbox-color-mode=light] .btn-outline-green-200.dropdown-toggle.show{color:#000;background-color:#a3cfbb;border-color:#a3cfbb}.btn-check:checked+html .btn-outline-green-200:focus,.btn-check:active+html .btn-outline-green-200:focus,html .btn-outline-green-200:active:focus,html .btn-outline-green-200.active:focus,html .btn-outline-green-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-200:focus,html[data-netbox-color-mode=dark] .btn-outline-green-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-200:focus,html[data-netbox-color-mode=light] .btn-outline-green-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a3cfbb80}html .btn-outline-green-200:disabled,html .btn-outline-green-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-200.disabled,html[data-netbox-color-mode=light] .btn-outline-green-200:disabled,html[data-netbox-color-mode=light] .btn-outline-green-200.disabled{color:#a3cfbb;background-color:transparent}}@media print{html .btn-outline-green-300,html[data-netbox-color-mode=dark] .btn-outline-green-300,html[data-netbox-color-mode=light] .btn-outline-green-300{color:#75b798;border-color:#75b798}html .btn-outline-green-300:hover,html[data-netbox-color-mode=dark] .btn-outline-green-300:hover,html[data-netbox-color-mode=light] .btn-outline-green-300:hover{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:focus+html .btn-outline-green-300,html .btn-outline-green-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-300,html[data-netbox-color-mode=dark] .btn-outline-green-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-300,html[data-netbox-color-mode=light] .btn-outline-green-300:focus{box-shadow:0 0 0 .25rem #75b79880}.btn-check:checked+html .btn-outline-green-300,.btn-check:active+html .btn-outline-green-300,html .btn-outline-green-300:active,html .btn-outline-green-300.active,html .btn-outline-green-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-300,html[data-netbox-color-mode=dark] .btn-outline-green-300:active,html[data-netbox-color-mode=dark] .btn-outline-green-300.active,html[data-netbox-color-mode=dark] .btn-outline-green-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-300,html[data-netbox-color-mode=light] .btn-outline-green-300:active,html[data-netbox-color-mode=light] .btn-outline-green-300.active,html[data-netbox-color-mode=light] .btn-outline-green-300.dropdown-toggle.show{color:#000;background-color:#75b798;border-color:#75b798}.btn-check:checked+html .btn-outline-green-300:focus,.btn-check:active+html .btn-outline-green-300:focus,html .btn-outline-green-300:active:focus,html .btn-outline-green-300.active:focus,html .btn-outline-green-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-300:focus,html[data-netbox-color-mode=dark] .btn-outline-green-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-300:focus,html[data-netbox-color-mode=light] .btn-outline-green-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #75b79880}html .btn-outline-green-300:disabled,html .btn-outline-green-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-300.disabled,html[data-netbox-color-mode=light] .btn-outline-green-300:disabled,html[data-netbox-color-mode=light] .btn-outline-green-300.disabled{color:#75b798;background-color:transparent}}@media print{html .btn-outline-green-400,html[data-netbox-color-mode=dark] .btn-outline-green-400,html[data-netbox-color-mode=light] .btn-outline-green-400{color:#479f76;border-color:#479f76}html .btn-outline-green-400:hover,html[data-netbox-color-mode=dark] .btn-outline-green-400:hover,html[data-netbox-color-mode=light] .btn-outline-green-400:hover{color:#000;background-color:#479f76;border-color:#479f76}.btn-check:focus+html .btn-outline-green-400,html .btn-outline-green-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-400,html[data-netbox-color-mode=dark] .btn-outline-green-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-400,html[data-netbox-color-mode=light] .btn-outline-green-400:focus{box-shadow:0 0 0 .25rem #479f7680}.btn-check:checked+html .btn-outline-green-400,.btn-check:active+html .btn-outline-green-400,html .btn-outline-green-400:active,html .btn-outline-green-400.active,html .btn-outline-green-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-400,html[data-netbox-color-mode=dark] .btn-outline-green-400:active,html[data-netbox-color-mode=dark] .btn-outline-green-400.active,html[data-netbox-color-mode=dark] .btn-outline-green-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-400,html[data-netbox-color-mode=light] .btn-outline-green-400:active,html[data-netbox-color-mode=light] .btn-outline-green-400.active,html[data-netbox-color-mode=light] .btn-outline-green-400.dropdown-toggle.show{color:#000;background-color:#479f76;border-color:#479f76}.btn-check:checked+html .btn-outline-green-400:focus,.btn-check:active+html .btn-outline-green-400:focus,html .btn-outline-green-400:active:focus,html .btn-outline-green-400.active:focus,html .btn-outline-green-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-400:focus,html[data-netbox-color-mode=dark] .btn-outline-green-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-400:focus,html[data-netbox-color-mode=light] .btn-outline-green-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #479f7680}html .btn-outline-green-400:disabled,html .btn-outline-green-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-400.disabled,html[data-netbox-color-mode=light] .btn-outline-green-400:disabled,html[data-netbox-color-mode=light] .btn-outline-green-400.disabled{color:#479f76;background-color:transparent}}@media print{html .btn-outline-green-500,html[data-netbox-color-mode=dark] .btn-outline-green-500,html[data-netbox-color-mode=light] .btn-outline-green-500{color:#198754;border-color:#198754}html .btn-outline-green-500:hover,html[data-netbox-color-mode=dark] .btn-outline-green-500:hover,html[data-netbox-color-mode=light] .btn-outline-green-500:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+html .btn-outline-green-500,html .btn-outline-green-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-500,html[data-netbox-color-mode=dark] .btn-outline-green-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-500,html[data-netbox-color-mode=light] .btn-outline-green-500:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+html .btn-outline-green-500,.btn-check:active+html .btn-outline-green-500,html .btn-outline-green-500:active,html .btn-outline-green-500.active,html .btn-outline-green-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-500,html[data-netbox-color-mode=dark] .btn-outline-green-500:active,html[data-netbox-color-mode=dark] .btn-outline-green-500.active,html[data-netbox-color-mode=dark] .btn-outline-green-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-500,html[data-netbox-color-mode=light] .btn-outline-green-500:active,html[data-netbox-color-mode=light] .btn-outline-green-500.active,html[data-netbox-color-mode=light] .btn-outline-green-500.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+html .btn-outline-green-500:focus,.btn-check:active+html .btn-outline-green-500:focus,html .btn-outline-green-500:active:focus,html .btn-outline-green-500.active:focus,html .btn-outline-green-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-500:focus,html[data-netbox-color-mode=dark] .btn-outline-green-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-500:focus,html[data-netbox-color-mode=light] .btn-outline-green-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}html .btn-outline-green-500:disabled,html .btn-outline-green-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-500.disabled,html[data-netbox-color-mode=light] .btn-outline-green-500:disabled,html[data-netbox-color-mode=light] .btn-outline-green-500.disabled{color:#198754;background-color:transparent}}@media print{html .btn-outline-green-600,html[data-netbox-color-mode=dark] .btn-outline-green-600,html[data-netbox-color-mode=light] .btn-outline-green-600{color:#146c43;border-color:#146c43}html .btn-outline-green-600:hover,html[data-netbox-color-mode=dark] .btn-outline-green-600:hover,html[data-netbox-color-mode=light] .btn-outline-green-600:hover{color:#fff;background-color:#146c43;border-color:#146c43}.btn-check:focus+html .btn-outline-green-600,html .btn-outline-green-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-600,html[data-netbox-color-mode=dark] .btn-outline-green-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-600,html[data-netbox-color-mode=light] .btn-outline-green-600:focus{box-shadow:0 0 0 .25rem #146c4380}.btn-check:checked+html .btn-outline-green-600,.btn-check:active+html .btn-outline-green-600,html .btn-outline-green-600:active,html .btn-outline-green-600.active,html .btn-outline-green-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-600,html[data-netbox-color-mode=dark] .btn-outline-green-600:active,html[data-netbox-color-mode=dark] .btn-outline-green-600.active,html[data-netbox-color-mode=dark] .btn-outline-green-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-600,html[data-netbox-color-mode=light] .btn-outline-green-600:active,html[data-netbox-color-mode=light] .btn-outline-green-600.active,html[data-netbox-color-mode=light] .btn-outline-green-600.dropdown-toggle.show{color:#fff;background-color:#146c43;border-color:#146c43}.btn-check:checked+html .btn-outline-green-600:focus,.btn-check:active+html .btn-outline-green-600:focus,html .btn-outline-green-600:active:focus,html .btn-outline-green-600.active:focus,html .btn-outline-green-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-600:focus,html[data-netbox-color-mode=dark] .btn-outline-green-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-600:focus,html[data-netbox-color-mode=light] .btn-outline-green-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #146c4380}html .btn-outline-green-600:disabled,html .btn-outline-green-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-600.disabled,html[data-netbox-color-mode=light] .btn-outline-green-600:disabled,html[data-netbox-color-mode=light] .btn-outline-green-600.disabled{color:#146c43;background-color:transparent}}@media print{html .btn-outline-green-700,html[data-netbox-color-mode=dark] .btn-outline-green-700,html[data-netbox-color-mode=light] .btn-outline-green-700{color:#0f5132;border-color:#0f5132}html .btn-outline-green-700:hover,html[data-netbox-color-mode=dark] .btn-outline-green-700:hover,html[data-netbox-color-mode=light] .btn-outline-green-700:hover{color:#fff;background-color:#0f5132;border-color:#0f5132}.btn-check:focus+html .btn-outline-green-700,html .btn-outline-green-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-700,html[data-netbox-color-mode=dark] .btn-outline-green-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-700,html[data-netbox-color-mode=light] .btn-outline-green-700:focus{box-shadow:0 0 0 .25rem #0f513280}.btn-check:checked+html .btn-outline-green-700,.btn-check:active+html .btn-outline-green-700,html .btn-outline-green-700:active,html .btn-outline-green-700.active,html .btn-outline-green-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-700,html[data-netbox-color-mode=dark] .btn-outline-green-700:active,html[data-netbox-color-mode=dark] .btn-outline-green-700.active,html[data-netbox-color-mode=dark] .btn-outline-green-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-700,html[data-netbox-color-mode=light] .btn-outline-green-700:active,html[data-netbox-color-mode=light] .btn-outline-green-700.active,html[data-netbox-color-mode=light] .btn-outline-green-700.dropdown-toggle.show{color:#fff;background-color:#0f5132;border-color:#0f5132}.btn-check:checked+html .btn-outline-green-700:focus,.btn-check:active+html .btn-outline-green-700:focus,html .btn-outline-green-700:active:focus,html .btn-outline-green-700.active:focus,html .btn-outline-green-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-700:focus,html[data-netbox-color-mode=dark] .btn-outline-green-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-700:focus,html[data-netbox-color-mode=light] .btn-outline-green-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0f513280}html .btn-outline-green-700:disabled,html .btn-outline-green-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-700.disabled,html[data-netbox-color-mode=light] .btn-outline-green-700:disabled,html[data-netbox-color-mode=light] .btn-outline-green-700.disabled{color:#0f5132;background-color:transparent}}@media print{html .btn-outline-green-800,html[data-netbox-color-mode=dark] .btn-outline-green-800,html[data-netbox-color-mode=light] .btn-outline-green-800{color:#0a3622;border-color:#0a3622}html .btn-outline-green-800:hover,html[data-netbox-color-mode=dark] .btn-outline-green-800:hover,html[data-netbox-color-mode=light] .btn-outline-green-800:hover{color:#fff;background-color:#0a3622;border-color:#0a3622}.btn-check:focus+html .btn-outline-green-800,html .btn-outline-green-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-800,html[data-netbox-color-mode=dark] .btn-outline-green-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-800,html[data-netbox-color-mode=light] .btn-outline-green-800:focus{box-shadow:0 0 0 .25rem #0a362280}.btn-check:checked+html .btn-outline-green-800,.btn-check:active+html .btn-outline-green-800,html .btn-outline-green-800:active,html .btn-outline-green-800.active,html .btn-outline-green-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-800,html[data-netbox-color-mode=dark] .btn-outline-green-800:active,html[data-netbox-color-mode=dark] .btn-outline-green-800.active,html[data-netbox-color-mode=dark] .btn-outline-green-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-800,html[data-netbox-color-mode=light] .btn-outline-green-800:active,html[data-netbox-color-mode=light] .btn-outline-green-800.active,html[data-netbox-color-mode=light] .btn-outline-green-800.dropdown-toggle.show{color:#fff;background-color:#0a3622;border-color:#0a3622}.btn-check:checked+html .btn-outline-green-800:focus,.btn-check:active+html .btn-outline-green-800:focus,html .btn-outline-green-800:active:focus,html .btn-outline-green-800.active:focus,html .btn-outline-green-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-800:focus,html[data-netbox-color-mode=dark] .btn-outline-green-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-800:focus,html[data-netbox-color-mode=light] .btn-outline-green-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0a362280}html .btn-outline-green-800:disabled,html .btn-outline-green-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-800.disabled,html[data-netbox-color-mode=light] .btn-outline-green-800:disabled,html[data-netbox-color-mode=light] .btn-outline-green-800.disabled{color:#0a3622;background-color:transparent}}@media print{html .btn-outline-green-900,html[data-netbox-color-mode=dark] .btn-outline-green-900,html[data-netbox-color-mode=light] .btn-outline-green-900{color:#051b11;border-color:#051b11}html .btn-outline-green-900:hover,html[data-netbox-color-mode=dark] .btn-outline-green-900:hover,html[data-netbox-color-mode=light] .btn-outline-green-900:hover{color:#fff;background-color:#051b11;border-color:#051b11}.btn-check:focus+html .btn-outline-green-900,html .btn-outline-green-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green-900,html[data-netbox-color-mode=dark] .btn-outline-green-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green-900,html[data-netbox-color-mode=light] .btn-outline-green-900:focus{box-shadow:0 0 0 .25rem #051b1180}.btn-check:checked+html .btn-outline-green-900,.btn-check:active+html .btn-outline-green-900,html .btn-outline-green-900:active,html .btn-outline-green-900.active,html .btn-outline-green-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-900,html[data-netbox-color-mode=dark] .btn-outline-green-900:active,html[data-netbox-color-mode=dark] .btn-outline-green-900.active,html[data-netbox-color-mode=dark] .btn-outline-green-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-900,html[data-netbox-color-mode=light] .btn-outline-green-900:active,html[data-netbox-color-mode=light] .btn-outline-green-900.active,html[data-netbox-color-mode=light] .btn-outline-green-900.dropdown-toggle.show{color:#fff;background-color:#051b11;border-color:#051b11}.btn-check:checked+html .btn-outline-green-900:focus,.btn-check:active+html .btn-outline-green-900:focus,html .btn-outline-green-900:active:focus,html .btn-outline-green-900.active:focus,html .btn-outline-green-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green-900:focus,html[data-netbox-color-mode=dark] .btn-outline-green-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green-900:focus,html[data-netbox-color-mode=light] .btn-outline-green-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-green-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-green-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #051b1180}html .btn-outline-green-900:disabled,html .btn-outline-green-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-green-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-green-900.disabled,html[data-netbox-color-mode=light] .btn-outline-green-900:disabled,html[data-netbox-color-mode=light] .btn-outline-green-900.disabled{color:#051b11;background-color:transparent}}@media print{html .btn-outline-blue-100,html[data-netbox-color-mode=dark] .btn-outline-blue-100,html[data-netbox-color-mode=light] .btn-outline-blue-100{color:#cfe2ff;border-color:#cfe2ff}html .btn-outline-blue-100:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-100:hover,html[data-netbox-color-mode=light] .btn-outline-blue-100:hover{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}.btn-check:focus+html .btn-outline-blue-100,html .btn-outline-blue-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-100,html[data-netbox-color-mode=dark] .btn-outline-blue-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-100,html[data-netbox-color-mode=light] .btn-outline-blue-100:focus{box-shadow:0 0 0 .25rem #cfe2ff80}.btn-check:checked+html .btn-outline-blue-100,.btn-check:active+html .btn-outline-blue-100,html .btn-outline-blue-100:active,html .btn-outline-blue-100.active,html .btn-outline-blue-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-100,html[data-netbox-color-mode=dark] .btn-outline-blue-100:active,html[data-netbox-color-mode=dark] .btn-outline-blue-100.active,html[data-netbox-color-mode=dark] .btn-outline-blue-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-100,html[data-netbox-color-mode=light] .btn-outline-blue-100:active,html[data-netbox-color-mode=light] .btn-outline-blue-100.active,html[data-netbox-color-mode=light] .btn-outline-blue-100.dropdown-toggle.show{color:#000;background-color:#cfe2ff;border-color:#cfe2ff}.btn-check:checked+html .btn-outline-blue-100:focus,.btn-check:active+html .btn-outline-blue-100:focus,html .btn-outline-blue-100:active:focus,html .btn-outline-blue-100.active:focus,html .btn-outline-blue-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-100:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-100:focus,html[data-netbox-color-mode=light] .btn-outline-blue-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cfe2ff80}html .btn-outline-blue-100:disabled,html .btn-outline-blue-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-100.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-100:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-100.disabled{color:#cfe2ff;background-color:transparent}}@media print{html .btn-outline-blue-200,html[data-netbox-color-mode=dark] .btn-outline-blue-200,html[data-netbox-color-mode=light] .btn-outline-blue-200{color:#9ec5fe;border-color:#9ec5fe}html .btn-outline-blue-200:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-200:hover,html[data-netbox-color-mode=light] .btn-outline-blue-200:hover{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}.btn-check:focus+html .btn-outline-blue-200,html .btn-outline-blue-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-200,html[data-netbox-color-mode=dark] .btn-outline-blue-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-200,html[data-netbox-color-mode=light] .btn-outline-blue-200:focus{box-shadow:0 0 0 .25rem #9ec5fe80}.btn-check:checked+html .btn-outline-blue-200,.btn-check:active+html .btn-outline-blue-200,html .btn-outline-blue-200:active,html .btn-outline-blue-200.active,html .btn-outline-blue-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-200,html[data-netbox-color-mode=dark] .btn-outline-blue-200:active,html[data-netbox-color-mode=dark] .btn-outline-blue-200.active,html[data-netbox-color-mode=dark] .btn-outline-blue-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-200,html[data-netbox-color-mode=light] .btn-outline-blue-200:active,html[data-netbox-color-mode=light] .btn-outline-blue-200.active,html[data-netbox-color-mode=light] .btn-outline-blue-200.dropdown-toggle.show{color:#000;background-color:#9ec5fe;border-color:#9ec5fe}.btn-check:checked+html .btn-outline-blue-200:focus,.btn-check:active+html .btn-outline-blue-200:focus,html .btn-outline-blue-200:active:focus,html .btn-outline-blue-200.active:focus,html .btn-outline-blue-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-200:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-200:focus,html[data-netbox-color-mode=light] .btn-outline-blue-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #9ec5fe80}html .btn-outline-blue-200:disabled,html .btn-outline-blue-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-200.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-200:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-200.disabled{color:#9ec5fe;background-color:transparent}}@media print{html .btn-outline-blue-300,html[data-netbox-color-mode=dark] .btn-outline-blue-300,html[data-netbox-color-mode=light] .btn-outline-blue-300{color:#6ea8fe;border-color:#6ea8fe}html .btn-outline-blue-300:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-300:hover,html[data-netbox-color-mode=light] .btn-outline-blue-300:hover{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:focus+html .btn-outline-blue-300,html .btn-outline-blue-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-300,html[data-netbox-color-mode=dark] .btn-outline-blue-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-300,html[data-netbox-color-mode=light] .btn-outline-blue-300:focus{box-shadow:0 0 0 .25rem #6ea8fe80}.btn-check:checked+html .btn-outline-blue-300,.btn-check:active+html .btn-outline-blue-300,html .btn-outline-blue-300:active,html .btn-outline-blue-300.active,html .btn-outline-blue-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-300,html[data-netbox-color-mode=dark] .btn-outline-blue-300:active,html[data-netbox-color-mode=dark] .btn-outline-blue-300.active,html[data-netbox-color-mode=dark] .btn-outline-blue-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-300,html[data-netbox-color-mode=light] .btn-outline-blue-300:active,html[data-netbox-color-mode=light] .btn-outline-blue-300.active,html[data-netbox-color-mode=light] .btn-outline-blue-300.dropdown-toggle.show{color:#000;background-color:#6ea8fe;border-color:#6ea8fe}.btn-check:checked+html .btn-outline-blue-300:focus,.btn-check:active+html .btn-outline-blue-300:focus,html .btn-outline-blue-300:active:focus,html .btn-outline-blue-300.active:focus,html .btn-outline-blue-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-300:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-300:focus,html[data-netbox-color-mode=light] .btn-outline-blue-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6ea8fe80}html .btn-outline-blue-300:disabled,html .btn-outline-blue-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-300.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-300:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-300.disabled{color:#6ea8fe;background-color:transparent}}@media print{html .btn-outline-blue-400,html[data-netbox-color-mode=dark] .btn-outline-blue-400,html[data-netbox-color-mode=light] .btn-outline-blue-400{color:#3d8bfd;border-color:#3d8bfd}html .btn-outline-blue-400:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-400:hover,html[data-netbox-color-mode=light] .btn-outline-blue-400:hover{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}.btn-check:focus+html .btn-outline-blue-400,html .btn-outline-blue-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-400,html[data-netbox-color-mode=dark] .btn-outline-blue-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-400,html[data-netbox-color-mode=light] .btn-outline-blue-400:focus{box-shadow:0 0 0 .25rem #3d8bfd80}.btn-check:checked+html .btn-outline-blue-400,.btn-check:active+html .btn-outline-blue-400,html .btn-outline-blue-400:active,html .btn-outline-blue-400.active,html .btn-outline-blue-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-400,html[data-netbox-color-mode=dark] .btn-outline-blue-400:active,html[data-netbox-color-mode=dark] .btn-outline-blue-400.active,html[data-netbox-color-mode=dark] .btn-outline-blue-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-400,html[data-netbox-color-mode=light] .btn-outline-blue-400:active,html[data-netbox-color-mode=light] .btn-outline-blue-400.active,html[data-netbox-color-mode=light] .btn-outline-blue-400.dropdown-toggle.show{color:#000;background-color:#3d8bfd;border-color:#3d8bfd}.btn-check:checked+html .btn-outline-blue-400:focus,.btn-check:active+html .btn-outline-blue-400:focus,html .btn-outline-blue-400:active:focus,html .btn-outline-blue-400.active:focus,html .btn-outline-blue-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-400:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-400:focus,html[data-netbox-color-mode=light] .btn-outline-blue-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3d8bfd80}html .btn-outline-blue-400:disabled,html .btn-outline-blue-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-400.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-400:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-400.disabled{color:#3d8bfd;background-color:transparent}}@media print{html .btn-outline-blue-500,html[data-netbox-color-mode=dark] .btn-outline-blue-500,html[data-netbox-color-mode=light] .btn-outline-blue-500{color:#0d6efd;border-color:#0d6efd}html .btn-outline-blue-500:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-500:hover,html[data-netbox-color-mode=light] .btn-outline-blue-500:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+html .btn-outline-blue-500,html .btn-outline-blue-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-500,html[data-netbox-color-mode=dark] .btn-outline-blue-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-500,html[data-netbox-color-mode=light] .btn-outline-blue-500:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-check:checked+html .btn-outline-blue-500,.btn-check:active+html .btn-outline-blue-500,html .btn-outline-blue-500:active,html .btn-outline-blue-500.active,html .btn-outline-blue-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-500,html[data-netbox-color-mode=dark] .btn-outline-blue-500:active,html[data-netbox-color-mode=dark] .btn-outline-blue-500.active,html[data-netbox-color-mode=dark] .btn-outline-blue-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-500,html[data-netbox-color-mode=light] .btn-outline-blue-500:active,html[data-netbox-color-mode=light] .btn-outline-blue-500.active,html[data-netbox-color-mode=light] .btn-outline-blue-500.dropdown-toggle.show{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:checked+html .btn-outline-blue-500:focus,.btn-check:active+html .btn-outline-blue-500:focus,html .btn-outline-blue-500:active:focus,html .btn-outline-blue-500.active:focus,html .btn-outline-blue-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-500:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-500:focus,html[data-netbox-color-mode=light] .btn-outline-blue-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0d6efd80}html .btn-outline-blue-500:disabled,html .btn-outline-blue-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-500.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-500:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-500.disabled{color:#0d6efd;background-color:transparent}}@media print{html .btn-outline-blue-600,html[data-netbox-color-mode=dark] .btn-outline-blue-600,html[data-netbox-color-mode=light] .btn-outline-blue-600{color:#0a58ca;border-color:#0a58ca}html .btn-outline-blue-600:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-600:hover,html[data-netbox-color-mode=light] .btn-outline-blue-600:hover{color:#fff;background-color:#0a58ca;border-color:#0a58ca}.btn-check:focus+html .btn-outline-blue-600,html .btn-outline-blue-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-600,html[data-netbox-color-mode=dark] .btn-outline-blue-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-600,html[data-netbox-color-mode=light] .btn-outline-blue-600:focus{box-shadow:0 0 0 .25rem #0a58ca80}.btn-check:checked+html .btn-outline-blue-600,.btn-check:active+html .btn-outline-blue-600,html .btn-outline-blue-600:active,html .btn-outline-blue-600.active,html .btn-outline-blue-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-600,html[data-netbox-color-mode=dark] .btn-outline-blue-600:active,html[data-netbox-color-mode=dark] .btn-outline-blue-600.active,html[data-netbox-color-mode=dark] .btn-outline-blue-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-600,html[data-netbox-color-mode=light] .btn-outline-blue-600:active,html[data-netbox-color-mode=light] .btn-outline-blue-600.active,html[data-netbox-color-mode=light] .btn-outline-blue-600.dropdown-toggle.show{color:#fff;background-color:#0a58ca;border-color:#0a58ca}.btn-check:checked+html .btn-outline-blue-600:focus,.btn-check:active+html .btn-outline-blue-600:focus,html .btn-outline-blue-600:active:focus,html .btn-outline-blue-600.active:focus,html .btn-outline-blue-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-600:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-600:focus,html[data-netbox-color-mode=light] .btn-outline-blue-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0a58ca80}html .btn-outline-blue-600:disabled,html .btn-outline-blue-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-600.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-600:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-600.disabled{color:#0a58ca;background-color:transparent}}@media print{html .btn-outline-blue-700,html[data-netbox-color-mode=dark] .btn-outline-blue-700,html[data-netbox-color-mode=light] .btn-outline-blue-700{color:#084298;border-color:#084298}html .btn-outline-blue-700:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-700:hover,html[data-netbox-color-mode=light] .btn-outline-blue-700:hover{color:#fff;background-color:#084298;border-color:#084298}.btn-check:focus+html .btn-outline-blue-700,html .btn-outline-blue-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-700,html[data-netbox-color-mode=dark] .btn-outline-blue-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-700,html[data-netbox-color-mode=light] .btn-outline-blue-700:focus{box-shadow:0 0 0 .25rem #08429880}.btn-check:checked+html .btn-outline-blue-700,.btn-check:active+html .btn-outline-blue-700,html .btn-outline-blue-700:active,html .btn-outline-blue-700.active,html .btn-outline-blue-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-700,html[data-netbox-color-mode=dark] .btn-outline-blue-700:active,html[data-netbox-color-mode=dark] .btn-outline-blue-700.active,html[data-netbox-color-mode=dark] .btn-outline-blue-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-700,html[data-netbox-color-mode=light] .btn-outline-blue-700:active,html[data-netbox-color-mode=light] .btn-outline-blue-700.active,html[data-netbox-color-mode=light] .btn-outline-blue-700.dropdown-toggle.show{color:#fff;background-color:#084298;border-color:#084298}.btn-check:checked+html .btn-outline-blue-700:focus,.btn-check:active+html .btn-outline-blue-700:focus,html .btn-outline-blue-700:active:focus,html .btn-outline-blue-700.active:focus,html .btn-outline-blue-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-700:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-700:focus,html[data-netbox-color-mode=light] .btn-outline-blue-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #08429880}html .btn-outline-blue-700:disabled,html .btn-outline-blue-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-700.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-700:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-700.disabled{color:#084298;background-color:transparent}}@media print{html .btn-outline-blue-800,html[data-netbox-color-mode=dark] .btn-outline-blue-800,html[data-netbox-color-mode=light] .btn-outline-blue-800{color:#052c65;border-color:#052c65}html .btn-outline-blue-800:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-800:hover,html[data-netbox-color-mode=light] .btn-outline-blue-800:hover{color:#fff;background-color:#052c65;border-color:#052c65}.btn-check:focus+html .btn-outline-blue-800,html .btn-outline-blue-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-800,html[data-netbox-color-mode=dark] .btn-outline-blue-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-800,html[data-netbox-color-mode=light] .btn-outline-blue-800:focus{box-shadow:0 0 0 .25rem #052c6580}.btn-check:checked+html .btn-outline-blue-800,.btn-check:active+html .btn-outline-blue-800,html .btn-outline-blue-800:active,html .btn-outline-blue-800.active,html .btn-outline-blue-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-800,html[data-netbox-color-mode=dark] .btn-outline-blue-800:active,html[data-netbox-color-mode=dark] .btn-outline-blue-800.active,html[data-netbox-color-mode=dark] .btn-outline-blue-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-800,html[data-netbox-color-mode=light] .btn-outline-blue-800:active,html[data-netbox-color-mode=light] .btn-outline-blue-800.active,html[data-netbox-color-mode=light] .btn-outline-blue-800.dropdown-toggle.show{color:#fff;background-color:#052c65;border-color:#052c65}.btn-check:checked+html .btn-outline-blue-800:focus,.btn-check:active+html .btn-outline-blue-800:focus,html .btn-outline-blue-800:active:focus,html .btn-outline-blue-800.active:focus,html .btn-outline-blue-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-800:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-800:focus,html[data-netbox-color-mode=light] .btn-outline-blue-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #052c6580}html .btn-outline-blue-800:disabled,html .btn-outline-blue-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-800.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-800:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-800.disabled{color:#052c65;background-color:transparent}}@media print{html .btn-outline-blue-900,html[data-netbox-color-mode=dark] .btn-outline-blue-900,html[data-netbox-color-mode=light] .btn-outline-blue-900{color:#031633;border-color:#031633}html .btn-outline-blue-900:hover,html[data-netbox-color-mode=dark] .btn-outline-blue-900:hover,html[data-netbox-color-mode=light] .btn-outline-blue-900:hover{color:#fff;background-color:#031633;border-color:#031633}.btn-check:focus+html .btn-outline-blue-900,html .btn-outline-blue-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue-900,html[data-netbox-color-mode=dark] .btn-outline-blue-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue-900,html[data-netbox-color-mode=light] .btn-outline-blue-900:focus{box-shadow:0 0 0 .25rem #03163380}.btn-check:checked+html .btn-outline-blue-900,.btn-check:active+html .btn-outline-blue-900,html .btn-outline-blue-900:active,html .btn-outline-blue-900.active,html .btn-outline-blue-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-900,html[data-netbox-color-mode=dark] .btn-outline-blue-900:active,html[data-netbox-color-mode=dark] .btn-outline-blue-900.active,html[data-netbox-color-mode=dark] .btn-outline-blue-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-900,html[data-netbox-color-mode=light] .btn-outline-blue-900:active,html[data-netbox-color-mode=light] .btn-outline-blue-900.active,html[data-netbox-color-mode=light] .btn-outline-blue-900.dropdown-toggle.show{color:#fff;background-color:#031633;border-color:#031633}.btn-check:checked+html .btn-outline-blue-900:focus,.btn-check:active+html .btn-outline-blue-900:focus,html .btn-outline-blue-900:active:focus,html .btn-outline-blue-900.active:focus,html .btn-outline-blue-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue-900:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue-900:focus,html[data-netbox-color-mode=light] .btn-outline-blue-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #03163380}html .btn-outline-blue-900:disabled,html .btn-outline-blue-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue-900.disabled,html[data-netbox-color-mode=light] .btn-outline-blue-900:disabled,html[data-netbox-color-mode=light] .btn-outline-blue-900.disabled{color:#031633;background-color:transparent}}@media print{html .btn-outline-cyan-100,html[data-netbox-color-mode=dark] .btn-outline-cyan-100,html[data-netbox-color-mode=light] .btn-outline-cyan-100{color:#cff4fc;border-color:#cff4fc}html .btn-outline-cyan-100:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-100:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-100:hover{color:#000;background-color:#cff4fc;border-color:#cff4fc}.btn-check:focus+html .btn-outline-cyan-100,html .btn-outline-cyan-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-100,html[data-netbox-color-mode=dark] .btn-outline-cyan-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-100,html[data-netbox-color-mode=light] .btn-outline-cyan-100:focus{box-shadow:0 0 0 .25rem #cff4fc80}.btn-check:checked+html .btn-outline-cyan-100,.btn-check:active+html .btn-outline-cyan-100,html .btn-outline-cyan-100:active,html .btn-outline-cyan-100.active,html .btn-outline-cyan-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-100,html[data-netbox-color-mode=dark] .btn-outline-cyan-100:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-100,html[data-netbox-color-mode=light] .btn-outline-cyan-100:active,html[data-netbox-color-mode=light] .btn-outline-cyan-100.active,html[data-netbox-color-mode=light] .btn-outline-cyan-100.dropdown-toggle.show{color:#000;background-color:#cff4fc;border-color:#cff4fc}.btn-check:checked+html .btn-outline-cyan-100:focus,.btn-check:active+html .btn-outline-cyan-100:focus,html .btn-outline-cyan-100:active:focus,html .btn-outline-cyan-100.active:focus,html .btn-outline-cyan-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-100:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-100:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #cff4fc80}html .btn-outline-cyan-100:disabled,html .btn-outline-cyan-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-100.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-100:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-100.disabled{color:#cff4fc;background-color:transparent}}@media print{html .btn-outline-cyan-200,html[data-netbox-color-mode=dark] .btn-outline-cyan-200,html[data-netbox-color-mode=light] .btn-outline-cyan-200{color:#9eeaf9;border-color:#9eeaf9}html .btn-outline-cyan-200:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-200:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-200:hover{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}.btn-check:focus+html .btn-outline-cyan-200,html .btn-outline-cyan-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-200,html[data-netbox-color-mode=dark] .btn-outline-cyan-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-200,html[data-netbox-color-mode=light] .btn-outline-cyan-200:focus{box-shadow:0 0 0 .25rem #9eeaf980}.btn-check:checked+html .btn-outline-cyan-200,.btn-check:active+html .btn-outline-cyan-200,html .btn-outline-cyan-200:active,html .btn-outline-cyan-200.active,html .btn-outline-cyan-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-200,html[data-netbox-color-mode=dark] .btn-outline-cyan-200:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-200,html[data-netbox-color-mode=light] .btn-outline-cyan-200:active,html[data-netbox-color-mode=light] .btn-outline-cyan-200.active,html[data-netbox-color-mode=light] .btn-outline-cyan-200.dropdown-toggle.show{color:#000;background-color:#9eeaf9;border-color:#9eeaf9}.btn-check:checked+html .btn-outline-cyan-200:focus,.btn-check:active+html .btn-outline-cyan-200:focus,html .btn-outline-cyan-200:active:focus,html .btn-outline-cyan-200.active:focus,html .btn-outline-cyan-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-200:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-200:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #9eeaf980}html .btn-outline-cyan-200:disabled,html .btn-outline-cyan-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-200.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-200:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-200.disabled{color:#9eeaf9;background-color:transparent}}@media print{html .btn-outline-cyan-300,html[data-netbox-color-mode=dark] .btn-outline-cyan-300,html[data-netbox-color-mode=light] .btn-outline-cyan-300{color:#6edff6;border-color:#6edff6}html .btn-outline-cyan-300:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-300:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-300:hover{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:focus+html .btn-outline-cyan-300,html .btn-outline-cyan-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-300,html[data-netbox-color-mode=dark] .btn-outline-cyan-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-300,html[data-netbox-color-mode=light] .btn-outline-cyan-300:focus{box-shadow:0 0 0 .25rem #6edff680}.btn-check:checked+html .btn-outline-cyan-300,.btn-check:active+html .btn-outline-cyan-300,html .btn-outline-cyan-300:active,html .btn-outline-cyan-300.active,html .btn-outline-cyan-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-300,html[data-netbox-color-mode=dark] .btn-outline-cyan-300:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-300,html[data-netbox-color-mode=light] .btn-outline-cyan-300:active,html[data-netbox-color-mode=light] .btn-outline-cyan-300.active,html[data-netbox-color-mode=light] .btn-outline-cyan-300.dropdown-toggle.show{color:#000;background-color:#6edff6;border-color:#6edff6}.btn-check:checked+html .btn-outline-cyan-300:focus,.btn-check:active+html .btn-outline-cyan-300:focus,html .btn-outline-cyan-300:active:focus,html .btn-outline-cyan-300.active:focus,html .btn-outline-cyan-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-300:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-300:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6edff680}html .btn-outline-cyan-300:disabled,html .btn-outline-cyan-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-300.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-300:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-300.disabled{color:#6edff6;background-color:transparent}}@media print{html .btn-outline-cyan-400,html[data-netbox-color-mode=dark] .btn-outline-cyan-400,html[data-netbox-color-mode=light] .btn-outline-cyan-400{color:#3dd5f3;border-color:#3dd5f3}html .btn-outline-cyan-400:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-400:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-400:hover{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}.btn-check:focus+html .btn-outline-cyan-400,html .btn-outline-cyan-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-400,html[data-netbox-color-mode=dark] .btn-outline-cyan-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-400,html[data-netbox-color-mode=light] .btn-outline-cyan-400:focus{box-shadow:0 0 0 .25rem #3dd5f380}.btn-check:checked+html .btn-outline-cyan-400,.btn-check:active+html .btn-outline-cyan-400,html .btn-outline-cyan-400:active,html .btn-outline-cyan-400.active,html .btn-outline-cyan-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-400,html[data-netbox-color-mode=dark] .btn-outline-cyan-400:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-400,html[data-netbox-color-mode=light] .btn-outline-cyan-400:active,html[data-netbox-color-mode=light] .btn-outline-cyan-400.active,html[data-netbox-color-mode=light] .btn-outline-cyan-400.dropdown-toggle.show{color:#000;background-color:#3dd5f3;border-color:#3dd5f3}.btn-check:checked+html .btn-outline-cyan-400:focus,.btn-check:active+html .btn-outline-cyan-400:focus,html .btn-outline-cyan-400:active:focus,html .btn-outline-cyan-400.active:focus,html .btn-outline-cyan-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-400:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-400:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3dd5f380}html .btn-outline-cyan-400:disabled,html .btn-outline-cyan-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-400.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-400:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-400.disabled{color:#3dd5f3;background-color:transparent}}@media print{html .btn-outline-cyan-500,html[data-netbox-color-mode=dark] .btn-outline-cyan-500,html[data-netbox-color-mode=light] .btn-outline-cyan-500{color:#0dcaf0;border-color:#0dcaf0}html .btn-outline-cyan-500:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-500:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-500:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+html .btn-outline-cyan-500,html .btn-outline-cyan-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-500,html[data-netbox-color-mode=dark] .btn-outline-cyan-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-500,html[data-netbox-color-mode=light] .btn-outline-cyan-500:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-check:checked+html .btn-outline-cyan-500,.btn-check:active+html .btn-outline-cyan-500,html .btn-outline-cyan-500:active,html .btn-outline-cyan-500.active,html .btn-outline-cyan-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-500,html[data-netbox-color-mode=dark] .btn-outline-cyan-500:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-500,html[data-netbox-color-mode=light] .btn-outline-cyan-500:active,html[data-netbox-color-mode=light] .btn-outline-cyan-500.active,html[data-netbox-color-mode=light] .btn-outline-cyan-500.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+html .btn-outline-cyan-500:focus,.btn-check:active+html .btn-outline-cyan-500:focus,html .btn-outline-cyan-500:active:focus,html .btn-outline-cyan-500.active:focus,html .btn-outline-cyan-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-500:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-500:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0dcaf080}html .btn-outline-cyan-500:disabled,html .btn-outline-cyan-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-500.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-500:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-500.disabled{color:#0dcaf0;background-color:transparent}}@media print{html .btn-outline-cyan-600,html[data-netbox-color-mode=dark] .btn-outline-cyan-600,html[data-netbox-color-mode=light] .btn-outline-cyan-600{color:#0aa2c0;border-color:#0aa2c0}html .btn-outline-cyan-600:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-600:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-600:hover{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}.btn-check:focus+html .btn-outline-cyan-600,html .btn-outline-cyan-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-600,html[data-netbox-color-mode=dark] .btn-outline-cyan-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-600,html[data-netbox-color-mode=light] .btn-outline-cyan-600:focus{box-shadow:0 0 0 .25rem #0aa2c080}.btn-check:checked+html .btn-outline-cyan-600,.btn-check:active+html .btn-outline-cyan-600,html .btn-outline-cyan-600:active,html .btn-outline-cyan-600.active,html .btn-outline-cyan-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-600,html[data-netbox-color-mode=dark] .btn-outline-cyan-600:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-600,html[data-netbox-color-mode=light] .btn-outline-cyan-600:active,html[data-netbox-color-mode=light] .btn-outline-cyan-600.active,html[data-netbox-color-mode=light] .btn-outline-cyan-600.dropdown-toggle.show{color:#000;background-color:#0aa2c0;border-color:#0aa2c0}.btn-check:checked+html .btn-outline-cyan-600:focus,.btn-check:active+html .btn-outline-cyan-600:focus,html .btn-outline-cyan-600:active:focus,html .btn-outline-cyan-600.active:focus,html .btn-outline-cyan-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-600:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-600:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0aa2c080}html .btn-outline-cyan-600:disabled,html .btn-outline-cyan-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-600.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-600:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-600.disabled{color:#0aa2c0;background-color:transparent}}@media print{html .btn-outline-cyan-700,html[data-netbox-color-mode=dark] .btn-outline-cyan-700,html[data-netbox-color-mode=light] .btn-outline-cyan-700{color:#087990;border-color:#087990}html .btn-outline-cyan-700:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-700:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-700:hover{color:#fff;background-color:#087990;border-color:#087990}.btn-check:focus+html .btn-outline-cyan-700,html .btn-outline-cyan-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-700,html[data-netbox-color-mode=dark] .btn-outline-cyan-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-700,html[data-netbox-color-mode=light] .btn-outline-cyan-700:focus{box-shadow:0 0 0 .25rem #08799080}.btn-check:checked+html .btn-outline-cyan-700,.btn-check:active+html .btn-outline-cyan-700,html .btn-outline-cyan-700:active,html .btn-outline-cyan-700.active,html .btn-outline-cyan-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-700,html[data-netbox-color-mode=dark] .btn-outline-cyan-700:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-700,html[data-netbox-color-mode=light] .btn-outline-cyan-700:active,html[data-netbox-color-mode=light] .btn-outline-cyan-700.active,html[data-netbox-color-mode=light] .btn-outline-cyan-700.dropdown-toggle.show{color:#fff;background-color:#087990;border-color:#087990}.btn-check:checked+html .btn-outline-cyan-700:focus,.btn-check:active+html .btn-outline-cyan-700:focus,html .btn-outline-cyan-700:active:focus,html .btn-outline-cyan-700.active:focus,html .btn-outline-cyan-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-700:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-700:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #08799080}html .btn-outline-cyan-700:disabled,html .btn-outline-cyan-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-700.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-700:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-700.disabled{color:#087990;background-color:transparent}}@media print{html .btn-outline-cyan-800,html[data-netbox-color-mode=dark] .btn-outline-cyan-800,html[data-netbox-color-mode=light] .btn-outline-cyan-800{color:#055160;border-color:#055160}html .btn-outline-cyan-800:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-800:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-800:hover{color:#fff;background-color:#055160;border-color:#055160}.btn-check:focus+html .btn-outline-cyan-800,html .btn-outline-cyan-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-800,html[data-netbox-color-mode=dark] .btn-outline-cyan-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-800,html[data-netbox-color-mode=light] .btn-outline-cyan-800:focus{box-shadow:0 0 0 .25rem #05516080}.btn-check:checked+html .btn-outline-cyan-800,.btn-check:active+html .btn-outline-cyan-800,html .btn-outline-cyan-800:active,html .btn-outline-cyan-800.active,html .btn-outline-cyan-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-800,html[data-netbox-color-mode=dark] .btn-outline-cyan-800:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-800,html[data-netbox-color-mode=light] .btn-outline-cyan-800:active,html[data-netbox-color-mode=light] .btn-outline-cyan-800.active,html[data-netbox-color-mode=light] .btn-outline-cyan-800.dropdown-toggle.show{color:#fff;background-color:#055160;border-color:#055160}.btn-check:checked+html .btn-outline-cyan-800:focus,.btn-check:active+html .btn-outline-cyan-800:focus,html .btn-outline-cyan-800:active:focus,html .btn-outline-cyan-800.active:focus,html .btn-outline-cyan-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-800:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-800:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #05516080}html .btn-outline-cyan-800:disabled,html .btn-outline-cyan-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-800.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-800:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-800.disabled{color:#055160;background-color:transparent}}@media print{html .btn-outline-cyan-900,html[data-netbox-color-mode=dark] .btn-outline-cyan-900,html[data-netbox-color-mode=light] .btn-outline-cyan-900{color:#032830;border-color:#032830}html .btn-outline-cyan-900:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan-900:hover,html[data-netbox-color-mode=light] .btn-outline-cyan-900:hover{color:#fff;background-color:#032830;border-color:#032830}.btn-check:focus+html .btn-outline-cyan-900,html .btn-outline-cyan-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan-900,html[data-netbox-color-mode=dark] .btn-outline-cyan-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan-900,html[data-netbox-color-mode=light] .btn-outline-cyan-900:focus{box-shadow:0 0 0 .25rem #03283080}.btn-check:checked+html .btn-outline-cyan-900,.btn-check:active+html .btn-outline-cyan-900,html .btn-outline-cyan-900:active,html .btn-outline-cyan-900.active,html .btn-outline-cyan-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-900,html[data-netbox-color-mode=dark] .btn-outline-cyan-900:active,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.active,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-900,html[data-netbox-color-mode=light] .btn-outline-cyan-900:active,html[data-netbox-color-mode=light] .btn-outline-cyan-900.active,html[data-netbox-color-mode=light] .btn-outline-cyan-900.dropdown-toggle.show{color:#fff;background-color:#032830;border-color:#032830}.btn-check:checked+html .btn-outline-cyan-900:focus,.btn-check:active+html .btn-outline-cyan-900:focus,html .btn-outline-cyan-900:active:focus,html .btn-outline-cyan-900.active:focus,html .btn-outline-cyan-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan-900:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan-900:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #03283080}html .btn-outline-cyan-900:disabled,html .btn-outline-cyan-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan-900.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-900:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan-900.disabled{color:#032830;background-color:transparent}}@media print{html .btn-outline-indigo-100,html[data-netbox-color-mode=dark] .btn-outline-indigo-100,html[data-netbox-color-mode=light] .btn-outline-indigo-100{color:#e0cffc;border-color:#e0cffc}html .btn-outline-indigo-100:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-100:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-100:hover{color:#000;background-color:#e0cffc;border-color:#e0cffc}.btn-check:focus+html .btn-outline-indigo-100,html .btn-outline-indigo-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-100,html[data-netbox-color-mode=dark] .btn-outline-indigo-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-100,html[data-netbox-color-mode=light] .btn-outline-indigo-100:focus{box-shadow:0 0 0 .25rem #e0cffc80}.btn-check:checked+html .btn-outline-indigo-100,.btn-check:active+html .btn-outline-indigo-100,html .btn-outline-indigo-100:active,html .btn-outline-indigo-100.active,html .btn-outline-indigo-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-100,html[data-netbox-color-mode=dark] .btn-outline-indigo-100:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-100,html[data-netbox-color-mode=light] .btn-outline-indigo-100:active,html[data-netbox-color-mode=light] .btn-outline-indigo-100.active,html[data-netbox-color-mode=light] .btn-outline-indigo-100.dropdown-toggle.show{color:#000;background-color:#e0cffc;border-color:#e0cffc}.btn-check:checked+html .btn-outline-indigo-100:focus,.btn-check:active+html .btn-outline-indigo-100:focus,html .btn-outline-indigo-100:active:focus,html .btn-outline-indigo-100.active:focus,html .btn-outline-indigo-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-100:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-100:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e0cffc80}html .btn-outline-indigo-100:disabled,html .btn-outline-indigo-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-100.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-100:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-100.disabled{color:#e0cffc;background-color:transparent}}@media print{html .btn-outline-indigo-200,html[data-netbox-color-mode=dark] .btn-outline-indigo-200,html[data-netbox-color-mode=light] .btn-outline-indigo-200{color:#c29ffa;border-color:#c29ffa}html .btn-outline-indigo-200:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-200:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-200:hover{color:#000;background-color:#c29ffa;border-color:#c29ffa}.btn-check:focus+html .btn-outline-indigo-200,html .btn-outline-indigo-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-200,html[data-netbox-color-mode=dark] .btn-outline-indigo-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-200,html[data-netbox-color-mode=light] .btn-outline-indigo-200:focus{box-shadow:0 0 0 .25rem #c29ffa80}.btn-check:checked+html .btn-outline-indigo-200,.btn-check:active+html .btn-outline-indigo-200,html .btn-outline-indigo-200:active,html .btn-outline-indigo-200.active,html .btn-outline-indigo-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-200,html[data-netbox-color-mode=dark] .btn-outline-indigo-200:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-200,html[data-netbox-color-mode=light] .btn-outline-indigo-200:active,html[data-netbox-color-mode=light] .btn-outline-indigo-200.active,html[data-netbox-color-mode=light] .btn-outline-indigo-200.dropdown-toggle.show{color:#000;background-color:#c29ffa;border-color:#c29ffa}.btn-check:checked+html .btn-outline-indigo-200:focus,.btn-check:active+html .btn-outline-indigo-200:focus,html .btn-outline-indigo-200:active:focus,html .btn-outline-indigo-200.active:focus,html .btn-outline-indigo-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-200:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-200:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #c29ffa80}html .btn-outline-indigo-200:disabled,html .btn-outline-indigo-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-200.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-200:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-200.disabled{color:#c29ffa;background-color:transparent}}@media print{html .btn-outline-indigo-300,html[data-netbox-color-mode=dark] .btn-outline-indigo-300,html[data-netbox-color-mode=light] .btn-outline-indigo-300{color:#a370f7;border-color:#a370f7}html .btn-outline-indigo-300:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-300:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-300:hover{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:focus+html .btn-outline-indigo-300,html .btn-outline-indigo-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-300,html[data-netbox-color-mode=dark] .btn-outline-indigo-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-300,html[data-netbox-color-mode=light] .btn-outline-indigo-300:focus{box-shadow:0 0 0 .25rem #a370f780}.btn-check:checked+html .btn-outline-indigo-300,.btn-check:active+html .btn-outline-indigo-300,html .btn-outline-indigo-300:active,html .btn-outline-indigo-300.active,html .btn-outline-indigo-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-300,html[data-netbox-color-mode=dark] .btn-outline-indigo-300:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-300,html[data-netbox-color-mode=light] .btn-outline-indigo-300:active,html[data-netbox-color-mode=light] .btn-outline-indigo-300.active,html[data-netbox-color-mode=light] .btn-outline-indigo-300.dropdown-toggle.show{color:#000;background-color:#a370f7;border-color:#a370f7}.btn-check:checked+html .btn-outline-indigo-300:focus,.btn-check:active+html .btn-outline-indigo-300:focus,html .btn-outline-indigo-300:active:focus,html .btn-outline-indigo-300.active:focus,html .btn-outline-indigo-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-300:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-300:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a370f780}html .btn-outline-indigo-300:disabled,html .btn-outline-indigo-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-300.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-300:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-300.disabled{color:#a370f7;background-color:transparent}}@media print{html .btn-outline-indigo-400,html[data-netbox-color-mode=dark] .btn-outline-indigo-400,html[data-netbox-color-mode=light] .btn-outline-indigo-400{color:#8540f5;border-color:#8540f5}html .btn-outline-indigo-400:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-400:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-400:hover{color:#fff;background-color:#8540f5;border-color:#8540f5}.btn-check:focus+html .btn-outline-indigo-400,html .btn-outline-indigo-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-400,html[data-netbox-color-mode=dark] .btn-outline-indigo-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-400,html[data-netbox-color-mode=light] .btn-outline-indigo-400:focus{box-shadow:0 0 0 .25rem #8540f580}.btn-check:checked+html .btn-outline-indigo-400,.btn-check:active+html .btn-outline-indigo-400,html .btn-outline-indigo-400:active,html .btn-outline-indigo-400.active,html .btn-outline-indigo-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-400,html[data-netbox-color-mode=dark] .btn-outline-indigo-400:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-400,html[data-netbox-color-mode=light] .btn-outline-indigo-400:active,html[data-netbox-color-mode=light] .btn-outline-indigo-400.active,html[data-netbox-color-mode=light] .btn-outline-indigo-400.dropdown-toggle.show{color:#fff;background-color:#8540f5;border-color:#8540f5}.btn-check:checked+html .btn-outline-indigo-400:focus,.btn-check:active+html .btn-outline-indigo-400:focus,html .btn-outline-indigo-400:active:focus,html .btn-outline-indigo-400.active:focus,html .btn-outline-indigo-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-400:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-400:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #8540f580}html .btn-outline-indigo-400:disabled,html .btn-outline-indigo-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-400.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-400:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-400.disabled{color:#8540f5;background-color:transparent}}@media print{html .btn-outline-indigo-500,html[data-netbox-color-mode=dark] .btn-outline-indigo-500,html[data-netbox-color-mode=light] .btn-outline-indigo-500{color:#6610f2;border-color:#6610f2}html .btn-outline-indigo-500:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-500:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-500:hover{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:focus+html .btn-outline-indigo-500,html .btn-outline-indigo-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-500,html[data-netbox-color-mode=dark] .btn-outline-indigo-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-500,html[data-netbox-color-mode=light] .btn-outline-indigo-500:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-check:checked+html .btn-outline-indigo-500,.btn-check:active+html .btn-outline-indigo-500,html .btn-outline-indigo-500:active,html .btn-outline-indigo-500.active,html .btn-outline-indigo-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-500,html[data-netbox-color-mode=dark] .btn-outline-indigo-500:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-500,html[data-netbox-color-mode=light] .btn-outline-indigo-500:active,html[data-netbox-color-mode=light] .btn-outline-indigo-500.active,html[data-netbox-color-mode=light] .btn-outline-indigo-500.dropdown-toggle.show{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:checked+html .btn-outline-indigo-500:focus,.btn-check:active+html .btn-outline-indigo-500:focus,html .btn-outline-indigo-500:active:focus,html .btn-outline-indigo-500.active:focus,html .btn-outline-indigo-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-500:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-500:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6610f280}html .btn-outline-indigo-500:disabled,html .btn-outline-indigo-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-500.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-500:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-500.disabled{color:#6610f2;background-color:transparent}}@media print{html .btn-outline-indigo-600,html[data-netbox-color-mode=dark] .btn-outline-indigo-600,html[data-netbox-color-mode=light] .btn-outline-indigo-600{color:#520dc2;border-color:#520dc2}html .btn-outline-indigo-600:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-600:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-600:hover{color:#fff;background-color:#520dc2;border-color:#520dc2}.btn-check:focus+html .btn-outline-indigo-600,html .btn-outline-indigo-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-600,html[data-netbox-color-mode=dark] .btn-outline-indigo-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-600,html[data-netbox-color-mode=light] .btn-outline-indigo-600:focus{box-shadow:0 0 0 .25rem #520dc280}.btn-check:checked+html .btn-outline-indigo-600,.btn-check:active+html .btn-outline-indigo-600,html .btn-outline-indigo-600:active,html .btn-outline-indigo-600.active,html .btn-outline-indigo-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-600,html[data-netbox-color-mode=dark] .btn-outline-indigo-600:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-600,html[data-netbox-color-mode=light] .btn-outline-indigo-600:active,html[data-netbox-color-mode=light] .btn-outline-indigo-600.active,html[data-netbox-color-mode=light] .btn-outline-indigo-600.dropdown-toggle.show{color:#fff;background-color:#520dc2;border-color:#520dc2}.btn-check:checked+html .btn-outline-indigo-600:focus,.btn-check:active+html .btn-outline-indigo-600:focus,html .btn-outline-indigo-600:active:focus,html .btn-outline-indigo-600.active:focus,html .btn-outline-indigo-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-600:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-600:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #520dc280}html .btn-outline-indigo-600:disabled,html .btn-outline-indigo-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-600.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-600:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-600.disabled{color:#520dc2;background-color:transparent}}@media print{html .btn-outline-indigo-700,html[data-netbox-color-mode=dark] .btn-outline-indigo-700,html[data-netbox-color-mode=light] .btn-outline-indigo-700{color:#3d0a91;border-color:#3d0a91}html .btn-outline-indigo-700:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-700:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-700:hover{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.btn-check:focus+html .btn-outline-indigo-700,html .btn-outline-indigo-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-700,html[data-netbox-color-mode=dark] .btn-outline-indigo-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-700,html[data-netbox-color-mode=light] .btn-outline-indigo-700:focus{box-shadow:0 0 0 .25rem #3d0a9180}.btn-check:checked+html .btn-outline-indigo-700,.btn-check:active+html .btn-outline-indigo-700,html .btn-outline-indigo-700:active,html .btn-outline-indigo-700.active,html .btn-outline-indigo-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-700,html[data-netbox-color-mode=dark] .btn-outline-indigo-700:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-700,html[data-netbox-color-mode=light] .btn-outline-indigo-700:active,html[data-netbox-color-mode=light] .btn-outline-indigo-700.active,html[data-netbox-color-mode=light] .btn-outline-indigo-700.dropdown-toggle.show{color:#fff;background-color:#3d0a91;border-color:#3d0a91}.btn-check:checked+html .btn-outline-indigo-700:focus,.btn-check:active+html .btn-outline-indigo-700:focus,html .btn-outline-indigo-700:active:focus,html .btn-outline-indigo-700.active:focus,html .btn-outline-indigo-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-700:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-700:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #3d0a9180}html .btn-outline-indigo-700:disabled,html .btn-outline-indigo-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-700.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-700:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-700.disabled{color:#3d0a91;background-color:transparent}}@media print{html .btn-outline-indigo-800,html[data-netbox-color-mode=dark] .btn-outline-indigo-800,html[data-netbox-color-mode=light] .btn-outline-indigo-800{color:#290661;border-color:#290661}html .btn-outline-indigo-800:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-800:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-800:hover{color:#fff;background-color:#290661;border-color:#290661}.btn-check:focus+html .btn-outline-indigo-800,html .btn-outline-indigo-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-800,html[data-netbox-color-mode=dark] .btn-outline-indigo-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-800,html[data-netbox-color-mode=light] .btn-outline-indigo-800:focus{box-shadow:0 0 0 .25rem #29066180}.btn-check:checked+html .btn-outline-indigo-800,.btn-check:active+html .btn-outline-indigo-800,html .btn-outline-indigo-800:active,html .btn-outline-indigo-800.active,html .btn-outline-indigo-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-800,html[data-netbox-color-mode=dark] .btn-outline-indigo-800:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-800,html[data-netbox-color-mode=light] .btn-outline-indigo-800:active,html[data-netbox-color-mode=light] .btn-outline-indigo-800.active,html[data-netbox-color-mode=light] .btn-outline-indigo-800.dropdown-toggle.show{color:#fff;background-color:#290661;border-color:#290661}.btn-check:checked+html .btn-outline-indigo-800:focus,.btn-check:active+html .btn-outline-indigo-800:focus,html .btn-outline-indigo-800:active:focus,html .btn-outline-indigo-800.active:focus,html .btn-outline-indigo-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-800:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-800:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #29066180}html .btn-outline-indigo-800:disabled,html .btn-outline-indigo-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-800.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-800:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-800.disabled{color:#290661;background-color:transparent}}@media print{html .btn-outline-indigo-900,html[data-netbox-color-mode=dark] .btn-outline-indigo-900,html[data-netbox-color-mode=light] .btn-outline-indigo-900{color:#140330;border-color:#140330}html .btn-outline-indigo-900:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo-900:hover,html[data-netbox-color-mode=light] .btn-outline-indigo-900:hover{color:#fff;background-color:#140330;border-color:#140330}.btn-check:focus+html .btn-outline-indigo-900,html .btn-outline-indigo-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo-900,html[data-netbox-color-mode=dark] .btn-outline-indigo-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo-900,html[data-netbox-color-mode=light] .btn-outline-indigo-900:focus{box-shadow:0 0 0 .25rem #14033080}.btn-check:checked+html .btn-outline-indigo-900,.btn-check:active+html .btn-outline-indigo-900,html .btn-outline-indigo-900:active,html .btn-outline-indigo-900.active,html .btn-outline-indigo-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-900,html[data-netbox-color-mode=dark] .btn-outline-indigo-900:active,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.active,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-900,html[data-netbox-color-mode=light] .btn-outline-indigo-900:active,html[data-netbox-color-mode=light] .btn-outline-indigo-900.active,html[data-netbox-color-mode=light] .btn-outline-indigo-900.dropdown-toggle.show{color:#fff;background-color:#140330;border-color:#140330}.btn-check:checked+html .btn-outline-indigo-900:focus,.btn-check:active+html .btn-outline-indigo-900:focus,html .btn-outline-indigo-900:active:focus,html .btn-outline-indigo-900.active:focus,html .btn-outline-indigo-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo-900:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo-900:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #14033080}html .btn-outline-indigo-900:disabled,html .btn-outline-indigo-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo-900.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-900:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo-900.disabled{color:#140330;background-color:transparent}}@media print{html .btn-outline-purple-100,html[data-netbox-color-mode=dark] .btn-outline-purple-100,html[data-netbox-color-mode=light] .btn-outline-purple-100{color:#e2d9f3;border-color:#e2d9f3}html .btn-outline-purple-100:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-100:hover,html[data-netbox-color-mode=light] .btn-outline-purple-100:hover{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}.btn-check:focus+html .btn-outline-purple-100,html .btn-outline-purple-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-100,html[data-netbox-color-mode=dark] .btn-outline-purple-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-100,html[data-netbox-color-mode=light] .btn-outline-purple-100:focus{box-shadow:0 0 0 .25rem #e2d9f380}.btn-check:checked+html .btn-outline-purple-100,.btn-check:active+html .btn-outline-purple-100,html .btn-outline-purple-100:active,html .btn-outline-purple-100.active,html .btn-outline-purple-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-100,html[data-netbox-color-mode=dark] .btn-outline-purple-100:active,html[data-netbox-color-mode=dark] .btn-outline-purple-100.active,html[data-netbox-color-mode=dark] .btn-outline-purple-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-100,html[data-netbox-color-mode=light] .btn-outline-purple-100:active,html[data-netbox-color-mode=light] .btn-outline-purple-100.active,html[data-netbox-color-mode=light] .btn-outline-purple-100.dropdown-toggle.show{color:#000;background-color:#e2d9f3;border-color:#e2d9f3}.btn-check:checked+html .btn-outline-purple-100:focus,.btn-check:active+html .btn-outline-purple-100:focus,html .btn-outline-purple-100:active:focus,html .btn-outline-purple-100.active:focus,html .btn-outline-purple-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-100:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-100:focus,html[data-netbox-color-mode=light] .btn-outline-purple-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e2d9f380}html .btn-outline-purple-100:disabled,html .btn-outline-purple-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-100.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-100:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-100.disabled{color:#e2d9f3;background-color:transparent}}@media print{html .btn-outline-purple-200,html[data-netbox-color-mode=dark] .btn-outline-purple-200,html[data-netbox-color-mode=light] .btn-outline-purple-200{color:#c5b3e6;border-color:#c5b3e6}html .btn-outline-purple-200:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-200:hover,html[data-netbox-color-mode=light] .btn-outline-purple-200:hover{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}.btn-check:focus+html .btn-outline-purple-200,html .btn-outline-purple-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-200,html[data-netbox-color-mode=dark] .btn-outline-purple-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-200,html[data-netbox-color-mode=light] .btn-outline-purple-200:focus{box-shadow:0 0 0 .25rem #c5b3e680}.btn-check:checked+html .btn-outline-purple-200,.btn-check:active+html .btn-outline-purple-200,html .btn-outline-purple-200:active,html .btn-outline-purple-200.active,html .btn-outline-purple-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-200,html[data-netbox-color-mode=dark] .btn-outline-purple-200:active,html[data-netbox-color-mode=dark] .btn-outline-purple-200.active,html[data-netbox-color-mode=dark] .btn-outline-purple-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-200,html[data-netbox-color-mode=light] .btn-outline-purple-200:active,html[data-netbox-color-mode=light] .btn-outline-purple-200.active,html[data-netbox-color-mode=light] .btn-outline-purple-200.dropdown-toggle.show{color:#000;background-color:#c5b3e6;border-color:#c5b3e6}.btn-check:checked+html .btn-outline-purple-200:focus,.btn-check:active+html .btn-outline-purple-200:focus,html .btn-outline-purple-200:active:focus,html .btn-outline-purple-200.active:focus,html .btn-outline-purple-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-200:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-200:focus,html[data-netbox-color-mode=light] .btn-outline-purple-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #c5b3e680}html .btn-outline-purple-200:disabled,html .btn-outline-purple-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-200.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-200:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-200.disabled{color:#c5b3e6;background-color:transparent}}@media print{html .btn-outline-purple-300,html[data-netbox-color-mode=dark] .btn-outline-purple-300,html[data-netbox-color-mode=light] .btn-outline-purple-300{color:#a98eda;border-color:#a98eda}html .btn-outline-purple-300:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-300:hover,html[data-netbox-color-mode=light] .btn-outline-purple-300:hover{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:focus+html .btn-outline-purple-300,html .btn-outline-purple-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-300,html[data-netbox-color-mode=dark] .btn-outline-purple-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-300,html[data-netbox-color-mode=light] .btn-outline-purple-300:focus{box-shadow:0 0 0 .25rem #a98eda80}.btn-check:checked+html .btn-outline-purple-300,.btn-check:active+html .btn-outline-purple-300,html .btn-outline-purple-300:active,html .btn-outline-purple-300.active,html .btn-outline-purple-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-300,html[data-netbox-color-mode=dark] .btn-outline-purple-300:active,html[data-netbox-color-mode=dark] .btn-outline-purple-300.active,html[data-netbox-color-mode=dark] .btn-outline-purple-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-300,html[data-netbox-color-mode=light] .btn-outline-purple-300:active,html[data-netbox-color-mode=light] .btn-outline-purple-300.active,html[data-netbox-color-mode=light] .btn-outline-purple-300.dropdown-toggle.show{color:#000;background-color:#a98eda;border-color:#a98eda}.btn-check:checked+html .btn-outline-purple-300:focus,.btn-check:active+html .btn-outline-purple-300:focus,html .btn-outline-purple-300:active:focus,html .btn-outline-purple-300.active:focus,html .btn-outline-purple-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-300:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-300:focus,html[data-netbox-color-mode=light] .btn-outline-purple-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #a98eda80}html .btn-outline-purple-300:disabled,html .btn-outline-purple-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-300.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-300:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-300.disabled{color:#a98eda;background-color:transparent}}@media print{html .btn-outline-purple-400,html[data-netbox-color-mode=dark] .btn-outline-purple-400,html[data-netbox-color-mode=light] .btn-outline-purple-400{color:#8c68cd;border-color:#8c68cd}html .btn-outline-purple-400:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-400:hover,html[data-netbox-color-mode=light] .btn-outline-purple-400:hover{color:#000;background-color:#8c68cd;border-color:#8c68cd}.btn-check:focus+html .btn-outline-purple-400,html .btn-outline-purple-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-400,html[data-netbox-color-mode=dark] .btn-outline-purple-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-400,html[data-netbox-color-mode=light] .btn-outline-purple-400:focus{box-shadow:0 0 0 .25rem #8c68cd80}.btn-check:checked+html .btn-outline-purple-400,.btn-check:active+html .btn-outline-purple-400,html .btn-outline-purple-400:active,html .btn-outline-purple-400.active,html .btn-outline-purple-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-400,html[data-netbox-color-mode=dark] .btn-outline-purple-400:active,html[data-netbox-color-mode=dark] .btn-outline-purple-400.active,html[data-netbox-color-mode=dark] .btn-outline-purple-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-400,html[data-netbox-color-mode=light] .btn-outline-purple-400:active,html[data-netbox-color-mode=light] .btn-outline-purple-400.active,html[data-netbox-color-mode=light] .btn-outline-purple-400.dropdown-toggle.show{color:#000;background-color:#8c68cd;border-color:#8c68cd}.btn-check:checked+html .btn-outline-purple-400:focus,.btn-check:active+html .btn-outline-purple-400:focus,html .btn-outline-purple-400:active:focus,html .btn-outline-purple-400.active:focus,html .btn-outline-purple-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-400:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-400:focus,html[data-netbox-color-mode=light] .btn-outline-purple-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #8c68cd80}html .btn-outline-purple-400:disabled,html .btn-outline-purple-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-400.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-400:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-400.disabled{color:#8c68cd;background-color:transparent}}@media print{html .btn-outline-purple-500,html[data-netbox-color-mode=dark] .btn-outline-purple-500,html[data-netbox-color-mode=light] .btn-outline-purple-500{color:#6f42c1;border-color:#6f42c1}html .btn-outline-purple-500:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-500:hover,html[data-netbox-color-mode=light] .btn-outline-purple-500:hover{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:focus+html .btn-outline-purple-500,html .btn-outline-purple-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-500,html[data-netbox-color-mode=dark] .btn-outline-purple-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-500,html[data-netbox-color-mode=light] .btn-outline-purple-500:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-check:checked+html .btn-outline-purple-500,.btn-check:active+html .btn-outline-purple-500,html .btn-outline-purple-500:active,html .btn-outline-purple-500.active,html .btn-outline-purple-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-500,html[data-netbox-color-mode=dark] .btn-outline-purple-500:active,html[data-netbox-color-mode=dark] .btn-outline-purple-500.active,html[data-netbox-color-mode=dark] .btn-outline-purple-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-500,html[data-netbox-color-mode=light] .btn-outline-purple-500:active,html[data-netbox-color-mode=light] .btn-outline-purple-500.active,html[data-netbox-color-mode=light] .btn-outline-purple-500.dropdown-toggle.show{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:checked+html .btn-outline-purple-500:focus,.btn-check:active+html .btn-outline-purple-500:focus,html .btn-outline-purple-500:active:focus,html .btn-outline-purple-500.active:focus,html .btn-outline-purple-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-500:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-500:focus,html[data-netbox-color-mode=light] .btn-outline-purple-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6f42c180}html .btn-outline-purple-500:disabled,html .btn-outline-purple-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-500.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-500:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-500.disabled{color:#6f42c1;background-color:transparent}}@media print{html .btn-outline-purple-600,html[data-netbox-color-mode=dark] .btn-outline-purple-600,html[data-netbox-color-mode=light] .btn-outline-purple-600{color:#59359a;border-color:#59359a}html .btn-outline-purple-600:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-600:hover,html[data-netbox-color-mode=light] .btn-outline-purple-600:hover{color:#fff;background-color:#59359a;border-color:#59359a}.btn-check:focus+html .btn-outline-purple-600,html .btn-outline-purple-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-600,html[data-netbox-color-mode=dark] .btn-outline-purple-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-600,html[data-netbox-color-mode=light] .btn-outline-purple-600:focus{box-shadow:0 0 0 .25rem #59359a80}.btn-check:checked+html .btn-outline-purple-600,.btn-check:active+html .btn-outline-purple-600,html .btn-outline-purple-600:active,html .btn-outline-purple-600.active,html .btn-outline-purple-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-600,html[data-netbox-color-mode=dark] .btn-outline-purple-600:active,html[data-netbox-color-mode=dark] .btn-outline-purple-600.active,html[data-netbox-color-mode=dark] .btn-outline-purple-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-600,html[data-netbox-color-mode=light] .btn-outline-purple-600:active,html[data-netbox-color-mode=light] .btn-outline-purple-600.active,html[data-netbox-color-mode=light] .btn-outline-purple-600.dropdown-toggle.show{color:#fff;background-color:#59359a;border-color:#59359a}.btn-check:checked+html .btn-outline-purple-600:focus,.btn-check:active+html .btn-outline-purple-600:focus,html .btn-outline-purple-600:active:focus,html .btn-outline-purple-600.active:focus,html .btn-outline-purple-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-600:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-600:focus,html[data-netbox-color-mode=light] .btn-outline-purple-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #59359a80}html .btn-outline-purple-600:disabled,html .btn-outline-purple-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-600.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-600:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-600.disabled{color:#59359a;background-color:transparent}}@media print{html .btn-outline-purple-700,html[data-netbox-color-mode=dark] .btn-outline-purple-700,html[data-netbox-color-mode=light] .btn-outline-purple-700{color:#432874;border-color:#432874}html .btn-outline-purple-700:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-700:hover,html[data-netbox-color-mode=light] .btn-outline-purple-700:hover{color:#fff;background-color:#432874;border-color:#432874}.btn-check:focus+html .btn-outline-purple-700,html .btn-outline-purple-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-700,html[data-netbox-color-mode=dark] .btn-outline-purple-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-700,html[data-netbox-color-mode=light] .btn-outline-purple-700:focus{box-shadow:0 0 0 .25rem #43287480}.btn-check:checked+html .btn-outline-purple-700,.btn-check:active+html .btn-outline-purple-700,html .btn-outline-purple-700:active,html .btn-outline-purple-700.active,html .btn-outline-purple-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-700,html[data-netbox-color-mode=dark] .btn-outline-purple-700:active,html[data-netbox-color-mode=dark] .btn-outline-purple-700.active,html[data-netbox-color-mode=dark] .btn-outline-purple-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-700,html[data-netbox-color-mode=light] .btn-outline-purple-700:active,html[data-netbox-color-mode=light] .btn-outline-purple-700.active,html[data-netbox-color-mode=light] .btn-outline-purple-700.dropdown-toggle.show{color:#fff;background-color:#432874;border-color:#432874}.btn-check:checked+html .btn-outline-purple-700:focus,.btn-check:active+html .btn-outline-purple-700:focus,html .btn-outline-purple-700:active:focus,html .btn-outline-purple-700.active:focus,html .btn-outline-purple-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-700:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-700:focus,html[data-netbox-color-mode=light] .btn-outline-purple-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #43287480}html .btn-outline-purple-700:disabled,html .btn-outline-purple-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-700.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-700:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-700.disabled{color:#432874;background-color:transparent}}@media print{html .btn-outline-purple-800,html[data-netbox-color-mode=dark] .btn-outline-purple-800,html[data-netbox-color-mode=light] .btn-outline-purple-800{color:#2c1a4d;border-color:#2c1a4d}html .btn-outline-purple-800:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-800:hover,html[data-netbox-color-mode=light] .btn-outline-purple-800:hover{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}.btn-check:focus+html .btn-outline-purple-800,html .btn-outline-purple-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-800,html[data-netbox-color-mode=dark] .btn-outline-purple-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-800,html[data-netbox-color-mode=light] .btn-outline-purple-800:focus{box-shadow:0 0 0 .25rem #2c1a4d80}.btn-check:checked+html .btn-outline-purple-800,.btn-check:active+html .btn-outline-purple-800,html .btn-outline-purple-800:active,html .btn-outline-purple-800.active,html .btn-outline-purple-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-800,html[data-netbox-color-mode=dark] .btn-outline-purple-800:active,html[data-netbox-color-mode=dark] .btn-outline-purple-800.active,html[data-netbox-color-mode=dark] .btn-outline-purple-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-800,html[data-netbox-color-mode=light] .btn-outline-purple-800:active,html[data-netbox-color-mode=light] .btn-outline-purple-800.active,html[data-netbox-color-mode=light] .btn-outline-purple-800.dropdown-toggle.show{color:#fff;background-color:#2c1a4d;border-color:#2c1a4d}.btn-check:checked+html .btn-outline-purple-800:focus,.btn-check:active+html .btn-outline-purple-800:focus,html .btn-outline-purple-800:active:focus,html .btn-outline-purple-800.active:focus,html .btn-outline-purple-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-800:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-800:focus,html[data-netbox-color-mode=light] .btn-outline-purple-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2c1a4d80}html .btn-outline-purple-800:disabled,html .btn-outline-purple-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-800.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-800:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-800.disabled{color:#2c1a4d;background-color:transparent}}@media print{html .btn-outline-purple-900,html[data-netbox-color-mode=dark] .btn-outline-purple-900,html[data-netbox-color-mode=light] .btn-outline-purple-900{color:#160d27;border-color:#160d27}html .btn-outline-purple-900:hover,html[data-netbox-color-mode=dark] .btn-outline-purple-900:hover,html[data-netbox-color-mode=light] .btn-outline-purple-900:hover{color:#fff;background-color:#160d27;border-color:#160d27}.btn-check:focus+html .btn-outline-purple-900,html .btn-outline-purple-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple-900,html[data-netbox-color-mode=dark] .btn-outline-purple-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple-900,html[data-netbox-color-mode=light] .btn-outline-purple-900:focus{box-shadow:0 0 0 .25rem #160d2780}.btn-check:checked+html .btn-outline-purple-900,.btn-check:active+html .btn-outline-purple-900,html .btn-outline-purple-900:active,html .btn-outline-purple-900.active,html .btn-outline-purple-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-900,html[data-netbox-color-mode=dark] .btn-outline-purple-900:active,html[data-netbox-color-mode=dark] .btn-outline-purple-900.active,html[data-netbox-color-mode=dark] .btn-outline-purple-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-900,html[data-netbox-color-mode=light] .btn-outline-purple-900:active,html[data-netbox-color-mode=light] .btn-outline-purple-900.active,html[data-netbox-color-mode=light] .btn-outline-purple-900.dropdown-toggle.show{color:#fff;background-color:#160d27;border-color:#160d27}.btn-check:checked+html .btn-outline-purple-900:focus,.btn-check:active+html .btn-outline-purple-900:focus,html .btn-outline-purple-900:active:focus,html .btn-outline-purple-900.active:focus,html .btn-outline-purple-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple-900:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple-900:focus,html[data-netbox-color-mode=light] .btn-outline-purple-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #160d2780}html .btn-outline-purple-900:disabled,html .btn-outline-purple-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple-900.disabled,html[data-netbox-color-mode=light] .btn-outline-purple-900:disabled,html[data-netbox-color-mode=light] .btn-outline-purple-900.disabled{color:#160d27;background-color:transparent}}@media print{html .btn-outline-pink-100,html[data-netbox-color-mode=dark] .btn-outline-pink-100,html[data-netbox-color-mode=light] .btn-outline-pink-100{color:#f7d6e6;border-color:#f7d6e6}html .btn-outline-pink-100:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-100:hover,html[data-netbox-color-mode=light] .btn-outline-pink-100:hover{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}.btn-check:focus+html .btn-outline-pink-100,html .btn-outline-pink-100:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-100,html[data-netbox-color-mode=dark] .btn-outline-pink-100:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-100,html[data-netbox-color-mode=light] .btn-outline-pink-100:focus{box-shadow:0 0 0 .25rem #f7d6e680}.btn-check:checked+html .btn-outline-pink-100,.btn-check:active+html .btn-outline-pink-100,html .btn-outline-pink-100:active,html .btn-outline-pink-100.active,html .btn-outline-pink-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-100,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-100,html[data-netbox-color-mode=dark] .btn-outline-pink-100:active,html[data-netbox-color-mode=dark] .btn-outline-pink-100.active,html[data-netbox-color-mode=dark] .btn-outline-pink-100.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-100,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-100,html[data-netbox-color-mode=light] .btn-outline-pink-100:active,html[data-netbox-color-mode=light] .btn-outline-pink-100.active,html[data-netbox-color-mode=light] .btn-outline-pink-100.dropdown-toggle.show{color:#000;background-color:#f7d6e6;border-color:#f7d6e6}.btn-check:checked+html .btn-outline-pink-100:focus,.btn-check:active+html .btn-outline-pink-100:focus,html .btn-outline-pink-100:active:focus,html .btn-outline-pink-100.active:focus,html .btn-outline-pink-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-100:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-100:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-100:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-100.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-100.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-100:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-100:focus,html[data-netbox-color-mode=light] .btn-outline-pink-100:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-100.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-100.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f7d6e680}html .btn-outline-pink-100:disabled,html .btn-outline-pink-100.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-100:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-100.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-100:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-100.disabled{color:#f7d6e6;background-color:transparent}}@media print{html .btn-outline-pink-200,html[data-netbox-color-mode=dark] .btn-outline-pink-200,html[data-netbox-color-mode=light] .btn-outline-pink-200{color:#efadce;border-color:#efadce}html .btn-outline-pink-200:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-200:hover,html[data-netbox-color-mode=light] .btn-outline-pink-200:hover{color:#000;background-color:#efadce;border-color:#efadce}.btn-check:focus+html .btn-outline-pink-200,html .btn-outline-pink-200:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-200,html[data-netbox-color-mode=dark] .btn-outline-pink-200:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-200,html[data-netbox-color-mode=light] .btn-outline-pink-200:focus{box-shadow:0 0 0 .25rem #efadce80}.btn-check:checked+html .btn-outline-pink-200,.btn-check:active+html .btn-outline-pink-200,html .btn-outline-pink-200:active,html .btn-outline-pink-200.active,html .btn-outline-pink-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-200,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-200,html[data-netbox-color-mode=dark] .btn-outline-pink-200:active,html[data-netbox-color-mode=dark] .btn-outline-pink-200.active,html[data-netbox-color-mode=dark] .btn-outline-pink-200.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-200,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-200,html[data-netbox-color-mode=light] .btn-outline-pink-200:active,html[data-netbox-color-mode=light] .btn-outline-pink-200.active,html[data-netbox-color-mode=light] .btn-outline-pink-200.dropdown-toggle.show{color:#000;background-color:#efadce;border-color:#efadce}.btn-check:checked+html .btn-outline-pink-200:focus,.btn-check:active+html .btn-outline-pink-200:focus,html .btn-outline-pink-200:active:focus,html .btn-outline-pink-200.active:focus,html .btn-outline-pink-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-200:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-200:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-200:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-200.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-200.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-200:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-200:focus,html[data-netbox-color-mode=light] .btn-outline-pink-200:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-200.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-200.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #efadce80}html .btn-outline-pink-200:disabled,html .btn-outline-pink-200.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-200:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-200.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-200:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-200.disabled{color:#efadce;background-color:transparent}}@media print{html .btn-outline-pink-300,html[data-netbox-color-mode=dark] .btn-outline-pink-300,html[data-netbox-color-mode=light] .btn-outline-pink-300{color:#e685b5;border-color:#e685b5}html .btn-outline-pink-300:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-300:hover,html[data-netbox-color-mode=light] .btn-outline-pink-300:hover{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:focus+html .btn-outline-pink-300,html .btn-outline-pink-300:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-300,html[data-netbox-color-mode=dark] .btn-outline-pink-300:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-300,html[data-netbox-color-mode=light] .btn-outline-pink-300:focus{box-shadow:0 0 0 .25rem #e685b580}.btn-check:checked+html .btn-outline-pink-300,.btn-check:active+html .btn-outline-pink-300,html .btn-outline-pink-300:active,html .btn-outline-pink-300.active,html .btn-outline-pink-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-300,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-300,html[data-netbox-color-mode=dark] .btn-outline-pink-300:active,html[data-netbox-color-mode=dark] .btn-outline-pink-300.active,html[data-netbox-color-mode=dark] .btn-outline-pink-300.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-300,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-300,html[data-netbox-color-mode=light] .btn-outline-pink-300:active,html[data-netbox-color-mode=light] .btn-outline-pink-300.active,html[data-netbox-color-mode=light] .btn-outline-pink-300.dropdown-toggle.show{color:#000;background-color:#e685b5;border-color:#e685b5}.btn-check:checked+html .btn-outline-pink-300:focus,.btn-check:active+html .btn-outline-pink-300:focus,html .btn-outline-pink-300:active:focus,html .btn-outline-pink-300.active:focus,html .btn-outline-pink-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-300:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-300:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-300:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-300.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-300.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-300:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-300:focus,html[data-netbox-color-mode=light] .btn-outline-pink-300:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-300.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-300.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e685b580}html .btn-outline-pink-300:disabled,html .btn-outline-pink-300.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-300:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-300.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-300:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-300.disabled{color:#e685b5;background-color:transparent}}@media print{html .btn-outline-pink-400,html[data-netbox-color-mode=dark] .btn-outline-pink-400,html[data-netbox-color-mode=light] .btn-outline-pink-400{color:#de5c9d;border-color:#de5c9d}html .btn-outline-pink-400:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-400:hover,html[data-netbox-color-mode=light] .btn-outline-pink-400:hover{color:#000;background-color:#de5c9d;border-color:#de5c9d}.btn-check:focus+html .btn-outline-pink-400,html .btn-outline-pink-400:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-400,html[data-netbox-color-mode=dark] .btn-outline-pink-400:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-400,html[data-netbox-color-mode=light] .btn-outline-pink-400:focus{box-shadow:0 0 0 .25rem #de5c9d80}.btn-check:checked+html .btn-outline-pink-400,.btn-check:active+html .btn-outline-pink-400,html .btn-outline-pink-400:active,html .btn-outline-pink-400.active,html .btn-outline-pink-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-400,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-400,html[data-netbox-color-mode=dark] .btn-outline-pink-400:active,html[data-netbox-color-mode=dark] .btn-outline-pink-400.active,html[data-netbox-color-mode=dark] .btn-outline-pink-400.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-400,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-400,html[data-netbox-color-mode=light] .btn-outline-pink-400:active,html[data-netbox-color-mode=light] .btn-outline-pink-400.active,html[data-netbox-color-mode=light] .btn-outline-pink-400.dropdown-toggle.show{color:#000;background-color:#de5c9d;border-color:#de5c9d}.btn-check:checked+html .btn-outline-pink-400:focus,.btn-check:active+html .btn-outline-pink-400:focus,html .btn-outline-pink-400:active:focus,html .btn-outline-pink-400.active:focus,html .btn-outline-pink-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-400:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-400:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-400:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-400.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-400.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-400:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-400:focus,html[data-netbox-color-mode=light] .btn-outline-pink-400:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-400.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-400.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #de5c9d80}html .btn-outline-pink-400:disabled,html .btn-outline-pink-400.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-400:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-400.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-400:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-400.disabled{color:#de5c9d;background-color:transparent}}@media print{html .btn-outline-pink-500,html[data-netbox-color-mode=dark] .btn-outline-pink-500,html[data-netbox-color-mode=light] .btn-outline-pink-500{color:#d63384;border-color:#d63384}html .btn-outline-pink-500:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-500:hover,html[data-netbox-color-mode=light] .btn-outline-pink-500:hover{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:focus+html .btn-outline-pink-500,html .btn-outline-pink-500:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-500,html[data-netbox-color-mode=dark] .btn-outline-pink-500:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-500,html[data-netbox-color-mode=light] .btn-outline-pink-500:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-check:checked+html .btn-outline-pink-500,.btn-check:active+html .btn-outline-pink-500,html .btn-outline-pink-500:active,html .btn-outline-pink-500.active,html .btn-outline-pink-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-500,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-500,html[data-netbox-color-mode=dark] .btn-outline-pink-500:active,html[data-netbox-color-mode=dark] .btn-outline-pink-500.active,html[data-netbox-color-mode=dark] .btn-outline-pink-500.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-500,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-500,html[data-netbox-color-mode=light] .btn-outline-pink-500:active,html[data-netbox-color-mode=light] .btn-outline-pink-500.active,html[data-netbox-color-mode=light] .btn-outline-pink-500.dropdown-toggle.show{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:checked+html .btn-outline-pink-500:focus,.btn-check:active+html .btn-outline-pink-500:focus,html .btn-outline-pink-500:active:focus,html .btn-outline-pink-500.active:focus,html .btn-outline-pink-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-500:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-500:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-500:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-500.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-500.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-500:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-500:focus,html[data-netbox-color-mode=light] .btn-outline-pink-500:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-500.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-500.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d6338480}html .btn-outline-pink-500:disabled,html .btn-outline-pink-500.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-500:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-500.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-500:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-500.disabled{color:#d63384;background-color:transparent}}@media print{html .btn-outline-pink-600,html[data-netbox-color-mode=dark] .btn-outline-pink-600,html[data-netbox-color-mode=light] .btn-outline-pink-600{color:#ab296a;border-color:#ab296a}html .btn-outline-pink-600:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-600:hover,html[data-netbox-color-mode=light] .btn-outline-pink-600:hover{color:#fff;background-color:#ab296a;border-color:#ab296a}.btn-check:focus+html .btn-outline-pink-600,html .btn-outline-pink-600:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-600,html[data-netbox-color-mode=dark] .btn-outline-pink-600:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-600,html[data-netbox-color-mode=light] .btn-outline-pink-600:focus{box-shadow:0 0 0 .25rem #ab296a80}.btn-check:checked+html .btn-outline-pink-600,.btn-check:active+html .btn-outline-pink-600,html .btn-outline-pink-600:active,html .btn-outline-pink-600.active,html .btn-outline-pink-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-600,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-600,html[data-netbox-color-mode=dark] .btn-outline-pink-600:active,html[data-netbox-color-mode=dark] .btn-outline-pink-600.active,html[data-netbox-color-mode=dark] .btn-outline-pink-600.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-600,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-600,html[data-netbox-color-mode=light] .btn-outline-pink-600:active,html[data-netbox-color-mode=light] .btn-outline-pink-600.active,html[data-netbox-color-mode=light] .btn-outline-pink-600.dropdown-toggle.show{color:#fff;background-color:#ab296a;border-color:#ab296a}.btn-check:checked+html .btn-outline-pink-600:focus,.btn-check:active+html .btn-outline-pink-600:focus,html .btn-outline-pink-600:active:focus,html .btn-outline-pink-600.active:focus,html .btn-outline-pink-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-600:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-600:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-600:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-600.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-600.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-600:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-600:focus,html[data-netbox-color-mode=light] .btn-outline-pink-600:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-600.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-600.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ab296a80}html .btn-outline-pink-600:disabled,html .btn-outline-pink-600.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-600:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-600.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-600:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-600.disabled{color:#ab296a;background-color:transparent}}@media print{html .btn-outline-pink-700,html[data-netbox-color-mode=dark] .btn-outline-pink-700,html[data-netbox-color-mode=light] .btn-outline-pink-700{color:#801f4f;border-color:#801f4f}html .btn-outline-pink-700:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-700:hover,html[data-netbox-color-mode=light] .btn-outline-pink-700:hover{color:#fff;background-color:#801f4f;border-color:#801f4f}.btn-check:focus+html .btn-outline-pink-700,html .btn-outline-pink-700:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-700,html[data-netbox-color-mode=dark] .btn-outline-pink-700:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-700,html[data-netbox-color-mode=light] .btn-outline-pink-700:focus{box-shadow:0 0 0 .25rem #801f4f80}.btn-check:checked+html .btn-outline-pink-700,.btn-check:active+html .btn-outline-pink-700,html .btn-outline-pink-700:active,html .btn-outline-pink-700.active,html .btn-outline-pink-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-700,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-700,html[data-netbox-color-mode=dark] .btn-outline-pink-700:active,html[data-netbox-color-mode=dark] .btn-outline-pink-700.active,html[data-netbox-color-mode=dark] .btn-outline-pink-700.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-700,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-700,html[data-netbox-color-mode=light] .btn-outline-pink-700:active,html[data-netbox-color-mode=light] .btn-outline-pink-700.active,html[data-netbox-color-mode=light] .btn-outline-pink-700.dropdown-toggle.show{color:#fff;background-color:#801f4f;border-color:#801f4f}.btn-check:checked+html .btn-outline-pink-700:focus,.btn-check:active+html .btn-outline-pink-700:focus,html .btn-outline-pink-700:active:focus,html .btn-outline-pink-700.active:focus,html .btn-outline-pink-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-700:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-700:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-700:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-700.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-700.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-700:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-700:focus,html[data-netbox-color-mode=light] .btn-outline-pink-700:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-700.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-700.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #801f4f80}html .btn-outline-pink-700:disabled,html .btn-outline-pink-700.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-700:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-700.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-700:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-700.disabled{color:#801f4f;background-color:transparent}}@media print{html .btn-outline-pink-800,html[data-netbox-color-mode=dark] .btn-outline-pink-800,html[data-netbox-color-mode=light] .btn-outline-pink-800{color:#561435;border-color:#561435}html .btn-outline-pink-800:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-800:hover,html[data-netbox-color-mode=light] .btn-outline-pink-800:hover{color:#fff;background-color:#561435;border-color:#561435}.btn-check:focus+html .btn-outline-pink-800,html .btn-outline-pink-800:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-800,html[data-netbox-color-mode=dark] .btn-outline-pink-800:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-800,html[data-netbox-color-mode=light] .btn-outline-pink-800:focus{box-shadow:0 0 0 .25rem #56143580}.btn-check:checked+html .btn-outline-pink-800,.btn-check:active+html .btn-outline-pink-800,html .btn-outline-pink-800:active,html .btn-outline-pink-800.active,html .btn-outline-pink-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-800,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-800,html[data-netbox-color-mode=dark] .btn-outline-pink-800:active,html[data-netbox-color-mode=dark] .btn-outline-pink-800.active,html[data-netbox-color-mode=dark] .btn-outline-pink-800.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-800,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-800,html[data-netbox-color-mode=light] .btn-outline-pink-800:active,html[data-netbox-color-mode=light] .btn-outline-pink-800.active,html[data-netbox-color-mode=light] .btn-outline-pink-800.dropdown-toggle.show{color:#fff;background-color:#561435;border-color:#561435}.btn-check:checked+html .btn-outline-pink-800:focus,.btn-check:active+html .btn-outline-pink-800:focus,html .btn-outline-pink-800:active:focus,html .btn-outline-pink-800.active:focus,html .btn-outline-pink-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-800:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-800:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-800:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-800.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-800.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-800:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-800:focus,html[data-netbox-color-mode=light] .btn-outline-pink-800:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-800.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-800.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #56143580}html .btn-outline-pink-800:disabled,html .btn-outline-pink-800.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-800:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-800.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-800:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-800.disabled{color:#561435;background-color:transparent}}@media print{html .btn-outline-pink-900,html[data-netbox-color-mode=dark] .btn-outline-pink-900,html[data-netbox-color-mode=light] .btn-outline-pink-900{color:#2b0a1a;border-color:#2b0a1a}html .btn-outline-pink-900:hover,html[data-netbox-color-mode=dark] .btn-outline-pink-900:hover,html[data-netbox-color-mode=light] .btn-outline-pink-900:hover{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}.btn-check:focus+html .btn-outline-pink-900,html .btn-outline-pink-900:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink-900,html[data-netbox-color-mode=dark] .btn-outline-pink-900:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink-900,html[data-netbox-color-mode=light] .btn-outline-pink-900:focus{box-shadow:0 0 0 .25rem #2b0a1a80}.btn-check:checked+html .btn-outline-pink-900,.btn-check:active+html .btn-outline-pink-900,html .btn-outline-pink-900:active,html .btn-outline-pink-900.active,html .btn-outline-pink-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-900,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-900,html[data-netbox-color-mode=dark] .btn-outline-pink-900:active,html[data-netbox-color-mode=dark] .btn-outline-pink-900.active,html[data-netbox-color-mode=dark] .btn-outline-pink-900.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-900,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-900,html[data-netbox-color-mode=light] .btn-outline-pink-900:active,html[data-netbox-color-mode=light] .btn-outline-pink-900.active,html[data-netbox-color-mode=light] .btn-outline-pink-900.dropdown-toggle.show{color:#fff;background-color:#2b0a1a;border-color:#2b0a1a}.btn-check:checked+html .btn-outline-pink-900:focus,.btn-check:active+html .btn-outline-pink-900:focus,html .btn-outline-pink-900:active:focus,html .btn-outline-pink-900.active:focus,html .btn-outline-pink-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink-900:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink-900:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-900:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-900.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink-900.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink-900:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink-900:focus,html[data-netbox-color-mode=light] .btn-outline-pink-900:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-900.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink-900.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #2b0a1a80}html .btn-outline-pink-900:disabled,html .btn-outline-pink-900.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-900:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink-900.disabled,html[data-netbox-color-mode=light] .btn-outline-pink-900:disabled,html[data-netbox-color-mode=light] .btn-outline-pink-900.disabled{color:#2b0a1a;background-color:transparent}}@media print{html .btn-link,html[data-netbox-color-mode=dark] .btn-link,html[data-netbox-color-mode=light] .btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}html .btn-link:hover,html[data-netbox-color-mode=dark] .btn-link:hover,html[data-netbox-color-mode=light] .btn-link:hover{color:#0a58ca}html .btn-link:disabled,html .btn-link.disabled,html[data-netbox-color-mode=dark] .btn-link:disabled,html[data-netbox-color-mode=dark] .btn-link.disabled,html[data-netbox-color-mode=light] .btn-link:disabled,html[data-netbox-color-mode=light] .btn-link.disabled{color:#6c757d}}@media print{html .btn-lg,html .btn-group-lg>.btn,html[data-netbox-color-mode=dark] .btn-lg,html[data-netbox-color-mode=light] .btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}}@media print{html .btn-sm,html .btn-group-sm>.btn,html[data-netbox-color-mode=dark] .btn-sm,html[data-netbox-color-mode=light] .btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}}@media print{html .fade,html[data-netbox-color-mode=dark] .fade,html[data-netbox-color-mode=light] .fade{transition:opacity .15s linear}}@media print and (prefers-reduced-motion: reduce){html .fade,html[data-netbox-color-mode=dark] .fade,html[data-netbox-color-mode=light] .fade{transition:none}}@media print{html .fade:not(.show),html[data-netbox-color-mode=dark] .fade:not(.show),html[data-netbox-color-mode=light] .fade:not(.show){opacity:0}}@media print{html .collapse:not(.show),html[data-netbox-color-mode=dark] .collapse:not(.show),html[data-netbox-color-mode=light] .collapse:not(.show){display:none}}@media print{html .collapsing,html[data-netbox-color-mode=dark] .collapsing,html[data-netbox-color-mode=light] .collapsing{height:0;overflow:hidden;transition:height .35s ease}}@media print and (prefers-reduced-motion: reduce){html .collapsing,html[data-netbox-color-mode=dark] .collapsing,html[data-netbox-color-mode=light] .collapsing{transition:none}}@media print{html .dropup,html .dropend,html .dropdown,html .dropstart,html[data-netbox-color-mode=dark] .dropup,html[data-netbox-color-mode=dark] .dropend,html[data-netbox-color-mode=dark] .dropdown,html[data-netbox-color-mode=dark] .dropstart,html[data-netbox-color-mode=light] .dropup,html[data-netbox-color-mode=light] .dropend,html[data-netbox-color-mode=light] .dropdown,html[data-netbox-color-mode=light] .dropstart{position:relative}}@media print{html .dropdown-toggle,html[data-netbox-color-mode=dark] .dropdown-toggle,html[data-netbox-color-mode=light] .dropdown-toggle{white-space:nowrap}html .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}html .dropdown-toggle:empty:after,html[data-netbox-color-mode=dark] .dropdown-toggle:empty:after,html[data-netbox-color-mode=light] .dropdown-toggle:empty:after{margin-left:0}}@media print{html .dropdown-menu,html[data-netbox-color-mode=dark] .dropdown-menu,html[data-netbox-color-mode=light] .dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.375rem}html .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}}@media print{html .dropdown-menu-start,html[data-netbox-color-mode=dark] .dropdown-menu-start,html[data-netbox-color-mode=light] .dropdown-menu-start{--bs-position: start}html .dropdown-menu-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-start[data-bs-popper]{right:auto;left:0}}@media print{html .dropdown-menu-end,html[data-netbox-color-mode=dark] .dropdown-menu-end,html[data-netbox-color-mode=light] .dropdown-menu-end{--bs-position: end}html .dropdown-menu-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 576px){html .dropdown-menu-sm-start,html[data-netbox-color-mode=dark] .dropdown-menu-sm-start,html[data-netbox-color-mode=light] .dropdown-menu-sm-start{--bs-position: start}html .dropdown-menu-sm-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-sm-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-sm-end,html[data-netbox-color-mode=dark] .dropdown-menu-sm-end,html[data-netbox-color-mode=light] .dropdown-menu-sm-end{--bs-position: end}html .dropdown-menu-sm-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-sm-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 768px){html .dropdown-menu-md-start,html[data-netbox-color-mode=dark] .dropdown-menu-md-start,html[data-netbox-color-mode=light] .dropdown-menu-md-start{--bs-position: start}html .dropdown-menu-md-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-md-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-md-end,html[data-netbox-color-mode=dark] .dropdown-menu-md-end,html[data-netbox-color-mode=light] .dropdown-menu-md-end{--bs-position: end}html .dropdown-menu-md-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-md-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 992px){html .dropdown-menu-lg-start,html[data-netbox-color-mode=dark] .dropdown-menu-lg-start,html[data-netbox-color-mode=light] .dropdown-menu-lg-start{--bs-position: start}html .dropdown-menu-lg-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-lg-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-lg-end,html[data-netbox-color-mode=dark] .dropdown-menu-lg-end,html[data-netbox-color-mode=light] .dropdown-menu-lg-end{--bs-position: end}html .dropdown-menu-lg-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-lg-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 1200px){html .dropdown-menu-xl-start,html[data-netbox-color-mode=dark] .dropdown-menu-xl-start,html[data-netbox-color-mode=light] .dropdown-menu-xl-start{--bs-position: start}html .dropdown-menu-xl-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-xl-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-xl-end,html[data-netbox-color-mode=dark] .dropdown-menu-xl-end,html[data-netbox-color-mode=light] .dropdown-menu-xl-end{--bs-position: end}html .dropdown-menu-xl-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-xl-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 1400px){html .dropdown-menu-xxl-start,html[data-netbox-color-mode=dark] .dropdown-menu-xxl-start,html[data-netbox-color-mode=light] .dropdown-menu-xxl-start{--bs-position: start}html .dropdown-menu-xxl-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-xxl-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-xxl-end,html[data-netbox-color-mode=dark] .dropdown-menu-xxl-end,html[data-netbox-color-mode=light] .dropdown-menu-xxl-end{--bs-position: end}html .dropdown-menu-xxl-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-xxl-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}@media print{html .dropup .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=dark] .dropup .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=light] .dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}html .dropup .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropup .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}html .dropup .dropdown-toggle:empty:after,html[data-netbox-color-mode=dark] .dropup .dropdown-toggle:empty:after,html[data-netbox-color-mode=light] .dropup .dropdown-toggle:empty:after{margin-left:0}}@media print{html .dropend .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=dark] .dropend .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=light] .dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}html .dropend .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}html .dropend .dropdown-toggle:empty:after,html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:empty:after,html[data-netbox-color-mode=light] .dropend .dropdown-toggle:empty:after{margin-left:0}html .dropend .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropend .dropdown-toggle:after{vertical-align:0}}@media print{html .dropstart .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=dark] .dropstart .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=light] .dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}html .dropstart .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}html .dropstart .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:after{display:none}html .dropstart .dropdown-toggle:before,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:before,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}html .dropstart .dropdown-toggle:empty:after,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:empty:after,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:empty:after{margin-left:0}html .dropstart .dropdown-toggle:before,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:before,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:before{vertical-align:0}}@media print{html .dropdown-divider,html[data-netbox-color-mode=dark] .dropdown-divider,html[data-netbox-color-mode=light] .dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}}@media print{html .dropdown-item,html[data-netbox-color-mode=dark] .dropdown-item,html[data-netbox-color-mode=light] .dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}html .dropdown-item:hover,html .dropdown-item:focus,html[data-netbox-color-mode=dark] .dropdown-item:hover,html[data-netbox-color-mode=dark] .dropdown-item:focus,html[data-netbox-color-mode=light] .dropdown-item:hover,html[data-netbox-color-mode=light] .dropdown-item:focus{color:#1e2125;background-color:#e9ecef}html .dropdown-item.active,html .dropdown-item:active,html[data-netbox-color-mode=dark] .dropdown-item.active,html[data-netbox-color-mode=dark] .dropdown-item:active,html[data-netbox-color-mode=light] .dropdown-item.active,html[data-netbox-color-mode=light] .dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}html .dropdown-item.disabled,html .dropdown-item:disabled,html[data-netbox-color-mode=dark] .dropdown-item.disabled,html[data-netbox-color-mode=dark] .dropdown-item:disabled,html[data-netbox-color-mode=light] .dropdown-item.disabled,html[data-netbox-color-mode=light] .dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}}@media print{html .dropdown-menu.show,html[data-netbox-color-mode=dark] .dropdown-menu.show,html[data-netbox-color-mode=light] .dropdown-menu.show{display:block}}@media print{html .dropdown-header,html[data-netbox-color-mode=dark] .dropdown-header,html[data-netbox-color-mode=light] .dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}}@media print{html .dropdown-item-text,html[data-netbox-color-mode=dark] .dropdown-item-text,html[data-netbox-color-mode=light] .dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}}@media print{html .dropdown-menu-dark,html[data-netbox-color-mode=dark] .dropdown-menu-dark,html[data-netbox-color-mode=light] .dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#00000026}html .dropdown-menu-dark .dropdown-item,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item{color:#dee2e6}html .dropdown-menu-dark .dropdown-item:hover,html .dropdown-menu-dark .dropdown-item:focus,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:hover,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:focus,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item:hover,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:#ffffff26}html .dropdown-menu-dark .dropdown-item.active,html .dropdown-menu-dark .dropdown-item:active,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item.active,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:active,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item.active,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}html .dropdown-menu-dark .dropdown-item.disabled,html .dropdown-menu-dark .dropdown-item:disabled,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item.disabled,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:disabled,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item.disabled,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}html .dropdown-menu-dark .dropdown-divider,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-divider,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-divider{border-color:#00000026}html .dropdown-menu-dark .dropdown-item-text,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item-text,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item-text{color:#dee2e6}html .dropdown-menu-dark .dropdown-header,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-header,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-header{color:#adb5bd}}@media print{html .btn-group,html .btn-group-vertical,html[data-netbox-color-mode=dark] .btn-group,html[data-netbox-color-mode=dark] .btn-group-vertical,html[data-netbox-color-mode=light] .btn-group,html[data-netbox-color-mode=light] .btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}html .btn-group>.btn,html .btn-group-vertical>.btn,html[data-netbox-color-mode=dark] .btn-group>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn,html[data-netbox-color-mode=light] .btn-group>.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn{position:relative;flex:1 1 auto}html .btn-group>.btn-check:checked+.btn,html .btn-group>.btn-check:focus+.btn,html .btn-group>.btn:hover,html .btn-group>.btn:focus,html .btn-group>.btn:active,html .btn-group>.btn.active,html .btn-group-vertical>.btn-check:checked+.btn,html .btn-group-vertical>.btn-check:focus+.btn,html .btn-group-vertical>.btn:hover,html .btn-group-vertical>.btn:focus,html .btn-group-vertical>.btn:active,html .btn-group-vertical>.btn.active,html[data-netbox-color-mode=dark] .btn-group>.btn-check:checked+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn-check:focus+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn:hover,html[data-netbox-color-mode=dark] .btn-group>.btn:focus,html[data-netbox-color-mode=dark] .btn-group>.btn:active,html[data-netbox-color-mode=dark] .btn-group>.btn.active,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-check:checked+.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-check:focus+.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:hover,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:focus,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:active,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn.active,html[data-netbox-color-mode=light] .btn-group>.btn-check:checked+.btn,html[data-netbox-color-mode=light] .btn-group>.btn-check:focus+.btn,html[data-netbox-color-mode=light] .btn-group>.btn:hover,html[data-netbox-color-mode=light] .btn-group>.btn:focus,html[data-netbox-color-mode=light] .btn-group>.btn:active,html[data-netbox-color-mode=light] .btn-group>.btn.active,html[data-netbox-color-mode=light] .btn-group-vertical>.btn-check:checked+.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn-check:focus+.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn:hover,html[data-netbox-color-mode=light] .btn-group-vertical>.btn:focus,html[data-netbox-color-mode=light] .btn-group-vertical>.btn:active,html[data-netbox-color-mode=light] .btn-group-vertical>.btn.active{z-index:1}}@media print{html .btn-toolbar,html[data-netbox-color-mode=dark] .btn-toolbar,html[data-netbox-color-mode=light] .btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}html .btn-toolbar .input-group,html[data-netbox-color-mode=dark] .btn-toolbar .input-group,html[data-netbox-color-mode=light] .btn-toolbar .input-group{width:auto}}@media print{html .btn-group>.btn:not(:first-child),html .btn-group>.btn-group:not(:first-child),html[data-netbox-color-mode=dark] .btn-group>.btn:not(:first-child),html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:first-child),html[data-netbox-color-mode=light] .btn-group>.btn:not(:first-child),html[data-netbox-color-mode=light] .btn-group>.btn-group:not(:first-child){margin-left:-1px}html .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html .btn-group>.btn-group:not(:last-child)>.btn,html[data-netbox-color-mode=dark] .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:last-child)>.btn,html[data-netbox-color-mode=light] .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=light] .btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}html .btn-group>.btn:nth-child(n+3),html .btn-group>:not(.btn-check)+.btn,html .btn-group>.btn-group:not(:first-child)>.btn,html[data-netbox-color-mode=dark] .btn-group>.btn:nth-child(n+3),html[data-netbox-color-mode=dark] .btn-group>:not(.btn-check)+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:first-child)>.btn,html[data-netbox-color-mode=light] .btn-group>.btn:nth-child(n+3),html[data-netbox-color-mode=light] .btn-group>:not(.btn-check)+.btn,html[data-netbox-color-mode=light] .btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}}@media print{html .dropdown-toggle-split,html[data-netbox-color-mode=dark] .dropdown-toggle-split,html[data-netbox-color-mode=light] .dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}html .dropdown-toggle-split:after,.dropup html .dropdown-toggle-split:after,.dropend html .dropdown-toggle-split:after,html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,.dropup html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,.dropend html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,html[data-netbox-color-mode=light] .dropdown-toggle-split:after,.dropup html[data-netbox-color-mode=light] .dropdown-toggle-split:after,.dropend html[data-netbox-color-mode=light] .dropdown-toggle-split:after{margin-left:0}.dropstart html .dropdown-toggle-split:before,.dropstart html[data-netbox-color-mode=dark] .dropdown-toggle-split:before,.dropstart html[data-netbox-color-mode=light] .dropdown-toggle-split:before{margin-right:0}}@media print{html .btn-sm+.dropdown-toggle-split,html .btn-group-sm>.btn+.dropdown-toggle-split,html[data-netbox-color-mode=dark] .btn-sm+.dropdown-toggle-split,html[data-netbox-color-mode=light] .btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}}@media print{html .btn-lg+.dropdown-toggle-split,html .btn-group-lg>.btn+.dropdown-toggle-split,html[data-netbox-color-mode=dark] .btn-lg+.dropdown-toggle-split,html[data-netbox-color-mode=light] .btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}}@media print{html .btn-group-vertical,html[data-netbox-color-mode=dark] .btn-group-vertical,html[data-netbox-color-mode=light] .btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}html .btn-group-vertical>.btn,html .btn-group-vertical>.btn-group,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group,html[data-netbox-color-mode=light] .btn-group-vertical>.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn-group{width:100%}html .btn-group-vertical>.btn:not(:first-child),html .btn-group-vertical>.btn-group:not(:first-child),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:not(:first-child),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:first-child),html[data-netbox-color-mode=light] .btn-group-vertical>.btn:not(:first-child),html[data-netbox-color-mode=light] .btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}html .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),html .btn-group-vertical>.btn-group:not(:last-child)>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:last-child)>.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=light] .btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}html .btn-group-vertical>.btn~.btn,html .btn-group-vertical>.btn-group:not(:first-child)>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn~.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:first-child)>.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn~.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}}@media print{html .nav,html[data-netbox-color-mode=dark] .nav,html[data-netbox-color-mode=light] .nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}}@media print{html .nav-link,html[data-netbox-color-mode=dark] .nav-link,html[data-netbox-color-mode=light] .nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .nav-link,html[data-netbox-color-mode=dark] .nav-link,html[data-netbox-color-mode=light] .nav-link{transition:none}}@media print{html .nav-link:hover,html .nav-link:focus,html[data-netbox-color-mode=dark] .nav-link:hover,html[data-netbox-color-mode=dark] .nav-link:focus,html[data-netbox-color-mode=light] .nav-link:hover,html[data-netbox-color-mode=light] .nav-link:focus{color:#0a58ca}}@media print{html .nav-link.disabled,html[data-netbox-color-mode=dark] .nav-link.disabled,html[data-netbox-color-mode=light] .nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}}@media print{html .nav-tabs,html[data-netbox-color-mode=dark] .nav-tabs,html[data-netbox-color-mode=light] .nav-tabs{border-bottom:1px solid #dee2e6}html .nav-tabs .nav-link,html[data-netbox-color-mode=dark] .nav-tabs .nav-link,html[data-netbox-color-mode=light] .nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:.375rem;border-top-right-radius:.375rem}html .nav-tabs .nav-link:hover,html .nav-tabs .nav-link:focus,html[data-netbox-color-mode=dark] .nav-tabs .nav-link:hover,html[data-netbox-color-mode=dark] .nav-tabs .nav-link:focus,html[data-netbox-color-mode=light] .nav-tabs .nav-link:hover,html[data-netbox-color-mode=light] .nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}html .nav-tabs .nav-link.disabled,html[data-netbox-color-mode=dark] .nav-tabs .nav-link.disabled,html[data-netbox-color-mode=light] .nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}html .nav-tabs .nav-link.active,html .nav-tabs .nav-item.show .nav-link,html[data-netbox-color-mode=dark] .nav-tabs .nav-link.active,html[data-netbox-color-mode=dark] .nav-tabs .nav-item.show .nav-link,html[data-netbox-color-mode=light] .nav-tabs .nav-link.active,html[data-netbox-color-mode=light] .nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}html .nav-tabs .dropdown-menu,html[data-netbox-color-mode=dark] .nav-tabs .dropdown-menu,html[data-netbox-color-mode=light] .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}}@media print{html .nav-pills .nav-link,html[data-netbox-color-mode=dark] .nav-pills .nav-link,html[data-netbox-color-mode=light] .nav-pills .nav-link{background:none;border:0;border-radius:.375rem}html .nav-pills .nav-link.active,html .nav-pills .show>.nav-link,html[data-netbox-color-mode=dark] .nav-pills .nav-link.active,html[data-netbox-color-mode=dark] .nav-pills .show>.nav-link,html[data-netbox-color-mode=light] .nav-pills .nav-link.active,html[data-netbox-color-mode=light] .nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}}@media print{html .nav-fill>.nav-link,html .nav-fill .nav-item,html[data-netbox-color-mode=dark] .nav-fill>.nav-link,html[data-netbox-color-mode=dark] .nav-fill .nav-item,html[data-netbox-color-mode=light] .nav-fill>.nav-link,html[data-netbox-color-mode=light] .nav-fill .nav-item{flex:1 1 auto;text-align:center}}@media print{html .nav-justified>.nav-link,html .nav-justified .nav-item,html[data-netbox-color-mode=dark] .nav-justified>.nav-link,html[data-netbox-color-mode=dark] .nav-justified .nav-item,html[data-netbox-color-mode=light] .nav-justified>.nav-link,html[data-netbox-color-mode=light] .nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}}@media print{html .nav-fill .nav-item .nav-link,html .nav-justified .nav-item .nav-link,html[data-netbox-color-mode=dark] .nav-fill .nav-item .nav-link,html[data-netbox-color-mode=dark] .nav-justified .nav-item .nav-link,html[data-netbox-color-mode=light] .nav-fill .nav-item .nav-link,html[data-netbox-color-mode=light] .nav-justified .nav-item .nav-link{width:100%}}@media print{html .tab-content>.tab-pane,html[data-netbox-color-mode=dark] .tab-content>.tab-pane,html[data-netbox-color-mode=light] .tab-content>.tab-pane{display:none}html .tab-content>.active,html[data-netbox-color-mode=dark] .tab-content>.active,html[data-netbox-color-mode=light] .tab-content>.active{display:block}}@media print{html .navbar,html[data-netbox-color-mode=dark] .navbar,html[data-netbox-color-mode=light] .navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}html[data-netbox-color-mode=dark] .navbar>.container-xxl,html[data-netbox-color-mode=light] .navbar>.container-xxl,html[data-netbox-color-mode=dark] .navbar>.container-xl,html[data-netbox-color-mode=light] .navbar>.container-xl,html[data-netbox-color-mode=dark] .navbar>.container-lg,html[data-netbox-color-mode=light] .navbar>.container-lg,html[data-netbox-color-mode=dark] .navbar>.container-md,html[data-netbox-color-mode=light] .navbar>.container-md,html[data-netbox-color-mode=dark] .navbar>.container-sm,html[data-netbox-color-mode=light] .navbar>.container-sm,html .navbar>.container,html .navbar>.container-fluid,html .navbar>.container-sm,html .navbar>.container-md,html .navbar>.container-lg,html .navbar>.container-xl,html .navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}}@media print{html .navbar-brand,html[data-netbox-color-mode=dark] .navbar-brand,html[data-netbox-color-mode=light] .navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}}@media print{html .navbar-nav,html[data-netbox-color-mode=dark] .navbar-nav,html[data-netbox-color-mode=light] .navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}html .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-nav .nav-link{padding-right:0;padding-left:0}html .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-nav .dropdown-menu{position:static}}@media print{html .navbar-text,html[data-netbox-color-mode=dark] .navbar-text,html[data-netbox-color-mode=light] .navbar-text{padding-top:.5rem;padding-bottom:.5rem}}@media print{html .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-collapse,html[data-netbox-color-mode=light] .navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}}@media print{html .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-toggler,html[data-netbox-color-mode=light] .navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.375rem;transition:box-shadow .15s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-toggler,html[data-netbox-color-mode=light] .navbar-toggler{transition:none}}@media print{html .navbar-toggler:hover,html[data-netbox-color-mode=dark] .navbar-toggler:hover,html[data-netbox-color-mode=light] .navbar-toggler:hover{text-decoration:none}}@media print{html .navbar-toggler:focus,html[data-netbox-color-mode=dark] .navbar-toggler:focus,html[data-netbox-color-mode=light] .navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}}@media print{html .navbar-toggler-icon,html[data-netbox-color-mode=dark] .navbar-toggler-icon,html[data-netbox-color-mode=light] .navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}}@media print{html .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}}@media print and (min-width: 576px){html .navbar-expand-sm,html[data-netbox-color-mode=dark] .navbar-expand-sm,html[data-netbox-color-mode=light] .navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-sm .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-nav{flex-direction:row}html .navbar-expand-sm .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-sm .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-sm .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-nav-scroll{overflow:visible}html .navbar-expand-sm .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-sm .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-toggler{display:none}}@media print and (min-width: 768px){html .navbar-expand-md,html[data-netbox-color-mode=dark] .navbar-expand-md,html[data-netbox-color-mode=light] .navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-md .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-nav{flex-direction:row}html .navbar-expand-md .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-md .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-md .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-nav-scroll{overflow:visible}html .navbar-expand-md .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-md .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-toggler{display:none}}@media print and (min-width: 992px){html .navbar-expand-lg,html[data-netbox-color-mode=dark] .navbar-expand-lg,html[data-netbox-color-mode=light] .navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-lg .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-nav{flex-direction:row}html .navbar-expand-lg .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-lg .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-lg .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-nav-scroll{overflow:visible}html .navbar-expand-lg .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-lg .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-toggler{display:none}}@media print and (min-width: 1200px){html .navbar-expand-xl,html[data-netbox-color-mode=dark] .navbar-expand-xl,html[data-netbox-color-mode=light] .navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-xl .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-nav{flex-direction:row}html .navbar-expand-xl .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-xl .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-xl .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-nav-scroll{overflow:visible}html .navbar-expand-xl .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-xl .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-toggler{display:none}}@media print and (min-width: 1400px){html .navbar-expand-xxl,html[data-netbox-color-mode=dark] .navbar-expand-xxl,html[data-netbox-color-mode=light] .navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-xxl .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-nav{flex-direction:row}html .navbar-expand-xxl .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-xxl .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-xxl .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-nav-scroll{overflow:visible}html .navbar-expand-xxl .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-xxl .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-toggler{display:none}}@media print{html .navbar-expand,html[data-netbox-color-mode=dark] .navbar-expand,html[data-netbox-color-mode=light] .navbar-expand{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand .navbar-nav{flex-direction:row}html .navbar-expand .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand .navbar-nav-scroll{overflow:visible}html .navbar-expand .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand .navbar-toggler{display:none}}@media print{html .navbar-light .navbar-brand,html[data-netbox-color-mode=dark] .navbar-light .navbar-brand,html[data-netbox-color-mode=light] .navbar-light .navbar-brand{color:#000000e6}html .navbar-light .navbar-brand:hover,html .navbar-light .navbar-brand:focus,html[data-netbox-color-mode=dark] .navbar-light .navbar-brand:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-brand:focus,html[data-netbox-color-mode=light] .navbar-light .navbar-brand:hover,html[data-netbox-color-mode=light] .navbar-light .navbar-brand:focus{color:#000000e6}html .navbar-light .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link{color:#0000008c}html .navbar-light .navbar-nav .nav-link:hover,html .navbar-light .navbar-nav .nav-link:focus,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link:focus,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link:hover,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link:focus{color:#000000b3}html .navbar-light .navbar-nav .nav-link.disabled,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link.disabled,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}html .navbar-light .navbar-nav .show>.nav-link,html .navbar-light .navbar-nav .nav-link.active,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .show>.nav-link,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link.active,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .show>.nav-link,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link.active{color:#000000e6}html .navbar-light .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-light .navbar-toggler,html[data-netbox-color-mode=light] .navbar-light .navbar-toggler{color:#0000008c;border-color:#0000001a}html .navbar-light .navbar-toggler-icon,html[data-netbox-color-mode=dark] .navbar-light .navbar-toggler-icon,html[data-netbox-color-mode=light] .navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html .navbar-light .navbar-text,html[data-netbox-color-mode=dark] .navbar-light .navbar-text,html[data-netbox-color-mode=light] .navbar-light .navbar-text{color:#0000008c}html .navbar-light .navbar-text a,html .navbar-light .navbar-text a:hover,html .navbar-light .navbar-text a:focus,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a:focus,html[data-netbox-color-mode=light] .navbar-light .navbar-text a,html[data-netbox-color-mode=light] .navbar-light .navbar-text a:hover,html[data-netbox-color-mode=light] .navbar-light .navbar-text a:focus{color:#000000e6}}@media print{html .navbar-dark .navbar-brand,html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand,html[data-netbox-color-mode=light] .navbar-dark .navbar-brand{color:#fff}html .navbar-dark .navbar-brand:hover,html .navbar-dark .navbar-brand:focus,html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand:focus,html[data-netbox-color-mode=light] .navbar-dark .navbar-brand:hover,html[data-netbox-color-mode=light] .navbar-dark .navbar-brand:focus{color:#fff}html .navbar-dark .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link{color:#ffffff8c}html .navbar-dark .navbar-nav .nav-link:hover,html .navbar-dark .navbar-nav .nav-link:focus,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link:focus,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link:hover,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link:focus{color:#ffffffbf}html .navbar-dark .navbar-nav .nav-link.disabled,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link.disabled,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}html .navbar-dark .navbar-nav .show>.nav-link,html .navbar-dark .navbar-nav .nav-link.active,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .show>.nav-link,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link.active,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .show>.nav-link,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link.active{color:#fff}html .navbar-dark .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-dark .navbar-toggler,html[data-netbox-color-mode=light] .navbar-dark .navbar-toggler{color:#ffffff8c;border-color:#ffffff1a}html .navbar-dark .navbar-toggler-icon,html[data-netbox-color-mode=dark] .navbar-dark .navbar-toggler-icon,html[data-netbox-color-mode=light] .navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html .navbar-dark .navbar-text,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text,html[data-netbox-color-mode=light] .navbar-dark .navbar-text{color:#ffffff8c}html .navbar-dark .navbar-text a,html .navbar-dark .navbar-text a:hover,html .navbar-dark .navbar-text a:focus,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a:focus,html[data-netbox-color-mode=light] .navbar-dark .navbar-text a,html[data-netbox-color-mode=light] .navbar-dark .navbar-text a:hover,html[data-netbox-color-mode=light] .navbar-dark .navbar-text a:focus{color:#fff}}@media print{html .card,html[data-netbox-color-mode=dark] .card,html[data-netbox-color-mode=light] .card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.375rem}html .card>hr,html[data-netbox-color-mode=dark] .card>hr,html[data-netbox-color-mode=light] .card>hr{margin-right:0;margin-left:0}html .card>.list-group,html[data-netbox-color-mode=dark] .card>.list-group,html[data-netbox-color-mode=light] .card>.list-group{border-top:inherit;border-bottom:inherit}html .card>.list-group:first-child,html[data-netbox-color-mode=dark] .card>.list-group:first-child,html[data-netbox-color-mode=light] .card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html .card>.list-group:last-child,html[data-netbox-color-mode=dark] .card>.list-group:last-child,html[data-netbox-color-mode=light] .card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html .card>.card-header+.list-group,html .card>.list-group+.card-footer,html[data-netbox-color-mode=dark] .card>.card-header+.list-group,html[data-netbox-color-mode=dark] .card>.list-group+.card-footer,html[data-netbox-color-mode=light] .card>.card-header+.list-group,html[data-netbox-color-mode=light] .card>.list-group+.card-footer{border-top:0}}@media print{html .card-body,html[data-netbox-color-mode=dark] .card-body,html[data-netbox-color-mode=light] .card-body{flex:1 1 auto;padding:1rem}}@media print{html .card-title,html[data-netbox-color-mode=dark] .card-title,html[data-netbox-color-mode=light] .card-title{margin-bottom:.5rem}}@media print{html .card-subtitle,html[data-netbox-color-mode=dark] .card-subtitle,html[data-netbox-color-mode=light] .card-subtitle{margin-top:-.25rem;margin-bottom:0}}@media print{html .card-text:last-child,html[data-netbox-color-mode=dark] .card-text:last-child,html[data-netbox-color-mode=light] .card-text:last-child{margin-bottom:0}}@media print{html .card-link:hover,html[data-netbox-color-mode=dark] .card-link:hover,html[data-netbox-color-mode=light] .card-link:hover{text-decoration:none}html .card-link+.card-link,html[data-netbox-color-mode=dark] .card-link+.card-link,html[data-netbox-color-mode=light] .card-link+.card-link{margin-left:1rem}}@media print{html .card-header,html[data-netbox-color-mode=dark] .card-header,html[data-netbox-color-mode=light] .card-header{padding:.5rem 1rem;margin-bottom:0;color:#343a40;background-color:"unset";border-bottom:1px solid rgba(0,0,0,.125)}html .card-header:first-child,html[data-netbox-color-mode=dark] .card-header:first-child,html[data-netbox-color-mode=light] .card-header:first-child{border-radius:calc(.375rem - 1px) calc(.375rem - 1px) 0 0}}@media print{html .card-footer,html[data-netbox-color-mode=dark] .card-footer,html[data-netbox-color-mode=light] .card-footer{padding:.5rem 1rem;color:#343a40;background-color:"unset";border-top:1px solid rgba(0,0,0,.125)}html .card-footer:last-child,html[data-netbox-color-mode=dark] .card-footer:last-child,html[data-netbox-color-mode=light] .card-footer:last-child{border-radius:0 0 calc(.375rem - 1px) calc(.375rem - 1px)}}@media print{html .card-header-tabs,html[data-netbox-color-mode=dark] .card-header-tabs,html[data-netbox-color-mode=light] .card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}}@media print{html .card-header-pills,html[data-netbox-color-mode=dark] .card-header-pills,html[data-netbox-color-mode=light] .card-header-pills{margin-right:-.5rem;margin-left:-.5rem}}@media print{html .card-img-overlay,html[data-netbox-color-mode=dark] .card-img-overlay,html[data-netbox-color-mode=light] .card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.375rem - 1px)}}@media print{html .card-img,html .card-img-top,html .card-img-bottom,html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-top,html[data-netbox-color-mode=dark] .card-img-bottom,html[data-netbox-color-mode=light] .card-img,html[data-netbox-color-mode=light] .card-img-top,html[data-netbox-color-mode=light] .card-img-bottom{width:100%}}@media print{html .card-img,html .card-img-top,html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-top,html[data-netbox-color-mode=light] .card-img,html[data-netbox-color-mode=light] .card-img-top{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}}@media print{html .card-img,html .card-img-bottom,html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-bottom,html[data-netbox-color-mode=light] .card-img,html[data-netbox-color-mode=light] .card-img-bottom{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}}@media print{html .card-group>.card,html[data-netbox-color-mode=dark] .card-group>.card,html[data-netbox-color-mode=light] .card-group>.card{margin-bottom:.75rem}}@media print and (min-width: 576px){html .card-group,html[data-netbox-color-mode=dark] .card-group,html[data-netbox-color-mode=light] .card-group{display:flex;flex-flow:row wrap}html .card-group>.card,html[data-netbox-color-mode=dark] .card-group>.card,html[data-netbox-color-mode=light] .card-group>.card{flex:1 0 0%;margin-bottom:0}html .card-group>.card+.card,html[data-netbox-color-mode=dark] .card-group>.card+.card,html[data-netbox-color-mode=light] .card-group>.card+.card{margin-left:0;border-left:0}html .card-group>.card:not(:last-child),html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child),html[data-netbox-color-mode=light] .card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html .card-group>.card:not(:last-child) .card-img-top,html .card-group>.card:not(:last-child) .card-header,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-img-top,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-header,html[data-netbox-color-mode=light] .card-group>.card:not(:last-child) .card-img-top,html[data-netbox-color-mode=light] .card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}html .card-group>.card:not(:last-child) .card-img-bottom,html .card-group>.card:not(:last-child) .card-footer,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-img-bottom,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-footer,html[data-netbox-color-mode=light] .card-group>.card:not(:last-child) .card-img-bottom,html[data-netbox-color-mode=light] .card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}html .card-group>.card:not(:first-child),html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child),html[data-netbox-color-mode=light] .card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}html .card-group>.card:not(:first-child) .card-img-top,html .card-group>.card:not(:first-child) .card-header,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-img-top,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-header,html[data-netbox-color-mode=light] .card-group>.card:not(:first-child) .card-img-top,html[data-netbox-color-mode=light] .card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}html .card-group>.card:not(:first-child) .card-img-bottom,html .card-group>.card:not(:first-child) .card-footer,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-img-bottom,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-footer,html[data-netbox-color-mode=light] .card-group>.card:not(:first-child) .card-img-bottom,html[data-netbox-color-mode=light] .card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}@media print{html .accordion-button,html[data-netbox-color-mode=dark] .accordion-button,html[data-netbox-color-mode=light] .accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}}@media print and (prefers-reduced-motion: reduce){html .accordion-button,html[data-netbox-color-mode=dark] .accordion-button,html[data-netbox-color-mode=light] .accordion-button{transition:none}}@media print{html .accordion-button:not(.collapsed),html[data-netbox-color-mode=dark] .accordion-button:not(.collapsed),html[data-netbox-color-mode=light] .accordion-button:not(.collapsed){color:#343a40;background-color:#cfe2ff;box-shadow:inset 0 -1px #dee2e6}html .accordion-button:not(.collapsed):after,html[data-netbox-color-mode=dark] .accordion-button:not(.collapsed):after,html[data-netbox-color-mode=light] .accordion-button:not(.collapsed):after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}}@media print{html .accordion-button:after,html[data-netbox-color-mode=dark] .accordion-button:after,html[data-netbox-color-mode=light] .accordion-button:after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .accordion-button:after,html[data-netbox-color-mode=dark] .accordion-button:after,html[data-netbox-color-mode=light] .accordion-button:after{transition:none}}@media print{html .accordion-button:hover,html[data-netbox-color-mode=dark] .accordion-button:hover,html[data-netbox-color-mode=light] .accordion-button:hover{z-index:2}}@media print{html .accordion-button:focus,html[data-netbox-color-mode=dark] .accordion-button:focus,html[data-netbox-color-mode=light] .accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .accordion-header,html[data-netbox-color-mode=dark] .accordion-header,html[data-netbox-color-mode=light] .accordion-header{margin-bottom:0}}@media print{html .accordion-item,html[data-netbox-color-mode=dark] .accordion-item,html[data-netbox-color-mode=light] .accordion-item{background-color:transparent;border:1px solid #dee2e6}html .accordion-item:first-of-type,html[data-netbox-color-mode=dark] .accordion-item:first-of-type,html[data-netbox-color-mode=light] .accordion-item:first-of-type{border-top-left-radius:.375rem;border-top-right-radius:.375rem}html .accordion-item:first-of-type .accordion-button,html[data-netbox-color-mode=dark] .accordion-item:first-of-type .accordion-button,html[data-netbox-color-mode=light] .accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html .accordion-item:not(:first-of-type),html[data-netbox-color-mode=dark] .accordion-item:not(:first-of-type),html[data-netbox-color-mode=light] .accordion-item:not(:first-of-type){border-top:0}html .accordion-item:last-of-type,html[data-netbox-color-mode=dark] .accordion-item:last-of-type,html[data-netbox-color-mode=light] .accordion-item:last-of-type{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html .accordion-item:last-of-type .accordion-button.collapsed,html[data-netbox-color-mode=dark] .accordion-item:last-of-type .accordion-button.collapsed,html[data-netbox-color-mode=light] .accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html .accordion-item:last-of-type .accordion-collapse,html[data-netbox-color-mode=dark] .accordion-item:last-of-type .accordion-collapse,html[data-netbox-color-mode=light] .accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}}@media print{html .accordion-body,html[data-netbox-color-mode=dark] .accordion-body,html[data-netbox-color-mode=light] .accordion-body{padding:1rem 1.25rem}}@media print{html .accordion-flush .accordion-collapse,html[data-netbox-color-mode=dark] .accordion-flush .accordion-collapse,html[data-netbox-color-mode=light] .accordion-flush .accordion-collapse{border-width:0}html .accordion-flush .accordion-item,html[data-netbox-color-mode=dark] .accordion-flush .accordion-item,html[data-netbox-color-mode=light] .accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}html .accordion-flush .accordion-item:first-child,html[data-netbox-color-mode=dark] .accordion-flush .accordion-item:first-child,html[data-netbox-color-mode=light] .accordion-flush .accordion-item:first-child{border-top:0}html .accordion-flush .accordion-item:last-child,html[data-netbox-color-mode=dark] .accordion-flush .accordion-item:last-child,html[data-netbox-color-mode=light] .accordion-flush .accordion-item:last-child{border-bottom:0}html .accordion-flush .accordion-item .accordion-button,html[data-netbox-color-mode=dark] .accordion-flush .accordion-item .accordion-button,html[data-netbox-color-mode=light] .accordion-flush .accordion-item .accordion-button{border-radius:0}}@media print{html .breadcrumb,html[data-netbox-color-mode=dark] .breadcrumb,html[data-netbox-color-mode=light] .breadcrumb{display:flex;flex-wrap:wrap;padding:0;margin-bottom:1rem;list-style:none}}@media print{html .breadcrumb-item+.breadcrumb-item,html[data-netbox-color-mode=dark] .breadcrumb-item+.breadcrumb-item,html[data-netbox-color-mode=light] .breadcrumb-item+.breadcrumb-item{padding-left:.5rem}html .breadcrumb-item+.breadcrumb-item:before,html[data-netbox-color-mode=dark] .breadcrumb-item+.breadcrumb-item:before,html[data-netbox-color-mode=light] .breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='currentColor'/%3E%3C/svg%3E"))}html .breadcrumb-item.active,html[data-netbox-color-mode=dark] .breadcrumb-item.active,html[data-netbox-color-mode=light] .breadcrumb-item.active{color:#6c757d}}@media print{html .pagination,html[data-netbox-color-mode=dark] .pagination,html[data-netbox-color-mode=light] .pagination{display:flex;padding-left:0;list-style:none}}@media print{html .page-link,html[data-netbox-color-mode=dark] .page-link,html[data-netbox-color-mode=light] .page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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 print and (prefers-reduced-motion: reduce){html .page-link,html[data-netbox-color-mode=dark] .page-link,html[data-netbox-color-mode=light] .page-link{transition:none}}@media print{html .page-link:hover,html[data-netbox-color-mode=dark] .page-link:hover,html[data-netbox-color-mode=light] .page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}}@media print{html .page-link:focus,html[data-netbox-color-mode=dark] .page-link:focus,html[data-netbox-color-mode=light] .page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .page-item:not(:first-child) .page-link,html[data-netbox-color-mode=dark] .page-item:not(:first-child) .page-link,html[data-netbox-color-mode=light] .page-item:not(:first-child) .page-link{margin-left:-1px}html .page-item.active .page-link,html[data-netbox-color-mode=dark] .page-item.active .page-link,html[data-netbox-color-mode=light] .page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}html .page-item.disabled .page-link,html[data-netbox-color-mode=dark] .page-item.disabled .page-link,html[data-netbox-color-mode=light] .page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}}@media print{html .page-link,html[data-netbox-color-mode=dark] .page-link,html[data-netbox-color-mode=light] .page-link{padding:.375rem .75rem}}@media print{html .page-item:first-child .page-link,html[data-netbox-color-mode=dark] .page-item:first-child .page-link,html[data-netbox-color-mode=light] .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}html .page-item:last-child .page-link,html[data-netbox-color-mode=dark] .page-item:last-child .page-link,html[data-netbox-color-mode=light] .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}}@media print{html .pagination-lg .page-link,html[data-netbox-color-mode=dark] .pagination-lg .page-link,html[data-netbox-color-mode=light] .pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}html .pagination-lg .page-item:first-child .page-link,html[data-netbox-color-mode=dark] .pagination-lg .page-item:first-child .page-link,html[data-netbox-color-mode=light] .pagination-lg .page-item:first-child .page-link{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}html .pagination-lg .page-item:last-child .page-link,html[data-netbox-color-mode=dark] .pagination-lg .page-item:last-child .page-link,html[data-netbox-color-mode=light] .pagination-lg .page-item:last-child .page-link{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}}@media print{html .pagination-sm .page-link,html[data-netbox-color-mode=dark] .pagination-sm .page-link,html[data-netbox-color-mode=light] .pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}html .pagination-sm .page-item:first-child .page-link,html[data-netbox-color-mode=dark] .pagination-sm .page-item:first-child .page-link,html[data-netbox-color-mode=light] .pagination-sm .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}html .pagination-sm .page-item:last-child .page-link,html[data-netbox-color-mode=dark] .pagination-sm .page-item:last-child .page-link,html[data-netbox-color-mode=light] .pagination-sm .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}}@media print{html .badge,html[data-netbox-color-mode=dark] .badge,html[data-netbox-color-mode=light] .badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.375rem}html .badge:empty,html[data-netbox-color-mode=dark] .badge:empty,html[data-netbox-color-mode=light] .badge:empty{display:none}}@media print{html .btn .badge,html[data-netbox-color-mode=dark] .btn .badge,html[data-netbox-color-mode=light] .btn .badge{position:relative;top:-1px}}@media print{html .alert,html[data-netbox-color-mode=dark] .alert,html[data-netbox-color-mode=light] .alert{position:relative;padding:1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.375rem}}@media print{html .alert-heading,html[data-netbox-color-mode=dark] .alert-heading,html[data-netbox-color-mode=light] .alert-heading{color:inherit}}@media print{html .alert-link,html[data-netbox-color-mode=dark] .alert-link,html[data-netbox-color-mode=light] .alert-link{font-weight:700}}@media print{html .alert-dismissible,html[data-netbox-color-mode=dark] .alert-dismissible,html[data-netbox-color-mode=light] .alert-dismissible{padding-right:3rem}html .alert-dismissible .btn-close,html[data-netbox-color-mode=dark] .alert-dismissible .btn-close,html[data-netbox-color-mode=light] .alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}}@media print{html .alert-primary,html[data-netbox-color-mode=dark] .alert-primary,html[data-netbox-color-mode=light] .alert-primary{color:#1f496e;background-color:#d6e4f1;border-color:#c2d7e9}html .alert-primary .alert-link,html[data-netbox-color-mode=dark] .alert-primary .alert-link,html[data-netbox-color-mode=light] .alert-primary .alert-link{color:#193a58}}@media print{html .alert-secondary,html[data-netbox-color-mode=dark] .alert-secondary,html[data-netbox-color-mode=light] .alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}html .alert-secondary .alert-link,html[data-netbox-color-mode=dark] .alert-secondary .alert-link,html[data-netbox-color-mode=light] .alert-secondary .alert-link{color:#34383c}}@media print{html .alert-success,html[data-netbox-color-mode=dark] .alert-success,html[data-netbox-color-mode=light] .alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}html .alert-success .alert-link,html[data-netbox-color-mode=dark] .alert-success .alert-link,html[data-netbox-color-mode=light] .alert-success .alert-link{color:#0c4128}}@media print{html .alert-info,html[data-netbox-color-mode=dark] .alert-info,html[data-netbox-color-mode=light] .alert-info{color:#225660;background-color:#ddf7fc;border-color:#ccf3fb}html .alert-info .alert-link,html[data-netbox-color-mode=dark] .alert-info .alert-link,html[data-netbox-color-mode=light] .alert-info .alert-link{color:#1b454d}}@media print{html .alert-warning,html[data-netbox-color-mode=dark] .alert-warning,html[data-netbox-color-mode=light] .alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}html .alert-warning .alert-link,html[data-netbox-color-mode=dark] .alert-warning .alert-link,html[data-netbox-color-mode=light] .alert-warning .alert-link{color:#523e02}}@media print{html .alert-danger,html[data-netbox-color-mode=dark] .alert-danger,html[data-netbox-color-mode=light] .alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}html .alert-danger .alert-link,html[data-netbox-color-mode=dark] .alert-danger .alert-link,html[data-netbox-color-mode=light] .alert-danger .alert-link{color:#6a1a21}}@media print{html .alert-light,html[data-netbox-color-mode=dark] .alert-light,html[data-netbox-color-mode=light] .alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}html .alert-light .alert-link,html[data-netbox-color-mode=dark] .alert-light .alert-link,html[data-netbox-color-mode=light] .alert-light .alert-link{color:#4f5050}}@media print{html .alert-dark,html[data-netbox-color-mode=dark] .alert-dark,html[data-netbox-color-mode=light] .alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}html .alert-dark .alert-link,html[data-netbox-color-mode=dark] .alert-dark .alert-link,html[data-netbox-color-mode=light] .alert-dark .alert-link{color:#101214}}@media print{html .alert-red,html[data-netbox-color-mode=dark] .alert-red,html[data-netbox-color-mode=light] .alert-red{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}html .alert-red .alert-link,html[data-netbox-color-mode=dark] .alert-red .alert-link,html[data-netbox-color-mode=light] .alert-red .alert-link{color:#6a1a21}}@media print{html .alert-yellow,html[data-netbox-color-mode=dark] .alert-yellow,html[data-netbox-color-mode=light] .alert-yellow{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}html .alert-yellow .alert-link,html[data-netbox-color-mode=dark] .alert-yellow .alert-link,html[data-netbox-color-mode=light] .alert-yellow .alert-link{color:#523e02}}@media print{html .alert-green,html[data-netbox-color-mode=dark] .alert-green,html[data-netbox-color-mode=light] .alert-green{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}html .alert-green .alert-link,html[data-netbox-color-mode=dark] .alert-green .alert-link,html[data-netbox-color-mode=light] .alert-green .alert-link{color:#0c4128}}@media print{html .alert-blue,html[data-netbox-color-mode=dark] .alert-blue,html[data-netbox-color-mode=light] .alert-blue{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}html .alert-blue .alert-link,html[data-netbox-color-mode=dark] .alert-blue .alert-link,html[data-netbox-color-mode=light] .alert-blue .alert-link{color:#06357a}}@media print{html .alert-cyan,html[data-netbox-color-mode=dark] .alert-cyan,html[data-netbox-color-mode=light] .alert-cyan{color:#055160;background-color:#cff4fc;border-color:#b6effb}html .alert-cyan .alert-link,html[data-netbox-color-mode=dark] .alert-cyan .alert-link,html[data-netbox-color-mode=light] .alert-cyan .alert-link{color:#04414d}}@media print{html .alert-indigo,html[data-netbox-color-mode=dark] .alert-indigo,html[data-netbox-color-mode=light] .alert-indigo{color:#3d0a91;background-color:#e0cffc;border-color:#d1b7fb}html .alert-indigo .alert-link,html[data-netbox-color-mode=dark] .alert-indigo .alert-link,html[data-netbox-color-mode=light] .alert-indigo .alert-link{color:#310874}}@media print{html .alert-purple,html[data-netbox-color-mode=dark] .alert-purple,html[data-netbox-color-mode=light] .alert-purple{color:#432874;background-color:#e2d9f3;border-color:#d4c6ec}html .alert-purple .alert-link,html[data-netbox-color-mode=dark] .alert-purple .alert-link,html[data-netbox-color-mode=light] .alert-purple .alert-link{color:#36205d}}@media print{html .alert-pink,html[data-netbox-color-mode=dark] .alert-pink,html[data-netbox-color-mode=light] .alert-pink{color:#801f4f;background-color:#f7d6e6;border-color:#f3c2da}html .alert-pink .alert-link,html[data-netbox-color-mode=dark] .alert-pink .alert-link,html[data-netbox-color-mode=light] .alert-pink .alert-link{color:#66193f}}@media print{html .alert-darker,html[data-netbox-color-mode=dark] .alert-darker,html[data-netbox-color-mode=light] .alert-darker{color:#101314;background-color:#d1d2d3;border-color:#bbbcbd}html .alert-darker .alert-link,html[data-netbox-color-mode=dark] .alert-darker .alert-link,html[data-netbox-color-mode=light] .alert-darker .alert-link{color:#0d0f10}}@media print{html .alert-darkest,html[data-netbox-color-mode=dark] .alert-darkest,html[data-netbox-color-mode=light] .alert-darkest{color:#0e1011;background-color:#d1d1d2;border-color:#b9bbbb}html .alert-darkest .alert-link,html[data-netbox-color-mode=dark] .alert-darkest .alert-link,html[data-netbox-color-mode=light] .alert-darkest .alert-link{color:#0b0d0e}}@media print{html .alert-gray,html[data-netbox-color-mode=dark] .alert-gray,html[data-netbox-color-mode=light] .alert-gray{color:#525557;background-color:#f5f6f8;border-color:#f0f2f4}html .alert-gray .alert-link,html[data-netbox-color-mode=dark] .alert-gray .alert-link,html[data-netbox-color-mode=light] .alert-gray .alert-link{color:#424446}}@media print{html .alert-gray-100,html[data-netbox-color-mode=dark] .alert-gray-100,html[data-netbox-color-mode=light] .alert-gray-100{color:#636464;background-color:#fefefe;border-color:#fdfdfe}html .alert-gray-100 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-100 .alert-link,html[data-netbox-color-mode=light] .alert-gray-100 .alert-link{color:#4f5050}}@media print{html .alert-gray-200,html[data-netbox-color-mode=dark] .alert-gray-200,html[data-netbox-color-mode=light] .alert-gray-200{color:#5d5e60;background-color:#fbfbfc;border-color:#f8f9fa}html .alert-gray-200 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-200 .alert-link,html[data-netbox-color-mode=light] .alert-gray-200 .alert-link{color:#4a4b4d}}@media print{html .alert-gray-300,html[data-netbox-color-mode=dark] .alert-gray-300,html[data-netbox-color-mode=light] .alert-gray-300{color:#595a5c;background-color:#f8f9fa;border-color:#f5f6f8}html .alert-gray-300 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-300 .alert-link,html[data-netbox-color-mode=light] .alert-gray-300 .alert-link{color:#47484a}}@media print{html .alert-gray-400,html[data-netbox-color-mode=dark] .alert-gray-400,html[data-netbox-color-mode=light] .alert-gray-400{color:#525557;background-color:#f5f6f8;border-color:#f0f2f4}html .alert-gray-400 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-400 .alert-link,html[data-netbox-color-mode=light] .alert-gray-400 .alert-link{color:#424446}}@media print{html .alert-gray-500,html[data-netbox-color-mode=dark] .alert-gray-500,html[data-netbox-color-mode=light] .alert-gray-500{color:#686d71;background-color:#eff0f2;border-color:#e6e9eb}html .alert-gray-500 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-500 .alert-link,html[data-netbox-color-mode=light] .alert-gray-500 .alert-link{color:#53575a}}@media print{html .alert-gray-600,html[data-netbox-color-mode=dark] .alert-gray-600,html[data-netbox-color-mode=light] .alert-gray-600{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}html .alert-gray-600 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-600 .alert-link,html[data-netbox-color-mode=light] .alert-gray-600 .alert-link{color:#34383c}}@media print{html .alert-gray-700,html[data-netbox-color-mode=dark] .alert-gray-700,html[data-netbox-color-mode=light] .alert-gray-700{color:#2c3034;background-color:#dbdcdd;border-color:#c8cbcd}html .alert-gray-700 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-700 .alert-link,html[data-netbox-color-mode=light] .alert-gray-700 .alert-link{color:#23262a}}@media print{html .alert-gray-800,html[data-netbox-color-mode=dark] .alert-gray-800,html[data-netbox-color-mode=light] .alert-gray-800{color:#1f2326;background-color:#d6d8d9;border-color:#c2c4c6}html .alert-gray-800 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-800 .alert-link,html[data-netbox-color-mode=light] .alert-gray-800 .alert-link{color:#191c1e}}@media print{html .alert-gray-900,html[data-netbox-color-mode=dark] .alert-gray-900,html[data-netbox-color-mode=light] .alert-gray-900{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}html .alert-gray-900 .alert-link,html[data-netbox-color-mode=dark] .alert-gray-900 .alert-link,html[data-netbox-color-mode=light] .alert-gray-900 .alert-link{color:#101214}}@media print{html .alert-red-100,html[data-netbox-color-mode=dark] .alert-red-100,html[data-netbox-color-mode=light] .alert-red-100{color:#635657;background-color:#fef7f8;border-color:#fdf3f4}html .alert-red-100 .alert-link,html[data-netbox-color-mode=dark] .alert-red-100 .alert-link,html[data-netbox-color-mode=light] .alert-red-100 .alert-link{color:#4f4546}}@media print{html .alert-red-200,html[data-netbox-color-mode=dark] .alert-red-200,html[data-netbox-color-mode=light] .alert-red-200{color:#604648;background-color:#fceff0;border-color:#fbe7e9}html .alert-red-200 .alert-link,html[data-netbox-color-mode=dark] .alert-red-200 .alert-link,html[data-netbox-color-mode=light] .alert-red-200 .alert-link{color:#4d383a}}@media print{html .alert-red-300,html[data-netbox-color-mode=dark] .alert-red-300,html[data-netbox-color-mode=light] .alert-red-300{color:#8c5056;background-color:#fbe7e9;border-color:#f9dbdd}html .alert-red-300 .alert-link,html[data-netbox-color-mode=dark] .alert-red-300 .alert-link,html[data-netbox-color-mode=light] .alert-red-300 .alert-link{color:#704045}}@media print{html .alert-red-400,html[data-netbox-color-mode=dark] .alert-red-400,html[data-netbox-color-mode=light] .alert-red-400{color:#883840;background-color:#f9dfe1;border-color:#f7ced2}html .alert-red-400 .alert-link,html[data-netbox-color-mode=dark] .alert-red-400 .alert-link,html[data-netbox-color-mode=light] .alert-red-400 .alert-link{color:#6d2d33}}@media print{html .alert-red-500,html[data-netbox-color-mode=dark] .alert-red-500,html[data-netbox-color-mode=light] .alert-red-500{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}html .alert-red-500 .alert-link,html[data-netbox-color-mode=dark] .alert-red-500 .alert-link,html[data-netbox-color-mode=light] .alert-red-500 .alert-link{color:#6a1a21}}@media print{html .alert-red-600,html[data-netbox-color-mode=dark] .alert-red-600,html[data-netbox-color-mode=light] .alert-red-600{color:#6a1921;background-color:#efd4d7;border-color:#e7bfc3}html .alert-red-600 .alert-link,html[data-netbox-color-mode=dark] .alert-red-600 .alert-link,html[data-netbox-color-mode=light] .alert-red-600 .alert-link{color:#55141a}}@media print{html .alert-red-700,html[data-netbox-color-mode=dark] .alert-red-700,html[data-netbox-color-mode=light] .alert-red-700{color:#4f1319;background-color:#e6d2d4;border-color:#dabcbf}html .alert-red-700 .alert-link,html[data-netbox-color-mode=dark] .alert-red-700 .alert-link,html[data-netbox-color-mode=light] .alert-red-700 .alert-link{color:#3f0f14}}@media print{html .alert-red-800,html[data-netbox-color-mode=dark] .alert-red-800,html[data-netbox-color-mode=light] .alert-red-800{color:#350d11;background-color:#ded0d2;border-color:#cdb9bb}html .alert-red-800 .alert-link,html[data-netbox-color-mode=dark] .alert-red-800 .alert-link,html[data-netbox-color-mode=light] .alert-red-800 .alert-link{color:#2a0a0e}}@media print{html .alert-red-900,html[data-netbox-color-mode=dark] .alert-red-900,html[data-netbox-color-mode=light] .alert-red-900{color:#1a0708;background-color:#d5cecf;border-color:#c0b6b7}html .alert-red-900 .alert-link,html[data-netbox-color-mode=dark] .alert-red-900 .alert-link,html[data-netbox-color-mode=light] .alert-red-900 .alert-link{color:#150606}}@media print{html .alert-yellow-100,html[data-netbox-color-mode=dark] .alert-yellow-100,html[data-netbox-color-mode=light] .alert-yellow-100{color:#666152;background-color:#fffdf5;border-color:#fffbf0}html .alert-yellow-100 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-100 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-100 .alert-link{color:#524e42}}@media print{html .alert-yellow-200,html[data-netbox-color-mode=dark] .alert-yellow-200,html[data-netbox-color-mode=light] .alert-yellow-200{color:#665c3e;background-color:#fffaeb;border-color:#fff8e1}html .alert-yellow-200 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-200 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-200 .alert-link{color:#524a32}}@media print{html .alert-yellow-300,html[data-netbox-color-mode=dark] .alert-yellow-300,html[data-netbox-color-mode=light] .alert-yellow-300{color:#66572a;background-color:#fff8e1;border-color:#fff4d2}html .alert-yellow-300 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-300 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-300 .alert-link{color:#524622}}@media print{html .alert-yellow-400,html[data-netbox-color-mode=dark] .alert-yellow-400,html[data-netbox-color-mode=light] .alert-yellow-400{color:#665217;background-color:#fff5d7;border-color:#fff0c4}html .alert-yellow-400 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-400 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-400 .alert-link{color:#524212}}@media print{html .alert-yellow-500,html[data-netbox-color-mode=dark] .alert-yellow-500,html[data-netbox-color-mode=light] .alert-yellow-500{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}html .alert-yellow-500 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-500 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-500 .alert-link{color:#523e02}}@media print{html .alert-yellow-600,html[data-netbox-color-mode=dark] .alert-yellow-600,html[data-netbox-color-mode=light] .alert-yellow-600{color:#7a5c04;background-color:#f5ebcd;border-color:#f0e1b4}html .alert-yellow-600 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-600 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-600 .alert-link{color:#624a03}}@media print{html .alert-yellow-700,html[data-netbox-color-mode=dark] .alert-yellow-700,html[data-netbox-color-mode=light] .alert-yellow-700{color:#5c4602;background-color:#ebe3cd;border-color:#e0d5b4}html .alert-yellow-700 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-700 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-700 .alert-link{color:#4a3802}}@media print{html .alert-yellow-800,html[data-netbox-color-mode=dark] .alert-yellow-800,html[data-netbox-color-mode=light] .alert-yellow-800{color:#3d2e02;background-color:#e0dbcd;border-color:#d1cab3}html .alert-yellow-800 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-800 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-800 .alert-link{color:#312502}}@media print{html .alert-yellow-900,html[data-netbox-color-mode=dark] .alert-yellow-900,html[data-netbox-color-mode=light] .alert-yellow-900{color:#1f1701;background-color:#d6d4cc;border-color:#c2beb3}html .alert-yellow-900 .alert-link,html[data-netbox-color-mode=dark] .alert-yellow-900 .alert-link,html[data-netbox-color-mode=light] .alert-yellow-900 .alert-link{color:#191201}}@media print{html .alert-green-100,html[data-netbox-color-mode=dark] .alert-green-100,html[data-netbox-color-mode=light] .alert-green-100{color:#545c58;background-color:#f6faf8;border-color:#f1f8f5}html .alert-green-100 .alert-link,html[data-netbox-color-mode=dark] .alert-green-100 .alert-link,html[data-netbox-color-mode=light] .alert-green-100 .alert-link{color:#434a46}}@media print{html .alert-green-200,html[data-netbox-color-mode=dark] .alert-green-200,html[data-netbox-color-mode=light] .alert-green-200{color:#41534b;background-color:#edf5f1;border-color:#e3f1eb}html .alert-green-200 .alert-link,html[data-netbox-color-mode=dark] .alert-green-200 .alert-link,html[data-netbox-color-mode=light] .alert-green-200 .alert-link{color:#34423c}}@media print{html .alert-green-300,html[data-netbox-color-mode=dark] .alert-green-300,html[data-netbox-color-mode=light] .alert-green-300{color:#466e5b;background-color:#e3f1ea;border-color:#d6e9e0}html .alert-green-300 .alert-link,html[data-netbox-color-mode=dark] .alert-green-300 .alert-link,html[data-netbox-color-mode=light] .alert-green-300 .alert-link{color:#385849}}@media print{html .alert-green-400,html[data-netbox-color-mode=dark] .alert-green-400,html[data-netbox-color-mode=light] .alert-green-400{color:#2b5f47;background-color:#daece4;border-color:#c8e2d6}html .alert-green-400 .alert-link,html[data-netbox-color-mode=dark] .alert-green-400 .alert-link,html[data-netbox-color-mode=light] .alert-green-400 .alert-link{color:#224c39}}@media print{html .alert-green-500,html[data-netbox-color-mode=dark] .alert-green-500,html[data-netbox-color-mode=light] .alert-green-500{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}html .alert-green-500 .alert-link,html[data-netbox-color-mode=dark] .alert-green-500 .alert-link,html[data-netbox-color-mode=light] .alert-green-500 .alert-link{color:#0c4128}}@media print{html .alert-green-600,html[data-netbox-color-mode=dark] .alert-green-600,html[data-netbox-color-mode=light] .alert-green-600{color:#0c4128;background-color:#d0e2d9;border-color:#b9d3c7}html .alert-green-600 .alert-link,html[data-netbox-color-mode=dark] .alert-green-600 .alert-link,html[data-netbox-color-mode=light] .alert-green-600 .alert-link{color:#0a3420}}@media print{html .alert-green-700,html[data-netbox-color-mode=dark] .alert-green-700,html[data-netbox-color-mode=light] .alert-green-700{color:#09311e;background-color:#cfdcd6;border-color:#b7cbc2}html .alert-green-700 .alert-link,html[data-netbox-color-mode=dark] .alert-green-700 .alert-link,html[data-netbox-color-mode=light] .alert-green-700 .alert-link{color:#072718}}@media print{html .alert-green-800,html[data-netbox-color-mode=dark] .alert-green-800,html[data-netbox-color-mode=light] .alert-green-800{color:#062014;background-color:#ced7d3;border-color:#b6c3bd}html .alert-green-800 .alert-link,html[data-netbox-color-mode=dark] .alert-green-800 .alert-link,html[data-netbox-color-mode=light] .alert-green-800 .alert-link{color:#051a10}}@media print{html .alert-green-900,html[data-netbox-color-mode=dark] .alert-green-900,html[data-netbox-color-mode=light] .alert-green-900{color:#03100a;background-color:#cdd1cf;border-color:#b4bbb8}html .alert-green-900 .alert-link,html[data-netbox-color-mode=dark] .alert-green-900 .alert-link,html[data-netbox-color-mode=light] .alert-green-900 .alert-link{color:#020d08}}@media print{html .alert-blue-100,html[data-netbox-color-mode=dark] .alert-blue-100,html[data-netbox-color-mode=light] .alert-blue-100{color:#535a66;background-color:#f5f9ff;border-color:#f1f6ff}html .alert-blue-100 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-100 .alert-link,html[data-netbox-color-mode=light] .alert-blue-100 .alert-link{color:#424852}}@media print{html .alert-blue-200,html[data-netbox-color-mode=dark] .alert-blue-200,html[data-netbox-color-mode=light] .alert-blue-200{color:#3f4f66;background-color:#ecf3ff;border-color:#e2eeff}html .alert-blue-200 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-200 .alert-link,html[data-netbox-color-mode=light] .alert-blue-200 .alert-link{color:#323f52}}@media print{html .alert-blue-300,html[data-netbox-color-mode=dark] .alert-blue-300,html[data-netbox-color-mode=light] .alert-blue-300{color:#426598;background-color:#e2eeff;border-color:#d4e5ff}html .alert-blue-300 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-300 .alert-link,html[data-netbox-color-mode=light] .alert-blue-300 .alert-link{color:#35517a}}@media print{html .alert-blue-400,html[data-netbox-color-mode=dark] .alert-blue-400,html[data-netbox-color-mode=light] .alert-blue-400{color:#255398;background-color:#d8e8ff;border-color:#c5dcfe}html .alert-blue-400 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-400 .alert-link,html[data-netbox-color-mode=light] .alert-blue-400 .alert-link{color:#1e427a}}@media print{html .alert-blue-500,html[data-netbox-color-mode=dark] .alert-blue-500,html[data-netbox-color-mode=light] .alert-blue-500{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}html .alert-blue-500 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-500 .alert-link,html[data-netbox-color-mode=light] .alert-blue-500 .alert-link{color:#06357a}}@media print{html .alert-blue-600,html[data-netbox-color-mode=dark] .alert-blue-600,html[data-netbox-color-mode=light] .alert-blue-600{color:#063579;background-color:#cedef4;border-color:#b6cdef}html .alert-blue-600 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-600 .alert-link,html[data-netbox-color-mode=light] .alert-blue-600 .alert-link{color:#052a61}}@media print{html .alert-blue-700,html[data-netbox-color-mode=dark] .alert-blue-700,html[data-netbox-color-mode=light] .alert-blue-700{color:#05285b;background-color:#ced9ea;border-color:#b5c6e0}html .alert-blue-700 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-700 .alert-link,html[data-netbox-color-mode=light] .alert-blue-700 .alert-link{color:#042049}}@media print{html .alert-blue-800,html[data-netbox-color-mode=dark] .alert-blue-800,html[data-netbox-color-mode=light] .alert-blue-800{color:#031a3d;background-color:#cdd5e0;border-color:#b4c0d1}html .alert-blue-800 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-800 .alert-link,html[data-netbox-color-mode=light] .alert-blue-800 .alert-link{color:#021531}}@media print{html .alert-blue-900,html[data-netbox-color-mode=dark] .alert-blue-900,html[data-netbox-color-mode=light] .alert-blue-900{color:#020d1f;background-color:#cdd0d6;border-color:#b3b9c2}html .alert-blue-900 .alert-link,html[data-netbox-color-mode=dark] .alert-blue-900 .alert-link,html[data-netbox-color-mode=light] .alert-blue-900 .alert-link{color:#020a19}}@media print{html .alert-cyan-100,html[data-netbox-color-mode=dark] .alert-cyan-100,html[data-netbox-color-mode=light] .alert-cyan-100{color:#536265;background-color:#f5fdfe;border-color:#f1fcfe}html .alert-cyan-100 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-100 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-100 .alert-link{color:#424e51}}@media print{html .alert-cyan-200,html[data-netbox-color-mode=dark] .alert-cyan-200,html[data-netbox-color-mode=light] .alert-cyan-200{color:#3f5e64;background-color:#ecfbfe;border-color:#e2f9fd}html .alert-cyan-200 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-200 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-200 .alert-link{color:#324b50}}@media print{html .alert-cyan-300,html[data-netbox-color-mode=dark] .alert-cyan-300,html[data-netbox-color-mode=light] .alert-cyan-300{color:#2c5962;background-color:#e2f9fd;border-color:#d4f5fc}html .alert-cyan-300 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-300 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-300 .alert-link{color:#23474e}}@media print{html .alert-cyan-400,html[data-netbox-color-mode=dark] .alert-cyan-400,html[data-netbox-color-mode=light] .alert-cyan-400{color:#185561;background-color:#d8f7fd;border-color:#c5f2fb}html .alert-cyan-400 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-400 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-400 .alert-link{color:#13444e}}@media print{html .alert-cyan-500,html[data-netbox-color-mode=dark] .alert-cyan-500,html[data-netbox-color-mode=light] .alert-cyan-500{color:#055160;background-color:#cff4fc;border-color:#b6effb}html .alert-cyan-500 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-500 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-500 .alert-link{color:#04414d}}@media print{html .alert-cyan-600,html[data-netbox-color-mode=dark] .alert-cyan-600,html[data-netbox-color-mode=light] .alert-cyan-600{color:#066173;background-color:#ceecf2;border-color:#b6e3ec}html .alert-cyan-600 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-600 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-600 .alert-link{color:#054e5c}}@media print{html .alert-cyan-700,html[data-netbox-color-mode=dark] .alert-cyan-700,html[data-netbox-color-mode=light] .alert-cyan-700{color:#054956;background-color:#cee4e9;border-color:#b5d7de}html .alert-cyan-700 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-700 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-700 .alert-link{color:#043a45}}@media print{html .alert-cyan-800,html[data-netbox-color-mode=dark] .alert-cyan-800,html[data-netbox-color-mode=light] .alert-cyan-800{color:#03313a;background-color:#cddcdf;border-color:#b4cbcf}html .alert-cyan-800 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-800 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-800 .alert-link{color:#02272e}}@media print{html .alert-cyan-900,html[data-netbox-color-mode=dark] .alert-cyan-900,html[data-netbox-color-mode=light] .alert-cyan-900{color:#02181d;background-color:#cdd4d6;border-color:#b3bfc1}html .alert-cyan-900 .alert-link,html[data-netbox-color-mode=dark] .alert-cyan-900 .alert-link,html[data-netbox-color-mode=light] .alert-cyan-900 .alert-link{color:#021317}}@media print{html .alert-indigo-100,html[data-netbox-color-mode=dark] .alert-indigo-100,html[data-netbox-color-mode=light] .alert-indigo-100{color:#5a5365;background-color:#f9f5fe;border-color:#f6f1fe}html .alert-indigo-100 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-100 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-100 .alert-link{color:#484251}}@media print{html .alert-indigo-200,html[data-netbox-color-mode=dark] .alert-indigo-200,html[data-netbox-color-mode=light] .alert-indigo-200{color:#745f96;background-color:#f3ecfe;border-color:#ede2fe}html .alert-indigo-200 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-200 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-200 .alert-link{color:#5d4c78}}@media print{html .alert-indigo-300,html[data-netbox-color-mode=dark] .alert-indigo-300,html[data-netbox-color-mode=light] .alert-indigo-300{color:#624394;background-color:#ede2fd;border-color:#e3d4fd}html .alert-indigo-300 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-300 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-300 .alert-link{color:#4e3676}}@media print{html .alert-indigo-400,html[data-netbox-color-mode=dark] .alert-indigo-400,html[data-netbox-color-mode=light] .alert-indigo-400{color:#502693;background-color:#e7d9fd;border-color:#dac6fc}html .alert-indigo-400 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-400 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-400 .alert-link{color:#401e76}}@media print{html .alert-indigo-500,html[data-netbox-color-mode=dark] .alert-indigo-500,html[data-netbox-color-mode=light] .alert-indigo-500{color:#3d0a91;background-color:#e0cffc;border-color:#d1b7fb}html .alert-indigo-500 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-500 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-500 .alert-link{color:#310874}}@media print{html .alert-indigo-600,html[data-netbox-color-mode=dark] .alert-indigo-600,html[data-netbox-color-mode=light] .alert-indigo-600{color:#310874;background-color:#dccff3;border-color:#cbb6ed}html .alert-indigo-600 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-600 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-600 .alert-link{color:#27065d}}@media print{html .alert-indigo-700,html[data-netbox-color-mode=dark] .alert-indigo-700,html[data-netbox-color-mode=light] .alert-indigo-700{color:#250657;background-color:#d8cee9;border-color:#c5b6de}html .alert-indigo-700 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-700 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-700 .alert-link{color:#1e0546}}@media print{html .alert-indigo-800,html[data-netbox-color-mode=dark] .alert-indigo-800,html[data-netbox-color-mode=light] .alert-indigo-800{color:#19043a;background-color:#d4cddf;border-color:#bfb4d0}html .alert-indigo-800 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-800 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-800 .alert-link{color:#14032e}}@media print{html .alert-indigo-900,html[data-netbox-color-mode=dark] .alert-indigo-900,html[data-netbox-color-mode=light] .alert-indigo-900{color:#0c021d;background-color:#d0cdd6;border-color:#b9b3c1}html .alert-indigo-900 .alert-link,html[data-netbox-color-mode=dark] .alert-indigo-900 .alert-link,html[data-netbox-color-mode=light] .alert-indigo-900 .alert-link{color:#0a0217}}@media print{html .alert-purple-100,html[data-netbox-color-mode=dark] .alert-purple-100,html[data-netbox-color-mode=light] .alert-purple-100{color:#5a5761;background-color:#f9f7fd;border-color:#f6f4fb}html .alert-purple-100 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-100 .alert-link,html[data-netbox-color-mode=light] .alert-purple-100 .alert-link{color:#48464e}}@media print{html .alert-purple-200,html[data-netbox-color-mode=dark] .alert-purple-200,html[data-netbox-color-mode=light] .alert-purple-200{color:#4f485c;background-color:#f3f0fa;border-color:#eee8f8}html .alert-purple-200 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-200 .alert-link,html[data-netbox-color-mode=light] .alert-purple-200 .alert-link{color:#3f3a4a}}@media print{html .alert-purple-300,html[data-netbox-color-mode=dark] .alert-purple-300,html[data-netbox-color-mode=light] .alert-purple-300{color:#655583;background-color:#eee8f8;border-color:#e5ddf4}html .alert-purple-300 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-300 .alert-link,html[data-netbox-color-mode=light] .alert-purple-300 .alert-link{color:#514469}}@media print{html .alert-purple-400,html[data-netbox-color-mode=dark] .alert-purple-400,html[data-netbox-color-mode=light] .alert-purple-400{color:#543e7b;background-color:#e8e1f5;border-color:#ddd2f0}html .alert-purple-400 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-400 .alert-link,html[data-netbox-color-mode=light] .alert-purple-400 .alert-link{color:#433262}}@media print{html .alert-purple-500,html[data-netbox-color-mode=dark] .alert-purple-500,html[data-netbox-color-mode=light] .alert-purple-500{color:#432874;background-color:#e2d9f3;border-color:#d4c6ec}html .alert-purple-500 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-500 .alert-link,html[data-netbox-color-mode=light] .alert-purple-500 .alert-link{color:#36205d}}@media print{html .alert-purple-600,html[data-netbox-color-mode=dark] .alert-purple-600,html[data-netbox-color-mode=light] .alert-purple-600{color:#35205c;background-color:#ded7eb;border-color:#cdc2e1}html .alert-purple-600 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-600 .alert-link,html[data-netbox-color-mode=light] .alert-purple-600 .alert-link{color:#2a1a4a}}@media print{html .alert-purple-700,html[data-netbox-color-mode=dark] .alert-purple-700,html[data-netbox-color-mode=light] .alert-purple-700{color:#281846;background-color:#d9d4e3;border-color:#c7bfd5}html .alert-purple-700 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-700 .alert-link,html[data-netbox-color-mode=light] .alert-purple-700 .alert-link{color:#201338}}@media print{html .alert-purple-800,html[data-netbox-color-mode=dark] .alert-purple-800,html[data-netbox-color-mode=light] .alert-purple-800{color:#1a102e;background-color:#d5d1db;border-color:#c0baca}html .alert-purple-800 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-800 .alert-link,html[data-netbox-color-mode=light] .alert-purple-800 .alert-link{color:#150d25}}@media print{html .alert-purple-900,html[data-netbox-color-mode=dark] .alert-purple-900,html[data-netbox-color-mode=light] .alert-purple-900{color:#0d0817;background-color:#d0cfd4;border-color:#b9b6be}html .alert-purple-900 .alert-link,html[data-netbox-color-mode=dark] .alert-purple-900 .alert-link,html[data-netbox-color-mode=light] .alert-purple-900 .alert-link{color:#0a0612}}@media print{html .alert-pink-100,html[data-netbox-color-mode=dark] .alert-pink-100,html[data-netbox-color-mode=light] .alert-pink-100{color:#63565c;background-color:#fdf7fa;border-color:#fdf3f8}html .alert-pink-100 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-100 .alert-link,html[data-netbox-color-mode=light] .alert-pink-100 .alert-link{color:#4f454a}}@media print{html .alert-pink-200,html[data-netbox-color-mode=dark] .alert-pink-200,html[data-netbox-color-mode=light] .alert-pink-200{color:#604552;background-color:#fceff5;border-color:#fae6f0}html .alert-pink-200 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-200 .alert-link,html[data-netbox-color-mode=light] .alert-pink-200 .alert-link{color:#4d3742}}@media print{html .alert-pink-300,html[data-netbox-color-mode=dark] .alert-pink-300,html[data-netbox-color-mode=light] .alert-pink-300{color:#8a506d;background-color:#fae7f0;border-color:#f8dae9}html .alert-pink-300 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-300 .alert-link,html[data-netbox-color-mode=light] .alert-pink-300 .alert-link{color:#6e4057}}@media print{html .alert-pink-400,html[data-netbox-color-mode=dark] .alert-pink-400,html[data-netbox-color-mode=light] .alert-pink-400{color:#85375e;background-color:#f8deeb;border-color:#f5cee2}html .alert-pink-400 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-400 .alert-link,html[data-netbox-color-mode=light] .alert-pink-400 .alert-link{color:#6a2c4b}}@media print{html .alert-pink-500,html[data-netbox-color-mode=dark] .alert-pink-500,html[data-netbox-color-mode=light] .alert-pink-500{color:#801f4f;background-color:#f7d6e6;border-color:#f3c2da}html .alert-pink-500 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-500 .alert-link,html[data-netbox-color-mode=light] .alert-pink-500 .alert-link{color:#66193f}}@media print{html .alert-pink-600,html[data-netbox-color-mode=dark] .alert-pink-600,html[data-netbox-color-mode=light] .alert-pink-600{color:#671940;background-color:#eed4e1;border-color:#e6bfd2}html .alert-pink-600 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-600 .alert-link,html[data-netbox-color-mode=light] .alert-pink-600 .alert-link{color:#521433}}@media print{html .alert-pink-700,html[data-netbox-color-mode=dark] .alert-pink-700,html[data-netbox-color-mode=light] .alert-pink-700{color:#4d132f;background-color:#e6d2dc;border-color:#d9bcca}html .alert-pink-700 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-700 .alert-link,html[data-netbox-color-mode=light] .alert-pink-700 .alert-link{color:#3e0f26}}@media print{html .alert-pink-800,html[data-netbox-color-mode=dark] .alert-pink-800,html[data-netbox-color-mode=light] .alert-pink-800{color:#340c20;background-color:#ddd0d7;border-color:#ccb9c2}html .alert-pink-800 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-800 .alert-link,html[data-netbox-color-mode=light] .alert-pink-800 .alert-link{color:#2a0a1a}}@media print{html .alert-pink-900,html[data-netbox-color-mode=dark] .alert-pink-900,html[data-netbox-color-mode=light] .alert-pink-900{color:#1a0610;background-color:#d5ced1;border-color:#bfb6ba}html .alert-pink-900 .alert-link,html[data-netbox-color-mode=dark] .alert-pink-900 .alert-link,html[data-netbox-color-mode=light] .alert-pink-900 .alert-link{color:#15050d}}@media print{@keyframes progress-bar-stripes{0%{background-position-x:1rem}}}@media print{html .progress,html[data-netbox-color-mode=dark] .progress,html[data-netbox-color-mode=light] .progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.375rem}}@media print{html .progress-bar,html[data-netbox-color-mode=dark] .progress-bar,html[data-netbox-color-mode=light] .progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}}@media print and (prefers-reduced-motion: reduce){html .progress-bar,html[data-netbox-color-mode=dark] .progress-bar,html[data-netbox-color-mode=light] .progress-bar{transition:none}}@media print{html .progress-bar-striped,html[data-netbox-color-mode=dark] .progress-bar-striped,html[data-netbox-color-mode=light] .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:1rem 1rem}}@media print{html .progress-bar-animated,html[data-netbox-color-mode=dark] .progress-bar-animated,html[data-netbox-color-mode=light] .progress-bar-animated{animation:1s linear infinite progress-bar-stripes}}@media print and (prefers-reduced-motion: reduce){html .progress-bar-animated,html[data-netbox-color-mode=dark] .progress-bar-animated,html[data-netbox-color-mode=light] .progress-bar-animated{animation:none}}@media print{html .list-group,html[data-netbox-color-mode=dark] .list-group,html[data-netbox-color-mode=light] .list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.375rem}}@media print{html .list-group-numbered,html[data-netbox-color-mode=dark] .list-group-numbered,html[data-netbox-color-mode=light] .list-group-numbered{list-style-type:none;counter-reset:section}html .list-group-numbered>li:before,html[data-netbox-color-mode=dark] .list-group-numbered>li:before,html[data-netbox-color-mode=light] .list-group-numbered>li:before{content:counters(section,".") ". ";counter-increment:section}}@media print{html .list-group-item-action,html[data-netbox-color-mode=dark] .list-group-item-action,html[data-netbox-color-mode=light] .list-group-item-action{width:100%;color:#495057;text-align:inherit}html .list-group-item-action:hover,html .list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}html .list-group-item-action:active,html[data-netbox-color-mode=dark] .list-group-item-action:active,html[data-netbox-color-mode=light] .list-group-item-action:active{color:#212529;background-color:#e9ecef}}@media print{html .list-group-item,html[data-netbox-color-mode=dark] .list-group-item,html[data-netbox-color-mode=light] .list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#495057;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}html .list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}html .list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}html .list-group-item.disabled,html .list-group-item:disabled,html[data-netbox-color-mode=dark] .list-group-item.disabled,html[data-netbox-color-mode=dark] .list-group-item:disabled,html[data-netbox-color-mode=light] .list-group-item.disabled,html[data-netbox-color-mode=light] .list-group-item:disabled{color:#adb5bd;pointer-events:none;background-color:#fff}html .list-group-item.active,html[data-netbox-color-mode=dark] .list-group-item.active,html[data-netbox-color-mode=light] .list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}html .list-group-item+html .list-group-item,html .list-group-item+html[data-netbox-color-mode=dark] .list-group-item,html .list-group-item+html[data-netbox-color-mode=light] .list-group-item,html[data-netbox-color-mode=dark] .list-group-item+html .list-group-item,html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item,html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=light] .list-group-item,html[data-netbox-color-mode=light] .list-group-item+html .list-group-item,html[data-netbox-color-mode=light] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item,html[data-netbox-color-mode=light] .list-group-item+html[data-netbox-color-mode=light] .list-group-item{border-top-width:0}html .list-group-item+html .list-group-item.active,html .list-group-item+html[data-netbox-color-mode=dark] .list-group-item.active,html .list-group-item+html[data-netbox-color-mode=light] .list-group-item.active,html[data-netbox-color-mode=dark] .list-group-item+html .list-group-item.active,html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item.active,html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=light] .list-group-item.active,html[data-netbox-color-mode=light] .list-group-item+html .list-group-item.active,html[data-netbox-color-mode=light] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item.active,html[data-netbox-color-mode=light] .list-group-item+html[data-netbox-color-mode=light] .list-group-item.active{margin-top:-1px;border-top-width:1px}}@media print{html .list-group-horizontal,html[data-netbox-color-mode=dark] .list-group-horizontal,html[data-netbox-color-mode=light] .list-group-horizontal{flex-direction:row}html .list-group-horizontal>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item.active{margin-top:0}html .list-group-horizontal>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 576px){html .list-group-horizontal-sm,html[data-netbox-color-mode=dark] .list-group-horizontal-sm,html[data-netbox-color-mode=light] .list-group-horizontal-sm{flex-direction:row}html .list-group-horizontal-sm>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-sm>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-sm>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item.active{margin-top:0}html .list-group-horizontal-sm>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-sm>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 768px){html .list-group-horizontal-md,html[data-netbox-color-mode=dark] .list-group-horizontal-md,html[data-netbox-color-mode=light] .list-group-horizontal-md{flex-direction:row}html .list-group-horizontal-md>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-md>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-md>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item.active{margin-top:0}html .list-group-horizontal-md>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-md>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 992px){html .list-group-horizontal-lg,html[data-netbox-color-mode=dark] .list-group-horizontal-lg,html[data-netbox-color-mode=light] .list-group-horizontal-lg{flex-direction:row}html .list-group-horizontal-lg>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-lg>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-lg>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item.active{margin-top:0}html .list-group-horizontal-lg>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-lg>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 1200px){html .list-group-horizontal-xl,html[data-netbox-color-mode=dark] .list-group-horizontal-xl,html[data-netbox-color-mode=light] .list-group-horizontal-xl{flex-direction:row}html .list-group-horizontal-xl>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-xl>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-xl>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item.active{margin-top:0}html .list-group-horizontal-xl>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-xl>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 1400px){html .list-group-horizontal-xxl,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl,html[data-netbox-color-mode=light] .list-group-horizontal-xxl{flex-direction:row}html .list-group-horizontal-xxl>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-xxl>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-xxl>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item.active{margin-top:0}html .list-group-horizontal-xxl>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-xxl>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print{html .list-group-flush,html[data-netbox-color-mode=dark] .list-group-flush,html[data-netbox-color-mode=light] .list-group-flush{border-radius:0}html .list-group-flush>.list-group-item,html[data-netbox-color-mode=dark] .list-group-flush>.list-group-item,html[data-netbox-color-mode=light] .list-group-flush>.list-group-item{border-width:0 0 1px}html .list-group-flush>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-flush>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-flush>.list-group-item:last-child{border-bottom-width:0}}@media print{html .list-group-item-primary,html[data-netbox-color-mode=dark] .list-group-item-primary,html[data-netbox-color-mode=light] .list-group-item-primary{color:#1f496e;background-color:#d6e4f1}html .list-group-item-primary.list-group-item-action:hover,html .list-group-item-primary.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-primary.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-primary.list-group-item-action:focus{color:#1f496e;background-color:#c1cdd9}html .list-group-item-primary.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1f496e;border-color:#1f496e}}@media print{html .list-group-item-secondary,html[data-netbox-color-mode=dark] .list-group-item-secondary,html[data-netbox-color-mode=light] .list-group-item-secondary{color:#41464b;background-color:#e2e3e5}html .list-group-item-secondary.list-group-item-action:hover,html .list-group-item-secondary.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-secondary.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-secondary.list-group-item-action:focus{color:#41464b;background-color:#cbccce}html .list-group-item-secondary.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}}@media print{html .list-group-item-success,html[data-netbox-color-mode=dark] .list-group-item-success,html[data-netbox-color-mode=light] .list-group-item-success{color:#0f5132;background-color:#d1e7dd}html .list-group-item-success.list-group-item-action:hover,html .list-group-item-success.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-success.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-success.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}html .list-group-item-success.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}}@media print{html .list-group-item-info,html[data-netbox-color-mode=dark] .list-group-item-info,html[data-netbox-color-mode=light] .list-group-item-info{color:#225660;background-color:#ddf7fc}html .list-group-item-info.list-group-item-action:hover,html .list-group-item-info.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-info.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-info.list-group-item-action:focus{color:#225660;background-color:#c7dee3}html .list-group-item-info.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-info.list-group-item-action.active{color:#fff;background-color:#225660;border-color:#225660}}@media print{html .list-group-item-warning,html[data-netbox-color-mode=dark] .list-group-item-warning,html[data-netbox-color-mode=light] .list-group-item-warning{color:#664d03;background-color:#fff3cd}html .list-group-item-warning.list-group-item-action:hover,html .list-group-item-warning.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-warning.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-warning.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}html .list-group-item-warning.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}}@media print{html .list-group-item-danger,html[data-netbox-color-mode=dark] .list-group-item-danger,html[data-netbox-color-mode=light] .list-group-item-danger{color:#842029;background-color:#f8d7da}html .list-group-item-danger.list-group-item-action:hover,html .list-group-item-danger.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-danger.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-danger.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}html .list-group-item-danger.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}}@media print{html .list-group-item-light,html[data-netbox-color-mode=dark] .list-group-item-light,html[data-netbox-color-mode=light] .list-group-item-light{color:#636464;background-color:#fefefe}html .list-group-item-light.list-group-item-action:hover,html .list-group-item-light.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-light.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-light.list-group-item-action:focus{color:#636464;background-color:#e5e5e5}html .list-group-item-light.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}}@media print{html .list-group-item-dark,html[data-netbox-color-mode=dark] .list-group-item-dark,html[data-netbox-color-mode=light] .list-group-item-dark{color:#141619;background-color:#d3d3d4}html .list-group-item-dark.list-group-item-action:hover,html .list-group-item-dark.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-dark.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-dark.list-group-item-action:focus{color:#141619;background-color:#bebebf}html .list-group-item-dark.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}}@media print{html .list-group-item-red,html[data-netbox-color-mode=dark] .list-group-item-red,html[data-netbox-color-mode=light] .list-group-item-red{color:#842029;background-color:#f8d7da}html .list-group-item-red.list-group-item-action:hover,html .list-group-item-red.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}html .list-group-item-red.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}}@media print{html .list-group-item-yellow,html[data-netbox-color-mode=dark] .list-group-item-yellow,html[data-netbox-color-mode=light] .list-group-item-yellow{color:#664d03;background-color:#fff3cd}html .list-group-item-yellow.list-group-item-action:hover,html .list-group-item-yellow.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}html .list-group-item-yellow.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}}@media print{html .list-group-item-green,html[data-netbox-color-mode=dark] .list-group-item-green,html[data-netbox-color-mode=light] .list-group-item-green{color:#0f5132;background-color:#d1e7dd}html .list-group-item-green.list-group-item-action:hover,html .list-group-item-green.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}html .list-group-item-green.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}}@media print{html .list-group-item-blue,html[data-netbox-color-mode=dark] .list-group-item-blue,html[data-netbox-color-mode=light] .list-group-item-blue{color:#084298;background-color:#cfe2ff}html .list-group-item-blue.list-group-item-action:hover,html .list-group-item-blue.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue.list-group-item-action:focus{color:#084298;background-color:#bacbe6}html .list-group-item-blue.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}}@media print{html .list-group-item-cyan,html[data-netbox-color-mode=dark] .list-group-item-cyan,html[data-netbox-color-mode=light] .list-group-item-cyan{color:#055160;background-color:#cff4fc}html .list-group-item-cyan.list-group-item-action:hover,html .list-group-item-cyan.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan.list-group-item-action:focus{color:#055160;background-color:#badce3}html .list-group-item-cyan.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}}@media print{html .list-group-item-indigo,html[data-netbox-color-mode=dark] .list-group-item-indigo,html[data-netbox-color-mode=light] .list-group-item-indigo{color:#3d0a91;background-color:#e0cffc}html .list-group-item-indigo.list-group-item-action:hover,html .list-group-item-indigo.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo.list-group-item-action:focus{color:#3d0a91;background-color:#cabae3}html .list-group-item-indigo.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo.list-group-item-action.active{color:#fff;background-color:#3d0a91;border-color:#3d0a91}}@media print{html .list-group-item-purple,html[data-netbox-color-mode=dark] .list-group-item-purple,html[data-netbox-color-mode=light] .list-group-item-purple{color:#432874;background-color:#e2d9f3}html .list-group-item-purple.list-group-item-action:hover,html .list-group-item-purple.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple.list-group-item-action:focus{color:#432874;background-color:#cbc3db}html .list-group-item-purple.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple.list-group-item-action.active{color:#fff;background-color:#432874;border-color:#432874}}@media print{html .list-group-item-pink,html[data-netbox-color-mode=dark] .list-group-item-pink,html[data-netbox-color-mode=light] .list-group-item-pink{color:#801f4f;background-color:#f7d6e6}html .list-group-item-pink.list-group-item-action:hover,html .list-group-item-pink.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink.list-group-item-action:focus{color:#801f4f;background-color:#dec1cf}html .list-group-item-pink.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink.list-group-item-action.active{color:#fff;background-color:#801f4f;border-color:#801f4f}}@media print{html .list-group-item-darker,html[data-netbox-color-mode=dark] .list-group-item-darker,html[data-netbox-color-mode=light] .list-group-item-darker{color:#101314;background-color:#d1d2d3}html .list-group-item-darker.list-group-item-action:hover,html .list-group-item-darker.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-darker.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-darker.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-darker.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-darker.list-group-item-action:focus{color:#101314;background-color:#bcbdbe}html .list-group-item-darker.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-darker.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-darker.list-group-item-action.active{color:#fff;background-color:#101314;border-color:#101314}}@media print{html .list-group-item-darkest,html[data-netbox-color-mode=dark] .list-group-item-darkest,html[data-netbox-color-mode=light] .list-group-item-darkest{color:#0e1011;background-color:#d1d1d2}html .list-group-item-darkest.list-group-item-action:hover,html .list-group-item-darkest.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-darkest.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-darkest.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-darkest.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-darkest.list-group-item-action:focus{color:#0e1011;background-color:#bcbcbd}html .list-group-item-darkest.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-darkest.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-darkest.list-group-item-action.active{color:#fff;background-color:#0e1011;border-color:#0e1011}}@media print{html .list-group-item-gray,html[data-netbox-color-mode=dark] .list-group-item-gray,html[data-netbox-color-mode=light] .list-group-item-gray{color:#525557;background-color:#f5f6f8}html .list-group-item-gray.list-group-item-action:hover,html .list-group-item-gray.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray.list-group-item-action:focus{color:#525557;background-color:#dddddf}html .list-group-item-gray.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray.list-group-item-action.active{color:#fff;background-color:#525557;border-color:#525557}}@media print{html .list-group-item-gray-100,html[data-netbox-color-mode=dark] .list-group-item-gray-100,html[data-netbox-color-mode=light] .list-group-item-gray-100{color:#636464;background-color:#fefefe}html .list-group-item-gray-100.list-group-item-action:hover,html .list-group-item-gray-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-100.list-group-item-action:focus{color:#636464;background-color:#e5e5e5}html .list-group-item-gray-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-100.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}}@media print{html .list-group-item-gray-200,html[data-netbox-color-mode=dark] .list-group-item-gray-200,html[data-netbox-color-mode=light] .list-group-item-gray-200{color:#5d5e60;background-color:#fbfbfc}html .list-group-item-gray-200.list-group-item-action:hover,html .list-group-item-gray-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-200.list-group-item-action:focus{color:#5d5e60;background-color:#e2e2e3}html .list-group-item-gray-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-200.list-group-item-action.active{color:#fff;background-color:#5d5e60;border-color:#5d5e60}}@media print{html .list-group-item-gray-300,html[data-netbox-color-mode=dark] .list-group-item-gray-300,html[data-netbox-color-mode=light] .list-group-item-gray-300{color:#595a5c;background-color:#f8f9fa}html .list-group-item-gray-300.list-group-item-action:hover,html .list-group-item-gray-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-300.list-group-item-action:focus{color:#595a5c;background-color:#dfe0e1}html .list-group-item-gray-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-300.list-group-item-action.active{color:#fff;background-color:#595a5c;border-color:#595a5c}}@media print{html .list-group-item-gray-400,html[data-netbox-color-mode=dark] .list-group-item-gray-400,html[data-netbox-color-mode=light] .list-group-item-gray-400{color:#525557;background-color:#f5f6f8}html .list-group-item-gray-400.list-group-item-action:hover,html .list-group-item-gray-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-400.list-group-item-action:focus{color:#525557;background-color:#dddddf}html .list-group-item-gray-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-400.list-group-item-action.active{color:#fff;background-color:#525557;border-color:#525557}}@media print{html .list-group-item-gray-500,html[data-netbox-color-mode=dark] .list-group-item-gray-500,html[data-netbox-color-mode=light] .list-group-item-gray-500{color:#686d71;background-color:#eff0f2}html .list-group-item-gray-500.list-group-item-action:hover,html .list-group-item-gray-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-500.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}html .list-group-item-gray-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-500.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}}@media print{html .list-group-item-gray-600,html[data-netbox-color-mode=dark] .list-group-item-gray-600,html[data-netbox-color-mode=light] .list-group-item-gray-600{color:#41464b;background-color:#e2e3e5}html .list-group-item-gray-600.list-group-item-action:hover,html .list-group-item-gray-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-600.list-group-item-action:focus{color:#41464b;background-color:#cbccce}html .list-group-item-gray-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-600.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}}@media print{html .list-group-item-gray-700,html[data-netbox-color-mode=dark] .list-group-item-gray-700,html[data-netbox-color-mode=light] .list-group-item-gray-700{color:#2c3034;background-color:#dbdcdd}html .list-group-item-gray-700.list-group-item-action:hover,html .list-group-item-gray-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-700.list-group-item-action:focus{color:#2c3034;background-color:#c5c6c7}html .list-group-item-gray-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-700.list-group-item-action.active{color:#fff;background-color:#2c3034;border-color:#2c3034}}@media print{html .list-group-item-gray-800,html[data-netbox-color-mode=dark] .list-group-item-gray-800,html[data-netbox-color-mode=light] .list-group-item-gray-800{color:#1f2326;background-color:#d6d8d9}html .list-group-item-gray-800.list-group-item-action:hover,html .list-group-item-gray-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-800.list-group-item-action:focus{color:#1f2326;background-color:#c1c2c3}html .list-group-item-gray-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-800.list-group-item-action.active{color:#fff;background-color:#1f2326;border-color:#1f2326}}@media print{html .list-group-item-gray-900,html[data-netbox-color-mode=dark] .list-group-item-gray-900,html[data-netbox-color-mode=light] .list-group-item-gray-900{color:#141619;background-color:#d3d3d4}html .list-group-item-gray-900.list-group-item-action:hover,html .list-group-item-gray-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray-900.list-group-item-action:focus{color:#141619;background-color:#bebebf}html .list-group-item-gray-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray-900.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}}@media print{html .list-group-item-red-100,html[data-netbox-color-mode=dark] .list-group-item-red-100,html[data-netbox-color-mode=light] .list-group-item-red-100{color:#635657;background-color:#fef7f8}html .list-group-item-red-100.list-group-item-action:hover,html .list-group-item-red-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-100.list-group-item-action:focus{color:#635657;background-color:#e5dedf}html .list-group-item-red-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-100.list-group-item-action.active{color:#fff;background-color:#635657;border-color:#635657}}@media print{html .list-group-item-red-200,html[data-netbox-color-mode=dark] .list-group-item-red-200,html[data-netbox-color-mode=light] .list-group-item-red-200{color:#604648;background-color:#fceff0}html .list-group-item-red-200.list-group-item-action:hover,html .list-group-item-red-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-200.list-group-item-action:focus{color:#604648;background-color:#e3d7d8}html .list-group-item-red-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-200.list-group-item-action.active{color:#fff;background-color:#604648;border-color:#604648}}@media print{html .list-group-item-red-300,html[data-netbox-color-mode=dark] .list-group-item-red-300,html[data-netbox-color-mode=light] .list-group-item-red-300{color:#8c5056;background-color:#fbe7e9}html .list-group-item-red-300.list-group-item-action:hover,html .list-group-item-red-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-300.list-group-item-action:focus{color:#8c5056;background-color:#e2d0d2}html .list-group-item-red-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-300.list-group-item-action.active{color:#fff;background-color:#8c5056;border-color:#8c5056}}@media print{html .list-group-item-red-400,html[data-netbox-color-mode=dark] .list-group-item-red-400,html[data-netbox-color-mode=light] .list-group-item-red-400{color:#883840;background-color:#f9dfe1}html .list-group-item-red-400.list-group-item-action:hover,html .list-group-item-red-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-400.list-group-item-action:focus{color:#883840;background-color:#e0c9cb}html .list-group-item-red-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-400.list-group-item-action.active{color:#fff;background-color:#883840;border-color:#883840}}@media print{html .list-group-item-red-500,html[data-netbox-color-mode=dark] .list-group-item-red-500,html[data-netbox-color-mode=light] .list-group-item-red-500{color:#842029;background-color:#f8d7da}html .list-group-item-red-500.list-group-item-action:hover,html .list-group-item-red-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-500.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}html .list-group-item-red-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-500.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}}@media print{html .list-group-item-red-600,html[data-netbox-color-mode=dark] .list-group-item-red-600,html[data-netbox-color-mode=light] .list-group-item-red-600{color:#6a1921;background-color:#efd4d7}html .list-group-item-red-600.list-group-item-action:hover,html .list-group-item-red-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-600.list-group-item-action:focus{color:#6a1921;background-color:#d7bfc2}html .list-group-item-red-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-600.list-group-item-action.active{color:#fff;background-color:#6a1921;border-color:#6a1921}}@media print{html .list-group-item-red-700,html[data-netbox-color-mode=dark] .list-group-item-red-700,html[data-netbox-color-mode=light] .list-group-item-red-700{color:#4f1319;background-color:#e6d2d4}html .list-group-item-red-700.list-group-item-action:hover,html .list-group-item-red-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-700.list-group-item-action:focus{color:#4f1319;background-color:#cfbdbf}html .list-group-item-red-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-700.list-group-item-action.active{color:#fff;background-color:#4f1319;border-color:#4f1319}}@media print{html .list-group-item-red-800,html[data-netbox-color-mode=dark] .list-group-item-red-800,html[data-netbox-color-mode=light] .list-group-item-red-800{color:#350d11;background-color:#ded0d2}html .list-group-item-red-800.list-group-item-action:hover,html .list-group-item-red-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-800.list-group-item-action:focus{color:#350d11;background-color:#c8bbbd}html .list-group-item-red-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-800.list-group-item-action.active{color:#fff;background-color:#350d11;border-color:#350d11}}@media print{html .list-group-item-red-900,html[data-netbox-color-mode=dark] .list-group-item-red-900,html[data-netbox-color-mode=light] .list-group-item-red-900{color:#1a0708;background-color:#d5cecf}html .list-group-item-red-900.list-group-item-action:hover,html .list-group-item-red-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red-900.list-group-item-action:focus{color:#1a0708;background-color:#c0b9ba}html .list-group-item-red-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red-900.list-group-item-action.active{color:#fff;background-color:#1a0708;border-color:#1a0708}}@media print{html .list-group-item-yellow-100,html[data-netbox-color-mode=dark] .list-group-item-yellow-100,html[data-netbox-color-mode=light] .list-group-item-yellow-100{color:#666152;background-color:#fffdf5}html .list-group-item-yellow-100.list-group-item-action:hover,html .list-group-item-yellow-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-100.list-group-item-action:focus{color:#666152;background-color:#e6e4dd}html .list-group-item-yellow-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-100.list-group-item-action.active{color:#fff;background-color:#666152;border-color:#666152}}@media print{html .list-group-item-yellow-200,html[data-netbox-color-mode=dark] .list-group-item-yellow-200,html[data-netbox-color-mode=light] .list-group-item-yellow-200{color:#665c3e;background-color:#fffaeb}html .list-group-item-yellow-200.list-group-item-action:hover,html .list-group-item-yellow-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-200.list-group-item-action:focus{color:#665c3e;background-color:#e6e1d4}html .list-group-item-yellow-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-200.list-group-item-action.active{color:#fff;background-color:#665c3e;border-color:#665c3e}}@media print{html .list-group-item-yellow-300,html[data-netbox-color-mode=dark] .list-group-item-yellow-300,html[data-netbox-color-mode=light] .list-group-item-yellow-300{color:#66572a;background-color:#fff8e1}html .list-group-item-yellow-300.list-group-item-action:hover,html .list-group-item-yellow-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-300.list-group-item-action:focus{color:#66572a;background-color:#e6dfcb}html .list-group-item-yellow-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-300.list-group-item-action.active{color:#fff;background-color:#66572a;border-color:#66572a}}@media print{html .list-group-item-yellow-400,html[data-netbox-color-mode=dark] .list-group-item-yellow-400,html[data-netbox-color-mode=light] .list-group-item-yellow-400{color:#665217;background-color:#fff5d7}html .list-group-item-yellow-400.list-group-item-action:hover,html .list-group-item-yellow-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-400.list-group-item-action:focus{color:#665217;background-color:#e6ddc2}html .list-group-item-yellow-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-400.list-group-item-action.active{color:#fff;background-color:#665217;border-color:#665217}}@media print{html .list-group-item-yellow-500,html[data-netbox-color-mode=dark] .list-group-item-yellow-500,html[data-netbox-color-mode=light] .list-group-item-yellow-500{color:#664d03;background-color:#fff3cd}html .list-group-item-yellow-500.list-group-item-action:hover,html .list-group-item-yellow-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-500.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}html .list-group-item-yellow-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-500.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}}@media print{html .list-group-item-yellow-600,html[data-netbox-color-mode=dark] .list-group-item-yellow-600,html[data-netbox-color-mode=light] .list-group-item-yellow-600{color:#7a5c04;background-color:#f5ebcd}html .list-group-item-yellow-600.list-group-item-action:hover,html .list-group-item-yellow-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-600.list-group-item-action:focus{color:#7a5c04;background-color:#ddd4b9}html .list-group-item-yellow-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-600.list-group-item-action.active{color:#fff;background-color:#7a5c04;border-color:#7a5c04}}@media print{html .list-group-item-yellow-700,html[data-netbox-color-mode=dark] .list-group-item-yellow-700,html[data-netbox-color-mode=light] .list-group-item-yellow-700{color:#5c4602;background-color:#ebe3cd}html .list-group-item-yellow-700.list-group-item-action:hover,html .list-group-item-yellow-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-700.list-group-item-action:focus{color:#5c4602;background-color:#d4ccb9}html .list-group-item-yellow-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-700.list-group-item-action.active{color:#fff;background-color:#5c4602;border-color:#5c4602}}@media print{html .list-group-item-yellow-800,html[data-netbox-color-mode=dark] .list-group-item-yellow-800,html[data-netbox-color-mode=light] .list-group-item-yellow-800{color:#3d2e02;background-color:#e0dbcd}html .list-group-item-yellow-800.list-group-item-action:hover,html .list-group-item-yellow-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-800.list-group-item-action:focus{color:#3d2e02;background-color:#cac5b9}html .list-group-item-yellow-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-800.list-group-item-action.active{color:#fff;background-color:#3d2e02;border-color:#3d2e02}}@media print{html .list-group-item-yellow-900,html[data-netbox-color-mode=dark] .list-group-item-yellow-900,html[data-netbox-color-mode=light] .list-group-item-yellow-900{color:#1f1701;background-color:#d6d4cc}html .list-group-item-yellow-900.list-group-item-action:hover,html .list-group-item-yellow-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow-900.list-group-item-action:focus{color:#1f1701;background-color:#c1bfb8}html .list-group-item-yellow-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow-900.list-group-item-action.active{color:#fff;background-color:#1f1701;border-color:#1f1701}}@media print{html .list-group-item-green-100,html[data-netbox-color-mode=dark] .list-group-item-green-100,html[data-netbox-color-mode=light] .list-group-item-green-100{color:#545c58;background-color:#f6faf8}html .list-group-item-green-100.list-group-item-action:hover,html .list-group-item-green-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-100.list-group-item-action:focus{color:#545c58;background-color:#dde1df}html .list-group-item-green-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-100.list-group-item-action.active{color:#fff;background-color:#545c58;border-color:#545c58}}@media print{html .list-group-item-green-200,html[data-netbox-color-mode=dark] .list-group-item-green-200,html[data-netbox-color-mode=light] .list-group-item-green-200{color:#41534b;background-color:#edf5f1}html .list-group-item-green-200.list-group-item-action:hover,html .list-group-item-green-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-200.list-group-item-action:focus{color:#41534b;background-color:#d5ddd9}html .list-group-item-green-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-200.list-group-item-action.active{color:#fff;background-color:#41534b;border-color:#41534b}}@media print{html .list-group-item-green-300,html[data-netbox-color-mode=dark] .list-group-item-green-300,html[data-netbox-color-mode=light] .list-group-item-green-300{color:#466e5b;background-color:#e3f1ea}html .list-group-item-green-300.list-group-item-action:hover,html .list-group-item-green-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-300.list-group-item-action:focus{color:#466e5b;background-color:#ccd9d3}html .list-group-item-green-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-300.list-group-item-action.active{color:#fff;background-color:#466e5b;border-color:#466e5b}}@media print{html .list-group-item-green-400,html[data-netbox-color-mode=dark] .list-group-item-green-400,html[data-netbox-color-mode=light] .list-group-item-green-400{color:#2b5f47;background-color:#daece4}html .list-group-item-green-400.list-group-item-action:hover,html .list-group-item-green-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-400.list-group-item-action:focus{color:#2b5f47;background-color:#c4d4cd}html .list-group-item-green-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-400.list-group-item-action.active{color:#fff;background-color:#2b5f47;border-color:#2b5f47}}@media print{html .list-group-item-green-500,html[data-netbox-color-mode=dark] .list-group-item-green-500,html[data-netbox-color-mode=light] .list-group-item-green-500{color:#0f5132;background-color:#d1e7dd}html .list-group-item-green-500.list-group-item-action:hover,html .list-group-item-green-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-500.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}html .list-group-item-green-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-500.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}}@media print{html .list-group-item-green-600,html[data-netbox-color-mode=dark] .list-group-item-green-600,html[data-netbox-color-mode=light] .list-group-item-green-600{color:#0c4128;background-color:#d0e2d9}html .list-group-item-green-600.list-group-item-action:hover,html .list-group-item-green-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-600.list-group-item-action:focus{color:#0c4128;background-color:#bbcbc3}html .list-group-item-green-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-600.list-group-item-action.active{color:#fff;background-color:#0c4128;border-color:#0c4128}}@media print{html .list-group-item-green-700,html[data-netbox-color-mode=dark] .list-group-item-green-700,html[data-netbox-color-mode=light] .list-group-item-green-700{color:#09311e;background-color:#cfdcd6}html .list-group-item-green-700.list-group-item-action:hover,html .list-group-item-green-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-700.list-group-item-action:focus{color:#09311e;background-color:#bac6c1}html .list-group-item-green-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-700.list-group-item-action.active{color:#fff;background-color:#09311e;border-color:#09311e}}@media print{html .list-group-item-green-800,html[data-netbox-color-mode=dark] .list-group-item-green-800,html[data-netbox-color-mode=light] .list-group-item-green-800{color:#062014;background-color:#ced7d3}html .list-group-item-green-800.list-group-item-action:hover,html .list-group-item-green-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-800.list-group-item-action:focus{color:#062014;background-color:#b9c2be}html .list-group-item-green-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-800.list-group-item-action.active{color:#fff;background-color:#062014;border-color:#062014}}@media print{html .list-group-item-green-900,html[data-netbox-color-mode=dark] .list-group-item-green-900,html[data-netbox-color-mode=light] .list-group-item-green-900{color:#03100a;background-color:#cdd1cf}html .list-group-item-green-900.list-group-item-action:hover,html .list-group-item-green-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green-900.list-group-item-action:focus{color:#03100a;background-color:#b9bcba}html .list-group-item-green-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green-900.list-group-item-action.active{color:#fff;background-color:#03100a;border-color:#03100a}}@media print{html .list-group-item-blue-100,html[data-netbox-color-mode=dark] .list-group-item-blue-100,html[data-netbox-color-mode=light] .list-group-item-blue-100{color:#535a66;background-color:#f5f9ff}html .list-group-item-blue-100.list-group-item-action:hover,html .list-group-item-blue-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-100.list-group-item-action:focus{color:#535a66;background-color:#dde0e6}html .list-group-item-blue-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-100.list-group-item-action.active{color:#fff;background-color:#535a66;border-color:#535a66}}@media print{html .list-group-item-blue-200,html[data-netbox-color-mode=dark] .list-group-item-blue-200,html[data-netbox-color-mode=light] .list-group-item-blue-200{color:#3f4f66;background-color:#ecf3ff}html .list-group-item-blue-200.list-group-item-action:hover,html .list-group-item-blue-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-200.list-group-item-action:focus{color:#3f4f66;background-color:#d4dbe6}html .list-group-item-blue-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-200.list-group-item-action.active{color:#fff;background-color:#3f4f66;border-color:#3f4f66}}@media print{html .list-group-item-blue-300,html[data-netbox-color-mode=dark] .list-group-item-blue-300,html[data-netbox-color-mode=light] .list-group-item-blue-300{color:#426598;background-color:#e2eeff}html .list-group-item-blue-300.list-group-item-action:hover,html .list-group-item-blue-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-300.list-group-item-action:focus{color:#426598;background-color:#cbd6e6}html .list-group-item-blue-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-300.list-group-item-action.active{color:#fff;background-color:#426598;border-color:#426598}}@media print{html .list-group-item-blue-400,html[data-netbox-color-mode=dark] .list-group-item-blue-400,html[data-netbox-color-mode=light] .list-group-item-blue-400{color:#255398;background-color:#d8e8ff}html .list-group-item-blue-400.list-group-item-action:hover,html .list-group-item-blue-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-400.list-group-item-action:focus{color:#255398;background-color:#c2d1e6}html .list-group-item-blue-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-400.list-group-item-action.active{color:#fff;background-color:#255398;border-color:#255398}}@media print{html .list-group-item-blue-500,html[data-netbox-color-mode=dark] .list-group-item-blue-500,html[data-netbox-color-mode=light] .list-group-item-blue-500{color:#084298;background-color:#cfe2ff}html .list-group-item-blue-500.list-group-item-action:hover,html .list-group-item-blue-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-500.list-group-item-action:focus{color:#084298;background-color:#bacbe6}html .list-group-item-blue-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-500.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}}@media print{html .list-group-item-blue-600,html[data-netbox-color-mode=dark] .list-group-item-blue-600,html[data-netbox-color-mode=light] .list-group-item-blue-600{color:#063579;background-color:#cedef4}html .list-group-item-blue-600.list-group-item-action:hover,html .list-group-item-blue-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-600.list-group-item-action:focus{color:#063579;background-color:#b9c8dc}html .list-group-item-blue-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-600.list-group-item-action.active{color:#fff;background-color:#063579;border-color:#063579}}@media print{html .list-group-item-blue-700,html[data-netbox-color-mode=dark] .list-group-item-blue-700,html[data-netbox-color-mode=light] .list-group-item-blue-700{color:#05285b;background-color:#ced9ea}html .list-group-item-blue-700.list-group-item-action:hover,html .list-group-item-blue-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-700.list-group-item-action:focus{color:#05285b;background-color:#b9c3d3}html .list-group-item-blue-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-700.list-group-item-action.active{color:#fff;background-color:#05285b;border-color:#05285b}}@media print{html .list-group-item-blue-800,html[data-netbox-color-mode=dark] .list-group-item-blue-800,html[data-netbox-color-mode=light] .list-group-item-blue-800{color:#031a3d;background-color:#cdd5e0}html .list-group-item-blue-800.list-group-item-action:hover,html .list-group-item-blue-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-800.list-group-item-action:focus{color:#031a3d;background-color:#b9c0ca}html .list-group-item-blue-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-800.list-group-item-action.active{color:#fff;background-color:#031a3d;border-color:#031a3d}}@media print{html .list-group-item-blue-900,html[data-netbox-color-mode=dark] .list-group-item-blue-900,html[data-netbox-color-mode=light] .list-group-item-blue-900{color:#020d1f;background-color:#cdd0d6}html .list-group-item-blue-900.list-group-item-action:hover,html .list-group-item-blue-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue-900.list-group-item-action:focus{color:#020d1f;background-color:#b9bbc1}html .list-group-item-blue-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue-900.list-group-item-action.active{color:#fff;background-color:#020d1f;border-color:#020d1f}}@media print{html .list-group-item-cyan-100,html[data-netbox-color-mode=dark] .list-group-item-cyan-100,html[data-netbox-color-mode=light] .list-group-item-cyan-100{color:#536265;background-color:#f5fdfe}html .list-group-item-cyan-100.list-group-item-action:hover,html .list-group-item-cyan-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-100.list-group-item-action:focus{color:#536265;background-color:#dde4e5}html .list-group-item-cyan-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-100.list-group-item-action.active{color:#fff;background-color:#536265;border-color:#536265}}@media print{html .list-group-item-cyan-200,html[data-netbox-color-mode=dark] .list-group-item-cyan-200,html[data-netbox-color-mode=light] .list-group-item-cyan-200{color:#3f5e64;background-color:#ecfbfe}html .list-group-item-cyan-200.list-group-item-action:hover,html .list-group-item-cyan-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-200.list-group-item-action:focus{color:#3f5e64;background-color:#d4e2e5}html .list-group-item-cyan-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-200.list-group-item-action.active{color:#fff;background-color:#3f5e64;border-color:#3f5e64}}@media print{html .list-group-item-cyan-300,html[data-netbox-color-mode=dark] .list-group-item-cyan-300,html[data-netbox-color-mode=light] .list-group-item-cyan-300{color:#2c5962;background-color:#e2f9fd}html .list-group-item-cyan-300.list-group-item-action:hover,html .list-group-item-cyan-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-300.list-group-item-action:focus{color:#2c5962;background-color:#cbe0e4}html .list-group-item-cyan-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-300.list-group-item-action.active{color:#fff;background-color:#2c5962;border-color:#2c5962}}@media print{html .list-group-item-cyan-400,html[data-netbox-color-mode=dark] .list-group-item-cyan-400,html[data-netbox-color-mode=light] .list-group-item-cyan-400{color:#185561;background-color:#d8f7fd}html .list-group-item-cyan-400.list-group-item-action:hover,html .list-group-item-cyan-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-400.list-group-item-action:focus{color:#185561;background-color:#c2dee4}html .list-group-item-cyan-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-400.list-group-item-action.active{color:#fff;background-color:#185561;border-color:#185561}}@media print{html .list-group-item-cyan-500,html[data-netbox-color-mode=dark] .list-group-item-cyan-500,html[data-netbox-color-mode=light] .list-group-item-cyan-500{color:#055160;background-color:#cff4fc}html .list-group-item-cyan-500.list-group-item-action:hover,html .list-group-item-cyan-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-500.list-group-item-action:focus{color:#055160;background-color:#badce3}html .list-group-item-cyan-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-500.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}}@media print{html .list-group-item-cyan-600,html[data-netbox-color-mode=dark] .list-group-item-cyan-600,html[data-netbox-color-mode=light] .list-group-item-cyan-600{color:#066173;background-color:#ceecf2}html .list-group-item-cyan-600.list-group-item-action:hover,html .list-group-item-cyan-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-600.list-group-item-action:focus{color:#066173;background-color:#b9d4da}html .list-group-item-cyan-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-600.list-group-item-action.active{color:#fff;background-color:#066173;border-color:#066173}}@media print{html .list-group-item-cyan-700,html[data-netbox-color-mode=dark] .list-group-item-cyan-700,html[data-netbox-color-mode=light] .list-group-item-cyan-700{color:#054956;background-color:#cee4e9}html .list-group-item-cyan-700.list-group-item-action:hover,html .list-group-item-cyan-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-700.list-group-item-action:focus{color:#054956;background-color:#b9cdd2}html .list-group-item-cyan-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-700.list-group-item-action.active{color:#fff;background-color:#054956;border-color:#054956}}@media print{html .list-group-item-cyan-800,html[data-netbox-color-mode=dark] .list-group-item-cyan-800,html[data-netbox-color-mode=light] .list-group-item-cyan-800{color:#03313a;background-color:#cddcdf}html .list-group-item-cyan-800.list-group-item-action:hover,html .list-group-item-cyan-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-800.list-group-item-action:focus{color:#03313a;background-color:#b9c6c9}html .list-group-item-cyan-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-800.list-group-item-action.active{color:#fff;background-color:#03313a;border-color:#03313a}}@media print{html .list-group-item-cyan-900,html[data-netbox-color-mode=dark] .list-group-item-cyan-900,html[data-netbox-color-mode=light] .list-group-item-cyan-900{color:#02181d;background-color:#cdd4d6}html .list-group-item-cyan-900.list-group-item-action:hover,html .list-group-item-cyan-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan-900.list-group-item-action:focus{color:#02181d;background-color:#b9bfc1}html .list-group-item-cyan-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan-900.list-group-item-action.active{color:#fff;background-color:#02181d;border-color:#02181d}}@media print{html .list-group-item-indigo-100,html[data-netbox-color-mode=dark] .list-group-item-indigo-100,html[data-netbox-color-mode=light] .list-group-item-indigo-100{color:#5a5365;background-color:#f9f5fe}html .list-group-item-indigo-100.list-group-item-action:hover,html .list-group-item-indigo-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-100.list-group-item-action:focus{color:#5a5365;background-color:#e0dde5}html .list-group-item-indigo-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-100.list-group-item-action.active{color:#fff;background-color:#5a5365;border-color:#5a5365}}@media print{html .list-group-item-indigo-200,html[data-netbox-color-mode=dark] .list-group-item-indigo-200,html[data-netbox-color-mode=light] .list-group-item-indigo-200{color:#745f96;background-color:#f3ecfe}html .list-group-item-indigo-200.list-group-item-action:hover,html .list-group-item-indigo-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-200.list-group-item-action:focus{color:#745f96;background-color:#dbd4e5}html .list-group-item-indigo-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-200.list-group-item-action.active{color:#fff;background-color:#745f96;border-color:#745f96}}@media print{html .list-group-item-indigo-300,html[data-netbox-color-mode=dark] .list-group-item-indigo-300,html[data-netbox-color-mode=light] .list-group-item-indigo-300{color:#624394;background-color:#ede2fd}html .list-group-item-indigo-300.list-group-item-action:hover,html .list-group-item-indigo-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-300.list-group-item-action:focus{color:#624394;background-color:#d5cbe4}html .list-group-item-indigo-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-300.list-group-item-action.active{color:#fff;background-color:#624394;border-color:#624394}}@media print{html .list-group-item-indigo-400,html[data-netbox-color-mode=dark] .list-group-item-indigo-400,html[data-netbox-color-mode=light] .list-group-item-indigo-400{color:#502693;background-color:#e7d9fd}html .list-group-item-indigo-400.list-group-item-action:hover,html .list-group-item-indigo-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-400.list-group-item-action:focus{color:#502693;background-color:#d0c3e4}html .list-group-item-indigo-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-400.list-group-item-action.active{color:#fff;background-color:#502693;border-color:#502693}}@media print{html .list-group-item-indigo-500,html[data-netbox-color-mode=dark] .list-group-item-indigo-500,html[data-netbox-color-mode=light] .list-group-item-indigo-500{color:#3d0a91;background-color:#e0cffc}html .list-group-item-indigo-500.list-group-item-action:hover,html .list-group-item-indigo-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-500.list-group-item-action:focus{color:#3d0a91;background-color:#cabae3}html .list-group-item-indigo-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-500.list-group-item-action.active{color:#fff;background-color:#3d0a91;border-color:#3d0a91}}@media print{html .list-group-item-indigo-600,html[data-netbox-color-mode=dark] .list-group-item-indigo-600,html[data-netbox-color-mode=light] .list-group-item-indigo-600{color:#310874;background-color:#dccff3}html .list-group-item-indigo-600.list-group-item-action:hover,html .list-group-item-indigo-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-600.list-group-item-action:focus{color:#310874;background-color:#c6badb}html .list-group-item-indigo-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-600.list-group-item-action.active{color:#fff;background-color:#310874;border-color:#310874}}@media print{html .list-group-item-indigo-700,html[data-netbox-color-mode=dark] .list-group-item-indigo-700,html[data-netbox-color-mode=light] .list-group-item-indigo-700{color:#250657;background-color:#d8cee9}html .list-group-item-indigo-700.list-group-item-action:hover,html .list-group-item-indigo-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-700.list-group-item-action:focus{color:#250657;background-color:#c2b9d2}html .list-group-item-indigo-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-700.list-group-item-action.active{color:#fff;background-color:#250657;border-color:#250657}}@media print{html .list-group-item-indigo-800,html[data-netbox-color-mode=dark] .list-group-item-indigo-800,html[data-netbox-color-mode=light] .list-group-item-indigo-800{color:#19043a;background-color:#d4cddf}html .list-group-item-indigo-800.list-group-item-action:hover,html .list-group-item-indigo-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-800.list-group-item-action:focus{color:#19043a;background-color:#bfb9c9}html .list-group-item-indigo-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-800.list-group-item-action.active{color:#fff;background-color:#19043a;border-color:#19043a}}@media print{html .list-group-item-indigo-900,html[data-netbox-color-mode=dark] .list-group-item-indigo-900,html[data-netbox-color-mode=light] .list-group-item-indigo-900{color:#0c021d;background-color:#d0cdd6}html .list-group-item-indigo-900.list-group-item-action:hover,html .list-group-item-indigo-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo-900.list-group-item-action:focus{color:#0c021d;background-color:#bbb9c1}html .list-group-item-indigo-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo-900.list-group-item-action.active{color:#fff;background-color:#0c021d;border-color:#0c021d}}@media print{html .list-group-item-purple-100,html[data-netbox-color-mode=dark] .list-group-item-purple-100,html[data-netbox-color-mode=light] .list-group-item-purple-100{color:#5a5761;background-color:#f9f7fd}html .list-group-item-purple-100.list-group-item-action:hover,html .list-group-item-purple-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-100.list-group-item-action:focus{color:#5a5761;background-color:#e0dee4}html .list-group-item-purple-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-100.list-group-item-action.active{color:#fff;background-color:#5a5761;border-color:#5a5761}}@media print{html .list-group-item-purple-200,html[data-netbox-color-mode=dark] .list-group-item-purple-200,html[data-netbox-color-mode=light] .list-group-item-purple-200{color:#4f485c;background-color:#f3f0fa}html .list-group-item-purple-200.list-group-item-action:hover,html .list-group-item-purple-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-200.list-group-item-action:focus{color:#4f485c;background-color:#dbd8e1}html .list-group-item-purple-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-200.list-group-item-action.active{color:#fff;background-color:#4f485c;border-color:#4f485c}}@media print{html .list-group-item-purple-300,html[data-netbox-color-mode=dark] .list-group-item-purple-300,html[data-netbox-color-mode=light] .list-group-item-purple-300{color:#655583;background-color:#eee8f8}html .list-group-item-purple-300.list-group-item-action:hover,html .list-group-item-purple-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-300.list-group-item-action:focus{color:#655583;background-color:#d6d1df}html .list-group-item-purple-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-300.list-group-item-action.active{color:#fff;background-color:#655583;border-color:#655583}}@media print{html .list-group-item-purple-400,html[data-netbox-color-mode=dark] .list-group-item-purple-400,html[data-netbox-color-mode=light] .list-group-item-purple-400{color:#543e7b;background-color:#e8e1f5}html .list-group-item-purple-400.list-group-item-action:hover,html .list-group-item-purple-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-400.list-group-item-action:focus{color:#543e7b;background-color:#d1cbdd}html .list-group-item-purple-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-400.list-group-item-action.active{color:#fff;background-color:#543e7b;border-color:#543e7b}}@media print{html .list-group-item-purple-500,html[data-netbox-color-mode=dark] .list-group-item-purple-500,html[data-netbox-color-mode=light] .list-group-item-purple-500{color:#432874;background-color:#e2d9f3}html .list-group-item-purple-500.list-group-item-action:hover,html .list-group-item-purple-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-500.list-group-item-action:focus{color:#432874;background-color:#cbc3db}html .list-group-item-purple-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-500.list-group-item-action.active{color:#fff;background-color:#432874;border-color:#432874}}@media print{html .list-group-item-purple-600,html[data-netbox-color-mode=dark] .list-group-item-purple-600,html[data-netbox-color-mode=light] .list-group-item-purple-600{color:#35205c;background-color:#ded7eb}html .list-group-item-purple-600.list-group-item-action:hover,html .list-group-item-purple-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-600.list-group-item-action:focus{color:#35205c;background-color:#c8c2d4}html .list-group-item-purple-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-600.list-group-item-action.active{color:#fff;background-color:#35205c;border-color:#35205c}}@media print{html .list-group-item-purple-700,html[data-netbox-color-mode=dark] .list-group-item-purple-700,html[data-netbox-color-mode=light] .list-group-item-purple-700{color:#281846;background-color:#d9d4e3}html .list-group-item-purple-700.list-group-item-action:hover,html .list-group-item-purple-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-700.list-group-item-action:focus{color:#281846;background-color:#c3bfcc}html .list-group-item-purple-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-700.list-group-item-action.active{color:#fff;background-color:#281846;border-color:#281846}}@media print{html .list-group-item-purple-800,html[data-netbox-color-mode=dark] .list-group-item-purple-800,html[data-netbox-color-mode=light] .list-group-item-purple-800{color:#1a102e;background-color:#d5d1db}html .list-group-item-purple-800.list-group-item-action:hover,html .list-group-item-purple-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-800.list-group-item-action:focus{color:#1a102e;background-color:#c0bcc5}html .list-group-item-purple-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-800.list-group-item-action.active{color:#fff;background-color:#1a102e;border-color:#1a102e}}@media print{html .list-group-item-purple-900,html[data-netbox-color-mode=dark] .list-group-item-purple-900,html[data-netbox-color-mode=light] .list-group-item-purple-900{color:#0d0817;background-color:#d0cfd4}html .list-group-item-purple-900.list-group-item-action:hover,html .list-group-item-purple-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple-900.list-group-item-action:focus{color:#0d0817;background-color:#bbbabf}html .list-group-item-purple-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple-900.list-group-item-action.active{color:#fff;background-color:#0d0817;border-color:#0d0817}}@media print{html .list-group-item-pink-100,html[data-netbox-color-mode=dark] .list-group-item-pink-100,html[data-netbox-color-mode=light] .list-group-item-pink-100{color:#63565c;background-color:#fdf7fa}html .list-group-item-pink-100.list-group-item-action:hover,html .list-group-item-pink-100.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-100.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-100.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-100.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-100.list-group-item-action:focus{color:#63565c;background-color:#e4dee1}html .list-group-item-pink-100.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-100.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-100.list-group-item-action.active{color:#fff;background-color:#63565c;border-color:#63565c}}@media print{html .list-group-item-pink-200,html[data-netbox-color-mode=dark] .list-group-item-pink-200,html[data-netbox-color-mode=light] .list-group-item-pink-200{color:#604552;background-color:#fceff5}html .list-group-item-pink-200.list-group-item-action:hover,html .list-group-item-pink-200.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-200.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-200.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-200.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-200.list-group-item-action:focus{color:#604552;background-color:#e3d7dd}html .list-group-item-pink-200.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-200.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-200.list-group-item-action.active{color:#fff;background-color:#604552;border-color:#604552}}@media print{html .list-group-item-pink-300,html[data-netbox-color-mode=dark] .list-group-item-pink-300,html[data-netbox-color-mode=light] .list-group-item-pink-300{color:#8a506d;background-color:#fae7f0}html .list-group-item-pink-300.list-group-item-action:hover,html .list-group-item-pink-300.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-300.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-300.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-300.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-300.list-group-item-action:focus{color:#8a506d;background-color:#e1d0d8}html .list-group-item-pink-300.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-300.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-300.list-group-item-action.active{color:#fff;background-color:#8a506d;border-color:#8a506d}}@media print{html .list-group-item-pink-400,html[data-netbox-color-mode=dark] .list-group-item-pink-400,html[data-netbox-color-mode=light] .list-group-item-pink-400{color:#85375e;background-color:#f8deeb}html .list-group-item-pink-400.list-group-item-action:hover,html .list-group-item-pink-400.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-400.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-400.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-400.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-400.list-group-item-action:focus{color:#85375e;background-color:#dfc8d4}html .list-group-item-pink-400.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-400.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-400.list-group-item-action.active{color:#fff;background-color:#85375e;border-color:#85375e}}@media print{html .list-group-item-pink-500,html[data-netbox-color-mode=dark] .list-group-item-pink-500,html[data-netbox-color-mode=light] .list-group-item-pink-500{color:#801f4f;background-color:#f7d6e6}html .list-group-item-pink-500.list-group-item-action:hover,html .list-group-item-pink-500.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-500.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-500.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-500.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-500.list-group-item-action:focus{color:#801f4f;background-color:#dec1cf}html .list-group-item-pink-500.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-500.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-500.list-group-item-action.active{color:#fff;background-color:#801f4f;border-color:#801f4f}}@media print{html .list-group-item-pink-600,html[data-netbox-color-mode=dark] .list-group-item-pink-600,html[data-netbox-color-mode=light] .list-group-item-pink-600{color:#671940;background-color:#eed4e1}html .list-group-item-pink-600.list-group-item-action:hover,html .list-group-item-pink-600.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-600.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-600.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-600.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-600.list-group-item-action:focus{color:#671940;background-color:#d6bfcb}html .list-group-item-pink-600.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-600.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-600.list-group-item-action.active{color:#fff;background-color:#671940;border-color:#671940}}@media print{html .list-group-item-pink-700,html[data-netbox-color-mode=dark] .list-group-item-pink-700,html[data-netbox-color-mode=light] .list-group-item-pink-700{color:#4d132f;background-color:#e6d2dc}html .list-group-item-pink-700.list-group-item-action:hover,html .list-group-item-pink-700.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-700.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-700.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-700.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-700.list-group-item-action:focus{color:#4d132f;background-color:#cfbdc6}html .list-group-item-pink-700.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-700.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-700.list-group-item-action.active{color:#fff;background-color:#4d132f;border-color:#4d132f}}@media print{html .list-group-item-pink-800,html[data-netbox-color-mode=dark] .list-group-item-pink-800,html[data-netbox-color-mode=light] .list-group-item-pink-800{color:#340c20;background-color:#ddd0d7}html .list-group-item-pink-800.list-group-item-action:hover,html .list-group-item-pink-800.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-800.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-800.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-800.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-800.list-group-item-action:focus{color:#340c20;background-color:#c7bbc2}html .list-group-item-pink-800.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-800.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-800.list-group-item-action.active{color:#fff;background-color:#340c20;border-color:#340c20}}@media print{html .list-group-item-pink-900,html[data-netbox-color-mode=dark] .list-group-item-pink-900,html[data-netbox-color-mode=light] .list-group-item-pink-900{color:#1a0610;background-color:#d5ced1}html .list-group-item-pink-900.list-group-item-action:hover,html .list-group-item-pink-900.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink-900.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink-900.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink-900.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink-900.list-group-item-action:focus{color:#1a0610;background-color:#c0b9bc}html .list-group-item-pink-900.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink-900.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink-900.list-group-item-action.active{color:#fff;background-color:#1a0610;border-color:#1a0610}}@media print{html .btn-close,html[data-netbox-color-mode=dark] .btn-close,html[data-netbox-color-mode=light] .btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}html .btn-close:hover,html[data-netbox-color-mode=dark] .btn-close:hover,html[data-netbox-color-mode=light] .btn-close:hover{color:#000;text-decoration:none;opacity:.75}html .btn-close:focus,html[data-netbox-color-mode=dark] .btn-close:focus,html[data-netbox-color-mode=light] .btn-close:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40;opacity:1}html .btn-close:disabled,html .btn-close.disabled,html[data-netbox-color-mode=dark] .btn-close:disabled,html[data-netbox-color-mode=dark] .btn-close.disabled,html[data-netbox-color-mode=light] .btn-close:disabled,html[data-netbox-color-mode=light] .btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}}@media print{html .btn-close-white,html[data-netbox-color-mode=dark] .btn-close-white,html[data-netbox-color-mode=light] .btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}}@media print{html .toast,html[data-netbox-color-mode=dark] .toast,html[data-netbox-color-mode=light] .toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:#ffffffd9;background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem #00000026;border-radius:.375rem}html .toast:not(.showing):not(.show),html[data-netbox-color-mode=dark] .toast:not(.showing):not(.show),html[data-netbox-color-mode=light] .toast:not(.showing):not(.show){opacity:0}html .toast.hide,html[data-netbox-color-mode=dark] .toast.hide,html[data-netbox-color-mode=light] .toast.hide{display:none}}@media print{html .toast-container,html[data-netbox-color-mode=dark] .toast-container,html[data-netbox-color-mode=light] .toast-container{width:max-content;max-width:100%;pointer-events:none}html .toast-container>:not(:last-child),html[data-netbox-color-mode=dark] .toast-container>:not(:last-child),html[data-netbox-color-mode=light] .toast-container>:not(:last-child){margin-bottom:.75rem}}@media print{html .toast-header,html[data-netbox-color-mode=dark] .toast-header,html[data-netbox-color-mode=light] .toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:#ffffffd9;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html .toast-header .btn-close,html[data-netbox-color-mode=dark] .toast-header .btn-close,html[data-netbox-color-mode=light] .toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}}@media print{html .toast-body,html[data-netbox-color-mode=dark] .toast-body,html[data-netbox-color-mode=light] .toast-body{padding:.75rem;word-wrap:break-word}}@media print{html .modal,html[data-netbox-color-mode=dark] .modal,html[data-netbox-color-mode=light] .modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}}@media print{html .modal-dialog,html[data-netbox-color-mode=dark] .modal-dialog,html[data-netbox-color-mode=light] .modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade html .modal-dialog,.modal.fade html[data-netbox-color-mode=dark] .modal-dialog,.modal.fade html[data-netbox-color-mode=light] .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}}@media print and (prefers-reduced-motion: reduce){.modal.fade html .modal-dialog,.modal.fade html[data-netbox-color-mode=dark] .modal-dialog,.modal.fade html[data-netbox-color-mode=light] .modal-dialog{transition:none}}@media print{.modal.show html .modal-dialog,.modal.show html[data-netbox-color-mode=dark] .modal-dialog,.modal.show html[data-netbox-color-mode=light] .modal-dialog{transform:none}}@media print{.modal.modal-static html .modal-dialog,.modal.modal-static html[data-netbox-color-mode=dark] .modal-dialog,.modal.modal-static html[data-netbox-color-mode=light] .modal-dialog{transform:scale(1.02)}}@media print{html .modal-dialog-scrollable,html[data-netbox-color-mode=dark] .modal-dialog-scrollable,html[data-netbox-color-mode=light] .modal-dialog-scrollable{height:calc(100% - 1rem)}html .modal-dialog-scrollable .modal-content,html[data-netbox-color-mode=dark] .modal-dialog-scrollable .modal-content,html[data-netbox-color-mode=light] .modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}html .modal-dialog-scrollable .modal-body,html[data-netbox-color-mode=dark] .modal-dialog-scrollable .modal-body,html[data-netbox-color-mode=light] .modal-dialog-scrollable .modal-body{overflow-y:auto}}@media print{html .modal-dialog-centered,html[data-netbox-color-mode=dark] .modal-dialog-centered,html[data-netbox-color-mode=light] .modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}}@media print{html .modal-content,html[data-netbox-color-mode=dark] .modal-content,html[data-netbox-color-mode=light] .modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.75rem;outline:0}}@media print{html .modal-backdrop,html[data-netbox-color-mode=dark] .modal-backdrop,html[data-netbox-color-mode=light] .modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}html .modal-backdrop.fade,html[data-netbox-color-mode=dark] .modal-backdrop.fade,html[data-netbox-color-mode=light] .modal-backdrop.fade{opacity:0}html .modal-backdrop.show,html[data-netbox-color-mode=dark] .modal-backdrop.show,html[data-netbox-color-mode=light] .modal-backdrop.show{opacity:.5}}@media print{html .modal-header,html[data-netbox-color-mode=dark] .modal-header,html[data-netbox-color-mode=light] .modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}html .modal-header .btn-close,html[data-netbox-color-mode=dark] .modal-header .btn-close,html[data-netbox-color-mode=light] .modal-header .btn-close{padding:.5rem;margin:-.5rem -.5rem -.5rem auto}}@media print{html .modal-title,html[data-netbox-color-mode=dark] .modal-title,html[data-netbox-color-mode=light] .modal-title{margin-bottom:0;line-height:1.5}}@media print{html .modal-body,html[data-netbox-color-mode=dark] .modal-body,html[data-netbox-color-mode=light] .modal-body{position:relative;flex:1 1 auto;padding:1rem}}@media print{html .modal-footer,html[data-netbox-color-mode=dark] .modal-footer,html[data-netbox-color-mode=light] .modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.75rem - 1px);border-bottom-left-radius:calc(.75rem - 1px)}html .modal-footer>*,html[data-netbox-color-mode=dark] .modal-footer>*,html[data-netbox-color-mode=light] .modal-footer>*{margin:.25rem}}@media print and (min-width: 576px){html .modal-dialog,html[data-netbox-color-mode=dark] .modal-dialog,html[data-netbox-color-mode=light] .modal-dialog{max-width:500px;margin:1.75rem auto}html .modal-dialog-scrollable,html[data-netbox-color-mode=dark] .modal-dialog-scrollable,html[data-netbox-color-mode=light] .modal-dialog-scrollable{height:calc(100% - 3.5rem)}html .modal-dialog-centered,html[data-netbox-color-mode=dark] .modal-dialog-centered,html[data-netbox-color-mode=light] .modal-dialog-centered{min-height:calc(100% - 3.5rem)}html .modal-sm,html[data-netbox-color-mode=dark] .modal-sm,html[data-netbox-color-mode=light] .modal-sm{max-width:300px}}@media print and (min-width: 992px){html .modal-lg,html .modal-xl,html[data-netbox-color-mode=dark] .modal-lg,html[data-netbox-color-mode=dark] .modal-xl,html[data-netbox-color-mode=light] .modal-lg,html[data-netbox-color-mode=light] .modal-xl{max-width:800px}}@media print and (min-width: 1200px){html .modal-xl,html[data-netbox-color-mode=dark] .modal-xl,html[data-netbox-color-mode=light] .modal-xl{max-width:1140px}}@media print{html .modal-fullscreen,html[data-netbox-color-mode=dark] .modal-fullscreen,html[data-netbox-color-mode=light] .modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen .modal-header{border-radius:0}html .modal-fullscreen .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen .modal-body{overflow-y:auto}html .modal-fullscreen .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen .modal-footer{border-radius:0}}@media print and (max-width: 575.98px){html .modal-fullscreen-sm-down,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-sm-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-sm-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down .modal-header{border-radius:0}html .modal-fullscreen-sm-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down .modal-body{overflow-y:auto}html .modal-fullscreen-sm-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media print and (max-width: 767.98px){html .modal-fullscreen-md-down,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down,html[data-netbox-color-mode=light] .modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-md-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-md-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-md-down .modal-header{border-radius:0}html .modal-fullscreen-md-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-md-down .modal-body{overflow-y:auto}html .modal-fullscreen-md-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-md-down .modal-footer{border-radius:0}}@media print and (max-width: 991.98px){html .modal-fullscreen-lg-down,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-lg-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-lg-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down .modal-header{border-radius:0}html .modal-fullscreen-lg-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down .modal-body{overflow-y:auto}html .modal-fullscreen-lg-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media print and (max-width: 1199.98px){html .modal-fullscreen-xl-down,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-xl-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-xl-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down .modal-header{border-radius:0}html .modal-fullscreen-xl-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down .modal-body{overflow-y:auto}html .modal-fullscreen-xl-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media print and (max-width: 1399.98px){html .modal-fullscreen-xxl-down,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-xxl-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-xxl-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down .modal-header{border-radius:0}html .modal-fullscreen-xxl-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down .modal-body{overflow-y:auto}html .modal-fullscreen-xxl-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down .modal-footer{border-radius:0}}@media print{html .tooltip,html[data-netbox-color-mode=dark] .tooltip,html[data-netbox-color-mode=light] .tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}html .tooltip.show,html[data-netbox-color-mode=dark] .tooltip.show,html[data-netbox-color-mode=light] .tooltip.show{opacity:.9}html .tooltip .tooltip-arrow,html[data-netbox-color-mode=dark] .tooltip .tooltip-arrow,html[data-netbox-color-mode=light] .tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}html .tooltip .tooltip-arrow:before,html[data-netbox-color-mode=dark] .tooltip .tooltip-arrow:before,html[data-netbox-color-mode=light] .tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}}@media print{html .bs-tooltip-top,html .bs-tooltip-auto[data-popper-placement^=top],html[data-netbox-color-mode=dark] .bs-tooltip-top,html[data-netbox-color-mode=light] .bs-tooltip-top{padding:.4rem 0}html .bs-tooltip-top .tooltip-arrow,html .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-top .tooltip-arrow,html[data-netbox-color-mode=light] .bs-tooltip-top .tooltip-arrow{bottom:0}html .bs-tooltip-top .tooltip-arrow:before,html .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-top .tooltip-arrow:before,html[data-netbox-color-mode=light] .bs-tooltip-top .tooltip-arrow:before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}}@media print{html .bs-tooltip-end,html .bs-tooltip-auto[data-popper-placement^=right],html[data-netbox-color-mode=dark] .bs-tooltip-end,html[data-netbox-color-mode=light] .bs-tooltip-end{padding:0 .4rem}html .bs-tooltip-end .tooltip-arrow,html .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-end .tooltip-arrow,html[data-netbox-color-mode=light] .bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}html .bs-tooltip-end .tooltip-arrow:before,html .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-end .tooltip-arrow:before,html[data-netbox-color-mode=light] .bs-tooltip-end .tooltip-arrow:before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}}@media print{html .bs-tooltip-bottom,html .bs-tooltip-auto[data-popper-placement^=bottom],html[data-netbox-color-mode=dark] .bs-tooltip-bottom,html[data-netbox-color-mode=light] .bs-tooltip-bottom{padding:.4rem 0}html .bs-tooltip-bottom .tooltip-arrow,html .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-bottom .tooltip-arrow,html[data-netbox-color-mode=light] .bs-tooltip-bottom .tooltip-arrow{top:0}html .bs-tooltip-bottom .tooltip-arrow:before,html .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-bottom .tooltip-arrow:before,html[data-netbox-color-mode=light] .bs-tooltip-bottom .tooltip-arrow:before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}}@media print{html .bs-tooltip-start,html .bs-tooltip-auto[data-popper-placement^=left],html[data-netbox-color-mode=dark] .bs-tooltip-start,html[data-netbox-color-mode=light] .bs-tooltip-start{padding:0 .4rem}html .bs-tooltip-start .tooltip-arrow,html .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-start .tooltip-arrow,html[data-netbox-color-mode=light] .bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}html .bs-tooltip-start .tooltip-arrow:before,html .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-start .tooltip-arrow:before,html[data-netbox-color-mode=light] .bs-tooltip-start .tooltip-arrow:before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}}@media print{html .tooltip-inner,html[data-netbox-color-mode=dark] .tooltip-inner,html[data-netbox-color-mode=light] .tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.375rem}}@media print{html .popover,html[data-netbox-color-mode=dark] .popover,html[data-netbox-color-mode=light] .popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.75rem}html .popover .popover-arrow,html[data-netbox-color-mode=dark] .popover .popover-arrow,html[data-netbox-color-mode=light] .popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}html .popover .popover-arrow:before,html .popover .popover-arrow:after,html[data-netbox-color-mode=dark] .popover .popover-arrow:before,html[data-netbox-color-mode=dark] .popover .popover-arrow:after,html[data-netbox-color-mode=light] .popover .popover-arrow:before,html[data-netbox-color-mode=light] .popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}}@media print{html .bs-popover-top>.popover-arrow,html .bs-popover-auto[data-popper-placement^=top]>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow,html[data-netbox-color-mode=light] .bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}html .bs-popover-top>.popover-arrow:before,html .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow:before,html[data-netbox-color-mode=light] .bs-popover-top>.popover-arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}html .bs-popover-top>.popover-arrow:after,html .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow:after,html[data-netbox-color-mode=light] .bs-popover-top>.popover-arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}}@media print{html .bs-popover-end>.popover-arrow,html .bs-popover-auto[data-popper-placement^=right]>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow,html[data-netbox-color-mode=light] .bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}html .bs-popover-end>.popover-arrow:before,html .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow:before,html[data-netbox-color-mode=light] .bs-popover-end>.popover-arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}html .bs-popover-end>.popover-arrow:after,html .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow:after,html[data-netbox-color-mode=light] .bs-popover-end>.popover-arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}}@media print{html .bs-popover-bottom>.popover-arrow,html .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow,html[data-netbox-color-mode=light] .bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}html .bs-popover-bottom>.popover-arrow:before,html .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow:before,html[data-netbox-color-mode=light] .bs-popover-bottom>.popover-arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}html .bs-popover-bottom>.popover-arrow:after,html .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow:after,html[data-netbox-color-mode=light] .bs-popover-bottom>.popover-arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}html .bs-popover-bottom .popover-header:before,html .bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,html[data-netbox-color-mode=dark] .bs-popover-bottom .popover-header:before,html[data-netbox-color-mode=light] .bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}}@media print{html .bs-popover-start>.popover-arrow,html .bs-popover-auto[data-popper-placement^=left]>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow,html[data-netbox-color-mode=light] .bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}html .bs-popover-start>.popover-arrow:before,html .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow:before,html[data-netbox-color-mode=light] .bs-popover-start>.popover-arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}html .bs-popover-start>.popover-arrow:after,html .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow:after,html[data-netbox-color-mode=light] .bs-popover-start>.popover-arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}}@media print{html .popover-header,html[data-netbox-color-mode=dark] .popover-header,html[data-netbox-color-mode=light] .popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}html .popover-header:empty,html[data-netbox-color-mode=dark] .popover-header:empty,html[data-netbox-color-mode=light] .popover-header:empty{display:none}}@media print{html .popover-body,html[data-netbox-color-mode=dark] .popover-body,html[data-netbox-color-mode=light] .popover-body{padding:1rem;color:#212529}}@media print{html .carousel,html[data-netbox-color-mode=dark] .carousel,html[data-netbox-color-mode=light] .carousel{position:relative}}@media print{html .carousel.pointer-event,html[data-netbox-color-mode=dark] .carousel.pointer-event,html[data-netbox-color-mode=light] .carousel.pointer-event{touch-action:pan-y}}@media print{html .carousel-inner,html[data-netbox-color-mode=dark] .carousel-inner,html[data-netbox-color-mode=light] .carousel-inner{position:relative;width:100%;overflow:hidden}html .carousel-inner:after,html[data-netbox-color-mode=dark] .carousel-inner:after,html[data-netbox-color-mode=light] .carousel-inner:after{display:block;clear:both;content:""}}@media print{html .carousel-item,html[data-netbox-color-mode=dark] .carousel-item,html[data-netbox-color-mode=light] .carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .carousel-item,html[data-netbox-color-mode=dark] .carousel-item,html[data-netbox-color-mode=light] .carousel-item{transition:none}}@media print{html .carousel-item.active,html .carousel-item-next,html .carousel-item-prev,html[data-netbox-color-mode=dark] .carousel-item.active,html[data-netbox-color-mode=dark] .carousel-item-next,html[data-netbox-color-mode=dark] .carousel-item-prev,html[data-netbox-color-mode=light] .carousel-item.active,html[data-netbox-color-mode=light] .carousel-item-next,html[data-netbox-color-mode=light] .carousel-item-prev{display:block}}@media print{html .carousel-item-next:not(.carousel-item-start),html .active.carousel-item-end,html[data-netbox-color-mode=dark] .carousel-item-next:not(.carousel-item-start),html[data-netbox-color-mode=dark] .active.carousel-item-end,html[data-netbox-color-mode=light] .carousel-item-next:not(.carousel-item-start),html[data-netbox-color-mode=light] .active.carousel-item-end{transform:translate(100%)}}@media print{html .carousel-item-prev:not(.carousel-item-end),html .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-item-prev:not(.carousel-item-end),html[data-netbox-color-mode=dark] .active.carousel-item-start,html[data-netbox-color-mode=light] .carousel-item-prev:not(.carousel-item-end),html[data-netbox-color-mode=light] .active.carousel-item-start{transform:translate(-100%)}}@media print{html .carousel-fade .carousel-item,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item,html[data-netbox-color-mode=light] .carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}html .carousel-fade .carousel-item.active,html .carousel-fade .carousel-item-next.carousel-item-start,html .carousel-fade .carousel-item-prev.carousel-item-end,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item.active,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item-next.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item-prev.carousel-item-end,html[data-netbox-color-mode=light] .carousel-fade .carousel-item.active,html[data-netbox-color-mode=light] .carousel-fade .carousel-item-next.carousel-item-start,html[data-netbox-color-mode=light] .carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}html .carousel-fade .active.carousel-item-start,html .carousel-fade .active.carousel-item-end,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-end,html[data-netbox-color-mode=light] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=light] .carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}}@media print and (prefers-reduced-motion: reduce){html .carousel-fade .active.carousel-item-start,html .carousel-fade .active.carousel-item-end,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-end,html[data-netbox-color-mode=light] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=light] .carousel-fade .active.carousel-item-end{transition:none}}@media print{html .carousel-control-prev,html .carousel-control-next,html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-next,html[data-netbox-color-mode=light] .carousel-control-prev,html[data-netbox-color-mode=light] .carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}}@media print and (prefers-reduced-motion: reduce){html .carousel-control-prev,html .carousel-control-next,html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-next,html[data-netbox-color-mode=light] .carousel-control-prev,html[data-netbox-color-mode=light] .carousel-control-next{transition:none}}@media print{html .carousel-control-prev:hover,html .carousel-control-prev:focus,html .carousel-control-next:hover,html .carousel-control-next:focus,html[data-netbox-color-mode=dark] .carousel-control-prev:hover,html[data-netbox-color-mode=dark] .carousel-control-prev:focus,html[data-netbox-color-mode=dark] .carousel-control-next:hover,html[data-netbox-color-mode=dark] .carousel-control-next:focus,html[data-netbox-color-mode=light] .carousel-control-prev:hover,html[data-netbox-color-mode=light] .carousel-control-prev:focus,html[data-netbox-color-mode=light] .carousel-control-next:hover,html[data-netbox-color-mode=light] .carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}}@media print{html .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=light] .carousel-control-prev{left:0}}@media print{html .carousel-control-next,html[data-netbox-color-mode=dark] .carousel-control-next,html[data-netbox-color-mode=light] .carousel-control-next{right:0}}@media print{html .carousel-control-prev-icon,html .carousel-control-next-icon,html[data-netbox-color-mode=dark] .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-control-next-icon,html[data-netbox-color-mode=light] .carousel-control-prev-icon,html[data-netbox-color-mode=light] .carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}}@media print{html .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-control-prev-icon,html[data-netbox-color-mode=light] .carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}}@media print{html .carousel-control-next-icon,html[data-netbox-color-mode=dark] .carousel-control-next-icon,html[data-netbox-color-mode=light] .carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}}@media print{html .carousel-indicators,html[data-netbox-color-mode=dark] .carousel-indicators,html[data-netbox-color-mode=light] .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%;list-style:none}html .carousel-indicators [data-bs-target],html[data-netbox-color-mode=dark] .carousel-indicators [data-bs-target],html[data-netbox-color-mode=light] .carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}}@media print and (prefers-reduced-motion: reduce){html .carousel-indicators [data-bs-target],html[data-netbox-color-mode=dark] .carousel-indicators [data-bs-target],html[data-netbox-color-mode=light] .carousel-indicators [data-bs-target]{transition:none}}@media print{html .carousel-indicators .active,html[data-netbox-color-mode=dark] .carousel-indicators .active,html[data-netbox-color-mode=light] .carousel-indicators .active{opacity:1}}@media print{html .carousel-caption,html[data-netbox-color-mode=dark] .carousel-caption,html[data-netbox-color-mode=light] .carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}}@media print{html .carousel-dark .carousel-control-prev-icon,html .carousel-dark .carousel-control-next-icon,html[data-netbox-color-mode=dark] .carousel-dark .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-dark .carousel-control-next-icon,html[data-netbox-color-mode=light] .carousel-dark .carousel-control-prev-icon,html[data-netbox-color-mode=light] .carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}html .carousel-dark .carousel-indicators [data-bs-target],html[data-netbox-color-mode=dark] .carousel-dark .carousel-indicators [data-bs-target],html[data-netbox-color-mode=light] .carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}html .carousel-dark .carousel-caption,html[data-netbox-color-mode=dark] .carousel-dark .carousel-caption,html[data-netbox-color-mode=light] .carousel-dark .carousel-caption{color:#000}}@media print{@keyframes spinner-border{to{transform:rotate(360deg)}}}@media print{html .spinner-border,html[data-netbox-color-mode=dark] .spinner-border,html[data-netbox-color-mode=light] .spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}}@media print{html .spinner-border-sm,html[data-netbox-color-mode=dark] .spinner-border-sm,html[data-netbox-color-mode=light] .spinner-border-sm{width:1rem;height:1rem;border-width:.2em}}@media print{@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}}@media print{html .spinner-grow,html[data-netbox-color-mode=dark] .spinner-grow,html[data-netbox-color-mode=light] .spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}}@media print{html .spinner-grow-sm,html[data-netbox-color-mode=dark] .spinner-grow-sm,html[data-netbox-color-mode=light] .spinner-grow-sm{width:1rem;height:1rem}}@media print and (prefers-reduced-motion: reduce){html .spinner-border,html .spinner-grow,html[data-netbox-color-mode=dark] .spinner-border,html[data-netbox-color-mode=dark] .spinner-grow,html[data-netbox-color-mode=light] .spinner-border,html[data-netbox-color-mode=light] .spinner-grow{animation-duration:1.5s}}@media print{html .clearfix:after,html[data-netbox-color-mode=dark] .clearfix:after,html[data-netbox-color-mode=light] .clearfix:after{display:block;clear:both;content:""}}@media print{html .link-primary,html[data-netbox-color-mode=dark] .link-primary,html[data-netbox-color-mode=light] .link-primary{color:#337ab7}html .link-primary:hover,html .link-primary:focus,html[data-netbox-color-mode=dark] .link-primary:hover,html[data-netbox-color-mode=dark] .link-primary:focus,html[data-netbox-color-mode=light] .link-primary:hover,html[data-netbox-color-mode=light] .link-primary:focus{color:#296292}}@media print{html .link-secondary,html[data-netbox-color-mode=dark] .link-secondary,html[data-netbox-color-mode=light] .link-secondary{color:#6c757d}html .link-secondary:hover,html .link-secondary:focus,html[data-netbox-color-mode=dark] .link-secondary:hover,html[data-netbox-color-mode=dark] .link-secondary:focus,html[data-netbox-color-mode=light] .link-secondary:hover,html[data-netbox-color-mode=light] .link-secondary:focus{color:#565e64}}@media print{html .link-success,html[data-netbox-color-mode=dark] .link-success,html[data-netbox-color-mode=light] .link-success{color:#198754}html .link-success:hover,html .link-success:focus,html[data-netbox-color-mode=dark] .link-success:hover,html[data-netbox-color-mode=dark] .link-success:focus,html[data-netbox-color-mode=light] .link-success:hover,html[data-netbox-color-mode=light] .link-success:focus{color:#146c43}}@media print{html .link-info,html[data-netbox-color-mode=dark] .link-info,html[data-netbox-color-mode=light] .link-info{color:#54d6f0}html .link-info:hover,html .link-info:focus,html[data-netbox-color-mode=dark] .link-info:hover,html[data-netbox-color-mode=dark] .link-info:focus,html[data-netbox-color-mode=light] .link-info:hover,html[data-netbox-color-mode=light] .link-info:focus{color:#76def3}}@media print{html .link-warning,html[data-netbox-color-mode=dark] .link-warning,html[data-netbox-color-mode=light] .link-warning{color:#ffc107}html .link-warning:hover,html .link-warning:focus,html[data-netbox-color-mode=dark] .link-warning:hover,html[data-netbox-color-mode=dark] .link-warning:focus,html[data-netbox-color-mode=light] .link-warning:hover,html[data-netbox-color-mode=light] .link-warning:focus{color:#ffcd39}}@media print{html .link-danger,html[data-netbox-color-mode=dark] .link-danger,html[data-netbox-color-mode=light] .link-danger{color:#dc3545}html .link-danger:hover,html .link-danger:focus,html[data-netbox-color-mode=dark] .link-danger:hover,html[data-netbox-color-mode=dark] .link-danger:focus,html[data-netbox-color-mode=light] .link-danger:hover,html[data-netbox-color-mode=light] .link-danger:focus{color:#b02a37}}@media print{html .link-light,html[data-netbox-color-mode=dark] .link-light,html[data-netbox-color-mode=light] .link-light{color:#f8f9fa}html .link-light:hover,html .link-light:focus,html[data-netbox-color-mode=dark] .link-light:hover,html[data-netbox-color-mode=dark] .link-light:focus,html[data-netbox-color-mode=light] .link-light:hover,html[data-netbox-color-mode=light] .link-light:focus{color:#f9fafb}}@media print{html .link-dark,html[data-netbox-color-mode=dark] .link-dark,html[data-netbox-color-mode=light] .link-dark{color:#212529}html .link-dark:hover,html .link-dark:focus,html[data-netbox-color-mode=dark] .link-dark:hover,html[data-netbox-color-mode=dark] .link-dark:focus,html[data-netbox-color-mode=light] .link-dark:hover,html[data-netbox-color-mode=light] .link-dark:focus{color:#1a1e21}}@media print{html .link-red,html[data-netbox-color-mode=dark] .link-red,html[data-netbox-color-mode=light] .link-red{color:#dc3545}html .link-red:hover,html .link-red:focus,html[data-netbox-color-mode=dark] .link-red:hover,html[data-netbox-color-mode=dark] .link-red:focus,html[data-netbox-color-mode=light] .link-red:hover,html[data-netbox-color-mode=light] .link-red:focus{color:#b02a37}}@media print{html .link-yellow,html[data-netbox-color-mode=dark] .link-yellow,html[data-netbox-color-mode=light] .link-yellow{color:#ffc107}html .link-yellow:hover,html .link-yellow:focus,html[data-netbox-color-mode=dark] .link-yellow:hover,html[data-netbox-color-mode=dark] .link-yellow:focus,html[data-netbox-color-mode=light] .link-yellow:hover,html[data-netbox-color-mode=light] .link-yellow:focus{color:#ffcd39}}@media print{html .link-green,html[data-netbox-color-mode=dark] .link-green,html[data-netbox-color-mode=light] .link-green{color:#198754}html .link-green:hover,html .link-green:focus,html[data-netbox-color-mode=dark] .link-green:hover,html[data-netbox-color-mode=dark] .link-green:focus,html[data-netbox-color-mode=light] .link-green:hover,html[data-netbox-color-mode=light] .link-green:focus{color:#146c43}}@media print{html .link-blue,html[data-netbox-color-mode=dark] .link-blue,html[data-netbox-color-mode=light] .link-blue{color:#0d6efd}html .link-blue:hover,html .link-blue:focus,html[data-netbox-color-mode=dark] .link-blue:hover,html[data-netbox-color-mode=dark] .link-blue:focus,html[data-netbox-color-mode=light] .link-blue:hover,html[data-netbox-color-mode=light] .link-blue:focus{color:#0a58ca}}@media print{html .link-cyan,html[data-netbox-color-mode=dark] .link-cyan,html[data-netbox-color-mode=light] .link-cyan{color:#0dcaf0}html .link-cyan:hover,html .link-cyan:focus,html[data-netbox-color-mode=dark] .link-cyan:hover,html[data-netbox-color-mode=dark] .link-cyan:focus,html[data-netbox-color-mode=light] .link-cyan:hover,html[data-netbox-color-mode=light] .link-cyan:focus{color:#3dd5f3}}@media print{html .link-indigo,html[data-netbox-color-mode=dark] .link-indigo,html[data-netbox-color-mode=light] .link-indigo{color:#6610f2}html .link-indigo:hover,html .link-indigo:focus,html[data-netbox-color-mode=dark] .link-indigo:hover,html[data-netbox-color-mode=dark] .link-indigo:focus,html[data-netbox-color-mode=light] .link-indigo:hover,html[data-netbox-color-mode=light] .link-indigo:focus{color:#520dc2}}@media print{html .link-purple,html[data-netbox-color-mode=dark] .link-purple,html[data-netbox-color-mode=light] .link-purple{color:#6f42c1}html .link-purple:hover,html .link-purple:focus,html[data-netbox-color-mode=dark] .link-purple:hover,html[data-netbox-color-mode=dark] .link-purple:focus,html[data-netbox-color-mode=light] .link-purple:hover,html[data-netbox-color-mode=light] .link-purple:focus{color:#59359a}}@media print{html .link-pink,html[data-netbox-color-mode=dark] .link-pink,html[data-netbox-color-mode=light] .link-pink{color:#d63384}html .link-pink:hover,html .link-pink:focus,html[data-netbox-color-mode=dark] .link-pink:hover,html[data-netbox-color-mode=dark] .link-pink:focus,html[data-netbox-color-mode=light] .link-pink:hover,html[data-netbox-color-mode=light] .link-pink:focus{color:#ab296a}}@media print{html .link-darker,html[data-netbox-color-mode=dark] .link-darker,html[data-netbox-color-mode=light] .link-darker{color:#1b1f22}html .link-darker:hover,html .link-darker:focus,html[data-netbox-color-mode=dark] .link-darker:hover,html[data-netbox-color-mode=dark] .link-darker:focus,html[data-netbox-color-mode=light] .link-darker:hover,html[data-netbox-color-mode=light] .link-darker:focus{color:#16191b}}@media print{html .link-darkest,html[data-netbox-color-mode=dark] .link-darkest,html[data-netbox-color-mode=light] .link-darkest{color:#171b1d}html .link-darkest:hover,html .link-darkest:focus,html[data-netbox-color-mode=dark] .link-darkest:hover,html[data-netbox-color-mode=dark] .link-darkest:focus,html[data-netbox-color-mode=light] .link-darkest:hover,html[data-netbox-color-mode=light] .link-darkest:focus{color:#121617}}@media print{html .link-gray,html[data-netbox-color-mode=dark] .link-gray,html[data-netbox-color-mode=light] .link-gray{color:#ced4da}html .link-gray:hover,html .link-gray:focus,html[data-netbox-color-mode=dark] .link-gray:hover,html[data-netbox-color-mode=dark] .link-gray:focus,html[data-netbox-color-mode=light] .link-gray:hover,html[data-netbox-color-mode=light] .link-gray:focus{color:#d8dde1}}@media print{html .link-gray-100,html[data-netbox-color-mode=dark] .link-gray-100,html[data-netbox-color-mode=light] .link-gray-100{color:#f8f9fa}html .link-gray-100:hover,html .link-gray-100:focus,html[data-netbox-color-mode=dark] .link-gray-100:hover,html[data-netbox-color-mode=dark] .link-gray-100:focus,html[data-netbox-color-mode=light] .link-gray-100:hover,html[data-netbox-color-mode=light] .link-gray-100:focus{color:#f9fafb}}@media print{html .link-gray-200,html[data-netbox-color-mode=dark] .link-gray-200,html[data-netbox-color-mode=light] .link-gray-200{color:#e9ecef}html .link-gray-200:hover,html .link-gray-200:focus,html[data-netbox-color-mode=dark] .link-gray-200:hover,html[data-netbox-color-mode=dark] .link-gray-200:focus,html[data-netbox-color-mode=light] .link-gray-200:hover,html[data-netbox-color-mode=light] .link-gray-200:focus{color:#edf0f2}}@media print{html .link-gray-300,html[data-netbox-color-mode=dark] .link-gray-300,html[data-netbox-color-mode=light] .link-gray-300{color:#dee2e6}html .link-gray-300:hover,html .link-gray-300:focus,html[data-netbox-color-mode=dark] .link-gray-300:hover,html[data-netbox-color-mode=dark] .link-gray-300:focus,html[data-netbox-color-mode=light] .link-gray-300:hover,html[data-netbox-color-mode=light] .link-gray-300:focus{color:#e5e8eb}}@media print{html .link-gray-400,html[data-netbox-color-mode=dark] .link-gray-400,html[data-netbox-color-mode=light] .link-gray-400{color:#ced4da}html .link-gray-400:hover,html .link-gray-400:focus,html[data-netbox-color-mode=dark] .link-gray-400:hover,html[data-netbox-color-mode=dark] .link-gray-400:focus,html[data-netbox-color-mode=light] .link-gray-400:hover,html[data-netbox-color-mode=light] .link-gray-400:focus{color:#d8dde1}}@media print{html .link-gray-500,html[data-netbox-color-mode=dark] .link-gray-500,html[data-netbox-color-mode=light] .link-gray-500{color:#adb5bd}html .link-gray-500:hover,html .link-gray-500:focus,html[data-netbox-color-mode=dark] .link-gray-500:hover,html[data-netbox-color-mode=dark] .link-gray-500:focus,html[data-netbox-color-mode=light] .link-gray-500:hover,html[data-netbox-color-mode=light] .link-gray-500:focus{color:#bdc4ca}}@media print{html .link-gray-600,html[data-netbox-color-mode=dark] .link-gray-600,html[data-netbox-color-mode=light] .link-gray-600{color:#6c757d}html .link-gray-600:hover,html .link-gray-600:focus,html[data-netbox-color-mode=dark] .link-gray-600:hover,html[data-netbox-color-mode=dark] .link-gray-600:focus,html[data-netbox-color-mode=light] .link-gray-600:hover,html[data-netbox-color-mode=light] .link-gray-600:focus{color:#565e64}}@media print{html .link-gray-700,html[data-netbox-color-mode=dark] .link-gray-700,html[data-netbox-color-mode=light] .link-gray-700{color:#495057}html .link-gray-700:hover,html .link-gray-700:focus,html[data-netbox-color-mode=dark] .link-gray-700:hover,html[data-netbox-color-mode=dark] .link-gray-700:focus,html[data-netbox-color-mode=light] .link-gray-700:hover,html[data-netbox-color-mode=light] .link-gray-700:focus{color:#3a4046}}@media print{html .link-gray-800,html[data-netbox-color-mode=dark] .link-gray-800,html[data-netbox-color-mode=light] .link-gray-800{color:#343a40}html .link-gray-800:hover,html .link-gray-800:focus,html[data-netbox-color-mode=dark] .link-gray-800:hover,html[data-netbox-color-mode=dark] .link-gray-800:focus,html[data-netbox-color-mode=light] .link-gray-800:hover,html[data-netbox-color-mode=light] .link-gray-800:focus{color:#2a2e33}}@media print{html .link-gray-900,html[data-netbox-color-mode=dark] .link-gray-900,html[data-netbox-color-mode=light] .link-gray-900{color:#212529}html .link-gray-900:hover,html .link-gray-900:focus,html[data-netbox-color-mode=dark] .link-gray-900:hover,html[data-netbox-color-mode=dark] .link-gray-900:focus,html[data-netbox-color-mode=light] .link-gray-900:hover,html[data-netbox-color-mode=light] .link-gray-900:focus{color:#1a1e21}}@media print{html .link-red-100,html[data-netbox-color-mode=dark] .link-red-100,html[data-netbox-color-mode=light] .link-red-100{color:#f8d7da}html .link-red-100:hover,html .link-red-100:focus,html[data-netbox-color-mode=dark] .link-red-100:hover,html[data-netbox-color-mode=dark] .link-red-100:focus,html[data-netbox-color-mode=light] .link-red-100:hover,html[data-netbox-color-mode=light] .link-red-100:focus{color:#f9dfe1}}@media print{html .link-red-200,html[data-netbox-color-mode=dark] .link-red-200,html[data-netbox-color-mode=light] .link-red-200{color:#f1aeb5}html .link-red-200:hover,html .link-red-200:focus,html[data-netbox-color-mode=dark] .link-red-200:hover,html[data-netbox-color-mode=dark] .link-red-200:focus,html[data-netbox-color-mode=light] .link-red-200:hover,html[data-netbox-color-mode=light] .link-red-200:focus{color:#f4bec4}}@media print{html .link-red-300,html[data-netbox-color-mode=dark] .link-red-300,html[data-netbox-color-mode=light] .link-red-300{color:#ea868f}html .link-red-300:hover,html .link-red-300:focus,html[data-netbox-color-mode=dark] .link-red-300:hover,html[data-netbox-color-mode=dark] .link-red-300:focus,html[data-netbox-color-mode=light] .link-red-300:hover,html[data-netbox-color-mode=light] .link-red-300:focus{color:#ee9ea5}}@media print{html .link-red-400,html[data-netbox-color-mode=dark] .link-red-400,html[data-netbox-color-mode=light] .link-red-400{color:#e35d6a}html .link-red-400:hover,html .link-red-400:focus,html[data-netbox-color-mode=dark] .link-red-400:hover,html[data-netbox-color-mode=dark] .link-red-400:focus,html[data-netbox-color-mode=light] .link-red-400:hover,html[data-netbox-color-mode=light] .link-red-400:focus{color:#e97d88}}@media print{html .link-red-500,html[data-netbox-color-mode=dark] .link-red-500,html[data-netbox-color-mode=light] .link-red-500{color:#dc3545}html .link-red-500:hover,html .link-red-500:focus,html[data-netbox-color-mode=dark] .link-red-500:hover,html[data-netbox-color-mode=dark] .link-red-500:focus,html[data-netbox-color-mode=light] .link-red-500:hover,html[data-netbox-color-mode=light] .link-red-500:focus{color:#b02a37}}@media print{html .link-red-600,html[data-netbox-color-mode=dark] .link-red-600,html[data-netbox-color-mode=light] .link-red-600{color:#b02a37}html .link-red-600:hover,html .link-red-600:focus,html[data-netbox-color-mode=dark] .link-red-600:hover,html[data-netbox-color-mode=dark] .link-red-600:focus,html[data-netbox-color-mode=light] .link-red-600:hover,html[data-netbox-color-mode=light] .link-red-600:focus{color:#8d222c}}@media print{html .link-red-700,html[data-netbox-color-mode=dark] .link-red-700,html[data-netbox-color-mode=light] .link-red-700{color:#842029}html .link-red-700:hover,html .link-red-700:focus,html[data-netbox-color-mode=dark] .link-red-700:hover,html[data-netbox-color-mode=dark] .link-red-700:focus,html[data-netbox-color-mode=light] .link-red-700:hover,html[data-netbox-color-mode=light] .link-red-700:focus{color:#6a1a21}}@media print{html .link-red-800,html[data-netbox-color-mode=dark] .link-red-800,html[data-netbox-color-mode=light] .link-red-800{color:#58151c}html .link-red-800:hover,html .link-red-800:focus,html[data-netbox-color-mode=dark] .link-red-800:hover,html[data-netbox-color-mode=dark] .link-red-800:focus,html[data-netbox-color-mode=light] .link-red-800:hover,html[data-netbox-color-mode=light] .link-red-800:focus{color:#461116}}@media print{html .link-red-900,html[data-netbox-color-mode=dark] .link-red-900,html[data-netbox-color-mode=light] .link-red-900{color:#2c0b0e}html .link-red-900:hover,html .link-red-900:focus,html[data-netbox-color-mode=dark] .link-red-900:hover,html[data-netbox-color-mode=dark] .link-red-900:focus,html[data-netbox-color-mode=light] .link-red-900:hover,html[data-netbox-color-mode=light] .link-red-900:focus{color:#23090b}}@media print{html .link-yellow-100,html[data-netbox-color-mode=dark] .link-yellow-100,html[data-netbox-color-mode=light] .link-yellow-100{color:#fff3cd}html .link-yellow-100:hover,html .link-yellow-100:focus,html[data-netbox-color-mode=dark] .link-yellow-100:hover,html[data-netbox-color-mode=dark] .link-yellow-100:focus,html[data-netbox-color-mode=light] .link-yellow-100:hover,html[data-netbox-color-mode=light] .link-yellow-100:focus{color:#fff5d7}}@media print{html .link-yellow-200,html[data-netbox-color-mode=dark] .link-yellow-200,html[data-netbox-color-mode=light] .link-yellow-200{color:#ffe69c}html .link-yellow-200:hover,html .link-yellow-200:focus,html[data-netbox-color-mode=dark] .link-yellow-200:hover,html[data-netbox-color-mode=dark] .link-yellow-200:focus,html[data-netbox-color-mode=light] .link-yellow-200:hover,html[data-netbox-color-mode=light] .link-yellow-200:focus{color:#ffebb0}}@media print{html .link-yellow-300,html[data-netbox-color-mode=dark] .link-yellow-300,html[data-netbox-color-mode=light] .link-yellow-300{color:#ffda6a}html .link-yellow-300:hover,html .link-yellow-300:focus,html[data-netbox-color-mode=dark] .link-yellow-300:hover,html[data-netbox-color-mode=dark] .link-yellow-300:focus,html[data-netbox-color-mode=light] .link-yellow-300:hover,html[data-netbox-color-mode=light] .link-yellow-300:focus{color:#ffe188}}@media print{html .link-yellow-400,html[data-netbox-color-mode=dark] .link-yellow-400,html[data-netbox-color-mode=light] .link-yellow-400{color:#ffcd39}html .link-yellow-400:hover,html .link-yellow-400:focus,html[data-netbox-color-mode=dark] .link-yellow-400:hover,html[data-netbox-color-mode=dark] .link-yellow-400:focus,html[data-netbox-color-mode=light] .link-yellow-400:hover,html[data-netbox-color-mode=light] .link-yellow-400:focus{color:#ffd761}}@media print{html .link-yellow-500,html[data-netbox-color-mode=dark] .link-yellow-500,html[data-netbox-color-mode=light] .link-yellow-500{color:#ffc107}html .link-yellow-500:hover,html .link-yellow-500:focus,html[data-netbox-color-mode=dark] .link-yellow-500:hover,html[data-netbox-color-mode=dark] .link-yellow-500:focus,html[data-netbox-color-mode=light] .link-yellow-500:hover,html[data-netbox-color-mode=light] .link-yellow-500:focus{color:#ffcd39}}@media print{html .link-yellow-600,html[data-netbox-color-mode=dark] .link-yellow-600,html[data-netbox-color-mode=light] .link-yellow-600{color:#cc9a06}html .link-yellow-600:hover,html .link-yellow-600:focus,html[data-netbox-color-mode=dark] .link-yellow-600:hover,html[data-netbox-color-mode=dark] .link-yellow-600:focus,html[data-netbox-color-mode=light] .link-yellow-600:hover,html[data-netbox-color-mode=light] .link-yellow-600:focus{color:#d6ae38}}@media print{html .link-yellow-700,html[data-netbox-color-mode=dark] .link-yellow-700,html[data-netbox-color-mode=light] .link-yellow-700{color:#997404}html .link-yellow-700:hover,html .link-yellow-700:focus,html[data-netbox-color-mode=dark] .link-yellow-700:hover,html[data-netbox-color-mode=dark] .link-yellow-700:focus,html[data-netbox-color-mode=light] .link-yellow-700:hover,html[data-netbox-color-mode=light] .link-yellow-700:focus{color:#ad9036}}@media print{html .link-yellow-800,html[data-netbox-color-mode=dark] .link-yellow-800,html[data-netbox-color-mode=light] .link-yellow-800{color:#664d03}html .link-yellow-800:hover,html .link-yellow-800:focus,html[data-netbox-color-mode=dark] .link-yellow-800:hover,html[data-netbox-color-mode=dark] .link-yellow-800:focus,html[data-netbox-color-mode=light] .link-yellow-800:hover,html[data-netbox-color-mode=light] .link-yellow-800:focus{color:#523e02}}@media print{html .link-yellow-900,html[data-netbox-color-mode=dark] .link-yellow-900,html[data-netbox-color-mode=light] .link-yellow-900{color:#332701}html .link-yellow-900:hover,html .link-yellow-900:focus,html[data-netbox-color-mode=dark] .link-yellow-900:hover,html[data-netbox-color-mode=dark] .link-yellow-900:focus,html[data-netbox-color-mode=light] .link-yellow-900:hover,html[data-netbox-color-mode=light] .link-yellow-900:focus{color:#291f01}}@media print{html .link-green-100,html[data-netbox-color-mode=dark] .link-green-100,html[data-netbox-color-mode=light] .link-green-100{color:#d1e7dd}html .link-green-100:hover,html .link-green-100:focus,html[data-netbox-color-mode=dark] .link-green-100:hover,html[data-netbox-color-mode=dark] .link-green-100:focus,html[data-netbox-color-mode=light] .link-green-100:hover,html[data-netbox-color-mode=light] .link-green-100:focus{color:#daece4}}@media print{html .link-green-200,html[data-netbox-color-mode=dark] .link-green-200,html[data-netbox-color-mode=light] .link-green-200{color:#a3cfbb}html .link-green-200:hover,html .link-green-200:focus,html[data-netbox-color-mode=dark] .link-green-200:hover,html[data-netbox-color-mode=dark] .link-green-200:focus,html[data-netbox-color-mode=light] .link-green-200:hover,html[data-netbox-color-mode=light] .link-green-200:focus{color:#b5d9c9}}@media print{html .link-green-300,html[data-netbox-color-mode=dark] .link-green-300,html[data-netbox-color-mode=light] .link-green-300{color:#75b798}html .link-green-300:hover,html .link-green-300:focus,html[data-netbox-color-mode=dark] .link-green-300:hover,html[data-netbox-color-mode=dark] .link-green-300:focus,html[data-netbox-color-mode=light] .link-green-300:hover,html[data-netbox-color-mode=light] .link-green-300:focus{color:#91c5ad}}@media print{html .link-green-400,html[data-netbox-color-mode=dark] .link-green-400,html[data-netbox-color-mode=light] .link-green-400{color:#479f76}html .link-green-400:hover,html .link-green-400:focus,html[data-netbox-color-mode=dark] .link-green-400:hover,html[data-netbox-color-mode=dark] .link-green-400:focus,html[data-netbox-color-mode=light] .link-green-400:hover,html[data-netbox-color-mode=light] .link-green-400:focus{color:#6cb291}}@media print{html .link-green-500,html[data-netbox-color-mode=dark] .link-green-500,html[data-netbox-color-mode=light] .link-green-500{color:#198754}html .link-green-500:hover,html .link-green-500:focus,html[data-netbox-color-mode=dark] .link-green-500:hover,html[data-netbox-color-mode=dark] .link-green-500:focus,html[data-netbox-color-mode=light] .link-green-500:hover,html[data-netbox-color-mode=light] .link-green-500:focus{color:#146c43}}@media print{html .link-green-600,html[data-netbox-color-mode=dark] .link-green-600,html[data-netbox-color-mode=light] .link-green-600{color:#146c43}html .link-green-600:hover,html .link-green-600:focus,html[data-netbox-color-mode=dark] .link-green-600:hover,html[data-netbox-color-mode=dark] .link-green-600:focus,html[data-netbox-color-mode=light] .link-green-600:hover,html[data-netbox-color-mode=light] .link-green-600:focus{color:#105636}}@media print{html .link-green-700,html[data-netbox-color-mode=dark] .link-green-700,html[data-netbox-color-mode=light] .link-green-700{color:#0f5132}html .link-green-700:hover,html .link-green-700:focus,html[data-netbox-color-mode=dark] .link-green-700:hover,html[data-netbox-color-mode=dark] .link-green-700:focus,html[data-netbox-color-mode=light] .link-green-700:hover,html[data-netbox-color-mode=light] .link-green-700:focus{color:#0c4128}}@media print{html .link-green-800,html[data-netbox-color-mode=dark] .link-green-800,html[data-netbox-color-mode=light] .link-green-800{color:#0a3622}html .link-green-800:hover,html .link-green-800:focus,html[data-netbox-color-mode=dark] .link-green-800:hover,html[data-netbox-color-mode=dark] .link-green-800:focus,html[data-netbox-color-mode=light] .link-green-800:hover,html[data-netbox-color-mode=light] .link-green-800:focus{color:#082b1b}}@media print{html .link-green-900,html[data-netbox-color-mode=dark] .link-green-900,html[data-netbox-color-mode=light] .link-green-900{color:#051b11}html .link-green-900:hover,html .link-green-900:focus,html[data-netbox-color-mode=dark] .link-green-900:hover,html[data-netbox-color-mode=dark] .link-green-900:focus,html[data-netbox-color-mode=light] .link-green-900:hover,html[data-netbox-color-mode=light] .link-green-900:focus{color:#04160e}}@media print{html .link-blue-100,html[data-netbox-color-mode=dark] .link-blue-100,html[data-netbox-color-mode=light] .link-blue-100{color:#cfe2ff}html .link-blue-100:hover,html .link-blue-100:focus,html[data-netbox-color-mode=dark] .link-blue-100:hover,html[data-netbox-color-mode=dark] .link-blue-100:focus,html[data-netbox-color-mode=light] .link-blue-100:hover,html[data-netbox-color-mode=light] .link-blue-100:focus{color:#d9e8ff}}@media print{html .link-blue-200,html[data-netbox-color-mode=dark] .link-blue-200,html[data-netbox-color-mode=light] .link-blue-200{color:#9ec5fe}html .link-blue-200:hover,html .link-blue-200:focus,html[data-netbox-color-mode=dark] .link-blue-200:hover,html[data-netbox-color-mode=dark] .link-blue-200:focus,html[data-netbox-color-mode=light] .link-blue-200:hover,html[data-netbox-color-mode=light] .link-blue-200:focus{color:#b1d1fe}}@media print{html .link-blue-300,html[data-netbox-color-mode=dark] .link-blue-300,html[data-netbox-color-mode=light] .link-blue-300{color:#6ea8fe}html .link-blue-300:hover,html .link-blue-300:focus,html[data-netbox-color-mode=dark] .link-blue-300:hover,html[data-netbox-color-mode=dark] .link-blue-300:focus,html[data-netbox-color-mode=light] .link-blue-300:hover,html[data-netbox-color-mode=light] .link-blue-300:focus{color:#8bb9fe}}@media print{html .link-blue-400,html[data-netbox-color-mode=dark] .link-blue-400,html[data-netbox-color-mode=light] .link-blue-400{color:#3d8bfd}html .link-blue-400:hover,html .link-blue-400:focus,html[data-netbox-color-mode=dark] .link-blue-400:hover,html[data-netbox-color-mode=dark] .link-blue-400:focus,html[data-netbox-color-mode=light] .link-blue-400:hover,html[data-netbox-color-mode=light] .link-blue-400:focus{color:#64a2fd}}@media print{html .link-blue-500,html[data-netbox-color-mode=dark] .link-blue-500,html[data-netbox-color-mode=light] .link-blue-500{color:#0d6efd}html .link-blue-500:hover,html .link-blue-500:focus,html[data-netbox-color-mode=dark] .link-blue-500:hover,html[data-netbox-color-mode=dark] .link-blue-500:focus,html[data-netbox-color-mode=light] .link-blue-500:hover,html[data-netbox-color-mode=light] .link-blue-500:focus{color:#0a58ca}}@media print{html .link-blue-600,html[data-netbox-color-mode=dark] .link-blue-600,html[data-netbox-color-mode=light] .link-blue-600{color:#0a58ca}html .link-blue-600:hover,html .link-blue-600:focus,html[data-netbox-color-mode=dark] .link-blue-600:hover,html[data-netbox-color-mode=dark] .link-blue-600:focus,html[data-netbox-color-mode=light] .link-blue-600:hover,html[data-netbox-color-mode=light] .link-blue-600:focus{color:#0846a2}}@media print{html .link-blue-700,html[data-netbox-color-mode=dark] .link-blue-700,html[data-netbox-color-mode=light] .link-blue-700{color:#084298}html .link-blue-700:hover,html .link-blue-700:focus,html[data-netbox-color-mode=dark] .link-blue-700:hover,html[data-netbox-color-mode=dark] .link-blue-700:focus,html[data-netbox-color-mode=light] .link-blue-700:hover,html[data-netbox-color-mode=light] .link-blue-700:focus{color:#06357a}}@media print{html .link-blue-800,html[data-netbox-color-mode=dark] .link-blue-800,html[data-netbox-color-mode=light] .link-blue-800{color:#052c65}html .link-blue-800:hover,html .link-blue-800:focus,html[data-netbox-color-mode=dark] .link-blue-800:hover,html[data-netbox-color-mode=dark] .link-blue-800:focus,html[data-netbox-color-mode=light] .link-blue-800:hover,html[data-netbox-color-mode=light] .link-blue-800:focus{color:#042351}}@media print{html .link-blue-900,html[data-netbox-color-mode=dark] .link-blue-900,html[data-netbox-color-mode=light] .link-blue-900{color:#031633}html .link-blue-900:hover,html .link-blue-900:focus,html[data-netbox-color-mode=dark] .link-blue-900:hover,html[data-netbox-color-mode=dark] .link-blue-900:focus,html[data-netbox-color-mode=light] .link-blue-900:hover,html[data-netbox-color-mode=light] .link-blue-900:focus{color:#021229}}@media print{html .link-cyan-100,html[data-netbox-color-mode=dark] .link-cyan-100,html[data-netbox-color-mode=light] .link-cyan-100{color:#cff4fc}html .link-cyan-100:hover,html .link-cyan-100:focus,html[data-netbox-color-mode=dark] .link-cyan-100:hover,html[data-netbox-color-mode=dark] .link-cyan-100:focus,html[data-netbox-color-mode=light] .link-cyan-100:hover,html[data-netbox-color-mode=light] .link-cyan-100:focus{color:#d9f6fd}}@media print{html .link-cyan-200,html[data-netbox-color-mode=dark] .link-cyan-200,html[data-netbox-color-mode=light] .link-cyan-200{color:#9eeaf9}html .link-cyan-200:hover,html .link-cyan-200:focus,html[data-netbox-color-mode=dark] .link-cyan-200:hover,html[data-netbox-color-mode=dark] .link-cyan-200:focus,html[data-netbox-color-mode=light] .link-cyan-200:hover,html[data-netbox-color-mode=light] .link-cyan-200:focus{color:#b1eefa}}@media print{html .link-cyan-300,html[data-netbox-color-mode=dark] .link-cyan-300,html[data-netbox-color-mode=light] .link-cyan-300{color:#6edff6}html .link-cyan-300:hover,html .link-cyan-300:focus,html[data-netbox-color-mode=dark] .link-cyan-300:hover,html[data-netbox-color-mode=dark] .link-cyan-300:focus,html[data-netbox-color-mode=light] .link-cyan-300:hover,html[data-netbox-color-mode=light] .link-cyan-300:focus{color:#8be5f8}}@media print{html .link-cyan-400,html[data-netbox-color-mode=dark] .link-cyan-400,html[data-netbox-color-mode=light] .link-cyan-400{color:#3dd5f3}html .link-cyan-400:hover,html .link-cyan-400:focus,html[data-netbox-color-mode=dark] .link-cyan-400:hover,html[data-netbox-color-mode=dark] .link-cyan-400:focus,html[data-netbox-color-mode=light] .link-cyan-400:hover,html[data-netbox-color-mode=light] .link-cyan-400:focus{color:#64ddf5}}@media print{html .link-cyan-500,html[data-netbox-color-mode=dark] .link-cyan-500,html[data-netbox-color-mode=light] .link-cyan-500{color:#0dcaf0}html .link-cyan-500:hover,html .link-cyan-500:focus,html[data-netbox-color-mode=dark] .link-cyan-500:hover,html[data-netbox-color-mode=dark] .link-cyan-500:focus,html[data-netbox-color-mode=light] .link-cyan-500:hover,html[data-netbox-color-mode=light] .link-cyan-500:focus{color:#3dd5f3}}@media print{html .link-cyan-600,html[data-netbox-color-mode=dark] .link-cyan-600,html[data-netbox-color-mode=light] .link-cyan-600{color:#0aa2c0}html .link-cyan-600:hover,html .link-cyan-600:focus,html[data-netbox-color-mode=dark] .link-cyan-600:hover,html[data-netbox-color-mode=dark] .link-cyan-600:focus,html[data-netbox-color-mode=light] .link-cyan-600:hover,html[data-netbox-color-mode=light] .link-cyan-600:focus{color:#3bb5cd}}@media print{html .link-cyan-700,html[data-netbox-color-mode=dark] .link-cyan-700,html[data-netbox-color-mode=light] .link-cyan-700{color:#087990}html .link-cyan-700:hover,html .link-cyan-700:focus,html[data-netbox-color-mode=dark] .link-cyan-700:hover,html[data-netbox-color-mode=dark] .link-cyan-700:focus,html[data-netbox-color-mode=light] .link-cyan-700:hover,html[data-netbox-color-mode=light] .link-cyan-700:focus{color:#066173}}@media print{html .link-cyan-800,html[data-netbox-color-mode=dark] .link-cyan-800,html[data-netbox-color-mode=light] .link-cyan-800{color:#055160}html .link-cyan-800:hover,html .link-cyan-800:focus,html[data-netbox-color-mode=dark] .link-cyan-800:hover,html[data-netbox-color-mode=dark] .link-cyan-800:focus,html[data-netbox-color-mode=light] .link-cyan-800:hover,html[data-netbox-color-mode=light] .link-cyan-800:focus{color:#04414d}}@media print{html .link-cyan-900,html[data-netbox-color-mode=dark] .link-cyan-900,html[data-netbox-color-mode=light] .link-cyan-900{color:#032830}html .link-cyan-900:hover,html .link-cyan-900:focus,html[data-netbox-color-mode=dark] .link-cyan-900:hover,html[data-netbox-color-mode=dark] .link-cyan-900:focus,html[data-netbox-color-mode=light] .link-cyan-900:hover,html[data-netbox-color-mode=light] .link-cyan-900:focus{color:#022026}}@media print{html .link-indigo-100,html[data-netbox-color-mode=dark] .link-indigo-100,html[data-netbox-color-mode=light] .link-indigo-100{color:#e0cffc}html .link-indigo-100:hover,html .link-indigo-100:focus,html[data-netbox-color-mode=dark] .link-indigo-100:hover,html[data-netbox-color-mode=dark] .link-indigo-100:focus,html[data-netbox-color-mode=light] .link-indigo-100:hover,html[data-netbox-color-mode=light] .link-indigo-100:focus{color:#e6d9fd}}@media print{html .link-indigo-200,html[data-netbox-color-mode=dark] .link-indigo-200,html[data-netbox-color-mode=light] .link-indigo-200{color:#c29ffa}html .link-indigo-200:hover,html .link-indigo-200:focus,html[data-netbox-color-mode=dark] .link-indigo-200:hover,html[data-netbox-color-mode=dark] .link-indigo-200:focus,html[data-netbox-color-mode=light] .link-indigo-200:hover,html[data-netbox-color-mode=light] .link-indigo-200:focus{color:#ceb2fb}}@media print{html .link-indigo-300,html[data-netbox-color-mode=dark] .link-indigo-300,html[data-netbox-color-mode=light] .link-indigo-300{color:#a370f7}html .link-indigo-300:hover,html .link-indigo-300:focus,html[data-netbox-color-mode=dark] .link-indigo-300:hover,html[data-netbox-color-mode=dark] .link-indigo-300:focus,html[data-netbox-color-mode=light] .link-indigo-300:hover,html[data-netbox-color-mode=light] .link-indigo-300:focus{color:#b58df9}}@media print{html .link-indigo-400,html[data-netbox-color-mode=dark] .link-indigo-400,html[data-netbox-color-mode=light] .link-indigo-400{color:#8540f5}html .link-indigo-400:hover,html .link-indigo-400:focus,html[data-netbox-color-mode=dark] .link-indigo-400:hover,html[data-netbox-color-mode=dark] .link-indigo-400:focus,html[data-netbox-color-mode=light] .link-indigo-400:hover,html[data-netbox-color-mode=light] .link-indigo-400:focus{color:#6a33c4}}@media print{html .link-indigo-500,html[data-netbox-color-mode=dark] .link-indigo-500,html[data-netbox-color-mode=light] .link-indigo-500{color:#6610f2}html .link-indigo-500:hover,html .link-indigo-500:focus,html[data-netbox-color-mode=dark] .link-indigo-500:hover,html[data-netbox-color-mode=dark] .link-indigo-500:focus,html[data-netbox-color-mode=light] .link-indigo-500:hover,html[data-netbox-color-mode=light] .link-indigo-500:focus{color:#520dc2}}@media print{html .link-indigo-600,html[data-netbox-color-mode=dark] .link-indigo-600,html[data-netbox-color-mode=light] .link-indigo-600{color:#520dc2}html .link-indigo-600:hover,html .link-indigo-600:focus,html[data-netbox-color-mode=dark] .link-indigo-600:hover,html[data-netbox-color-mode=dark] .link-indigo-600:focus,html[data-netbox-color-mode=light] .link-indigo-600:hover,html[data-netbox-color-mode=light] .link-indigo-600:focus{color:#420a9b}}@media print{html .link-indigo-700,html[data-netbox-color-mode=dark] .link-indigo-700,html[data-netbox-color-mode=light] .link-indigo-700{color:#3d0a91}html .link-indigo-700:hover,html .link-indigo-700:focus,html[data-netbox-color-mode=dark] .link-indigo-700:hover,html[data-netbox-color-mode=dark] .link-indigo-700:focus,html[data-netbox-color-mode=light] .link-indigo-700:hover,html[data-netbox-color-mode=light] .link-indigo-700:focus{color:#310874}}@media print{html .link-indigo-800,html[data-netbox-color-mode=dark] .link-indigo-800,html[data-netbox-color-mode=light] .link-indigo-800{color:#290661}html .link-indigo-800:hover,html .link-indigo-800:focus,html[data-netbox-color-mode=dark] .link-indigo-800:hover,html[data-netbox-color-mode=dark] .link-indigo-800:focus,html[data-netbox-color-mode=light] .link-indigo-800:hover,html[data-netbox-color-mode=light] .link-indigo-800:focus{color:#21054e}}@media print{html .link-indigo-900,html[data-netbox-color-mode=dark] .link-indigo-900,html[data-netbox-color-mode=light] .link-indigo-900{color:#140330}html .link-indigo-900:hover,html .link-indigo-900:focus,html[data-netbox-color-mode=dark] .link-indigo-900:hover,html[data-netbox-color-mode=dark] .link-indigo-900:focus,html[data-netbox-color-mode=light] .link-indigo-900:hover,html[data-netbox-color-mode=light] .link-indigo-900:focus{color:#100226}}@media print{html .link-purple-100,html[data-netbox-color-mode=dark] .link-purple-100,html[data-netbox-color-mode=light] .link-purple-100{color:#e2d9f3}html .link-purple-100:hover,html .link-purple-100:focus,html[data-netbox-color-mode=dark] .link-purple-100:hover,html[data-netbox-color-mode=dark] .link-purple-100:focus,html[data-netbox-color-mode=light] .link-purple-100:hover,html[data-netbox-color-mode=light] .link-purple-100:focus{color:#e8e1f5}}@media print{html .link-purple-200,html[data-netbox-color-mode=dark] .link-purple-200,html[data-netbox-color-mode=light] .link-purple-200{color:#c5b3e6}html .link-purple-200:hover,html .link-purple-200:focus,html[data-netbox-color-mode=dark] .link-purple-200:hover,html[data-netbox-color-mode=dark] .link-purple-200:focus,html[data-netbox-color-mode=light] .link-purple-200:hover,html[data-netbox-color-mode=light] .link-purple-200:focus{color:#d1c2eb}}@media print{html .link-purple-300,html[data-netbox-color-mode=dark] .link-purple-300,html[data-netbox-color-mode=light] .link-purple-300{color:#a98eda}html .link-purple-300:hover,html .link-purple-300:focus,html[data-netbox-color-mode=dark] .link-purple-300:hover,html[data-netbox-color-mode=dark] .link-purple-300:focus,html[data-netbox-color-mode=light] .link-purple-300:hover,html[data-netbox-color-mode=light] .link-purple-300:focus{color:#baa5e1}}@media print{html .link-purple-400,html[data-netbox-color-mode=dark] .link-purple-400,html[data-netbox-color-mode=light] .link-purple-400{color:#8c68cd}html .link-purple-400:hover,html .link-purple-400:focus,html[data-netbox-color-mode=dark] .link-purple-400:hover,html[data-netbox-color-mode=dark] .link-purple-400:focus,html[data-netbox-color-mode=light] .link-purple-400:hover,html[data-netbox-color-mode=light] .link-purple-400:focus{color:#a386d7}}@media print{html .link-purple-500,html[data-netbox-color-mode=dark] .link-purple-500,html[data-netbox-color-mode=light] .link-purple-500{color:#6f42c1}html .link-purple-500:hover,html .link-purple-500:focus,html[data-netbox-color-mode=dark] .link-purple-500:hover,html[data-netbox-color-mode=dark] .link-purple-500:focus,html[data-netbox-color-mode=light] .link-purple-500:hover,html[data-netbox-color-mode=light] .link-purple-500:focus{color:#59359a}}@media print{html .link-purple-600,html[data-netbox-color-mode=dark] .link-purple-600,html[data-netbox-color-mode=light] .link-purple-600{color:#59359a}html .link-purple-600:hover,html .link-purple-600:focus,html[data-netbox-color-mode=dark] .link-purple-600:hover,html[data-netbox-color-mode=dark] .link-purple-600:focus,html[data-netbox-color-mode=light] .link-purple-600:hover,html[data-netbox-color-mode=light] .link-purple-600:focus{color:#472a7b}}@media print{html .link-purple-700,html[data-netbox-color-mode=dark] .link-purple-700,html[data-netbox-color-mode=light] .link-purple-700{color:#432874}html .link-purple-700:hover,html .link-purple-700:focus,html[data-netbox-color-mode=dark] .link-purple-700:hover,html[data-netbox-color-mode=dark] .link-purple-700:focus,html[data-netbox-color-mode=light] .link-purple-700:hover,html[data-netbox-color-mode=light] .link-purple-700:focus{color:#36205d}}@media print{html .link-purple-800,html[data-netbox-color-mode=dark] .link-purple-800,html[data-netbox-color-mode=light] .link-purple-800{color:#2c1a4d}html .link-purple-800:hover,html .link-purple-800:focus,html[data-netbox-color-mode=dark] .link-purple-800:hover,html[data-netbox-color-mode=dark] .link-purple-800:focus,html[data-netbox-color-mode=light] .link-purple-800:hover,html[data-netbox-color-mode=light] .link-purple-800:focus{color:#23153e}}@media print{html .link-purple-900,html[data-netbox-color-mode=dark] .link-purple-900,html[data-netbox-color-mode=light] .link-purple-900{color:#160d27}html .link-purple-900:hover,html .link-purple-900:focus,html[data-netbox-color-mode=dark] .link-purple-900:hover,html[data-netbox-color-mode=dark] .link-purple-900:focus,html[data-netbox-color-mode=light] .link-purple-900:hover,html[data-netbox-color-mode=light] .link-purple-900:focus{color:#120a1f}}@media print{html .link-pink-100,html[data-netbox-color-mode=dark] .link-pink-100,html[data-netbox-color-mode=light] .link-pink-100{color:#f7d6e6}html .link-pink-100:hover,html .link-pink-100:focus,html[data-netbox-color-mode=dark] .link-pink-100:hover,html[data-netbox-color-mode=dark] .link-pink-100:focus,html[data-netbox-color-mode=light] .link-pink-100:hover,html[data-netbox-color-mode=light] .link-pink-100:focus{color:#f9deeb}}@media print{html .link-pink-200,html[data-netbox-color-mode=dark] .link-pink-200,html[data-netbox-color-mode=light] .link-pink-200{color:#efadce}html .link-pink-200:hover,html .link-pink-200:focus,html[data-netbox-color-mode=dark] .link-pink-200:hover,html[data-netbox-color-mode=dark] .link-pink-200:focus,html[data-netbox-color-mode=light] .link-pink-200:hover,html[data-netbox-color-mode=light] .link-pink-200:focus{color:#f2bdd8}}@media print{html .link-pink-300,html[data-netbox-color-mode=dark] .link-pink-300,html[data-netbox-color-mode=light] .link-pink-300{color:#e685b5}html .link-pink-300:hover,html .link-pink-300:focus,html[data-netbox-color-mode=dark] .link-pink-300:hover,html[data-netbox-color-mode=dark] .link-pink-300:focus,html[data-netbox-color-mode=light] .link-pink-300:hover,html[data-netbox-color-mode=light] .link-pink-300:focus{color:#eb9dc4}}@media print{html .link-pink-400,html[data-netbox-color-mode=dark] .link-pink-400,html[data-netbox-color-mode=light] .link-pink-400{color:#de5c9d}html .link-pink-400:hover,html .link-pink-400:focus,html[data-netbox-color-mode=dark] .link-pink-400:hover,html[data-netbox-color-mode=dark] .link-pink-400:focus,html[data-netbox-color-mode=light] .link-pink-400:hover,html[data-netbox-color-mode=light] .link-pink-400:focus{color:#e57db1}}@media print{html .link-pink-500,html[data-netbox-color-mode=dark] .link-pink-500,html[data-netbox-color-mode=light] .link-pink-500{color:#d63384}html .link-pink-500:hover,html .link-pink-500:focus,html[data-netbox-color-mode=dark] .link-pink-500:hover,html[data-netbox-color-mode=dark] .link-pink-500:focus,html[data-netbox-color-mode=light] .link-pink-500:hover,html[data-netbox-color-mode=light] .link-pink-500:focus{color:#ab296a}}@media print{html .link-pink-600,html[data-netbox-color-mode=dark] .link-pink-600,html[data-netbox-color-mode=light] .link-pink-600{color:#ab296a}html .link-pink-600:hover,html .link-pink-600:focus,html[data-netbox-color-mode=dark] .link-pink-600:hover,html[data-netbox-color-mode=dark] .link-pink-600:focus,html[data-netbox-color-mode=light] .link-pink-600:hover,html[data-netbox-color-mode=light] .link-pink-600:focus{color:#892155}}@media print{html .link-pink-700,html[data-netbox-color-mode=dark] .link-pink-700,html[data-netbox-color-mode=light] .link-pink-700{color:#801f4f}html .link-pink-700:hover,html .link-pink-700:focus,html[data-netbox-color-mode=dark] .link-pink-700:hover,html[data-netbox-color-mode=dark] .link-pink-700:focus,html[data-netbox-color-mode=light] .link-pink-700:hover,html[data-netbox-color-mode=light] .link-pink-700:focus{color:#66193f}}@media print{html .link-pink-800,html[data-netbox-color-mode=dark] .link-pink-800,html[data-netbox-color-mode=light] .link-pink-800{color:#561435}html .link-pink-800:hover,html .link-pink-800:focus,html[data-netbox-color-mode=dark] .link-pink-800:hover,html[data-netbox-color-mode=dark] .link-pink-800:focus,html[data-netbox-color-mode=light] .link-pink-800:hover,html[data-netbox-color-mode=light] .link-pink-800:focus{color:#45102a}}@media print{html .link-pink-900,html[data-netbox-color-mode=dark] .link-pink-900,html[data-netbox-color-mode=light] .link-pink-900{color:#2b0a1a}html .link-pink-900:hover,html .link-pink-900:focus,html[data-netbox-color-mode=dark] .link-pink-900:hover,html[data-netbox-color-mode=dark] .link-pink-900:focus,html[data-netbox-color-mode=light] .link-pink-900:hover,html[data-netbox-color-mode=light] .link-pink-900:focus{color:#220815}}@media print{html .ratio,html[data-netbox-color-mode=dark] .ratio,html[data-netbox-color-mode=light] .ratio{position:relative;width:100%}html .ratio:before,html[data-netbox-color-mode=dark] .ratio:before,html[data-netbox-color-mode=light] .ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}html .ratio>*,html[data-netbox-color-mode=dark] .ratio>*,html[data-netbox-color-mode=light] .ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}}@media print{html .ratio-1x1,html[data-netbox-color-mode=dark] .ratio-1x1,html[data-netbox-color-mode=light] .ratio-1x1{--bs-aspect-ratio: 100%}}@media print{html .ratio-4x3,html[data-netbox-color-mode=dark] .ratio-4x3,html[data-netbox-color-mode=light] .ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}}@media print{html .ratio-16x9,html[data-netbox-color-mode=dark] .ratio-16x9,html[data-netbox-color-mode=light] .ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}}@media print{html .ratio-21x9,html[data-netbox-color-mode=dark] .ratio-21x9,html[data-netbox-color-mode=light] .ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}}@media print{html .fixed-top,html[data-netbox-color-mode=dark] .fixed-top,html[data-netbox-color-mode=light] .fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}}@media print{html .fixed-bottom,html[data-netbox-color-mode=dark] .fixed-bottom,html[data-netbox-color-mode=light] .fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}}@media print{html .sticky-top,html[data-netbox-color-mode=dark] .sticky-top,html[data-netbox-color-mode=light] .sticky-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 576px){html .sticky-sm-top,html[data-netbox-color-mode=dark] .sticky-sm-top,html[data-netbox-color-mode=light] .sticky-sm-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 768px){html .sticky-md-top,html[data-netbox-color-mode=dark] .sticky-md-top,html[data-netbox-color-mode=light] .sticky-md-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 992px){html .sticky-lg-top,html[data-netbox-color-mode=dark] .sticky-lg-top,html[data-netbox-color-mode=light] .sticky-lg-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 1200px){html .sticky-xl-top,html[data-netbox-color-mode=dark] .sticky-xl-top,html[data-netbox-color-mode=light] .sticky-xl-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 1400px){html .sticky-xxl-top,html[data-netbox-color-mode=dark] .sticky-xxl-top,html[data-netbox-color-mode=light] .sticky-xxl-top{position:sticky;top:0;z-index:1020}}@media print{html .visually-hidden,html .visually-hidden-focusable:not(:focus):not(:focus-within),html[data-netbox-color-mode=dark] .visually-hidden,html[data-netbox-color-mode=dark] .visually-hidden-focusable:not(:focus):not(:focus-within),html[data-netbox-color-mode=light] .visually-hidden,html[data-netbox-color-mode=light] .visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;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}}@media print{html .stretched-link:after,html[data-netbox-color-mode=dark] .stretched-link:after,html[data-netbox-color-mode=light] .stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}}@media print{html .text-truncate,html[data-netbox-color-mode=dark] .text-truncate,html[data-netbox-color-mode=light] .text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media print{html .align-baseline,html[data-netbox-color-mode=dark] .align-baseline,html[data-netbox-color-mode=light] .align-baseline{vertical-align:baseline!important}}@media print{html .align-top,html[data-netbox-color-mode=dark] .align-top,html[data-netbox-color-mode=light] .align-top{vertical-align:top!important}}@media print{html .align-middle,html[data-netbox-color-mode=dark] .align-middle,html[data-netbox-color-mode=light] .align-middle{vertical-align:middle!important}}@media print{html .align-bottom,html[data-netbox-color-mode=dark] .align-bottom,html[data-netbox-color-mode=light] .align-bottom{vertical-align:bottom!important}}@media print{html .align-text-bottom,html[data-netbox-color-mode=dark] .align-text-bottom,html[data-netbox-color-mode=light] .align-text-bottom{vertical-align:text-bottom!important}}@media print{html .align-text-top,html[data-netbox-color-mode=dark] .align-text-top,html[data-netbox-color-mode=light] .align-text-top{vertical-align:text-top!important}}@media print{html .float-start,html[data-netbox-color-mode=dark] .float-start,html[data-netbox-color-mode=light] .float-start{float:left!important}}@media print{html .float-end,html[data-netbox-color-mode=dark] .float-end,html[data-netbox-color-mode=light] .float-end{float:right!important}}@media print{html .float-none,html[data-netbox-color-mode=dark] .float-none,html[data-netbox-color-mode=light] .float-none{float:none!important}}@media print{html .overflow-auto,html[data-netbox-color-mode=dark] .overflow-auto,html[data-netbox-color-mode=light] .overflow-auto{overflow:auto!important}}@media print{html .overflow-hidden,html[data-netbox-color-mode=dark] .overflow-hidden,html[data-netbox-color-mode=light] .overflow-hidden{overflow:hidden!important}}@media print{html .overflow-visible,html[data-netbox-color-mode=dark] .overflow-visible,html[data-netbox-color-mode=light] .overflow-visible{overflow:visible!important}}@media print{html .overflow-scroll,html[data-netbox-color-mode=dark] .overflow-scroll,html[data-netbox-color-mode=light] .overflow-scroll{overflow:scroll!important}}@media print{html .d-inline,html[data-netbox-color-mode=dark] .d-inline,html[data-netbox-color-mode=light] .d-inline{display:inline!important}}@media print{html .d-inline-block,html[data-netbox-color-mode=dark] .d-inline-block,html[data-netbox-color-mode=light] .d-inline-block{display:inline-block!important}}@media print{html .d-block,html[data-netbox-color-mode=dark] .d-block,html[data-netbox-color-mode=light] .d-block{display:block!important}}@media print{html .d-grid,html[data-netbox-color-mode=dark] .d-grid,html[data-netbox-color-mode=light] .d-grid{display:grid!important}}@media print{html .d-table,html[data-netbox-color-mode=dark] .d-table,html[data-netbox-color-mode=light] .d-table{display:table!important}}@media print{html .d-table-row,html[data-netbox-color-mode=dark] .d-table-row,html[data-netbox-color-mode=light] .d-table-row{display:table-row!important}}@media print{html .d-table-cell,html[data-netbox-color-mode=dark] .d-table-cell,html[data-netbox-color-mode=light] .d-table-cell{display:table-cell!important}}@media print{html .d-flex,html[data-netbox-color-mode=dark] .d-flex,html[data-netbox-color-mode=light] .d-flex{display:flex!important}}@media print{html .d-inline-flex,html[data-netbox-color-mode=dark] .d-inline-flex,html[data-netbox-color-mode=light] .d-inline-flex{display:inline-flex!important}}@media print{html .d-none,html[data-netbox-color-mode=dark] .d-none,html[data-netbox-color-mode=light] .d-none{display:none!important}}@media print{html .shadow,html[data-netbox-color-mode=dark] .shadow,html[data-netbox-color-mode=light] .shadow{box-shadow:0 .5rem 1rem #00000026!important}}@media print{html .shadow-sm,html[data-netbox-color-mode=dark] .shadow-sm,html[data-netbox-color-mode=light] .shadow-sm{box-shadow:0 .125rem .25rem #00000013!important}}@media print{html .shadow-lg,html[data-netbox-color-mode=dark] .shadow-lg,html[data-netbox-color-mode=light] .shadow-lg{box-shadow:0 1rem 3rem #0000002d!important}}@media print{html .shadow-none,html[data-netbox-color-mode=dark] .shadow-none,html[data-netbox-color-mode=light] .shadow-none{box-shadow:none!important}}@media print{html .position-static,html[data-netbox-color-mode=dark] .position-static,html[data-netbox-color-mode=light] .position-static{position:static!important}}@media print{html .position-relative,html[data-netbox-color-mode=dark] .position-relative,html[data-netbox-color-mode=light] .position-relative{position:relative!important}}@media print{html .position-absolute,html[data-netbox-color-mode=dark] .position-absolute,html[data-netbox-color-mode=light] .position-absolute{position:absolute!important}}@media print{html .position-fixed,html[data-netbox-color-mode=dark] .position-fixed,html[data-netbox-color-mode=light] .position-fixed{position:fixed!important}}@media print{html .position-sticky,html[data-netbox-color-mode=dark] .position-sticky,html[data-netbox-color-mode=light] .position-sticky{position:sticky!important}}@media print{html .top-0,html[data-netbox-color-mode=dark] .top-0,html[data-netbox-color-mode=light] .top-0{top:0!important}}@media print{html .top-50,html[data-netbox-color-mode=dark] .top-50,html[data-netbox-color-mode=light] .top-50{top:50%!important}}@media print{html .top-100,html[data-netbox-color-mode=dark] .top-100,html[data-netbox-color-mode=light] .top-100{top:100%!important}}@media print{html .bottom-0,html[data-netbox-color-mode=dark] .bottom-0,html[data-netbox-color-mode=light] .bottom-0{bottom:0!important}}@media print{html .bottom-50,html[data-netbox-color-mode=dark] .bottom-50,html[data-netbox-color-mode=light] .bottom-50{bottom:50%!important}}@media print{html .bottom-100,html[data-netbox-color-mode=dark] .bottom-100,html[data-netbox-color-mode=light] .bottom-100{bottom:100%!important}}@media print{html .start-0,html[data-netbox-color-mode=dark] .start-0,html[data-netbox-color-mode=light] .start-0{left:0!important}}@media print{html .start-50,html[data-netbox-color-mode=dark] .start-50,html[data-netbox-color-mode=light] .start-50{left:50%!important}}@media print{html .start-100,html[data-netbox-color-mode=dark] .start-100,html[data-netbox-color-mode=light] .start-100{left:100%!important}}@media print{html .end-0,html[data-netbox-color-mode=dark] .end-0,html[data-netbox-color-mode=light] .end-0{right:0!important}}@media print{html .end-50,html[data-netbox-color-mode=dark] .end-50,html[data-netbox-color-mode=light] .end-50{right:50%!important}}@media print{html .end-100,html[data-netbox-color-mode=dark] .end-100,html[data-netbox-color-mode=light] .end-100{right:100%!important}}@media print{html .translate-middle,html[data-netbox-color-mode=dark] .translate-middle,html[data-netbox-color-mode=light] .translate-middle{transform:translate(-50%,-50%)!important}}@media print{html .translate-middle-x,html[data-netbox-color-mode=dark] .translate-middle-x,html[data-netbox-color-mode=light] .translate-middle-x{transform:translate(-50%)!important}}@media print{html .translate-middle-y,html[data-netbox-color-mode=dark] .translate-middle-y,html[data-netbox-color-mode=light] .translate-middle-y{transform:translateY(-50%)!important}}@media print{html .border,html[data-netbox-color-mode=dark] .border,html[data-netbox-color-mode=light] .border{border:1px solid #dee2e6!important}}@media print{html .border-0,html[data-netbox-color-mode=dark] .border-0,html[data-netbox-color-mode=light] .border-0{border:0!important}}@media print{html .border-top,html[data-netbox-color-mode=dark] .border-top,html[data-netbox-color-mode=light] .border-top{border-top:1px solid #dee2e6!important}}@media print{html .border-top-0,html[data-netbox-color-mode=dark] .border-top-0,html[data-netbox-color-mode=light] .border-top-0{border-top:0!important}}@media print{html .border-end,html[data-netbox-color-mode=dark] .border-end,html[data-netbox-color-mode=light] .border-end{border-right:1px solid #dee2e6!important}}@media print{html .border-end-0,html[data-netbox-color-mode=dark] .border-end-0,html[data-netbox-color-mode=light] .border-end-0{border-right:0!important}}@media print{html .border-bottom,html[data-netbox-color-mode=dark] .border-bottom,html[data-netbox-color-mode=light] .border-bottom{border-bottom:1px solid #dee2e6!important}}@media print{html .border-bottom-0,html[data-netbox-color-mode=dark] .border-bottom-0,html[data-netbox-color-mode=light] .border-bottom-0{border-bottom:0!important}}@media print{html .border-start,html[data-netbox-color-mode=dark] .border-start,html[data-netbox-color-mode=light] .border-start{border-left:1px solid #dee2e6!important}}@media print{html .border-start-0,html[data-netbox-color-mode=dark] .border-start-0,html[data-netbox-color-mode=light] .border-start-0{border-left:0!important}}@media print{html .border-primary,html[data-netbox-color-mode=dark] .border-primary,html[data-netbox-color-mode=light] .border-primary{border-color:#337ab7!important}}@media print{html .border-secondary,html[data-netbox-color-mode=dark] .border-secondary,html[data-netbox-color-mode=light] .border-secondary{border-color:#6c757d!important}}@media print{html .border-success,html[data-netbox-color-mode=dark] .border-success,html[data-netbox-color-mode=light] .border-success{border-color:#198754!important}}@media print{html .border-info,html[data-netbox-color-mode=dark] .border-info,html[data-netbox-color-mode=light] .border-info{border-color:#54d6f0!important}}@media print{html .border-warning,html[data-netbox-color-mode=dark] .border-warning,html[data-netbox-color-mode=light] .border-warning{border-color:#ffc107!important}}@media print{html .border-danger,html[data-netbox-color-mode=dark] .border-danger,html[data-netbox-color-mode=light] .border-danger{border-color:#dc3545!important}}@media print{html .border-light,html[data-netbox-color-mode=dark] .border-light,html[data-netbox-color-mode=light] .border-light{border-color:#f8f9fa!important}}@media print{html .border-dark,html[data-netbox-color-mode=dark] .border-dark,html[data-netbox-color-mode=light] .border-dark{border-color:#212529!important}}@media print{html .border-red,html[data-netbox-color-mode=dark] .border-red,html[data-netbox-color-mode=light] .border-red{border-color:#dc3545!important}}@media print{html .border-yellow,html[data-netbox-color-mode=dark] .border-yellow,html[data-netbox-color-mode=light] .border-yellow{border-color:#ffc107!important}}@media print{html .border-green,html[data-netbox-color-mode=dark] .border-green,html[data-netbox-color-mode=light] .border-green{border-color:#198754!important}}@media print{html .border-blue,html[data-netbox-color-mode=dark] .border-blue,html[data-netbox-color-mode=light] .border-blue{border-color:#0d6efd!important}}@media print{html .border-cyan,html[data-netbox-color-mode=dark] .border-cyan,html[data-netbox-color-mode=light] .border-cyan{border-color:#0dcaf0!important}}@media print{html .border-indigo,html[data-netbox-color-mode=dark] .border-indigo,html[data-netbox-color-mode=light] .border-indigo{border-color:#6610f2!important}}@media print{html .border-purple,html[data-netbox-color-mode=dark] .border-purple,html[data-netbox-color-mode=light] .border-purple{border-color:#6f42c1!important}}@media print{html .border-pink,html[data-netbox-color-mode=dark] .border-pink,html[data-netbox-color-mode=light] .border-pink{border-color:#d63384!important}}@media print{html .border-darker,html[data-netbox-color-mode=dark] .border-darker,html[data-netbox-color-mode=light] .border-darker{border-color:#1b1f22!important}}@media print{html .border-darkest,html[data-netbox-color-mode=dark] .border-darkest,html[data-netbox-color-mode=light] .border-darkest{border-color:#171b1d!important}}@media print{html .border-gray,html[data-netbox-color-mode=dark] .border-gray,html[data-netbox-color-mode=light] .border-gray{border-color:#ced4da!important}}@media print{html .border-gray-100,html[data-netbox-color-mode=dark] .border-gray-100,html[data-netbox-color-mode=light] .border-gray-100{border-color:#f8f9fa!important}}@media print{html .border-gray-200,html[data-netbox-color-mode=dark] .border-gray-200,html[data-netbox-color-mode=light] .border-gray-200{border-color:#e9ecef!important}}@media print{html .border-gray-300,html[data-netbox-color-mode=dark] .border-gray-300,html[data-netbox-color-mode=light] .border-gray-300{border-color:#dee2e6!important}}@media print{html .border-gray-400,html[data-netbox-color-mode=dark] .border-gray-400,html[data-netbox-color-mode=light] .border-gray-400{border-color:#ced4da!important}}@media print{html .border-gray-500,html[data-netbox-color-mode=dark] .border-gray-500,html[data-netbox-color-mode=light] .border-gray-500{border-color:#adb5bd!important}}@media print{html .border-gray-600,html[data-netbox-color-mode=dark] .border-gray-600,html[data-netbox-color-mode=light] .border-gray-600{border-color:#6c757d!important}}@media print{html .border-gray-700,html[data-netbox-color-mode=dark] .border-gray-700,html[data-netbox-color-mode=light] .border-gray-700{border-color:#495057!important}}@media print{html .border-gray-800,html[data-netbox-color-mode=dark] .border-gray-800,html[data-netbox-color-mode=light] .border-gray-800{border-color:#343a40!important}}@media print{html .border-gray-900,html[data-netbox-color-mode=dark] .border-gray-900,html[data-netbox-color-mode=light] .border-gray-900{border-color:#212529!important}}@media print{html .border-red-100,html[data-netbox-color-mode=dark] .border-red-100,html[data-netbox-color-mode=light] .border-red-100{border-color:#f8d7da!important}}@media print{html .border-red-200,html[data-netbox-color-mode=dark] .border-red-200,html[data-netbox-color-mode=light] .border-red-200{border-color:#f1aeb5!important}}@media print{html .border-red-300,html[data-netbox-color-mode=dark] .border-red-300,html[data-netbox-color-mode=light] .border-red-300{border-color:#ea868f!important}}@media print{html .border-red-400,html[data-netbox-color-mode=dark] .border-red-400,html[data-netbox-color-mode=light] .border-red-400{border-color:#e35d6a!important}}@media print{html .border-red-500,html[data-netbox-color-mode=dark] .border-red-500,html[data-netbox-color-mode=light] .border-red-500{border-color:#dc3545!important}}@media print{html .border-red-600,html[data-netbox-color-mode=dark] .border-red-600,html[data-netbox-color-mode=light] .border-red-600{border-color:#b02a37!important}}@media print{html .border-red-700,html[data-netbox-color-mode=dark] .border-red-700,html[data-netbox-color-mode=light] .border-red-700{border-color:#842029!important}}@media print{html .border-red-800,html[data-netbox-color-mode=dark] .border-red-800,html[data-netbox-color-mode=light] .border-red-800{border-color:#58151c!important}}@media print{html .border-red-900,html[data-netbox-color-mode=dark] .border-red-900,html[data-netbox-color-mode=light] .border-red-900{border-color:#2c0b0e!important}}@media print{html .border-yellow-100,html[data-netbox-color-mode=dark] .border-yellow-100,html[data-netbox-color-mode=light] .border-yellow-100{border-color:#fff3cd!important}}@media print{html .border-yellow-200,html[data-netbox-color-mode=dark] .border-yellow-200,html[data-netbox-color-mode=light] .border-yellow-200{border-color:#ffe69c!important}}@media print{html .border-yellow-300,html[data-netbox-color-mode=dark] .border-yellow-300,html[data-netbox-color-mode=light] .border-yellow-300{border-color:#ffda6a!important}}@media print{html .border-yellow-400,html[data-netbox-color-mode=dark] .border-yellow-400,html[data-netbox-color-mode=light] .border-yellow-400{border-color:#ffcd39!important}}@media print{html .border-yellow-500,html[data-netbox-color-mode=dark] .border-yellow-500,html[data-netbox-color-mode=light] .border-yellow-500{border-color:#ffc107!important}}@media print{html .border-yellow-600,html[data-netbox-color-mode=dark] .border-yellow-600,html[data-netbox-color-mode=light] .border-yellow-600{border-color:#cc9a06!important}}@media print{html .border-yellow-700,html[data-netbox-color-mode=dark] .border-yellow-700,html[data-netbox-color-mode=light] .border-yellow-700{border-color:#997404!important}}@media print{html .border-yellow-800,html[data-netbox-color-mode=dark] .border-yellow-800,html[data-netbox-color-mode=light] .border-yellow-800{border-color:#664d03!important}}@media print{html .border-yellow-900,html[data-netbox-color-mode=dark] .border-yellow-900,html[data-netbox-color-mode=light] .border-yellow-900{border-color:#332701!important}}@media print{html .border-green-100,html[data-netbox-color-mode=dark] .border-green-100,html[data-netbox-color-mode=light] .border-green-100{border-color:#d1e7dd!important}}@media print{html .border-green-200,html[data-netbox-color-mode=dark] .border-green-200,html[data-netbox-color-mode=light] .border-green-200{border-color:#a3cfbb!important}}@media print{html .border-green-300,html[data-netbox-color-mode=dark] .border-green-300,html[data-netbox-color-mode=light] .border-green-300{border-color:#75b798!important}}@media print{html .border-green-400,html[data-netbox-color-mode=dark] .border-green-400,html[data-netbox-color-mode=light] .border-green-400{border-color:#479f76!important}}@media print{html .border-green-500,html[data-netbox-color-mode=dark] .border-green-500,html[data-netbox-color-mode=light] .border-green-500{border-color:#198754!important}}@media print{html .border-green-600,html[data-netbox-color-mode=dark] .border-green-600,html[data-netbox-color-mode=light] .border-green-600{border-color:#146c43!important}}@media print{html .border-green-700,html[data-netbox-color-mode=dark] .border-green-700,html[data-netbox-color-mode=light] .border-green-700{border-color:#0f5132!important}}@media print{html .border-green-800,html[data-netbox-color-mode=dark] .border-green-800,html[data-netbox-color-mode=light] .border-green-800{border-color:#0a3622!important}}@media print{html .border-green-900,html[data-netbox-color-mode=dark] .border-green-900,html[data-netbox-color-mode=light] .border-green-900{border-color:#051b11!important}}@media print{html .border-blue-100,html[data-netbox-color-mode=dark] .border-blue-100,html[data-netbox-color-mode=light] .border-blue-100{border-color:#cfe2ff!important}}@media print{html .border-blue-200,html[data-netbox-color-mode=dark] .border-blue-200,html[data-netbox-color-mode=light] .border-blue-200{border-color:#9ec5fe!important}}@media print{html .border-blue-300,html[data-netbox-color-mode=dark] .border-blue-300,html[data-netbox-color-mode=light] .border-blue-300{border-color:#6ea8fe!important}}@media print{html .border-blue-400,html[data-netbox-color-mode=dark] .border-blue-400,html[data-netbox-color-mode=light] .border-blue-400{border-color:#3d8bfd!important}}@media print{html .border-blue-500,html[data-netbox-color-mode=dark] .border-blue-500,html[data-netbox-color-mode=light] .border-blue-500{border-color:#0d6efd!important}}@media print{html .border-blue-600,html[data-netbox-color-mode=dark] .border-blue-600,html[data-netbox-color-mode=light] .border-blue-600{border-color:#0a58ca!important}}@media print{html .border-blue-700,html[data-netbox-color-mode=dark] .border-blue-700,html[data-netbox-color-mode=light] .border-blue-700{border-color:#084298!important}}@media print{html .border-blue-800,html[data-netbox-color-mode=dark] .border-blue-800,html[data-netbox-color-mode=light] .border-blue-800{border-color:#052c65!important}}@media print{html .border-blue-900,html[data-netbox-color-mode=dark] .border-blue-900,html[data-netbox-color-mode=light] .border-blue-900{border-color:#031633!important}}@media print{html .border-cyan-100,html[data-netbox-color-mode=dark] .border-cyan-100,html[data-netbox-color-mode=light] .border-cyan-100{border-color:#cff4fc!important}}@media print{html .border-cyan-200,html[data-netbox-color-mode=dark] .border-cyan-200,html[data-netbox-color-mode=light] .border-cyan-200{border-color:#9eeaf9!important}}@media print{html .border-cyan-300,html[data-netbox-color-mode=dark] .border-cyan-300,html[data-netbox-color-mode=light] .border-cyan-300{border-color:#6edff6!important}}@media print{html .border-cyan-400,html[data-netbox-color-mode=dark] .border-cyan-400,html[data-netbox-color-mode=light] .border-cyan-400{border-color:#3dd5f3!important}}@media print{html .border-cyan-500,html[data-netbox-color-mode=dark] .border-cyan-500,html[data-netbox-color-mode=light] .border-cyan-500{border-color:#0dcaf0!important}}@media print{html .border-cyan-600,html[data-netbox-color-mode=dark] .border-cyan-600,html[data-netbox-color-mode=light] .border-cyan-600{border-color:#0aa2c0!important}}@media print{html .border-cyan-700,html[data-netbox-color-mode=dark] .border-cyan-700,html[data-netbox-color-mode=light] .border-cyan-700{border-color:#087990!important}}@media print{html .border-cyan-800,html[data-netbox-color-mode=dark] .border-cyan-800,html[data-netbox-color-mode=light] .border-cyan-800{border-color:#055160!important}}@media print{html .border-cyan-900,html[data-netbox-color-mode=dark] .border-cyan-900,html[data-netbox-color-mode=light] .border-cyan-900{border-color:#032830!important}}@media print{html .border-indigo-100,html[data-netbox-color-mode=dark] .border-indigo-100,html[data-netbox-color-mode=light] .border-indigo-100{border-color:#e0cffc!important}}@media print{html .border-indigo-200,html[data-netbox-color-mode=dark] .border-indigo-200,html[data-netbox-color-mode=light] .border-indigo-200{border-color:#c29ffa!important}}@media print{html .border-indigo-300,html[data-netbox-color-mode=dark] .border-indigo-300,html[data-netbox-color-mode=light] .border-indigo-300{border-color:#a370f7!important}}@media print{html .border-indigo-400,html[data-netbox-color-mode=dark] .border-indigo-400,html[data-netbox-color-mode=light] .border-indigo-400{border-color:#8540f5!important}}@media print{html .border-indigo-500,html[data-netbox-color-mode=dark] .border-indigo-500,html[data-netbox-color-mode=light] .border-indigo-500{border-color:#6610f2!important}}@media print{html .border-indigo-600,html[data-netbox-color-mode=dark] .border-indigo-600,html[data-netbox-color-mode=light] .border-indigo-600{border-color:#520dc2!important}}@media print{html .border-indigo-700,html[data-netbox-color-mode=dark] .border-indigo-700,html[data-netbox-color-mode=light] .border-indigo-700{border-color:#3d0a91!important}}@media print{html .border-indigo-800,html[data-netbox-color-mode=dark] .border-indigo-800,html[data-netbox-color-mode=light] .border-indigo-800{border-color:#290661!important}}@media print{html .border-indigo-900,html[data-netbox-color-mode=dark] .border-indigo-900,html[data-netbox-color-mode=light] .border-indigo-900{border-color:#140330!important}}@media print{html .border-purple-100,html[data-netbox-color-mode=dark] .border-purple-100,html[data-netbox-color-mode=light] .border-purple-100{border-color:#e2d9f3!important}}@media print{html .border-purple-200,html[data-netbox-color-mode=dark] .border-purple-200,html[data-netbox-color-mode=light] .border-purple-200{border-color:#c5b3e6!important}}@media print{html .border-purple-300,html[data-netbox-color-mode=dark] .border-purple-300,html[data-netbox-color-mode=light] .border-purple-300{border-color:#a98eda!important}}@media print{html .border-purple-400,html[data-netbox-color-mode=dark] .border-purple-400,html[data-netbox-color-mode=light] .border-purple-400{border-color:#8c68cd!important}}@media print{html .border-purple-500,html[data-netbox-color-mode=dark] .border-purple-500,html[data-netbox-color-mode=light] .border-purple-500{border-color:#6f42c1!important}}@media print{html .border-purple-600,html[data-netbox-color-mode=dark] .border-purple-600,html[data-netbox-color-mode=light] .border-purple-600{border-color:#59359a!important}}@media print{html .border-purple-700,html[data-netbox-color-mode=dark] .border-purple-700,html[data-netbox-color-mode=light] .border-purple-700{border-color:#432874!important}}@media print{html .border-purple-800,html[data-netbox-color-mode=dark] .border-purple-800,html[data-netbox-color-mode=light] .border-purple-800{border-color:#2c1a4d!important}}@media print{html .border-purple-900,html[data-netbox-color-mode=dark] .border-purple-900,html[data-netbox-color-mode=light] .border-purple-900{border-color:#160d27!important}}@media print{html .border-pink-100,html[data-netbox-color-mode=dark] .border-pink-100,html[data-netbox-color-mode=light] .border-pink-100{border-color:#f7d6e6!important}}@media print{html .border-pink-200,html[data-netbox-color-mode=dark] .border-pink-200,html[data-netbox-color-mode=light] .border-pink-200{border-color:#efadce!important}}@media print{html .border-pink-300,html[data-netbox-color-mode=dark] .border-pink-300,html[data-netbox-color-mode=light] .border-pink-300{border-color:#e685b5!important}}@media print{html .border-pink-400,html[data-netbox-color-mode=dark] .border-pink-400,html[data-netbox-color-mode=light] .border-pink-400{border-color:#de5c9d!important}}@media print{html .border-pink-500,html[data-netbox-color-mode=dark] .border-pink-500,html[data-netbox-color-mode=light] .border-pink-500{border-color:#d63384!important}}@media print{html .border-pink-600,html[data-netbox-color-mode=dark] .border-pink-600,html[data-netbox-color-mode=light] .border-pink-600{border-color:#ab296a!important}}@media print{html .border-pink-700,html[data-netbox-color-mode=dark] .border-pink-700,html[data-netbox-color-mode=light] .border-pink-700{border-color:#801f4f!important}}@media print{html .border-pink-800,html[data-netbox-color-mode=dark] .border-pink-800,html[data-netbox-color-mode=light] .border-pink-800{border-color:#561435!important}}@media print{html .border-pink-900,html[data-netbox-color-mode=dark] .border-pink-900,html[data-netbox-color-mode=light] .border-pink-900{border-color:#2b0a1a!important}}@media print{html .border-white,html[data-netbox-color-mode=dark] .border-white,html[data-netbox-color-mode=light] .border-white{border-color:#fff!important}}@media print{html .border-1,html[data-netbox-color-mode=dark] .border-1,html[data-netbox-color-mode=light] .border-1{border-width:1px!important}}@media print{html .border-2,html[data-netbox-color-mode=dark] .border-2,html[data-netbox-color-mode=light] .border-2{border-width:2px!important}}@media print{html .border-3,html[data-netbox-color-mode=dark] .border-3,html[data-netbox-color-mode=light] .border-3{border-width:3px!important}}@media print{html .border-4,html[data-netbox-color-mode=dark] .border-4,html[data-netbox-color-mode=light] .border-4{border-width:4px!important}}@media print{html .border-5,html[data-netbox-color-mode=dark] .border-5,html[data-netbox-color-mode=light] .border-5{border-width:5px!important}}@media print{html .w-25,html[data-netbox-color-mode=dark] .w-25,html[data-netbox-color-mode=light] .w-25{width:25%!important}}@media print{html .w-50,html[data-netbox-color-mode=dark] .w-50,html[data-netbox-color-mode=light] .w-50{width:50%!important}}@media print{html .w-75,html[data-netbox-color-mode=dark] .w-75,html[data-netbox-color-mode=light] .w-75{width:75%!important}}@media print{html .w-100,html[data-netbox-color-mode=dark] .w-100,html[data-netbox-color-mode=light] .w-100{width:100%!important}}@media print{html .w-auto,html[data-netbox-color-mode=dark] .w-auto,html[data-netbox-color-mode=light] .w-auto{width:auto!important}}@media print{html .mw-100,html[data-netbox-color-mode=dark] .mw-100,html[data-netbox-color-mode=light] .mw-100{max-width:100%!important}}@media print{html .vw-100,html[data-netbox-color-mode=dark] .vw-100,html[data-netbox-color-mode=light] .vw-100{width:100vw!important}}@media print{html .min-vw-100,html[data-netbox-color-mode=dark] .min-vw-100,html[data-netbox-color-mode=light] .min-vw-100{min-width:100vw!important}}@media print{html .h-25,html[data-netbox-color-mode=dark] .h-25,html[data-netbox-color-mode=light] .h-25{height:25%!important}}@media print{html .h-50,html[data-netbox-color-mode=dark] .h-50,html[data-netbox-color-mode=light] .h-50{height:50%!important}}@media print{html .h-75,html[data-netbox-color-mode=dark] .h-75,html[data-netbox-color-mode=light] .h-75{height:75%!important}}@media print{html .h-100,html[data-netbox-color-mode=dark] .h-100,html[data-netbox-color-mode=light] .h-100{height:100%!important}}@media print{html .h-auto,html[data-netbox-color-mode=dark] .h-auto,html[data-netbox-color-mode=light] .h-auto{height:auto!important}}@media print{html .mh-100,html[data-netbox-color-mode=dark] .mh-100,html[data-netbox-color-mode=light] .mh-100{max-height:100%!important}}@media print{html .vh-100,html[data-netbox-color-mode=dark] .vh-100,html[data-netbox-color-mode=light] .vh-100{height:100vh!important}}@media print{html .min-vh-100,html[data-netbox-color-mode=dark] .min-vh-100,html[data-netbox-color-mode=light] .min-vh-100{min-height:100vh!important}}@media print{html .flex-fill,html[data-netbox-color-mode=dark] .flex-fill,html[data-netbox-color-mode=light] .flex-fill{flex:1 1 auto!important}}@media print{html .flex-row,html[data-netbox-color-mode=dark] .flex-row,html[data-netbox-color-mode=light] .flex-row{flex-direction:row!important}}@media print{html .flex-column,html[data-netbox-color-mode=dark] .flex-column,html[data-netbox-color-mode=light] .flex-column{flex-direction:column!important}}@media print{html .flex-row-reverse,html[data-netbox-color-mode=dark] .flex-row-reverse,html[data-netbox-color-mode=light] .flex-row-reverse{flex-direction:row-reverse!important}}@media print{html .flex-column-reverse,html[data-netbox-color-mode=dark] .flex-column-reverse,html[data-netbox-color-mode=light] .flex-column-reverse{flex-direction:column-reverse!important}}@media print{html .flex-grow-0,html[data-netbox-color-mode=dark] .flex-grow-0,html[data-netbox-color-mode=light] .flex-grow-0{flex-grow:0!important}}@media print{html .flex-grow-1,html[data-netbox-color-mode=dark] .flex-grow-1,html[data-netbox-color-mode=light] .flex-grow-1{flex-grow:1!important}}@media print{html .flex-shrink-0,html[data-netbox-color-mode=dark] .flex-shrink-0,html[data-netbox-color-mode=light] .flex-shrink-0{flex-shrink:0!important}}@media print{html .flex-shrink-1,html[data-netbox-color-mode=dark] .flex-shrink-1,html[data-netbox-color-mode=light] .flex-shrink-1{flex-shrink:1!important}}@media print{html .flex-wrap,html[data-netbox-color-mode=dark] .flex-wrap,html[data-netbox-color-mode=light] .flex-wrap{flex-wrap:wrap!important}}@media print{html .flex-nowrap,html[data-netbox-color-mode=dark] .flex-nowrap,html[data-netbox-color-mode=light] .flex-nowrap{flex-wrap:nowrap!important}}@media print{html .flex-wrap-reverse,html[data-netbox-color-mode=dark] .flex-wrap-reverse,html[data-netbox-color-mode=light] .flex-wrap-reverse{flex-wrap:wrap-reverse!important}}@media print{html .gap-0,html[data-netbox-color-mode=dark] .gap-0,html[data-netbox-color-mode=light] .gap-0{gap:0!important}}@media print{html .gap-1,html[data-netbox-color-mode=dark] .gap-1,html[data-netbox-color-mode=light] .gap-1{gap:.25rem!important}}@media print{html .gap-2,html[data-netbox-color-mode=dark] .gap-2,html[data-netbox-color-mode=light] .gap-2{gap:.5rem!important}}@media print{html .gap-3,html[data-netbox-color-mode=dark] .gap-3,html[data-netbox-color-mode=light] .gap-3{gap:1rem!important}}@media print{html .gap-4,html[data-netbox-color-mode=dark] .gap-4,html[data-netbox-color-mode=light] .gap-4{gap:1.5rem!important}}@media print{html .gap-5,html[data-netbox-color-mode=dark] .gap-5,html[data-netbox-color-mode=light] .gap-5{gap:3rem!important}}@media print{html .justify-content-start,html[data-netbox-color-mode=dark] .justify-content-start,html[data-netbox-color-mode=light] .justify-content-start{justify-content:flex-start!important}}@media print{html .justify-content-end,html[data-netbox-color-mode=dark] .justify-content-end,html[data-netbox-color-mode=light] .justify-content-end{justify-content:flex-end!important}}@media print{html .justify-content-center,html[data-netbox-color-mode=dark] .justify-content-center,html[data-netbox-color-mode=light] .justify-content-center{justify-content:center!important}}@media print{html .justify-content-between,html[data-netbox-color-mode=dark] .justify-content-between,html[data-netbox-color-mode=light] .justify-content-between{justify-content:space-between!important}}@media print{html .justify-content-around,html[data-netbox-color-mode=dark] .justify-content-around,html[data-netbox-color-mode=light] .justify-content-around{justify-content:space-around!important}}@media print{html .justify-content-evenly,html[data-netbox-color-mode=dark] .justify-content-evenly,html[data-netbox-color-mode=light] .justify-content-evenly{justify-content:space-evenly!important}}@media print{html .align-items-start,html[data-netbox-color-mode=dark] .align-items-start,html[data-netbox-color-mode=light] .align-items-start{align-items:flex-start!important}}@media print{html .align-items-end,html[data-netbox-color-mode=dark] .align-items-end,html[data-netbox-color-mode=light] .align-items-end{align-items:flex-end!important}}@media print{html .align-items-center,html[data-netbox-color-mode=dark] .align-items-center,html[data-netbox-color-mode=light] .align-items-center{align-items:center!important}}@media print{html .align-items-baseline,html[data-netbox-color-mode=dark] .align-items-baseline,html[data-netbox-color-mode=light] .align-items-baseline{align-items:baseline!important}}@media print{html .align-items-stretch,html[data-netbox-color-mode=dark] .align-items-stretch,html[data-netbox-color-mode=light] .align-items-stretch{align-items:stretch!important}}@media print{html .align-content-start,html[data-netbox-color-mode=dark] .align-content-start,html[data-netbox-color-mode=light] .align-content-start{align-content:flex-start!important}}@media print{html .align-content-end,html[data-netbox-color-mode=dark] .align-content-end,html[data-netbox-color-mode=light] .align-content-end{align-content:flex-end!important}}@media print{html .align-content-center,html[data-netbox-color-mode=dark] .align-content-center,html[data-netbox-color-mode=light] .align-content-center{align-content:center!important}}@media print{html .align-content-between,html[data-netbox-color-mode=dark] .align-content-between,html[data-netbox-color-mode=light] .align-content-between{align-content:space-between!important}}@media print{html .align-content-around,html[data-netbox-color-mode=dark] .align-content-around,html[data-netbox-color-mode=light] .align-content-around{align-content:space-around!important}}@media print{html .align-content-stretch,html[data-netbox-color-mode=dark] .align-content-stretch,html[data-netbox-color-mode=light] .align-content-stretch{align-content:stretch!important}}@media print{html .align-self-auto,html[data-netbox-color-mode=dark] .align-self-auto,html[data-netbox-color-mode=light] .align-self-auto{align-self:auto!important}}@media print{html .align-self-start,html[data-netbox-color-mode=dark] .align-self-start,html[data-netbox-color-mode=light] .align-self-start{align-self:flex-start!important}}@media print{html .align-self-end,html[data-netbox-color-mode=dark] .align-self-end,html[data-netbox-color-mode=light] .align-self-end{align-self:flex-end!important}}@media print{html .align-self-center,html[data-netbox-color-mode=dark] .align-self-center,html[data-netbox-color-mode=light] .align-self-center{align-self:center!important}}@media print{html .align-self-baseline,html[data-netbox-color-mode=dark] .align-self-baseline,html[data-netbox-color-mode=light] .align-self-baseline{align-self:baseline!important}}@media print{html .align-self-stretch,html[data-netbox-color-mode=dark] .align-self-stretch,html[data-netbox-color-mode=light] .align-self-stretch{align-self:stretch!important}}@media print{html .order-first,html[data-netbox-color-mode=dark] .order-first,html[data-netbox-color-mode=light] .order-first{order:-1!important}}@media print{html .order-0,html[data-netbox-color-mode=dark] .order-0,html[data-netbox-color-mode=light] .order-0{order:0!important}}@media print{html .order-1,html[data-netbox-color-mode=dark] .order-1,html[data-netbox-color-mode=light] .order-1{order:1!important}}@media print{html .order-2,html[data-netbox-color-mode=dark] .order-2,html[data-netbox-color-mode=light] .order-2{order:2!important}}@media print{html .order-3,html[data-netbox-color-mode=dark] .order-3,html[data-netbox-color-mode=light] .order-3{order:3!important}}@media print{html .order-4,html[data-netbox-color-mode=dark] .order-4,html[data-netbox-color-mode=light] .order-4{order:4!important}}@media print{html .order-5,html[data-netbox-color-mode=dark] .order-5,html[data-netbox-color-mode=light] .order-5{order:5!important}}@media print{html .order-last,html[data-netbox-color-mode=dark] .order-last,html[data-netbox-color-mode=light] .order-last{order:6!important}}@media print{html .m-0,html[data-netbox-color-mode=dark] .m-0,html[data-netbox-color-mode=light] .m-0{margin:0!important}}@media print{html .m-1,html[data-netbox-color-mode=dark] .m-1,html[data-netbox-color-mode=light] .m-1{margin:.25rem!important}}@media print{html .m-2,html[data-netbox-color-mode=dark] .m-2,html[data-netbox-color-mode=light] .m-2{margin:.5rem!important}}@media print{html .m-3,html[data-netbox-color-mode=dark] .m-3,html[data-netbox-color-mode=light] .m-3{margin:1rem!important}}@media print{html .m-4,html[data-netbox-color-mode=dark] .m-4,html[data-netbox-color-mode=light] .m-4{margin:1.5rem!important}}@media print{html .m-5,html[data-netbox-color-mode=dark] .m-5,html[data-netbox-color-mode=light] .m-5{margin:3rem!important}}@media print{html .m-auto,html[data-netbox-color-mode=dark] .m-auto,html[data-netbox-color-mode=light] .m-auto{margin:auto!important}}@media print{html .mx-0,html[data-netbox-color-mode=dark] .mx-0,html[data-netbox-color-mode=light] .mx-0{margin-right:0!important;margin-left:0!important}}@media print{html .mx-1,html[data-netbox-color-mode=dark] .mx-1,html[data-netbox-color-mode=light] .mx-1{margin-right:.25rem!important;margin-left:.25rem!important}}@media print{html .mx-2,html[data-netbox-color-mode=dark] .mx-2,html[data-netbox-color-mode=light] .mx-2{margin-right:.5rem!important;margin-left:.5rem!important}}@media print{html .mx-3,html[data-netbox-color-mode=dark] .mx-3,html[data-netbox-color-mode=light] .mx-3{margin-right:1rem!important;margin-left:1rem!important}}@media print{html .mx-4,html[data-netbox-color-mode=dark] .mx-4,html[data-netbox-color-mode=light] .mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}}@media print{html .mx-5,html[data-netbox-color-mode=dark] .mx-5,html[data-netbox-color-mode=light] .mx-5{margin-right:3rem!important;margin-left:3rem!important}}@media print{html .mx-auto,html[data-netbox-color-mode=dark] .mx-auto,html[data-netbox-color-mode=light] .mx-auto{margin-right:auto!important;margin-left:auto!important}}@media print{html .my-0,html[data-netbox-color-mode=dark] .my-0,html[data-netbox-color-mode=light] .my-0{margin-top:0!important;margin-bottom:0!important}}@media print{html .my-1,html[data-netbox-color-mode=dark] .my-1,html[data-netbox-color-mode=light] .my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}}@media print{html .my-2,html[data-netbox-color-mode=dark] .my-2,html[data-netbox-color-mode=light] .my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}}@media print{html .my-3,html[data-netbox-color-mode=dark] .my-3,html[data-netbox-color-mode=light] .my-3{margin-top:1rem!important;margin-bottom:1rem!important}}@media print{html .my-4,html[data-netbox-color-mode=dark] .my-4,html[data-netbox-color-mode=light] .my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}}@media print{html .my-5,html[data-netbox-color-mode=dark] .my-5,html[data-netbox-color-mode=light] .my-5{margin-top:3rem!important;margin-bottom:3rem!important}}@media print{html .my-auto,html[data-netbox-color-mode=dark] .my-auto,html[data-netbox-color-mode=light] .my-auto{margin-top:auto!important;margin-bottom:auto!important}}@media print{html .mt-0,html[data-netbox-color-mode=dark] .mt-0,html[data-netbox-color-mode=light] .mt-0{margin-top:0!important}}@media print{html .mt-1,html[data-netbox-color-mode=dark] .mt-1,html[data-netbox-color-mode=light] .mt-1{margin-top:.25rem!important}}@media print{html .mt-2,html[data-netbox-color-mode=dark] .mt-2,html[data-netbox-color-mode=light] .mt-2{margin-top:.5rem!important}}@media print{html .mt-3,html[data-netbox-color-mode=dark] .mt-3,html[data-netbox-color-mode=light] .mt-3{margin-top:1rem!important}}@media print{html .mt-4,html[data-netbox-color-mode=dark] .mt-4,html[data-netbox-color-mode=light] .mt-4{margin-top:1.5rem!important}}@media print{html .mt-5,html[data-netbox-color-mode=dark] .mt-5,html[data-netbox-color-mode=light] .mt-5{margin-top:3rem!important}}@media print{html .mt-auto,html[data-netbox-color-mode=dark] .mt-auto,html[data-netbox-color-mode=light] .mt-auto{margin-top:auto!important}}@media print{html .me-0,html[data-netbox-color-mode=dark] .me-0,html[data-netbox-color-mode=light] .me-0{margin-right:0!important}}@media print{html .me-1,html[data-netbox-color-mode=dark] .me-1,html[data-netbox-color-mode=light] .me-1{margin-right:.25rem!important}}@media print{html .me-2,html[data-netbox-color-mode=dark] .me-2,html[data-netbox-color-mode=light] .me-2{margin-right:.5rem!important}}@media print{html .me-3,html[data-netbox-color-mode=dark] .me-3,html[data-netbox-color-mode=light] .me-3{margin-right:1rem!important}}@media print{html .me-4,html[data-netbox-color-mode=dark] .me-4,html[data-netbox-color-mode=light] .me-4{margin-right:1.5rem!important}}@media print{html .me-5,html[data-netbox-color-mode=dark] .me-5,html[data-netbox-color-mode=light] .me-5{margin-right:3rem!important}}@media print{html .me-auto,html[data-netbox-color-mode=dark] .me-auto,html[data-netbox-color-mode=light] .me-auto{margin-right:auto!important}}@media print{html .mb-0,html[data-netbox-color-mode=dark] .mb-0,html[data-netbox-color-mode=light] .mb-0{margin-bottom:0!important}}@media print{html .mb-1,html[data-netbox-color-mode=dark] .mb-1,html[data-netbox-color-mode=light] .mb-1{margin-bottom:.25rem!important}}@media print{html .mb-2,html[data-netbox-color-mode=dark] .mb-2,html[data-netbox-color-mode=light] .mb-2{margin-bottom:.5rem!important}}@media print{html .mb-3,html[data-netbox-color-mode=dark] .mb-3,html[data-netbox-color-mode=light] .mb-3{margin-bottom:1rem!important}}@media print{html .mb-4,html[data-netbox-color-mode=dark] .mb-4,html[data-netbox-color-mode=light] .mb-4{margin-bottom:1.5rem!important}}@media print{html .mb-5,html[data-netbox-color-mode=dark] .mb-5,html[data-netbox-color-mode=light] .mb-5{margin-bottom:3rem!important}}@media print{html .mb-auto,html[data-netbox-color-mode=dark] .mb-auto,html[data-netbox-color-mode=light] .mb-auto{margin-bottom:auto!important}}@media print{html .ms-0,html[data-netbox-color-mode=dark] .ms-0,html[data-netbox-color-mode=light] .ms-0{margin-left:0!important}}@media print{html .ms-1,html[data-netbox-color-mode=dark] .ms-1,html[data-netbox-color-mode=light] .ms-1{margin-left:.25rem!important}}@media print{html .ms-2,html[data-netbox-color-mode=dark] .ms-2,html[data-netbox-color-mode=light] .ms-2{margin-left:.5rem!important}}@media print{html .ms-3,html[data-netbox-color-mode=dark] .ms-3,html[data-netbox-color-mode=light] .ms-3{margin-left:1rem!important}}@media print{html .ms-4,html[data-netbox-color-mode=dark] .ms-4,html[data-netbox-color-mode=light] .ms-4{margin-left:1.5rem!important}}@media print{html .ms-5,html[data-netbox-color-mode=dark] .ms-5,html[data-netbox-color-mode=light] .ms-5{margin-left:3rem!important}}@media print{html .ms-auto,html[data-netbox-color-mode=dark] .ms-auto,html[data-netbox-color-mode=light] .ms-auto{margin-left:auto!important}}@media print{html .p-0,html[data-netbox-color-mode=dark] .p-0,html[data-netbox-color-mode=light] .p-0{padding:0!important}}@media print{html .p-1,html[data-netbox-color-mode=dark] .p-1,html[data-netbox-color-mode=light] .p-1{padding:.25rem!important}}@media print{html .p-2,html[data-netbox-color-mode=dark] .p-2,html[data-netbox-color-mode=light] .p-2{padding:.5rem!important}}@media print{html .p-3,html[data-netbox-color-mode=dark] .p-3,html[data-netbox-color-mode=light] .p-3{padding:1rem!important}}@media print{html .p-4,html[data-netbox-color-mode=dark] .p-4,html[data-netbox-color-mode=light] .p-4{padding:1.5rem!important}}@media print{html .p-5,html[data-netbox-color-mode=dark] .p-5,html[data-netbox-color-mode=light] .p-5{padding:3rem!important}}@media print{html .px-0,html[data-netbox-color-mode=dark] .px-0,html[data-netbox-color-mode=light] .px-0{padding-right:0!important;padding-left:0!important}}@media print{html .px-1,html[data-netbox-color-mode=dark] .px-1,html[data-netbox-color-mode=light] .px-1{padding-right:.25rem!important;padding-left:.25rem!important}}@media print{html .px-2,html[data-netbox-color-mode=dark] .px-2,html[data-netbox-color-mode=light] .px-2{padding-right:.5rem!important;padding-left:.5rem!important}}@media print{html .px-3,html[data-netbox-color-mode=dark] .px-3,html[data-netbox-color-mode=light] .px-3{padding-right:1rem!important;padding-left:1rem!important}}@media print{html .px-4,html[data-netbox-color-mode=dark] .px-4,html[data-netbox-color-mode=light] .px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}}@media print{html .px-5,html[data-netbox-color-mode=dark] .px-5,html[data-netbox-color-mode=light] .px-5{padding-right:3rem!important;padding-left:3rem!important}}@media print{html .py-0,html[data-netbox-color-mode=dark] .py-0,html[data-netbox-color-mode=light] .py-0{padding-top:0!important;padding-bottom:0!important}}@media print{html .py-1,html[data-netbox-color-mode=dark] .py-1,html[data-netbox-color-mode=light] .py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}}@media print{html .py-2,html[data-netbox-color-mode=dark] .py-2,html[data-netbox-color-mode=light] .py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}}@media print{html .py-3,html[data-netbox-color-mode=dark] .py-3,html[data-netbox-color-mode=light] .py-3{padding-top:1rem!important;padding-bottom:1rem!important}}@media print{html .py-4,html[data-netbox-color-mode=dark] .py-4,html[data-netbox-color-mode=light] .py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}}@media print{html .py-5,html[data-netbox-color-mode=dark] .py-5,html[data-netbox-color-mode=light] .py-5{padding-top:3rem!important;padding-bottom:3rem!important}}@media print{html .pt-0,html[data-netbox-color-mode=dark] .pt-0,html[data-netbox-color-mode=light] .pt-0{padding-top:0!important}}@media print{html .pt-1,html[data-netbox-color-mode=dark] .pt-1,html[data-netbox-color-mode=light] .pt-1{padding-top:.25rem!important}}@media print{html .pt-2,html[data-netbox-color-mode=dark] .pt-2,html[data-netbox-color-mode=light] .pt-2{padding-top:.5rem!important}}@media print{html .pt-3,html[data-netbox-color-mode=dark] .pt-3,html[data-netbox-color-mode=light] .pt-3{padding-top:1rem!important}}@media print{html .pt-4,html[data-netbox-color-mode=dark] .pt-4,html[data-netbox-color-mode=light] .pt-4{padding-top:1.5rem!important}}@media print{html .pt-5,html[data-netbox-color-mode=dark] .pt-5,html[data-netbox-color-mode=light] .pt-5{padding-top:3rem!important}}@media print{html .pe-0,html[data-netbox-color-mode=dark] .pe-0,html[data-netbox-color-mode=light] .pe-0{padding-right:0!important}}@media print{html .pe-1,html[data-netbox-color-mode=dark] .pe-1,html[data-netbox-color-mode=light] .pe-1{padding-right:.25rem!important}}@media print{html .pe-2,html[data-netbox-color-mode=dark] .pe-2,html[data-netbox-color-mode=light] .pe-2{padding-right:.5rem!important}}@media print{html .pe-3,html[data-netbox-color-mode=dark] .pe-3,html[data-netbox-color-mode=light] .pe-3{padding-right:1rem!important}}@media print{html .pe-4,html[data-netbox-color-mode=dark] .pe-4,html[data-netbox-color-mode=light] .pe-4{padding-right:1.5rem!important}}@media print{html .pe-5,html[data-netbox-color-mode=dark] .pe-5,html[data-netbox-color-mode=light] .pe-5{padding-right:3rem!important}}@media print{html .pb-0,html[data-netbox-color-mode=dark] .pb-0,html[data-netbox-color-mode=light] .pb-0{padding-bottom:0!important}}@media print{html .pb-1,html[data-netbox-color-mode=dark] .pb-1,html[data-netbox-color-mode=light] .pb-1{padding-bottom:.25rem!important}}@media print{html .pb-2,html[data-netbox-color-mode=dark] .pb-2,html[data-netbox-color-mode=light] .pb-2{padding-bottom:.5rem!important}}@media print{html .pb-3,html[data-netbox-color-mode=dark] .pb-3,html[data-netbox-color-mode=light] .pb-3{padding-bottom:1rem!important}}@media print{html .pb-4,html[data-netbox-color-mode=dark] .pb-4,html[data-netbox-color-mode=light] .pb-4{padding-bottom:1.5rem!important}}@media print{html .pb-5,html[data-netbox-color-mode=dark] .pb-5,html[data-netbox-color-mode=light] .pb-5{padding-bottom:3rem!important}}@media print{html .ps-0,html[data-netbox-color-mode=dark] .ps-0,html[data-netbox-color-mode=light] .ps-0{padding-left:0!important}}@media print{html .ps-1,html[data-netbox-color-mode=dark] .ps-1,html[data-netbox-color-mode=light] .ps-1{padding-left:.25rem!important}}@media print{html .ps-2,html[data-netbox-color-mode=dark] .ps-2,html[data-netbox-color-mode=light] .ps-2{padding-left:.5rem!important}}@media print{html .ps-3,html[data-netbox-color-mode=dark] .ps-3,html[data-netbox-color-mode=light] .ps-3{padding-left:1rem!important}}@media print{html .ps-4,html[data-netbox-color-mode=dark] .ps-4,html[data-netbox-color-mode=light] .ps-4{padding-left:1.5rem!important}}@media print{html .ps-5,html[data-netbox-color-mode=dark] .ps-5,html[data-netbox-color-mode=light] .ps-5{padding-left:3rem!important}}@media print{html .font-monospace,html[data-netbox-color-mode=dark] .font-monospace,html[data-netbox-color-mode=light] .font-monospace{font-family:var(--bs-font-monospace)!important}}@media print{html .fs-1,html[data-netbox-color-mode=dark] .fs-1,html[data-netbox-color-mode=light] .fs-1{font-size:calc(1.375rem + 1.5vw)!important}}@media print{html .fs-2,html[data-netbox-color-mode=dark] .fs-2,html[data-netbox-color-mode=light] .fs-2{font-size:calc(1.325rem + .9vw)!important}}@media print{html .fs-3,html[data-netbox-color-mode=dark] .fs-3,html[data-netbox-color-mode=light] .fs-3{font-size:calc(1.3rem + .6vw)!important}}@media print{html .fs-4,html[data-netbox-color-mode=dark] .fs-4,html[data-netbox-color-mode=light] .fs-4{font-size:calc(1.275rem + .3vw)!important}}@media print{html .fs-5,html[data-netbox-color-mode=dark] .fs-5,html[data-netbox-color-mode=light] .fs-5{font-size:1.25rem!important}}@media print{html .fs-6,html[data-netbox-color-mode=dark] .fs-6,html[data-netbox-color-mode=light] .fs-6{font-size:1rem!important}}@media print{html .fst-italic,html[data-netbox-color-mode=dark] .fst-italic,html[data-netbox-color-mode=light] .fst-italic{font-style:italic!important}}@media print{html .fst-normal,html[data-netbox-color-mode=dark] .fst-normal,html[data-netbox-color-mode=light] .fst-normal{font-style:normal!important}}@media print{html .fw-light,html[data-netbox-color-mode=dark] .fw-light,html[data-netbox-color-mode=light] .fw-light{font-weight:300!important}}@media print{html .fw-lighter,html[data-netbox-color-mode=dark] .fw-lighter,html[data-netbox-color-mode=light] .fw-lighter{font-weight:200!important}}@media print{html .fw-normal,html[data-netbox-color-mode=dark] .fw-normal,html[data-netbox-color-mode=light] .fw-normal{font-weight:400!important}}@media print{html .fw-bold,html[data-netbox-color-mode=dark] .fw-bold,html[data-netbox-color-mode=light] .fw-bold{font-weight:700!important}}@media print{html .fw-bolder,html[data-netbox-color-mode=dark] .fw-bolder,html[data-netbox-color-mode=light] .fw-bolder{font-weight:800!important}}@media print{html .lh-1,html[data-netbox-color-mode=dark] .lh-1,html[data-netbox-color-mode=light] .lh-1{line-height:1!important}}@media print{html .lh-sm,html[data-netbox-color-mode=dark] .lh-sm,html[data-netbox-color-mode=light] .lh-sm{line-height:1.25!important}}@media print{html .lh-base,html[data-netbox-color-mode=dark] .lh-base,html[data-netbox-color-mode=light] .lh-base{line-height:1.5!important}}@media print{html .lh-lg,html[data-netbox-color-mode=dark] .lh-lg,html[data-netbox-color-mode=light] .lh-lg{line-height:1.75!important}}@media print{html .text-start,html[data-netbox-color-mode=dark] .text-start,html[data-netbox-color-mode=light] .text-start{text-align:left!important}}@media print{html .text-end,html[data-netbox-color-mode=dark] .text-end,html[data-netbox-color-mode=light] .text-end{text-align:right!important}}@media print{html .text-center,html[data-netbox-color-mode=dark] .text-center,html[data-netbox-color-mode=light] .text-center{text-align:center!important}}@media print{html .text-decoration-none,html[data-netbox-color-mode=dark] .text-decoration-none,html[data-netbox-color-mode=light] .text-decoration-none{text-decoration:none!important}}@media print{html .text-decoration-underline,html[data-netbox-color-mode=dark] .text-decoration-underline,html[data-netbox-color-mode=light] .text-decoration-underline{text-decoration:underline!important}}@media print{html .text-decoration-line-through,html[data-netbox-color-mode=dark] .text-decoration-line-through,html[data-netbox-color-mode=light] .text-decoration-line-through{text-decoration:line-through!important}}@media print{html .text-lowercase,html[data-netbox-color-mode=dark] .text-lowercase,html[data-netbox-color-mode=light] .text-lowercase{text-transform:lowercase!important}}@media print{html .text-uppercase,html[data-netbox-color-mode=dark] .text-uppercase,html[data-netbox-color-mode=light] .text-uppercase{text-transform:uppercase!important}}@media print{html .text-capitalize,html[data-netbox-color-mode=dark] .text-capitalize,html[data-netbox-color-mode=light] .text-capitalize{text-transform:capitalize!important}}@media print{html .text-wrap,html[data-netbox-color-mode=dark] .text-wrap,html[data-netbox-color-mode=light] .text-wrap{white-space:normal!important}}@media print{html .text-nowrap,html[data-netbox-color-mode=dark] .text-nowrap,html[data-netbox-color-mode=light] .text-nowrap{white-space:nowrap!important}}@media print{html .text-break,html[data-netbox-color-mode=dark] .text-break,html[data-netbox-color-mode=light] .text-break{word-wrap:break-word!important;word-break:break-word!important}}@media print{html .text-primary,html[data-netbox-color-mode=dark] .text-primary,html[data-netbox-color-mode=light] .text-primary{color:#337ab7!important}}@media print{html .text-secondary,html[data-netbox-color-mode=dark] .text-secondary,html[data-netbox-color-mode=light] .text-secondary{color:#6c757d!important}}@media print{html .text-success,html[data-netbox-color-mode=dark] .text-success,html[data-netbox-color-mode=light] .text-success{color:#198754!important}}@media print{html .text-info,html[data-netbox-color-mode=dark] .text-info,html[data-netbox-color-mode=light] .text-info{color:#54d6f0!important}}@media print{html .text-warning,html[data-netbox-color-mode=dark] .text-warning,html[data-netbox-color-mode=light] .text-warning{color:#ffc107!important}}@media print{html .text-danger,html[data-netbox-color-mode=dark] .text-danger,html[data-netbox-color-mode=light] .text-danger{color:#dc3545!important}}@media print{html .text-light,html[data-netbox-color-mode=dark] .text-light,html[data-netbox-color-mode=light] .text-light{color:#f8f9fa!important}}@media print{html .text-dark,html[data-netbox-color-mode=dark] .text-dark,html[data-netbox-color-mode=light] .text-dark{color:#212529!important}}@media print{html .text-red,html[data-netbox-color-mode=dark] .text-red,html[data-netbox-color-mode=light] .text-red{color:#dc3545!important}}@media print{html .text-yellow,html[data-netbox-color-mode=dark] .text-yellow,html[data-netbox-color-mode=light] .text-yellow{color:#ffc107!important}}@media print{html .text-green,html[data-netbox-color-mode=dark] .text-green,html[data-netbox-color-mode=light] .text-green{color:#198754!important}}@media print{html .text-blue,html[data-netbox-color-mode=dark] .text-blue,html[data-netbox-color-mode=light] .text-blue{color:#0d6efd!important}}@media print{html .text-cyan,html[data-netbox-color-mode=dark] .text-cyan,html[data-netbox-color-mode=light] .text-cyan{color:#0dcaf0!important}}@media print{html .text-indigo,html[data-netbox-color-mode=dark] .text-indigo,html[data-netbox-color-mode=light] .text-indigo{color:#6610f2!important}}@media print{html .text-purple,html[data-netbox-color-mode=dark] .text-purple,html[data-netbox-color-mode=light] .text-purple{color:#6f42c1!important}}@media print{html .text-pink,html[data-netbox-color-mode=dark] .text-pink,html[data-netbox-color-mode=light] .text-pink{color:#d63384!important}}@media print{html .text-darker,html[data-netbox-color-mode=dark] .text-darker,html[data-netbox-color-mode=light] .text-darker{color:#1b1f22!important}}@media print{html .text-darkest,html[data-netbox-color-mode=dark] .text-darkest,html[data-netbox-color-mode=light] .text-darkest{color:#171b1d!important}}@media print{html .text-gray,html[data-netbox-color-mode=dark] .text-gray,html[data-netbox-color-mode=light] .text-gray{color:#ced4da!important}}@media print{html .text-gray-100,html[data-netbox-color-mode=dark] .text-gray-100,html[data-netbox-color-mode=light] .text-gray-100{color:#f8f9fa!important}}@media print{html .text-gray-200,html[data-netbox-color-mode=dark] .text-gray-200,html[data-netbox-color-mode=light] .text-gray-200{color:#e9ecef!important}}@media print{html .text-gray-300,html[data-netbox-color-mode=dark] .text-gray-300,html[data-netbox-color-mode=light] .text-gray-300{color:#dee2e6!important}}@media print{html .text-gray-400,html[data-netbox-color-mode=dark] .text-gray-400,html[data-netbox-color-mode=light] .text-gray-400{color:#ced4da!important}}@media print{html .text-gray-500,html[data-netbox-color-mode=dark] .text-gray-500,html[data-netbox-color-mode=light] .text-gray-500{color:#adb5bd!important}}@media print{html .text-gray-600,html[data-netbox-color-mode=dark] .text-gray-600,html[data-netbox-color-mode=light] .text-gray-600{color:#6c757d!important}}@media print{html .text-gray-700,html[data-netbox-color-mode=dark] .text-gray-700,html[data-netbox-color-mode=light] .text-gray-700{color:#495057!important}}@media print{html .text-gray-800,html[data-netbox-color-mode=dark] .text-gray-800,html[data-netbox-color-mode=light] .text-gray-800{color:#343a40!important}}@media print{html .text-gray-900,html[data-netbox-color-mode=dark] .text-gray-900,html[data-netbox-color-mode=light] .text-gray-900{color:#212529!important}}@media print{html .text-red-100,html[data-netbox-color-mode=dark] .text-red-100,html[data-netbox-color-mode=light] .text-red-100{color:#f8d7da!important}}@media print{html .text-red-200,html[data-netbox-color-mode=dark] .text-red-200,html[data-netbox-color-mode=light] .text-red-200{color:#f1aeb5!important}}@media print{html .text-red-300,html[data-netbox-color-mode=dark] .text-red-300,html[data-netbox-color-mode=light] .text-red-300{color:#ea868f!important}}@media print{html .text-red-400,html[data-netbox-color-mode=dark] .text-red-400,html[data-netbox-color-mode=light] .text-red-400{color:#e35d6a!important}}@media print{html .text-red-500,html[data-netbox-color-mode=dark] .text-red-500,html[data-netbox-color-mode=light] .text-red-500{color:#dc3545!important}}@media print{html .text-red-600,html[data-netbox-color-mode=dark] .text-red-600,html[data-netbox-color-mode=light] .text-red-600{color:#b02a37!important}}@media print{html .text-red-700,html[data-netbox-color-mode=dark] .text-red-700,html[data-netbox-color-mode=light] .text-red-700{color:#842029!important}}@media print{html .text-red-800,html[data-netbox-color-mode=dark] .text-red-800,html[data-netbox-color-mode=light] .text-red-800{color:#58151c!important}}@media print{html .text-red-900,html[data-netbox-color-mode=dark] .text-red-900,html[data-netbox-color-mode=light] .text-red-900{color:#2c0b0e!important}}@media print{html .text-yellow-100,html[data-netbox-color-mode=dark] .text-yellow-100,html[data-netbox-color-mode=light] .text-yellow-100{color:#fff3cd!important}}@media print{html .text-yellow-200,html[data-netbox-color-mode=dark] .text-yellow-200,html[data-netbox-color-mode=light] .text-yellow-200{color:#ffe69c!important}}@media print{html .text-yellow-300,html[data-netbox-color-mode=dark] .text-yellow-300,html[data-netbox-color-mode=light] .text-yellow-300{color:#ffda6a!important}}@media print{html .text-yellow-400,html[data-netbox-color-mode=dark] .text-yellow-400,html[data-netbox-color-mode=light] .text-yellow-400{color:#ffcd39!important}}@media print{html .text-yellow-500,html[data-netbox-color-mode=dark] .text-yellow-500,html[data-netbox-color-mode=light] .text-yellow-500{color:#ffc107!important}}@media print{html .text-yellow-600,html[data-netbox-color-mode=dark] .text-yellow-600,html[data-netbox-color-mode=light] .text-yellow-600{color:#cc9a06!important}}@media print{html .text-yellow-700,html[data-netbox-color-mode=dark] .text-yellow-700,html[data-netbox-color-mode=light] .text-yellow-700{color:#997404!important}}@media print{html .text-yellow-800,html[data-netbox-color-mode=dark] .text-yellow-800,html[data-netbox-color-mode=light] .text-yellow-800{color:#664d03!important}}@media print{html .text-yellow-900,html[data-netbox-color-mode=dark] .text-yellow-900,html[data-netbox-color-mode=light] .text-yellow-900{color:#332701!important}}@media print{html .text-green-100,html[data-netbox-color-mode=dark] .text-green-100,html[data-netbox-color-mode=light] .text-green-100{color:#d1e7dd!important}}@media print{html .text-green-200,html[data-netbox-color-mode=dark] .text-green-200,html[data-netbox-color-mode=light] .text-green-200{color:#a3cfbb!important}}@media print{html .text-green-300,html[data-netbox-color-mode=dark] .text-green-300,html[data-netbox-color-mode=light] .text-green-300{color:#75b798!important}}@media print{html .text-green-400,html[data-netbox-color-mode=dark] .text-green-400,html[data-netbox-color-mode=light] .text-green-400{color:#479f76!important}}@media print{html .text-green-500,html[data-netbox-color-mode=dark] .text-green-500,html[data-netbox-color-mode=light] .text-green-500{color:#198754!important}}@media print{html .text-green-600,html[data-netbox-color-mode=dark] .text-green-600,html[data-netbox-color-mode=light] .text-green-600{color:#146c43!important}}@media print{html .text-green-700,html[data-netbox-color-mode=dark] .text-green-700,html[data-netbox-color-mode=light] .text-green-700{color:#0f5132!important}}@media print{html .text-green-800,html[data-netbox-color-mode=dark] .text-green-800,html[data-netbox-color-mode=light] .text-green-800{color:#0a3622!important}}@media print{html .text-green-900,html[data-netbox-color-mode=dark] .text-green-900,html[data-netbox-color-mode=light] .text-green-900{color:#051b11!important}}@media print{html .text-blue-100,html[data-netbox-color-mode=dark] .text-blue-100,html[data-netbox-color-mode=light] .text-blue-100{color:#cfe2ff!important}}@media print{html .text-blue-200,html[data-netbox-color-mode=dark] .text-blue-200,html[data-netbox-color-mode=light] .text-blue-200{color:#9ec5fe!important}}@media print{html .text-blue-300,html[data-netbox-color-mode=dark] .text-blue-300,html[data-netbox-color-mode=light] .text-blue-300{color:#6ea8fe!important}}@media print{html .text-blue-400,html[data-netbox-color-mode=dark] .text-blue-400,html[data-netbox-color-mode=light] .text-blue-400{color:#3d8bfd!important}}@media print{html .text-blue-500,html[data-netbox-color-mode=dark] .text-blue-500,html[data-netbox-color-mode=light] .text-blue-500{color:#0d6efd!important}}@media print{html .text-blue-600,html[data-netbox-color-mode=dark] .text-blue-600,html[data-netbox-color-mode=light] .text-blue-600{color:#0a58ca!important}}@media print{html .text-blue-700,html[data-netbox-color-mode=dark] .text-blue-700,html[data-netbox-color-mode=light] .text-blue-700{color:#084298!important}}@media print{html .text-blue-800,html[data-netbox-color-mode=dark] .text-blue-800,html[data-netbox-color-mode=light] .text-blue-800{color:#052c65!important}}@media print{html .text-blue-900,html[data-netbox-color-mode=dark] .text-blue-900,html[data-netbox-color-mode=light] .text-blue-900{color:#031633!important}}@media print{html .text-cyan-100,html[data-netbox-color-mode=dark] .text-cyan-100,html[data-netbox-color-mode=light] .text-cyan-100{color:#cff4fc!important}}@media print{html .text-cyan-200,html[data-netbox-color-mode=dark] .text-cyan-200,html[data-netbox-color-mode=light] .text-cyan-200{color:#9eeaf9!important}}@media print{html .text-cyan-300,html[data-netbox-color-mode=dark] .text-cyan-300,html[data-netbox-color-mode=light] .text-cyan-300{color:#6edff6!important}}@media print{html .text-cyan-400,html[data-netbox-color-mode=dark] .text-cyan-400,html[data-netbox-color-mode=light] .text-cyan-400{color:#3dd5f3!important}}@media print{html .text-cyan-500,html[data-netbox-color-mode=dark] .text-cyan-500,html[data-netbox-color-mode=light] .text-cyan-500{color:#0dcaf0!important}}@media print{html .text-cyan-600,html[data-netbox-color-mode=dark] .text-cyan-600,html[data-netbox-color-mode=light] .text-cyan-600{color:#0aa2c0!important}}@media print{html .text-cyan-700,html[data-netbox-color-mode=dark] .text-cyan-700,html[data-netbox-color-mode=light] .text-cyan-700{color:#087990!important}}@media print{html .text-cyan-800,html[data-netbox-color-mode=dark] .text-cyan-800,html[data-netbox-color-mode=light] .text-cyan-800{color:#055160!important}}@media print{html .text-cyan-900,html[data-netbox-color-mode=dark] .text-cyan-900,html[data-netbox-color-mode=light] .text-cyan-900{color:#032830!important}}@media print{html .text-indigo-100,html[data-netbox-color-mode=dark] .text-indigo-100,html[data-netbox-color-mode=light] .text-indigo-100{color:#e0cffc!important}}@media print{html .text-indigo-200,html[data-netbox-color-mode=dark] .text-indigo-200,html[data-netbox-color-mode=light] .text-indigo-200{color:#c29ffa!important}}@media print{html .text-indigo-300,html[data-netbox-color-mode=dark] .text-indigo-300,html[data-netbox-color-mode=light] .text-indigo-300{color:#a370f7!important}}@media print{html .text-indigo-400,html[data-netbox-color-mode=dark] .text-indigo-400,html[data-netbox-color-mode=light] .text-indigo-400{color:#8540f5!important}}@media print{html .text-indigo-500,html[data-netbox-color-mode=dark] .text-indigo-500,html[data-netbox-color-mode=light] .text-indigo-500{color:#6610f2!important}}@media print{html .text-indigo-600,html[data-netbox-color-mode=dark] .text-indigo-600,html[data-netbox-color-mode=light] .text-indigo-600{color:#520dc2!important}}@media print{html .text-indigo-700,html[data-netbox-color-mode=dark] .text-indigo-700,html[data-netbox-color-mode=light] .text-indigo-700{color:#3d0a91!important}}@media print{html .text-indigo-800,html[data-netbox-color-mode=dark] .text-indigo-800,html[data-netbox-color-mode=light] .text-indigo-800{color:#290661!important}}@media print{html .text-indigo-900,html[data-netbox-color-mode=dark] .text-indigo-900,html[data-netbox-color-mode=light] .text-indigo-900{color:#140330!important}}@media print{html .text-purple-100,html[data-netbox-color-mode=dark] .text-purple-100,html[data-netbox-color-mode=light] .text-purple-100{color:#e2d9f3!important}}@media print{html .text-purple-200,html[data-netbox-color-mode=dark] .text-purple-200,html[data-netbox-color-mode=light] .text-purple-200{color:#c5b3e6!important}}@media print{html .text-purple-300,html[data-netbox-color-mode=dark] .text-purple-300,html[data-netbox-color-mode=light] .text-purple-300{color:#a98eda!important}}@media print{html .text-purple-400,html[data-netbox-color-mode=dark] .text-purple-400,html[data-netbox-color-mode=light] .text-purple-400{color:#8c68cd!important}}@media print{html .text-purple-500,html[data-netbox-color-mode=dark] .text-purple-500,html[data-netbox-color-mode=light] .text-purple-500{color:#6f42c1!important}}@media print{html .text-purple-600,html[data-netbox-color-mode=dark] .text-purple-600,html[data-netbox-color-mode=light] .text-purple-600{color:#59359a!important}}@media print{html .text-purple-700,html[data-netbox-color-mode=dark] .text-purple-700,html[data-netbox-color-mode=light] .text-purple-700{color:#432874!important}}@media print{html .text-purple-800,html[data-netbox-color-mode=dark] .text-purple-800,html[data-netbox-color-mode=light] .text-purple-800{color:#2c1a4d!important}}@media print{html .text-purple-900,html[data-netbox-color-mode=dark] .text-purple-900,html[data-netbox-color-mode=light] .text-purple-900{color:#160d27!important}}@media print{html .text-pink-100,html[data-netbox-color-mode=dark] .text-pink-100,html[data-netbox-color-mode=light] .text-pink-100{color:#f7d6e6!important}}@media print{html .text-pink-200,html[data-netbox-color-mode=dark] .text-pink-200,html[data-netbox-color-mode=light] .text-pink-200{color:#efadce!important}}@media print{html .text-pink-300,html[data-netbox-color-mode=dark] .text-pink-300,html[data-netbox-color-mode=light] .text-pink-300{color:#e685b5!important}}@media print{html .text-pink-400,html[data-netbox-color-mode=dark] .text-pink-400,html[data-netbox-color-mode=light] .text-pink-400{color:#de5c9d!important}}@media print{html .text-pink-500,html[data-netbox-color-mode=dark] .text-pink-500,html[data-netbox-color-mode=light] .text-pink-500{color:#d63384!important}}@media print{html .text-pink-600,html[data-netbox-color-mode=dark] .text-pink-600,html[data-netbox-color-mode=light] .text-pink-600{color:#ab296a!important}}@media print{html .text-pink-700,html[data-netbox-color-mode=dark] .text-pink-700,html[data-netbox-color-mode=light] .text-pink-700{color:#801f4f!important}}@media print{html .text-pink-800,html[data-netbox-color-mode=dark] .text-pink-800,html[data-netbox-color-mode=light] .text-pink-800{color:#561435!important}}@media print{html .text-pink-900,html[data-netbox-color-mode=dark] .text-pink-900,html[data-netbox-color-mode=light] .text-pink-900{color:#2b0a1a!important}}@media print{html .text-white,html[data-netbox-color-mode=dark] .text-white,html[data-netbox-color-mode=light] .text-white{color:#fff!important}}@media print{html .text-body,html[data-netbox-color-mode=dark] .text-body,html[data-netbox-color-mode=light] .text-body{color:#212529!important}}@media print{html .text-muted,html[data-netbox-color-mode=dark] .text-muted,html[data-netbox-color-mode=light] .text-muted{color:#6c757d!important}}@media print{html .text-black-50,html[data-netbox-color-mode=dark] .text-black-50,html[data-netbox-color-mode=light] .text-black-50{color:#00000080!important}}@media print{html .text-white-50,html[data-netbox-color-mode=dark] .text-white-50,html[data-netbox-color-mode=light] .text-white-50{color:#ffffff80!important}}@media print{html .text-reset,html[data-netbox-color-mode=dark] .text-reset,html[data-netbox-color-mode=light] .text-reset{color:inherit!important}}@media print{html .bg-primary,html[data-netbox-color-mode=dark] .bg-primary,html[data-netbox-color-mode=light] .bg-primary{background-color:#337ab7!important}}@media print{html .bg-secondary,html[data-netbox-color-mode=dark] .bg-secondary,html[data-netbox-color-mode=light] .bg-secondary{background-color:#6c757d!important}}@media print{html .bg-success,html[data-netbox-color-mode=dark] .bg-success,html[data-netbox-color-mode=light] .bg-success{background-color:#198754!important}}@media print{html .bg-info,html[data-netbox-color-mode=dark] .bg-info,html[data-netbox-color-mode=light] .bg-info{background-color:#54d6f0!important}}@media print{html .bg-warning,html[data-netbox-color-mode=dark] .bg-warning,html[data-netbox-color-mode=light] .bg-warning{background-color:#ffc107!important}}@media print{html .bg-danger,html[data-netbox-color-mode=dark] .bg-danger,html[data-netbox-color-mode=light] .bg-danger{background-color:#dc3545!important}}@media print{html .bg-light,html[data-netbox-color-mode=dark] .bg-light,html[data-netbox-color-mode=light] .bg-light{background-color:#f8f9fa!important}}@media print{html .bg-dark,html[data-netbox-color-mode=dark] .bg-dark,html[data-netbox-color-mode=light] .bg-dark{background-color:#212529!important}}@media print{html .bg-red,html[data-netbox-color-mode=dark] .bg-red,html[data-netbox-color-mode=light] .bg-red{background-color:#dc3545!important}}@media print{html .bg-yellow,html[data-netbox-color-mode=dark] .bg-yellow,html[data-netbox-color-mode=light] .bg-yellow{background-color:#ffc107!important}}@media print{html .bg-green,html[data-netbox-color-mode=dark] .bg-green,html[data-netbox-color-mode=light] .bg-green{background-color:#198754!important}}@media print{html .bg-blue,html[data-netbox-color-mode=dark] .bg-blue,html[data-netbox-color-mode=light] .bg-blue{background-color:#0d6efd!important}}@media print{html .bg-cyan,html[data-netbox-color-mode=dark] .bg-cyan,html[data-netbox-color-mode=light] .bg-cyan{background-color:#0dcaf0!important}}@media print{html .bg-indigo,html[data-netbox-color-mode=dark] .bg-indigo,html[data-netbox-color-mode=light] .bg-indigo{background-color:#6610f2!important}}@media print{html .bg-purple,html[data-netbox-color-mode=dark] .bg-purple,html[data-netbox-color-mode=light] .bg-purple{background-color:#6f42c1!important}}@media print{html .bg-pink,html[data-netbox-color-mode=dark] .bg-pink,html[data-netbox-color-mode=light] .bg-pink{background-color:#d63384!important}}@media print{html .bg-darker,html[data-netbox-color-mode=dark] .bg-darker,html[data-netbox-color-mode=light] .bg-darker{background-color:#1b1f22!important}}@media print{html .bg-darkest,html[data-netbox-color-mode=dark] .bg-darkest,html[data-netbox-color-mode=light] .bg-darkest{background-color:#171b1d!important}}@media print{html .bg-gray,html[data-netbox-color-mode=dark] .bg-gray,html[data-netbox-color-mode=light] .bg-gray{background-color:#ced4da!important}}@media print{html .bg-gray-100,html[data-netbox-color-mode=dark] .bg-gray-100,html[data-netbox-color-mode=light] .bg-gray-100{background-color:#f8f9fa!important}}@media print{html .bg-gray-200,html[data-netbox-color-mode=dark] .bg-gray-200,html[data-netbox-color-mode=light] .bg-gray-200{background-color:#e9ecef!important}}@media print{html .bg-gray-300,html[data-netbox-color-mode=dark] .bg-gray-300,html[data-netbox-color-mode=light] .bg-gray-300{background-color:#dee2e6!important}}@media print{html .bg-gray-400,html[data-netbox-color-mode=dark] .bg-gray-400,html[data-netbox-color-mode=light] .bg-gray-400{background-color:#ced4da!important}}@media print{html .bg-gray-500,html[data-netbox-color-mode=dark] .bg-gray-500,html[data-netbox-color-mode=light] .bg-gray-500{background-color:#adb5bd!important}}@media print{html .bg-gray-600,html[data-netbox-color-mode=dark] .bg-gray-600,html[data-netbox-color-mode=light] .bg-gray-600{background-color:#6c757d!important}}@media print{html .bg-gray-700,html[data-netbox-color-mode=dark] .bg-gray-700,html[data-netbox-color-mode=light] .bg-gray-700{background-color:#495057!important}}@media print{html .bg-gray-800,html[data-netbox-color-mode=dark] .bg-gray-800,html[data-netbox-color-mode=light] .bg-gray-800{background-color:#343a40!important}}@media print{html .bg-gray-900,html[data-netbox-color-mode=dark] .bg-gray-900,html[data-netbox-color-mode=light] .bg-gray-900{background-color:#212529!important}}@media print{html .bg-red-100,html[data-netbox-color-mode=dark] .bg-red-100,html[data-netbox-color-mode=light] .bg-red-100{background-color:#f8d7da!important}}@media print{html .bg-red-200,html[data-netbox-color-mode=dark] .bg-red-200,html[data-netbox-color-mode=light] .bg-red-200{background-color:#f1aeb5!important}}@media print{html .bg-red-300,html[data-netbox-color-mode=dark] .bg-red-300,html[data-netbox-color-mode=light] .bg-red-300{background-color:#ea868f!important}}@media print{html .bg-red-400,html[data-netbox-color-mode=dark] .bg-red-400,html[data-netbox-color-mode=light] .bg-red-400{background-color:#e35d6a!important}}@media print{html .bg-red-500,html[data-netbox-color-mode=dark] .bg-red-500,html[data-netbox-color-mode=light] .bg-red-500{background-color:#dc3545!important}}@media print{html .bg-red-600,html[data-netbox-color-mode=dark] .bg-red-600,html[data-netbox-color-mode=light] .bg-red-600{background-color:#b02a37!important}}@media print{html .bg-red-700,html[data-netbox-color-mode=dark] .bg-red-700,html[data-netbox-color-mode=light] .bg-red-700{background-color:#842029!important}}@media print{html .bg-red-800,html[data-netbox-color-mode=dark] .bg-red-800,html[data-netbox-color-mode=light] .bg-red-800{background-color:#58151c!important}}@media print{html .bg-red-900,html[data-netbox-color-mode=dark] .bg-red-900,html[data-netbox-color-mode=light] .bg-red-900{background-color:#2c0b0e!important}}@media print{html .bg-yellow-100,html[data-netbox-color-mode=dark] .bg-yellow-100,html[data-netbox-color-mode=light] .bg-yellow-100{background-color:#fff3cd!important}}@media print{html .bg-yellow-200,html[data-netbox-color-mode=dark] .bg-yellow-200,html[data-netbox-color-mode=light] .bg-yellow-200{background-color:#ffe69c!important}}@media print{html .bg-yellow-300,html[data-netbox-color-mode=dark] .bg-yellow-300,html[data-netbox-color-mode=light] .bg-yellow-300{background-color:#ffda6a!important}}@media print{html .bg-yellow-400,html[data-netbox-color-mode=dark] .bg-yellow-400,html[data-netbox-color-mode=light] .bg-yellow-400{background-color:#ffcd39!important}}@media print{html .bg-yellow-500,html[data-netbox-color-mode=dark] .bg-yellow-500,html[data-netbox-color-mode=light] .bg-yellow-500{background-color:#ffc107!important}}@media print{html .bg-yellow-600,html[data-netbox-color-mode=dark] .bg-yellow-600,html[data-netbox-color-mode=light] .bg-yellow-600{background-color:#cc9a06!important}}@media print{html .bg-yellow-700,html[data-netbox-color-mode=dark] .bg-yellow-700,html[data-netbox-color-mode=light] .bg-yellow-700{background-color:#997404!important}}@media print{html .bg-yellow-800,html[data-netbox-color-mode=dark] .bg-yellow-800,html[data-netbox-color-mode=light] .bg-yellow-800{background-color:#664d03!important}}@media print{html .bg-yellow-900,html[data-netbox-color-mode=dark] .bg-yellow-900,html[data-netbox-color-mode=light] .bg-yellow-900{background-color:#332701!important}}@media print{html .bg-green-100,html[data-netbox-color-mode=dark] .bg-green-100,html[data-netbox-color-mode=light] .bg-green-100{background-color:#d1e7dd!important}}@media print{html .bg-green-200,html[data-netbox-color-mode=dark] .bg-green-200,html[data-netbox-color-mode=light] .bg-green-200{background-color:#a3cfbb!important}}@media print{html .bg-green-300,html[data-netbox-color-mode=dark] .bg-green-300,html[data-netbox-color-mode=light] .bg-green-300{background-color:#75b798!important}}@media print{html .bg-green-400,html[data-netbox-color-mode=dark] .bg-green-400,html[data-netbox-color-mode=light] .bg-green-400{background-color:#479f76!important}}@media print{html .bg-green-500,html[data-netbox-color-mode=dark] .bg-green-500,html[data-netbox-color-mode=light] .bg-green-500{background-color:#198754!important}}@media print{html .bg-green-600,html[data-netbox-color-mode=dark] .bg-green-600,html[data-netbox-color-mode=light] .bg-green-600{background-color:#146c43!important}}@media print{html .bg-green-700,html[data-netbox-color-mode=dark] .bg-green-700,html[data-netbox-color-mode=light] .bg-green-700{background-color:#0f5132!important}}@media print{html .bg-green-800,html[data-netbox-color-mode=dark] .bg-green-800,html[data-netbox-color-mode=light] .bg-green-800{background-color:#0a3622!important}}@media print{html .bg-green-900,html[data-netbox-color-mode=dark] .bg-green-900,html[data-netbox-color-mode=light] .bg-green-900{background-color:#051b11!important}}@media print{html .bg-blue-100,html[data-netbox-color-mode=dark] .bg-blue-100,html[data-netbox-color-mode=light] .bg-blue-100{background-color:#cfe2ff!important}}@media print{html .bg-blue-200,html[data-netbox-color-mode=dark] .bg-blue-200,html[data-netbox-color-mode=light] .bg-blue-200{background-color:#9ec5fe!important}}@media print{html .bg-blue-300,html[data-netbox-color-mode=dark] .bg-blue-300,html[data-netbox-color-mode=light] .bg-blue-300{background-color:#6ea8fe!important}}@media print{html .bg-blue-400,html[data-netbox-color-mode=dark] .bg-blue-400,html[data-netbox-color-mode=light] .bg-blue-400{background-color:#3d8bfd!important}}@media print{html .bg-blue-500,html[data-netbox-color-mode=dark] .bg-blue-500,html[data-netbox-color-mode=light] .bg-blue-500{background-color:#0d6efd!important}}@media print{html .bg-blue-600,html[data-netbox-color-mode=dark] .bg-blue-600,html[data-netbox-color-mode=light] .bg-blue-600{background-color:#0a58ca!important}}@media print{html .bg-blue-700,html[data-netbox-color-mode=dark] .bg-blue-700,html[data-netbox-color-mode=light] .bg-blue-700{background-color:#084298!important}}@media print{html .bg-blue-800,html[data-netbox-color-mode=dark] .bg-blue-800,html[data-netbox-color-mode=light] .bg-blue-800{background-color:#052c65!important}}@media print{html .bg-blue-900,html[data-netbox-color-mode=dark] .bg-blue-900,html[data-netbox-color-mode=light] .bg-blue-900{background-color:#031633!important}}@media print{html .bg-cyan-100,html[data-netbox-color-mode=dark] .bg-cyan-100,html[data-netbox-color-mode=light] .bg-cyan-100{background-color:#cff4fc!important}}@media print{html .bg-cyan-200,html[data-netbox-color-mode=dark] .bg-cyan-200,html[data-netbox-color-mode=light] .bg-cyan-200{background-color:#9eeaf9!important}}@media print{html .bg-cyan-300,html[data-netbox-color-mode=dark] .bg-cyan-300,html[data-netbox-color-mode=light] .bg-cyan-300{background-color:#6edff6!important}}@media print{html .bg-cyan-400,html[data-netbox-color-mode=dark] .bg-cyan-400,html[data-netbox-color-mode=light] .bg-cyan-400{background-color:#3dd5f3!important}}@media print{html .bg-cyan-500,html[data-netbox-color-mode=dark] .bg-cyan-500,html[data-netbox-color-mode=light] .bg-cyan-500{background-color:#0dcaf0!important}}@media print{html .bg-cyan-600,html[data-netbox-color-mode=dark] .bg-cyan-600,html[data-netbox-color-mode=light] .bg-cyan-600{background-color:#0aa2c0!important}}@media print{html .bg-cyan-700,html[data-netbox-color-mode=dark] .bg-cyan-700,html[data-netbox-color-mode=light] .bg-cyan-700{background-color:#087990!important}}@media print{html .bg-cyan-800,html[data-netbox-color-mode=dark] .bg-cyan-800,html[data-netbox-color-mode=light] .bg-cyan-800{background-color:#055160!important}}@media print{html .bg-cyan-900,html[data-netbox-color-mode=dark] .bg-cyan-900,html[data-netbox-color-mode=light] .bg-cyan-900{background-color:#032830!important}}@media print{html .bg-indigo-100,html[data-netbox-color-mode=dark] .bg-indigo-100,html[data-netbox-color-mode=light] .bg-indigo-100{background-color:#e0cffc!important}}@media print{html .bg-indigo-200,html[data-netbox-color-mode=dark] .bg-indigo-200,html[data-netbox-color-mode=light] .bg-indigo-200{background-color:#c29ffa!important}}@media print{html .bg-indigo-300,html[data-netbox-color-mode=dark] .bg-indigo-300,html[data-netbox-color-mode=light] .bg-indigo-300{background-color:#a370f7!important}}@media print{html .bg-indigo-400,html[data-netbox-color-mode=dark] .bg-indigo-400,html[data-netbox-color-mode=light] .bg-indigo-400{background-color:#8540f5!important}}@media print{html .bg-indigo-500,html[data-netbox-color-mode=dark] .bg-indigo-500,html[data-netbox-color-mode=light] .bg-indigo-500{background-color:#6610f2!important}}@media print{html .bg-indigo-600,html[data-netbox-color-mode=dark] .bg-indigo-600,html[data-netbox-color-mode=light] .bg-indigo-600{background-color:#520dc2!important}}@media print{html .bg-indigo-700,html[data-netbox-color-mode=dark] .bg-indigo-700,html[data-netbox-color-mode=light] .bg-indigo-700{background-color:#3d0a91!important}}@media print{html .bg-indigo-800,html[data-netbox-color-mode=dark] .bg-indigo-800,html[data-netbox-color-mode=light] .bg-indigo-800{background-color:#290661!important}}@media print{html .bg-indigo-900,html[data-netbox-color-mode=dark] .bg-indigo-900,html[data-netbox-color-mode=light] .bg-indigo-900{background-color:#140330!important}}@media print{html .bg-purple-100,html[data-netbox-color-mode=dark] .bg-purple-100,html[data-netbox-color-mode=light] .bg-purple-100{background-color:#e2d9f3!important}}@media print{html .bg-purple-200,html[data-netbox-color-mode=dark] .bg-purple-200,html[data-netbox-color-mode=light] .bg-purple-200{background-color:#c5b3e6!important}}@media print{html .bg-purple-300,html[data-netbox-color-mode=dark] .bg-purple-300,html[data-netbox-color-mode=light] .bg-purple-300{background-color:#a98eda!important}}@media print{html .bg-purple-400,html[data-netbox-color-mode=dark] .bg-purple-400,html[data-netbox-color-mode=light] .bg-purple-400{background-color:#8c68cd!important}}@media print{html .bg-purple-500,html[data-netbox-color-mode=dark] .bg-purple-500,html[data-netbox-color-mode=light] .bg-purple-500{background-color:#6f42c1!important}}@media print{html .bg-purple-600,html[data-netbox-color-mode=dark] .bg-purple-600,html[data-netbox-color-mode=light] .bg-purple-600{background-color:#59359a!important}}@media print{html .bg-purple-700,html[data-netbox-color-mode=dark] .bg-purple-700,html[data-netbox-color-mode=light] .bg-purple-700{background-color:#432874!important}}@media print{html .bg-purple-800,html[data-netbox-color-mode=dark] .bg-purple-800,html[data-netbox-color-mode=light] .bg-purple-800{background-color:#2c1a4d!important}}@media print{html .bg-purple-900,html[data-netbox-color-mode=dark] .bg-purple-900,html[data-netbox-color-mode=light] .bg-purple-900{background-color:#160d27!important}}@media print{html .bg-pink-100,html[data-netbox-color-mode=dark] .bg-pink-100,html[data-netbox-color-mode=light] .bg-pink-100{background-color:#f7d6e6!important}}@media print{html .bg-pink-200,html[data-netbox-color-mode=dark] .bg-pink-200,html[data-netbox-color-mode=light] .bg-pink-200{background-color:#efadce!important}}@media print{html .bg-pink-300,html[data-netbox-color-mode=dark] .bg-pink-300,html[data-netbox-color-mode=light] .bg-pink-300{background-color:#e685b5!important}}@media print{html .bg-pink-400,html[data-netbox-color-mode=dark] .bg-pink-400,html[data-netbox-color-mode=light] .bg-pink-400{background-color:#de5c9d!important}}@media print{html .bg-pink-500,html[data-netbox-color-mode=dark] .bg-pink-500,html[data-netbox-color-mode=light] .bg-pink-500{background-color:#d63384!important}}@media print{html .bg-pink-600,html[data-netbox-color-mode=dark] .bg-pink-600,html[data-netbox-color-mode=light] .bg-pink-600{background-color:#ab296a!important}}@media print{html .bg-pink-700,html[data-netbox-color-mode=dark] .bg-pink-700,html[data-netbox-color-mode=light] .bg-pink-700{background-color:#801f4f!important}}@media print{html .bg-pink-800,html[data-netbox-color-mode=dark] .bg-pink-800,html[data-netbox-color-mode=light] .bg-pink-800{background-color:#561435!important}}@media print{html .bg-pink-900,html[data-netbox-color-mode=dark] .bg-pink-900,html[data-netbox-color-mode=light] .bg-pink-900{background-color:#2b0a1a!important}}@media print{html .bg-body,html[data-netbox-color-mode=dark] .bg-body,html[data-netbox-color-mode=light] .bg-body{background-color:#fff!important}}@media print{html .bg-white,html[data-netbox-color-mode=dark] .bg-white,html[data-netbox-color-mode=light] .bg-white{background-color:#fff!important}}@media print{html .bg-transparent,html[data-netbox-color-mode=dark] .bg-transparent,html[data-netbox-color-mode=light] .bg-transparent{background-color:transparent!important}}@media print{html .bg-gradient,html[data-netbox-color-mode=dark] .bg-gradient,html[data-netbox-color-mode=light] .bg-gradient{background-image:var(--bs-gradient)!important}}@media print{html .user-select-all,html[data-netbox-color-mode=dark] .user-select-all,html[data-netbox-color-mode=light] .user-select-all{user-select:all!important}}@media print{html .user-select-auto,html[data-netbox-color-mode=dark] .user-select-auto,html[data-netbox-color-mode=light] .user-select-auto{user-select:auto!important}}@media print{html .user-select-none,html[data-netbox-color-mode=dark] .user-select-none,html[data-netbox-color-mode=light] .user-select-none{user-select:none!important}}@media print{html .pe-none,html[data-netbox-color-mode=dark] .pe-none,html[data-netbox-color-mode=light] .pe-none{pointer-events:none!important}}@media print{html .pe-auto,html[data-netbox-color-mode=dark] .pe-auto,html[data-netbox-color-mode=light] .pe-auto{pointer-events:auto!important}}@media print{html .rounded,html[data-netbox-color-mode=dark] .rounded,html[data-netbox-color-mode=light] .rounded{border-radius:.375rem!important}}@media print{html .rounded-0,html[data-netbox-color-mode=dark] .rounded-0,html[data-netbox-color-mode=light] .rounded-0{border-radius:0!important}}@media print{html .rounded-1,html[data-netbox-color-mode=dark] .rounded-1,html[data-netbox-color-mode=light] .rounded-1{border-radius:.375rem!important}}@media print{html .rounded-2,html[data-netbox-color-mode=dark] .rounded-2,html[data-netbox-color-mode=light] .rounded-2{border-radius:.375rem!important}}@media print{html .rounded-3,html[data-netbox-color-mode=dark] .rounded-3,html[data-netbox-color-mode=light] .rounded-3{border-radius:.75rem!important}}@media print{html .rounded-circle,html[data-netbox-color-mode=dark] .rounded-circle,html[data-netbox-color-mode=light] .rounded-circle{border-radius:50%!important}}@media print{html .rounded-pill,html[data-netbox-color-mode=dark] .rounded-pill,html[data-netbox-color-mode=light] .rounded-pill{border-radius:50rem!important}}@media print{html .rounded-top,html[data-netbox-color-mode=dark] .rounded-top,html[data-netbox-color-mode=light] .rounded-top{border-top-left-radius:.375rem!important;border-top-right-radius:.375rem!important}}@media print{html .rounded-end,html[data-netbox-color-mode=dark] .rounded-end,html[data-netbox-color-mode=light] .rounded-end{border-top-right-radius:.375rem!important;border-bottom-right-radius:.375rem!important}}@media print{html .rounded-bottom,html[data-netbox-color-mode=dark] .rounded-bottom,html[data-netbox-color-mode=light] .rounded-bottom{border-bottom-right-radius:.375rem!important;border-bottom-left-radius:.375rem!important}}@media print{html .rounded-start,html[data-netbox-color-mode=dark] .rounded-start,html[data-netbox-color-mode=light] .rounded-start{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}}@media print{html .visible,html[data-netbox-color-mode=dark] .visible,html[data-netbox-color-mode=light] .visible{visibility:visible!important}}@media print{html .invisible,html[data-netbox-color-mode=dark] .invisible,html[data-netbox-color-mode=light] .invisible{visibility:hidden!important}}@media print and (min-width: 576px){html .float-sm-start,html[data-netbox-color-mode=dark] .float-sm-start,html[data-netbox-color-mode=light] .float-sm-start{float:left!important}html .float-sm-end,html[data-netbox-color-mode=dark] .float-sm-end,html[data-netbox-color-mode=light] .float-sm-end{float:right!important}html .float-sm-none,html[data-netbox-color-mode=dark] .float-sm-none,html[data-netbox-color-mode=light] .float-sm-none{float:none!important}html .d-sm-inline,html[data-netbox-color-mode=dark] .d-sm-inline,html[data-netbox-color-mode=light] .d-sm-inline{display:inline!important}html .d-sm-inline-block,html[data-netbox-color-mode=dark] .d-sm-inline-block,html[data-netbox-color-mode=light] .d-sm-inline-block{display:inline-block!important}html .d-sm-block,html[data-netbox-color-mode=dark] .d-sm-block,html[data-netbox-color-mode=light] .d-sm-block{display:block!important}html .d-sm-grid,html[data-netbox-color-mode=dark] .d-sm-grid,html[data-netbox-color-mode=light] .d-sm-grid{display:grid!important}html .d-sm-table,html[data-netbox-color-mode=dark] .d-sm-table,html[data-netbox-color-mode=light] .d-sm-table{display:table!important}html .d-sm-table-row,html[data-netbox-color-mode=dark] .d-sm-table-row,html[data-netbox-color-mode=light] .d-sm-table-row{display:table-row!important}html .d-sm-table-cell,html[data-netbox-color-mode=dark] .d-sm-table-cell,html[data-netbox-color-mode=light] .d-sm-table-cell{display:table-cell!important}html .d-sm-flex,html[data-netbox-color-mode=dark] .d-sm-flex,html[data-netbox-color-mode=light] .d-sm-flex{display:flex!important}html .d-sm-inline-flex,html[data-netbox-color-mode=dark] .d-sm-inline-flex,html[data-netbox-color-mode=light] .d-sm-inline-flex{display:inline-flex!important}html .d-sm-none,html[data-netbox-color-mode=dark] .d-sm-none,html[data-netbox-color-mode=light] .d-sm-none{display:none!important}html .flex-sm-fill,html[data-netbox-color-mode=dark] .flex-sm-fill,html[data-netbox-color-mode=light] .flex-sm-fill{flex:1 1 auto!important}html .flex-sm-row,html[data-netbox-color-mode=dark] .flex-sm-row,html[data-netbox-color-mode=light] .flex-sm-row{flex-direction:row!important}html .flex-sm-column,html[data-netbox-color-mode=dark] .flex-sm-column,html[data-netbox-color-mode=light] .flex-sm-column{flex-direction:column!important}html .flex-sm-row-reverse,html[data-netbox-color-mode=dark] .flex-sm-row-reverse,html[data-netbox-color-mode=light] .flex-sm-row-reverse{flex-direction:row-reverse!important}html .flex-sm-column-reverse,html[data-netbox-color-mode=dark] .flex-sm-column-reverse,html[data-netbox-color-mode=light] .flex-sm-column-reverse{flex-direction:column-reverse!important}html .flex-sm-grow-0,html[data-netbox-color-mode=dark] .flex-sm-grow-0,html[data-netbox-color-mode=light] .flex-sm-grow-0{flex-grow:0!important}html .flex-sm-grow-1,html[data-netbox-color-mode=dark] .flex-sm-grow-1,html[data-netbox-color-mode=light] .flex-sm-grow-1{flex-grow:1!important}html .flex-sm-shrink-0,html[data-netbox-color-mode=dark] .flex-sm-shrink-0,html[data-netbox-color-mode=light] .flex-sm-shrink-0{flex-shrink:0!important}html .flex-sm-shrink-1,html[data-netbox-color-mode=dark] .flex-sm-shrink-1,html[data-netbox-color-mode=light] .flex-sm-shrink-1{flex-shrink:1!important}html .flex-sm-wrap,html[data-netbox-color-mode=dark] .flex-sm-wrap,html[data-netbox-color-mode=light] .flex-sm-wrap{flex-wrap:wrap!important}html .flex-sm-nowrap,html[data-netbox-color-mode=dark] .flex-sm-nowrap,html[data-netbox-color-mode=light] .flex-sm-nowrap{flex-wrap:nowrap!important}html .flex-sm-wrap-reverse,html[data-netbox-color-mode=dark] .flex-sm-wrap-reverse,html[data-netbox-color-mode=light] .flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-sm-0,html[data-netbox-color-mode=dark] .gap-sm-0,html[data-netbox-color-mode=light] .gap-sm-0{gap:0!important}html .gap-sm-1,html[data-netbox-color-mode=dark] .gap-sm-1,html[data-netbox-color-mode=light] .gap-sm-1{gap:.25rem!important}html .gap-sm-2,html[data-netbox-color-mode=dark] .gap-sm-2,html[data-netbox-color-mode=light] .gap-sm-2{gap:.5rem!important}html .gap-sm-3,html[data-netbox-color-mode=dark] .gap-sm-3,html[data-netbox-color-mode=light] .gap-sm-3{gap:1rem!important}html .gap-sm-4,html[data-netbox-color-mode=dark] .gap-sm-4,html[data-netbox-color-mode=light] .gap-sm-4{gap:1.5rem!important}html .gap-sm-5,html[data-netbox-color-mode=dark] .gap-sm-5,html[data-netbox-color-mode=light] .gap-sm-5{gap:3rem!important}html .justify-content-sm-start,html[data-netbox-color-mode=dark] .justify-content-sm-start,html[data-netbox-color-mode=light] .justify-content-sm-start{justify-content:flex-start!important}html .justify-content-sm-end,html[data-netbox-color-mode=dark] .justify-content-sm-end,html[data-netbox-color-mode=light] .justify-content-sm-end{justify-content:flex-end!important}html .justify-content-sm-center,html[data-netbox-color-mode=dark] .justify-content-sm-center,html[data-netbox-color-mode=light] .justify-content-sm-center{justify-content:center!important}html .justify-content-sm-between,html[data-netbox-color-mode=dark] .justify-content-sm-between,html[data-netbox-color-mode=light] .justify-content-sm-between{justify-content:space-between!important}html .justify-content-sm-around,html[data-netbox-color-mode=dark] .justify-content-sm-around,html[data-netbox-color-mode=light] .justify-content-sm-around{justify-content:space-around!important}html .justify-content-sm-evenly,html[data-netbox-color-mode=dark] .justify-content-sm-evenly,html[data-netbox-color-mode=light] .justify-content-sm-evenly{justify-content:space-evenly!important}html .align-items-sm-start,html[data-netbox-color-mode=dark] .align-items-sm-start,html[data-netbox-color-mode=light] .align-items-sm-start{align-items:flex-start!important}html .align-items-sm-end,html[data-netbox-color-mode=dark] .align-items-sm-end,html[data-netbox-color-mode=light] .align-items-sm-end{align-items:flex-end!important}html .align-items-sm-center,html[data-netbox-color-mode=dark] .align-items-sm-center,html[data-netbox-color-mode=light] .align-items-sm-center{align-items:center!important}html .align-items-sm-baseline,html[data-netbox-color-mode=dark] .align-items-sm-baseline,html[data-netbox-color-mode=light] .align-items-sm-baseline{align-items:baseline!important}html .align-items-sm-stretch,html[data-netbox-color-mode=dark] .align-items-sm-stretch,html[data-netbox-color-mode=light] .align-items-sm-stretch{align-items:stretch!important}html .align-content-sm-start,html[data-netbox-color-mode=dark] .align-content-sm-start,html[data-netbox-color-mode=light] .align-content-sm-start{align-content:flex-start!important}html .align-content-sm-end,html[data-netbox-color-mode=dark] .align-content-sm-end,html[data-netbox-color-mode=light] .align-content-sm-end{align-content:flex-end!important}html .align-content-sm-center,html[data-netbox-color-mode=dark] .align-content-sm-center,html[data-netbox-color-mode=light] .align-content-sm-center{align-content:center!important}html .align-content-sm-between,html[data-netbox-color-mode=dark] .align-content-sm-between,html[data-netbox-color-mode=light] .align-content-sm-between{align-content:space-between!important}html .align-content-sm-around,html[data-netbox-color-mode=dark] .align-content-sm-around,html[data-netbox-color-mode=light] .align-content-sm-around{align-content:space-around!important}html .align-content-sm-stretch,html[data-netbox-color-mode=dark] .align-content-sm-stretch,html[data-netbox-color-mode=light] .align-content-sm-stretch{align-content:stretch!important}html .align-self-sm-auto,html[data-netbox-color-mode=dark] .align-self-sm-auto,html[data-netbox-color-mode=light] .align-self-sm-auto{align-self:auto!important}html .align-self-sm-start,html[data-netbox-color-mode=dark] .align-self-sm-start,html[data-netbox-color-mode=light] .align-self-sm-start{align-self:flex-start!important}html .align-self-sm-end,html[data-netbox-color-mode=dark] .align-self-sm-end,html[data-netbox-color-mode=light] .align-self-sm-end{align-self:flex-end!important}html .align-self-sm-center,html[data-netbox-color-mode=dark] .align-self-sm-center,html[data-netbox-color-mode=light] .align-self-sm-center{align-self:center!important}html .align-self-sm-baseline,html[data-netbox-color-mode=dark] .align-self-sm-baseline,html[data-netbox-color-mode=light] .align-self-sm-baseline{align-self:baseline!important}html .align-self-sm-stretch,html[data-netbox-color-mode=dark] .align-self-sm-stretch,html[data-netbox-color-mode=light] .align-self-sm-stretch{align-self:stretch!important}html .order-sm-first,html[data-netbox-color-mode=dark] .order-sm-first,html[data-netbox-color-mode=light] .order-sm-first{order:-1!important}html .order-sm-0,html[data-netbox-color-mode=dark] .order-sm-0,html[data-netbox-color-mode=light] .order-sm-0{order:0!important}html .order-sm-1,html[data-netbox-color-mode=dark] .order-sm-1,html[data-netbox-color-mode=light] .order-sm-1{order:1!important}html .order-sm-2,html[data-netbox-color-mode=dark] .order-sm-2,html[data-netbox-color-mode=light] .order-sm-2{order:2!important}html .order-sm-3,html[data-netbox-color-mode=dark] .order-sm-3,html[data-netbox-color-mode=light] .order-sm-3{order:3!important}html .order-sm-4,html[data-netbox-color-mode=dark] .order-sm-4,html[data-netbox-color-mode=light] .order-sm-4{order:4!important}html .order-sm-5,html[data-netbox-color-mode=dark] .order-sm-5,html[data-netbox-color-mode=light] .order-sm-5{order:5!important}html .order-sm-last,html[data-netbox-color-mode=dark] .order-sm-last,html[data-netbox-color-mode=light] .order-sm-last{order:6!important}html .m-sm-0,html[data-netbox-color-mode=dark] .m-sm-0,html[data-netbox-color-mode=light] .m-sm-0{margin:0!important}html .m-sm-1,html[data-netbox-color-mode=dark] .m-sm-1,html[data-netbox-color-mode=light] .m-sm-1{margin:.25rem!important}html .m-sm-2,html[data-netbox-color-mode=dark] .m-sm-2,html[data-netbox-color-mode=light] .m-sm-2{margin:.5rem!important}html .m-sm-3,html[data-netbox-color-mode=dark] .m-sm-3,html[data-netbox-color-mode=light] .m-sm-3{margin:1rem!important}html .m-sm-4,html[data-netbox-color-mode=dark] .m-sm-4,html[data-netbox-color-mode=light] .m-sm-4{margin:1.5rem!important}html .m-sm-5,html[data-netbox-color-mode=dark] .m-sm-5,html[data-netbox-color-mode=light] .m-sm-5{margin:3rem!important}html .m-sm-auto,html[data-netbox-color-mode=dark] .m-sm-auto,html[data-netbox-color-mode=light] .m-sm-auto{margin:auto!important}html .mx-sm-0,html[data-netbox-color-mode=dark] .mx-sm-0,html[data-netbox-color-mode=light] .mx-sm-0{margin-right:0!important;margin-left:0!important}html .mx-sm-1,html[data-netbox-color-mode=dark] .mx-sm-1,html[data-netbox-color-mode=light] .mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-sm-2,html[data-netbox-color-mode=dark] .mx-sm-2,html[data-netbox-color-mode=light] .mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-sm-3,html[data-netbox-color-mode=dark] .mx-sm-3,html[data-netbox-color-mode=light] .mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-sm-4,html[data-netbox-color-mode=dark] .mx-sm-4,html[data-netbox-color-mode=light] .mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-sm-5,html[data-netbox-color-mode=dark] .mx-sm-5,html[data-netbox-color-mode=light] .mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-sm-auto,html[data-netbox-color-mode=dark] .mx-sm-auto,html[data-netbox-color-mode=light] .mx-sm-auto{margin-right:auto!important;margin-left:auto!important}html .my-sm-0,html[data-netbox-color-mode=dark] .my-sm-0,html[data-netbox-color-mode=light] .my-sm-0{margin-top:0!important;margin-bottom:0!important}html .my-sm-1,html[data-netbox-color-mode=dark] .my-sm-1,html[data-netbox-color-mode=light] .my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-sm-2,html[data-netbox-color-mode=dark] .my-sm-2,html[data-netbox-color-mode=light] .my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-sm-3,html[data-netbox-color-mode=dark] .my-sm-3,html[data-netbox-color-mode=light] .my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-sm-4,html[data-netbox-color-mode=dark] .my-sm-4,html[data-netbox-color-mode=light] .my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-sm-5,html[data-netbox-color-mode=dark] .my-sm-5,html[data-netbox-color-mode=light] .my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-sm-auto,html[data-netbox-color-mode=dark] .my-sm-auto,html[data-netbox-color-mode=light] .my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-sm-0,html[data-netbox-color-mode=dark] .mt-sm-0,html[data-netbox-color-mode=light] .mt-sm-0{margin-top:0!important}html .mt-sm-1,html[data-netbox-color-mode=dark] .mt-sm-1,html[data-netbox-color-mode=light] .mt-sm-1{margin-top:.25rem!important}html .mt-sm-2,html[data-netbox-color-mode=dark] .mt-sm-2,html[data-netbox-color-mode=light] .mt-sm-2{margin-top:.5rem!important}html .mt-sm-3,html[data-netbox-color-mode=dark] .mt-sm-3,html[data-netbox-color-mode=light] .mt-sm-3{margin-top:1rem!important}html .mt-sm-4,html[data-netbox-color-mode=dark] .mt-sm-4,html[data-netbox-color-mode=light] .mt-sm-4{margin-top:1.5rem!important}html .mt-sm-5,html[data-netbox-color-mode=dark] .mt-sm-5,html[data-netbox-color-mode=light] .mt-sm-5{margin-top:3rem!important}html .mt-sm-auto,html[data-netbox-color-mode=dark] .mt-sm-auto,html[data-netbox-color-mode=light] .mt-sm-auto{margin-top:auto!important}html .me-sm-0,html[data-netbox-color-mode=dark] .me-sm-0,html[data-netbox-color-mode=light] .me-sm-0{margin-right:0!important}html .me-sm-1,html[data-netbox-color-mode=dark] .me-sm-1,html[data-netbox-color-mode=light] .me-sm-1{margin-right:.25rem!important}html .me-sm-2,html[data-netbox-color-mode=dark] .me-sm-2,html[data-netbox-color-mode=light] .me-sm-2{margin-right:.5rem!important}html .me-sm-3,html[data-netbox-color-mode=dark] .me-sm-3,html[data-netbox-color-mode=light] .me-sm-3{margin-right:1rem!important}html .me-sm-4,html[data-netbox-color-mode=dark] .me-sm-4,html[data-netbox-color-mode=light] .me-sm-4{margin-right:1.5rem!important}html .me-sm-5,html[data-netbox-color-mode=dark] .me-sm-5,html[data-netbox-color-mode=light] .me-sm-5{margin-right:3rem!important}html .me-sm-auto,html[data-netbox-color-mode=dark] .me-sm-auto,html[data-netbox-color-mode=light] .me-sm-auto{margin-right:auto!important}html .mb-sm-0,html[data-netbox-color-mode=dark] .mb-sm-0,html[data-netbox-color-mode=light] .mb-sm-0{margin-bottom:0!important}html .mb-sm-1,html[data-netbox-color-mode=dark] .mb-sm-1,html[data-netbox-color-mode=light] .mb-sm-1{margin-bottom:.25rem!important}html .mb-sm-2,html[data-netbox-color-mode=dark] .mb-sm-2,html[data-netbox-color-mode=light] .mb-sm-2{margin-bottom:.5rem!important}html .mb-sm-3,html[data-netbox-color-mode=dark] .mb-sm-3,html[data-netbox-color-mode=light] .mb-sm-3{margin-bottom:1rem!important}html .mb-sm-4,html[data-netbox-color-mode=dark] .mb-sm-4,html[data-netbox-color-mode=light] .mb-sm-4{margin-bottom:1.5rem!important}html .mb-sm-5,html[data-netbox-color-mode=dark] .mb-sm-5,html[data-netbox-color-mode=light] .mb-sm-5{margin-bottom:3rem!important}html .mb-sm-auto,html[data-netbox-color-mode=dark] .mb-sm-auto,html[data-netbox-color-mode=light] .mb-sm-auto{margin-bottom:auto!important}html .ms-sm-0,html[data-netbox-color-mode=dark] .ms-sm-0,html[data-netbox-color-mode=light] .ms-sm-0{margin-left:0!important}html .ms-sm-1,html[data-netbox-color-mode=dark] .ms-sm-1,html[data-netbox-color-mode=light] .ms-sm-1{margin-left:.25rem!important}html .ms-sm-2,html[data-netbox-color-mode=dark] .ms-sm-2,html[data-netbox-color-mode=light] .ms-sm-2{margin-left:.5rem!important}html .ms-sm-3,html[data-netbox-color-mode=dark] .ms-sm-3,html[data-netbox-color-mode=light] .ms-sm-3{margin-left:1rem!important}html .ms-sm-4,html[data-netbox-color-mode=dark] .ms-sm-4,html[data-netbox-color-mode=light] .ms-sm-4{margin-left:1.5rem!important}html .ms-sm-5,html[data-netbox-color-mode=dark] .ms-sm-5,html[data-netbox-color-mode=light] .ms-sm-5{margin-left:3rem!important}html .ms-sm-auto,html[data-netbox-color-mode=dark] .ms-sm-auto,html[data-netbox-color-mode=light] .ms-sm-auto{margin-left:auto!important}html .p-sm-0,html[data-netbox-color-mode=dark] .p-sm-0,html[data-netbox-color-mode=light] .p-sm-0{padding:0!important}html .p-sm-1,html[data-netbox-color-mode=dark] .p-sm-1,html[data-netbox-color-mode=light] .p-sm-1{padding:.25rem!important}html .p-sm-2,html[data-netbox-color-mode=dark] .p-sm-2,html[data-netbox-color-mode=light] .p-sm-2{padding:.5rem!important}html .p-sm-3,html[data-netbox-color-mode=dark] .p-sm-3,html[data-netbox-color-mode=light] .p-sm-3{padding:1rem!important}html .p-sm-4,html[data-netbox-color-mode=dark] .p-sm-4,html[data-netbox-color-mode=light] .p-sm-4{padding:1.5rem!important}html .p-sm-5,html[data-netbox-color-mode=dark] .p-sm-5,html[data-netbox-color-mode=light] .p-sm-5{padding:3rem!important}html .px-sm-0,html[data-netbox-color-mode=dark] .px-sm-0,html[data-netbox-color-mode=light] .px-sm-0{padding-right:0!important;padding-left:0!important}html .px-sm-1,html[data-netbox-color-mode=dark] .px-sm-1,html[data-netbox-color-mode=light] .px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-sm-2,html[data-netbox-color-mode=dark] .px-sm-2,html[data-netbox-color-mode=light] .px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-sm-3,html[data-netbox-color-mode=dark] .px-sm-3,html[data-netbox-color-mode=light] .px-sm-3{padding-right:1rem!important;padding-left:1rem!important}html .px-sm-4,html[data-netbox-color-mode=dark] .px-sm-4,html[data-netbox-color-mode=light] .px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-sm-5,html[data-netbox-color-mode=dark] .px-sm-5,html[data-netbox-color-mode=light] .px-sm-5{padding-right:3rem!important;padding-left:3rem!important}html .py-sm-0,html[data-netbox-color-mode=dark] .py-sm-0,html[data-netbox-color-mode=light] .py-sm-0{padding-top:0!important;padding-bottom:0!important}html .py-sm-1,html[data-netbox-color-mode=dark] .py-sm-1,html[data-netbox-color-mode=light] .py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-sm-2,html[data-netbox-color-mode=dark] .py-sm-2,html[data-netbox-color-mode=light] .py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-sm-3,html[data-netbox-color-mode=dark] .py-sm-3,html[data-netbox-color-mode=light] .py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-sm-4,html[data-netbox-color-mode=dark] .py-sm-4,html[data-netbox-color-mode=light] .py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-sm-5,html[data-netbox-color-mode=dark] .py-sm-5,html[data-netbox-color-mode=light] .py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-sm-0,html[data-netbox-color-mode=dark] .pt-sm-0,html[data-netbox-color-mode=light] .pt-sm-0{padding-top:0!important}html .pt-sm-1,html[data-netbox-color-mode=dark] .pt-sm-1,html[data-netbox-color-mode=light] .pt-sm-1{padding-top:.25rem!important}html .pt-sm-2,html[data-netbox-color-mode=dark] .pt-sm-2,html[data-netbox-color-mode=light] .pt-sm-2{padding-top:.5rem!important}html .pt-sm-3,html[data-netbox-color-mode=dark] .pt-sm-3,html[data-netbox-color-mode=light] .pt-sm-3{padding-top:1rem!important}html .pt-sm-4,html[data-netbox-color-mode=dark] .pt-sm-4,html[data-netbox-color-mode=light] .pt-sm-4{padding-top:1.5rem!important}html .pt-sm-5,html[data-netbox-color-mode=dark] .pt-sm-5,html[data-netbox-color-mode=light] .pt-sm-5{padding-top:3rem!important}html .pe-sm-0,html[data-netbox-color-mode=dark] .pe-sm-0,html[data-netbox-color-mode=light] .pe-sm-0{padding-right:0!important}html .pe-sm-1,html[data-netbox-color-mode=dark] .pe-sm-1,html[data-netbox-color-mode=light] .pe-sm-1{padding-right:.25rem!important}html .pe-sm-2,html[data-netbox-color-mode=dark] .pe-sm-2,html[data-netbox-color-mode=light] .pe-sm-2{padding-right:.5rem!important}html .pe-sm-3,html[data-netbox-color-mode=dark] .pe-sm-3,html[data-netbox-color-mode=light] .pe-sm-3{padding-right:1rem!important}html .pe-sm-4,html[data-netbox-color-mode=dark] .pe-sm-4,html[data-netbox-color-mode=light] .pe-sm-4{padding-right:1.5rem!important}html .pe-sm-5,html[data-netbox-color-mode=dark] .pe-sm-5,html[data-netbox-color-mode=light] .pe-sm-5{padding-right:3rem!important}html .pb-sm-0,html[data-netbox-color-mode=dark] .pb-sm-0,html[data-netbox-color-mode=light] .pb-sm-0{padding-bottom:0!important}html .pb-sm-1,html[data-netbox-color-mode=dark] .pb-sm-1,html[data-netbox-color-mode=light] .pb-sm-1{padding-bottom:.25rem!important}html .pb-sm-2,html[data-netbox-color-mode=dark] .pb-sm-2,html[data-netbox-color-mode=light] .pb-sm-2{padding-bottom:.5rem!important}html .pb-sm-3,html[data-netbox-color-mode=dark] .pb-sm-3,html[data-netbox-color-mode=light] .pb-sm-3{padding-bottom:1rem!important}html .pb-sm-4,html[data-netbox-color-mode=dark] .pb-sm-4,html[data-netbox-color-mode=light] .pb-sm-4{padding-bottom:1.5rem!important}html .pb-sm-5,html[data-netbox-color-mode=dark] .pb-sm-5,html[data-netbox-color-mode=light] .pb-sm-5{padding-bottom:3rem!important}html .ps-sm-0,html[data-netbox-color-mode=dark] .ps-sm-0,html[data-netbox-color-mode=light] .ps-sm-0{padding-left:0!important}html .ps-sm-1,html[data-netbox-color-mode=dark] .ps-sm-1,html[data-netbox-color-mode=light] .ps-sm-1{padding-left:.25rem!important}html .ps-sm-2,html[data-netbox-color-mode=dark] .ps-sm-2,html[data-netbox-color-mode=light] .ps-sm-2{padding-left:.5rem!important}html .ps-sm-3,html[data-netbox-color-mode=dark] .ps-sm-3,html[data-netbox-color-mode=light] .ps-sm-3{padding-left:1rem!important}html .ps-sm-4,html[data-netbox-color-mode=dark] .ps-sm-4,html[data-netbox-color-mode=light] .ps-sm-4{padding-left:1.5rem!important}html .ps-sm-5,html[data-netbox-color-mode=dark] .ps-sm-5,html[data-netbox-color-mode=light] .ps-sm-5{padding-left:3rem!important}html .text-sm-start,html[data-netbox-color-mode=dark] .text-sm-start,html[data-netbox-color-mode=light] .text-sm-start{text-align:left!important}html .text-sm-end,html[data-netbox-color-mode=dark] .text-sm-end,html[data-netbox-color-mode=light] .text-sm-end{text-align:right!important}html .text-sm-center,html[data-netbox-color-mode=dark] .text-sm-center,html[data-netbox-color-mode=light] .text-sm-center{text-align:center!important}}@media print and (min-width: 768px){html .float-md-start,html[data-netbox-color-mode=dark] .float-md-start,html[data-netbox-color-mode=light] .float-md-start{float:left!important}html .float-md-end,html[data-netbox-color-mode=dark] .float-md-end,html[data-netbox-color-mode=light] .float-md-end{float:right!important}html .float-md-none,html[data-netbox-color-mode=dark] .float-md-none,html[data-netbox-color-mode=light] .float-md-none{float:none!important}html .d-md-inline,html[data-netbox-color-mode=dark] .d-md-inline,html[data-netbox-color-mode=light] .d-md-inline{display:inline!important}html .d-md-inline-block,html[data-netbox-color-mode=dark] .d-md-inline-block,html[data-netbox-color-mode=light] .d-md-inline-block{display:inline-block!important}html .d-md-block,html[data-netbox-color-mode=dark] .d-md-block,html[data-netbox-color-mode=light] .d-md-block{display:block!important}html .d-md-grid,html[data-netbox-color-mode=dark] .d-md-grid,html[data-netbox-color-mode=light] .d-md-grid{display:grid!important}html .d-md-table,html[data-netbox-color-mode=dark] .d-md-table,html[data-netbox-color-mode=light] .d-md-table{display:table!important}html .d-md-table-row,html[data-netbox-color-mode=dark] .d-md-table-row,html[data-netbox-color-mode=light] .d-md-table-row{display:table-row!important}html .d-md-table-cell,html[data-netbox-color-mode=dark] .d-md-table-cell,html[data-netbox-color-mode=light] .d-md-table-cell{display:table-cell!important}html .d-md-flex,html[data-netbox-color-mode=dark] .d-md-flex,html[data-netbox-color-mode=light] .d-md-flex{display:flex!important}html .d-md-inline-flex,html[data-netbox-color-mode=dark] .d-md-inline-flex,html[data-netbox-color-mode=light] .d-md-inline-flex{display:inline-flex!important}html .d-md-none,html[data-netbox-color-mode=dark] .d-md-none,html[data-netbox-color-mode=light] .d-md-none{display:none!important}html .flex-md-fill,html[data-netbox-color-mode=dark] .flex-md-fill,html[data-netbox-color-mode=light] .flex-md-fill{flex:1 1 auto!important}html .flex-md-row,html[data-netbox-color-mode=dark] .flex-md-row,html[data-netbox-color-mode=light] .flex-md-row{flex-direction:row!important}html .flex-md-column,html[data-netbox-color-mode=dark] .flex-md-column,html[data-netbox-color-mode=light] .flex-md-column{flex-direction:column!important}html .flex-md-row-reverse,html[data-netbox-color-mode=dark] .flex-md-row-reverse,html[data-netbox-color-mode=light] .flex-md-row-reverse{flex-direction:row-reverse!important}html .flex-md-column-reverse,html[data-netbox-color-mode=dark] .flex-md-column-reverse,html[data-netbox-color-mode=light] .flex-md-column-reverse{flex-direction:column-reverse!important}html .flex-md-grow-0,html[data-netbox-color-mode=dark] .flex-md-grow-0,html[data-netbox-color-mode=light] .flex-md-grow-0{flex-grow:0!important}html .flex-md-grow-1,html[data-netbox-color-mode=dark] .flex-md-grow-1,html[data-netbox-color-mode=light] .flex-md-grow-1{flex-grow:1!important}html .flex-md-shrink-0,html[data-netbox-color-mode=dark] .flex-md-shrink-0,html[data-netbox-color-mode=light] .flex-md-shrink-0{flex-shrink:0!important}html .flex-md-shrink-1,html[data-netbox-color-mode=dark] .flex-md-shrink-1,html[data-netbox-color-mode=light] .flex-md-shrink-1{flex-shrink:1!important}html .flex-md-wrap,html[data-netbox-color-mode=dark] .flex-md-wrap,html[data-netbox-color-mode=light] .flex-md-wrap{flex-wrap:wrap!important}html .flex-md-nowrap,html[data-netbox-color-mode=dark] .flex-md-nowrap,html[data-netbox-color-mode=light] .flex-md-nowrap{flex-wrap:nowrap!important}html .flex-md-wrap-reverse,html[data-netbox-color-mode=dark] .flex-md-wrap-reverse,html[data-netbox-color-mode=light] .flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-md-0,html[data-netbox-color-mode=dark] .gap-md-0,html[data-netbox-color-mode=light] .gap-md-0{gap:0!important}html .gap-md-1,html[data-netbox-color-mode=dark] .gap-md-1,html[data-netbox-color-mode=light] .gap-md-1{gap:.25rem!important}html .gap-md-2,html[data-netbox-color-mode=dark] .gap-md-2,html[data-netbox-color-mode=light] .gap-md-2{gap:.5rem!important}html .gap-md-3,html[data-netbox-color-mode=dark] .gap-md-3,html[data-netbox-color-mode=light] .gap-md-3{gap:1rem!important}html .gap-md-4,html[data-netbox-color-mode=dark] .gap-md-4,html[data-netbox-color-mode=light] .gap-md-4{gap:1.5rem!important}html .gap-md-5,html[data-netbox-color-mode=dark] .gap-md-5,html[data-netbox-color-mode=light] .gap-md-5{gap:3rem!important}html .justify-content-md-start,html[data-netbox-color-mode=dark] .justify-content-md-start,html[data-netbox-color-mode=light] .justify-content-md-start{justify-content:flex-start!important}html .justify-content-md-end,html[data-netbox-color-mode=dark] .justify-content-md-end,html[data-netbox-color-mode=light] .justify-content-md-end{justify-content:flex-end!important}html .justify-content-md-center,html[data-netbox-color-mode=dark] .justify-content-md-center,html[data-netbox-color-mode=light] .justify-content-md-center{justify-content:center!important}html .justify-content-md-between,html[data-netbox-color-mode=dark] .justify-content-md-between,html[data-netbox-color-mode=light] .justify-content-md-between{justify-content:space-between!important}html .justify-content-md-around,html[data-netbox-color-mode=dark] .justify-content-md-around,html[data-netbox-color-mode=light] .justify-content-md-around{justify-content:space-around!important}html .justify-content-md-evenly,html[data-netbox-color-mode=dark] .justify-content-md-evenly,html[data-netbox-color-mode=light] .justify-content-md-evenly{justify-content:space-evenly!important}html .align-items-md-start,html[data-netbox-color-mode=dark] .align-items-md-start,html[data-netbox-color-mode=light] .align-items-md-start{align-items:flex-start!important}html .align-items-md-end,html[data-netbox-color-mode=dark] .align-items-md-end,html[data-netbox-color-mode=light] .align-items-md-end{align-items:flex-end!important}html .align-items-md-center,html[data-netbox-color-mode=dark] .align-items-md-center,html[data-netbox-color-mode=light] .align-items-md-center{align-items:center!important}html .align-items-md-baseline,html[data-netbox-color-mode=dark] .align-items-md-baseline,html[data-netbox-color-mode=light] .align-items-md-baseline{align-items:baseline!important}html .align-items-md-stretch,html[data-netbox-color-mode=dark] .align-items-md-stretch,html[data-netbox-color-mode=light] .align-items-md-stretch{align-items:stretch!important}html .align-content-md-start,html[data-netbox-color-mode=dark] .align-content-md-start,html[data-netbox-color-mode=light] .align-content-md-start{align-content:flex-start!important}html .align-content-md-end,html[data-netbox-color-mode=dark] .align-content-md-end,html[data-netbox-color-mode=light] .align-content-md-end{align-content:flex-end!important}html .align-content-md-center,html[data-netbox-color-mode=dark] .align-content-md-center,html[data-netbox-color-mode=light] .align-content-md-center{align-content:center!important}html .align-content-md-between,html[data-netbox-color-mode=dark] .align-content-md-between,html[data-netbox-color-mode=light] .align-content-md-between{align-content:space-between!important}html .align-content-md-around,html[data-netbox-color-mode=dark] .align-content-md-around,html[data-netbox-color-mode=light] .align-content-md-around{align-content:space-around!important}html .align-content-md-stretch,html[data-netbox-color-mode=dark] .align-content-md-stretch,html[data-netbox-color-mode=light] .align-content-md-stretch{align-content:stretch!important}html .align-self-md-auto,html[data-netbox-color-mode=dark] .align-self-md-auto,html[data-netbox-color-mode=light] .align-self-md-auto{align-self:auto!important}html .align-self-md-start,html[data-netbox-color-mode=dark] .align-self-md-start,html[data-netbox-color-mode=light] .align-self-md-start{align-self:flex-start!important}html .align-self-md-end,html[data-netbox-color-mode=dark] .align-self-md-end,html[data-netbox-color-mode=light] .align-self-md-end{align-self:flex-end!important}html .align-self-md-center,html[data-netbox-color-mode=dark] .align-self-md-center,html[data-netbox-color-mode=light] .align-self-md-center{align-self:center!important}html .align-self-md-baseline,html[data-netbox-color-mode=dark] .align-self-md-baseline,html[data-netbox-color-mode=light] .align-self-md-baseline{align-self:baseline!important}html .align-self-md-stretch,html[data-netbox-color-mode=dark] .align-self-md-stretch,html[data-netbox-color-mode=light] .align-self-md-stretch{align-self:stretch!important}html .order-md-first,html[data-netbox-color-mode=dark] .order-md-first,html[data-netbox-color-mode=light] .order-md-first{order:-1!important}html .order-md-0,html[data-netbox-color-mode=dark] .order-md-0,html[data-netbox-color-mode=light] .order-md-0{order:0!important}html .order-md-1,html[data-netbox-color-mode=dark] .order-md-1,html[data-netbox-color-mode=light] .order-md-1{order:1!important}html .order-md-2,html[data-netbox-color-mode=dark] .order-md-2,html[data-netbox-color-mode=light] .order-md-2{order:2!important}html .order-md-3,html[data-netbox-color-mode=dark] .order-md-3,html[data-netbox-color-mode=light] .order-md-3{order:3!important}html .order-md-4,html[data-netbox-color-mode=dark] .order-md-4,html[data-netbox-color-mode=light] .order-md-4{order:4!important}html .order-md-5,html[data-netbox-color-mode=dark] .order-md-5,html[data-netbox-color-mode=light] .order-md-5{order:5!important}html .order-md-last,html[data-netbox-color-mode=dark] .order-md-last,html[data-netbox-color-mode=light] .order-md-last{order:6!important}html .m-md-0,html[data-netbox-color-mode=dark] .m-md-0,html[data-netbox-color-mode=light] .m-md-0{margin:0!important}html .m-md-1,html[data-netbox-color-mode=dark] .m-md-1,html[data-netbox-color-mode=light] .m-md-1{margin:.25rem!important}html .m-md-2,html[data-netbox-color-mode=dark] .m-md-2,html[data-netbox-color-mode=light] .m-md-2{margin:.5rem!important}html .m-md-3,html[data-netbox-color-mode=dark] .m-md-3,html[data-netbox-color-mode=light] .m-md-3{margin:1rem!important}html .m-md-4,html[data-netbox-color-mode=dark] .m-md-4,html[data-netbox-color-mode=light] .m-md-4{margin:1.5rem!important}html .m-md-5,html[data-netbox-color-mode=dark] .m-md-5,html[data-netbox-color-mode=light] .m-md-5{margin:3rem!important}html .m-md-auto,html[data-netbox-color-mode=dark] .m-md-auto,html[data-netbox-color-mode=light] .m-md-auto{margin:auto!important}html .mx-md-0,html[data-netbox-color-mode=dark] .mx-md-0,html[data-netbox-color-mode=light] .mx-md-0{margin-right:0!important;margin-left:0!important}html .mx-md-1,html[data-netbox-color-mode=dark] .mx-md-1,html[data-netbox-color-mode=light] .mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-md-2,html[data-netbox-color-mode=dark] .mx-md-2,html[data-netbox-color-mode=light] .mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-md-3,html[data-netbox-color-mode=dark] .mx-md-3,html[data-netbox-color-mode=light] .mx-md-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-md-4,html[data-netbox-color-mode=dark] .mx-md-4,html[data-netbox-color-mode=light] .mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-md-5,html[data-netbox-color-mode=dark] .mx-md-5,html[data-netbox-color-mode=light] .mx-md-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-md-auto,html[data-netbox-color-mode=dark] .mx-md-auto,html[data-netbox-color-mode=light] .mx-md-auto{margin-right:auto!important;margin-left:auto!important}html .my-md-0,html[data-netbox-color-mode=dark] .my-md-0,html[data-netbox-color-mode=light] .my-md-0{margin-top:0!important;margin-bottom:0!important}html .my-md-1,html[data-netbox-color-mode=dark] .my-md-1,html[data-netbox-color-mode=light] .my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-md-2,html[data-netbox-color-mode=dark] .my-md-2,html[data-netbox-color-mode=light] .my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-md-3,html[data-netbox-color-mode=dark] .my-md-3,html[data-netbox-color-mode=light] .my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-md-4,html[data-netbox-color-mode=dark] .my-md-4,html[data-netbox-color-mode=light] .my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-md-5,html[data-netbox-color-mode=dark] .my-md-5,html[data-netbox-color-mode=light] .my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-md-auto,html[data-netbox-color-mode=dark] .my-md-auto,html[data-netbox-color-mode=light] .my-md-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-md-0,html[data-netbox-color-mode=dark] .mt-md-0,html[data-netbox-color-mode=light] .mt-md-0{margin-top:0!important}html .mt-md-1,html[data-netbox-color-mode=dark] .mt-md-1,html[data-netbox-color-mode=light] .mt-md-1{margin-top:.25rem!important}html .mt-md-2,html[data-netbox-color-mode=dark] .mt-md-2,html[data-netbox-color-mode=light] .mt-md-2{margin-top:.5rem!important}html .mt-md-3,html[data-netbox-color-mode=dark] .mt-md-3,html[data-netbox-color-mode=light] .mt-md-3{margin-top:1rem!important}html .mt-md-4,html[data-netbox-color-mode=dark] .mt-md-4,html[data-netbox-color-mode=light] .mt-md-4{margin-top:1.5rem!important}html .mt-md-5,html[data-netbox-color-mode=dark] .mt-md-5,html[data-netbox-color-mode=light] .mt-md-5{margin-top:3rem!important}html .mt-md-auto,html[data-netbox-color-mode=dark] .mt-md-auto,html[data-netbox-color-mode=light] .mt-md-auto{margin-top:auto!important}html .me-md-0,html[data-netbox-color-mode=dark] .me-md-0,html[data-netbox-color-mode=light] .me-md-0{margin-right:0!important}html .me-md-1,html[data-netbox-color-mode=dark] .me-md-1,html[data-netbox-color-mode=light] .me-md-1{margin-right:.25rem!important}html .me-md-2,html[data-netbox-color-mode=dark] .me-md-2,html[data-netbox-color-mode=light] .me-md-2{margin-right:.5rem!important}html .me-md-3,html[data-netbox-color-mode=dark] .me-md-3,html[data-netbox-color-mode=light] .me-md-3{margin-right:1rem!important}html .me-md-4,html[data-netbox-color-mode=dark] .me-md-4,html[data-netbox-color-mode=light] .me-md-4{margin-right:1.5rem!important}html .me-md-5,html[data-netbox-color-mode=dark] .me-md-5,html[data-netbox-color-mode=light] .me-md-5{margin-right:3rem!important}html .me-md-auto,html[data-netbox-color-mode=dark] .me-md-auto,html[data-netbox-color-mode=light] .me-md-auto{margin-right:auto!important}html .mb-md-0,html[data-netbox-color-mode=dark] .mb-md-0,html[data-netbox-color-mode=light] .mb-md-0{margin-bottom:0!important}html .mb-md-1,html[data-netbox-color-mode=dark] .mb-md-1,html[data-netbox-color-mode=light] .mb-md-1{margin-bottom:.25rem!important}html .mb-md-2,html[data-netbox-color-mode=dark] .mb-md-2,html[data-netbox-color-mode=light] .mb-md-2{margin-bottom:.5rem!important}html .mb-md-3,html[data-netbox-color-mode=dark] .mb-md-3,html[data-netbox-color-mode=light] .mb-md-3{margin-bottom:1rem!important}html .mb-md-4,html[data-netbox-color-mode=dark] .mb-md-4,html[data-netbox-color-mode=light] .mb-md-4{margin-bottom:1.5rem!important}html .mb-md-5,html[data-netbox-color-mode=dark] .mb-md-5,html[data-netbox-color-mode=light] .mb-md-5{margin-bottom:3rem!important}html .mb-md-auto,html[data-netbox-color-mode=dark] .mb-md-auto,html[data-netbox-color-mode=light] .mb-md-auto{margin-bottom:auto!important}html .ms-md-0,html[data-netbox-color-mode=dark] .ms-md-0,html[data-netbox-color-mode=light] .ms-md-0{margin-left:0!important}html .ms-md-1,html[data-netbox-color-mode=dark] .ms-md-1,html[data-netbox-color-mode=light] .ms-md-1{margin-left:.25rem!important}html .ms-md-2,html[data-netbox-color-mode=dark] .ms-md-2,html[data-netbox-color-mode=light] .ms-md-2{margin-left:.5rem!important}html .ms-md-3,html[data-netbox-color-mode=dark] .ms-md-3,html[data-netbox-color-mode=light] .ms-md-3{margin-left:1rem!important}html .ms-md-4,html[data-netbox-color-mode=dark] .ms-md-4,html[data-netbox-color-mode=light] .ms-md-4{margin-left:1.5rem!important}html .ms-md-5,html[data-netbox-color-mode=dark] .ms-md-5,html[data-netbox-color-mode=light] .ms-md-5{margin-left:3rem!important}html .ms-md-auto,html[data-netbox-color-mode=dark] .ms-md-auto,html[data-netbox-color-mode=light] .ms-md-auto{margin-left:auto!important}html .p-md-0,html[data-netbox-color-mode=dark] .p-md-0,html[data-netbox-color-mode=light] .p-md-0{padding:0!important}html .p-md-1,html[data-netbox-color-mode=dark] .p-md-1,html[data-netbox-color-mode=light] .p-md-1{padding:.25rem!important}html .p-md-2,html[data-netbox-color-mode=dark] .p-md-2,html[data-netbox-color-mode=light] .p-md-2{padding:.5rem!important}html .p-md-3,html[data-netbox-color-mode=dark] .p-md-3,html[data-netbox-color-mode=light] .p-md-3{padding:1rem!important}html .p-md-4,html[data-netbox-color-mode=dark] .p-md-4,html[data-netbox-color-mode=light] .p-md-4{padding:1.5rem!important}html .p-md-5,html[data-netbox-color-mode=dark] .p-md-5,html[data-netbox-color-mode=light] .p-md-5{padding:3rem!important}html .px-md-0,html[data-netbox-color-mode=dark] .px-md-0,html[data-netbox-color-mode=light] .px-md-0{padding-right:0!important;padding-left:0!important}html .px-md-1,html[data-netbox-color-mode=dark] .px-md-1,html[data-netbox-color-mode=light] .px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-md-2,html[data-netbox-color-mode=dark] .px-md-2,html[data-netbox-color-mode=light] .px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-md-3,html[data-netbox-color-mode=dark] .px-md-3,html[data-netbox-color-mode=light] .px-md-3{padding-right:1rem!important;padding-left:1rem!important}html .px-md-4,html[data-netbox-color-mode=dark] .px-md-4,html[data-netbox-color-mode=light] .px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-md-5,html[data-netbox-color-mode=dark] .px-md-5,html[data-netbox-color-mode=light] .px-md-5{padding-right:3rem!important;padding-left:3rem!important}html .py-md-0,html[data-netbox-color-mode=dark] .py-md-0,html[data-netbox-color-mode=light] .py-md-0{padding-top:0!important;padding-bottom:0!important}html .py-md-1,html[data-netbox-color-mode=dark] .py-md-1,html[data-netbox-color-mode=light] .py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-md-2,html[data-netbox-color-mode=dark] .py-md-2,html[data-netbox-color-mode=light] .py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-md-3,html[data-netbox-color-mode=dark] .py-md-3,html[data-netbox-color-mode=light] .py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-md-4,html[data-netbox-color-mode=dark] .py-md-4,html[data-netbox-color-mode=light] .py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-md-5,html[data-netbox-color-mode=dark] .py-md-5,html[data-netbox-color-mode=light] .py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-md-0,html[data-netbox-color-mode=dark] .pt-md-0,html[data-netbox-color-mode=light] .pt-md-0{padding-top:0!important}html .pt-md-1,html[data-netbox-color-mode=dark] .pt-md-1,html[data-netbox-color-mode=light] .pt-md-1{padding-top:.25rem!important}html .pt-md-2,html[data-netbox-color-mode=dark] .pt-md-2,html[data-netbox-color-mode=light] .pt-md-2{padding-top:.5rem!important}html .pt-md-3,html[data-netbox-color-mode=dark] .pt-md-3,html[data-netbox-color-mode=light] .pt-md-3{padding-top:1rem!important}html .pt-md-4,html[data-netbox-color-mode=dark] .pt-md-4,html[data-netbox-color-mode=light] .pt-md-4{padding-top:1.5rem!important}html .pt-md-5,html[data-netbox-color-mode=dark] .pt-md-5,html[data-netbox-color-mode=light] .pt-md-5{padding-top:3rem!important}html .pe-md-0,html[data-netbox-color-mode=dark] .pe-md-0,html[data-netbox-color-mode=light] .pe-md-0{padding-right:0!important}html .pe-md-1,html[data-netbox-color-mode=dark] .pe-md-1,html[data-netbox-color-mode=light] .pe-md-1{padding-right:.25rem!important}html .pe-md-2,html[data-netbox-color-mode=dark] .pe-md-2,html[data-netbox-color-mode=light] .pe-md-2{padding-right:.5rem!important}html .pe-md-3,html[data-netbox-color-mode=dark] .pe-md-3,html[data-netbox-color-mode=light] .pe-md-3{padding-right:1rem!important}html .pe-md-4,html[data-netbox-color-mode=dark] .pe-md-4,html[data-netbox-color-mode=light] .pe-md-4{padding-right:1.5rem!important}html .pe-md-5,html[data-netbox-color-mode=dark] .pe-md-5,html[data-netbox-color-mode=light] .pe-md-5{padding-right:3rem!important}html .pb-md-0,html[data-netbox-color-mode=dark] .pb-md-0,html[data-netbox-color-mode=light] .pb-md-0{padding-bottom:0!important}html .pb-md-1,html[data-netbox-color-mode=dark] .pb-md-1,html[data-netbox-color-mode=light] .pb-md-1{padding-bottom:.25rem!important}html .pb-md-2,html[data-netbox-color-mode=dark] .pb-md-2,html[data-netbox-color-mode=light] .pb-md-2{padding-bottom:.5rem!important}html .pb-md-3,html[data-netbox-color-mode=dark] .pb-md-3,html[data-netbox-color-mode=light] .pb-md-3{padding-bottom:1rem!important}html .pb-md-4,html[data-netbox-color-mode=dark] .pb-md-4,html[data-netbox-color-mode=light] .pb-md-4{padding-bottom:1.5rem!important}html .pb-md-5,html[data-netbox-color-mode=dark] .pb-md-5,html[data-netbox-color-mode=light] .pb-md-5{padding-bottom:3rem!important}html .ps-md-0,html[data-netbox-color-mode=dark] .ps-md-0,html[data-netbox-color-mode=light] .ps-md-0{padding-left:0!important}html .ps-md-1,html[data-netbox-color-mode=dark] .ps-md-1,html[data-netbox-color-mode=light] .ps-md-1{padding-left:.25rem!important}html .ps-md-2,html[data-netbox-color-mode=dark] .ps-md-2,html[data-netbox-color-mode=light] .ps-md-2{padding-left:.5rem!important}html .ps-md-3,html[data-netbox-color-mode=dark] .ps-md-3,html[data-netbox-color-mode=light] .ps-md-3{padding-left:1rem!important}html .ps-md-4,html[data-netbox-color-mode=dark] .ps-md-4,html[data-netbox-color-mode=light] .ps-md-4{padding-left:1.5rem!important}html .ps-md-5,html[data-netbox-color-mode=dark] .ps-md-5,html[data-netbox-color-mode=light] .ps-md-5{padding-left:3rem!important}html .text-md-start,html[data-netbox-color-mode=dark] .text-md-start,html[data-netbox-color-mode=light] .text-md-start{text-align:left!important}html .text-md-end,html[data-netbox-color-mode=dark] .text-md-end,html[data-netbox-color-mode=light] .text-md-end{text-align:right!important}html .text-md-center,html[data-netbox-color-mode=dark] .text-md-center,html[data-netbox-color-mode=light] .text-md-center{text-align:center!important}}@media print and (min-width: 992px){html .float-lg-start,html[data-netbox-color-mode=dark] .float-lg-start,html[data-netbox-color-mode=light] .float-lg-start{float:left!important}html .float-lg-end,html[data-netbox-color-mode=dark] .float-lg-end,html[data-netbox-color-mode=light] .float-lg-end{float:right!important}html .float-lg-none,html[data-netbox-color-mode=dark] .float-lg-none,html[data-netbox-color-mode=light] .float-lg-none{float:none!important}html .d-lg-inline,html[data-netbox-color-mode=dark] .d-lg-inline,html[data-netbox-color-mode=light] .d-lg-inline{display:inline!important}html .d-lg-inline-block,html[data-netbox-color-mode=dark] .d-lg-inline-block,html[data-netbox-color-mode=light] .d-lg-inline-block{display:inline-block!important}html .d-lg-block,html[data-netbox-color-mode=dark] .d-lg-block,html[data-netbox-color-mode=light] .d-lg-block{display:block!important}html .d-lg-grid,html[data-netbox-color-mode=dark] .d-lg-grid,html[data-netbox-color-mode=light] .d-lg-grid{display:grid!important}html .d-lg-table,html[data-netbox-color-mode=dark] .d-lg-table,html[data-netbox-color-mode=light] .d-lg-table{display:table!important}html .d-lg-table-row,html[data-netbox-color-mode=dark] .d-lg-table-row,html[data-netbox-color-mode=light] .d-lg-table-row{display:table-row!important}html .d-lg-table-cell,html[data-netbox-color-mode=dark] .d-lg-table-cell,html[data-netbox-color-mode=light] .d-lg-table-cell{display:table-cell!important}html .d-lg-flex,html[data-netbox-color-mode=dark] .d-lg-flex,html[data-netbox-color-mode=light] .d-lg-flex{display:flex!important}html .d-lg-inline-flex,html[data-netbox-color-mode=dark] .d-lg-inline-flex,html[data-netbox-color-mode=light] .d-lg-inline-flex{display:inline-flex!important}html .d-lg-none,html[data-netbox-color-mode=dark] .d-lg-none,html[data-netbox-color-mode=light] .d-lg-none{display:none!important}html .flex-lg-fill,html[data-netbox-color-mode=dark] .flex-lg-fill,html[data-netbox-color-mode=light] .flex-lg-fill{flex:1 1 auto!important}html .flex-lg-row,html[data-netbox-color-mode=dark] .flex-lg-row,html[data-netbox-color-mode=light] .flex-lg-row{flex-direction:row!important}html .flex-lg-column,html[data-netbox-color-mode=dark] .flex-lg-column,html[data-netbox-color-mode=light] .flex-lg-column{flex-direction:column!important}html .flex-lg-row-reverse,html[data-netbox-color-mode=dark] .flex-lg-row-reverse,html[data-netbox-color-mode=light] .flex-lg-row-reverse{flex-direction:row-reverse!important}html .flex-lg-column-reverse,html[data-netbox-color-mode=dark] .flex-lg-column-reverse,html[data-netbox-color-mode=light] .flex-lg-column-reverse{flex-direction:column-reverse!important}html .flex-lg-grow-0,html[data-netbox-color-mode=dark] .flex-lg-grow-0,html[data-netbox-color-mode=light] .flex-lg-grow-0{flex-grow:0!important}html .flex-lg-grow-1,html[data-netbox-color-mode=dark] .flex-lg-grow-1,html[data-netbox-color-mode=light] .flex-lg-grow-1{flex-grow:1!important}html .flex-lg-shrink-0,html[data-netbox-color-mode=dark] .flex-lg-shrink-0,html[data-netbox-color-mode=light] .flex-lg-shrink-0{flex-shrink:0!important}html .flex-lg-shrink-1,html[data-netbox-color-mode=dark] .flex-lg-shrink-1,html[data-netbox-color-mode=light] .flex-lg-shrink-1{flex-shrink:1!important}html .flex-lg-wrap,html[data-netbox-color-mode=dark] .flex-lg-wrap,html[data-netbox-color-mode=light] .flex-lg-wrap{flex-wrap:wrap!important}html .flex-lg-nowrap,html[data-netbox-color-mode=dark] .flex-lg-nowrap,html[data-netbox-color-mode=light] .flex-lg-nowrap{flex-wrap:nowrap!important}html .flex-lg-wrap-reverse,html[data-netbox-color-mode=dark] .flex-lg-wrap-reverse,html[data-netbox-color-mode=light] .flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-lg-0,html[data-netbox-color-mode=dark] .gap-lg-0,html[data-netbox-color-mode=light] .gap-lg-0{gap:0!important}html .gap-lg-1,html[data-netbox-color-mode=dark] .gap-lg-1,html[data-netbox-color-mode=light] .gap-lg-1{gap:.25rem!important}html .gap-lg-2,html[data-netbox-color-mode=dark] .gap-lg-2,html[data-netbox-color-mode=light] .gap-lg-2{gap:.5rem!important}html .gap-lg-3,html[data-netbox-color-mode=dark] .gap-lg-3,html[data-netbox-color-mode=light] .gap-lg-3{gap:1rem!important}html .gap-lg-4,html[data-netbox-color-mode=dark] .gap-lg-4,html[data-netbox-color-mode=light] .gap-lg-4{gap:1.5rem!important}html .gap-lg-5,html[data-netbox-color-mode=dark] .gap-lg-5,html[data-netbox-color-mode=light] .gap-lg-5{gap:3rem!important}html .justify-content-lg-start,html[data-netbox-color-mode=dark] .justify-content-lg-start,html[data-netbox-color-mode=light] .justify-content-lg-start{justify-content:flex-start!important}html .justify-content-lg-end,html[data-netbox-color-mode=dark] .justify-content-lg-end,html[data-netbox-color-mode=light] .justify-content-lg-end{justify-content:flex-end!important}html .justify-content-lg-center,html[data-netbox-color-mode=dark] .justify-content-lg-center,html[data-netbox-color-mode=light] .justify-content-lg-center{justify-content:center!important}html .justify-content-lg-between,html[data-netbox-color-mode=dark] .justify-content-lg-between,html[data-netbox-color-mode=light] .justify-content-lg-between{justify-content:space-between!important}html .justify-content-lg-around,html[data-netbox-color-mode=dark] .justify-content-lg-around,html[data-netbox-color-mode=light] .justify-content-lg-around{justify-content:space-around!important}html .justify-content-lg-evenly,html[data-netbox-color-mode=dark] .justify-content-lg-evenly,html[data-netbox-color-mode=light] .justify-content-lg-evenly{justify-content:space-evenly!important}html .align-items-lg-start,html[data-netbox-color-mode=dark] .align-items-lg-start,html[data-netbox-color-mode=light] .align-items-lg-start{align-items:flex-start!important}html .align-items-lg-end,html[data-netbox-color-mode=dark] .align-items-lg-end,html[data-netbox-color-mode=light] .align-items-lg-end{align-items:flex-end!important}html .align-items-lg-center,html[data-netbox-color-mode=dark] .align-items-lg-center,html[data-netbox-color-mode=light] .align-items-lg-center{align-items:center!important}html .align-items-lg-baseline,html[data-netbox-color-mode=dark] .align-items-lg-baseline,html[data-netbox-color-mode=light] .align-items-lg-baseline{align-items:baseline!important}html .align-items-lg-stretch,html[data-netbox-color-mode=dark] .align-items-lg-stretch,html[data-netbox-color-mode=light] .align-items-lg-stretch{align-items:stretch!important}html .align-content-lg-start,html[data-netbox-color-mode=dark] .align-content-lg-start,html[data-netbox-color-mode=light] .align-content-lg-start{align-content:flex-start!important}html .align-content-lg-end,html[data-netbox-color-mode=dark] .align-content-lg-end,html[data-netbox-color-mode=light] .align-content-lg-end{align-content:flex-end!important}html .align-content-lg-center,html[data-netbox-color-mode=dark] .align-content-lg-center,html[data-netbox-color-mode=light] .align-content-lg-center{align-content:center!important}html .align-content-lg-between,html[data-netbox-color-mode=dark] .align-content-lg-between,html[data-netbox-color-mode=light] .align-content-lg-between{align-content:space-between!important}html .align-content-lg-around,html[data-netbox-color-mode=dark] .align-content-lg-around,html[data-netbox-color-mode=light] .align-content-lg-around{align-content:space-around!important}html .align-content-lg-stretch,html[data-netbox-color-mode=dark] .align-content-lg-stretch,html[data-netbox-color-mode=light] .align-content-lg-stretch{align-content:stretch!important}html .align-self-lg-auto,html[data-netbox-color-mode=dark] .align-self-lg-auto,html[data-netbox-color-mode=light] .align-self-lg-auto{align-self:auto!important}html .align-self-lg-start,html[data-netbox-color-mode=dark] .align-self-lg-start,html[data-netbox-color-mode=light] .align-self-lg-start{align-self:flex-start!important}html .align-self-lg-end,html[data-netbox-color-mode=dark] .align-self-lg-end,html[data-netbox-color-mode=light] .align-self-lg-end{align-self:flex-end!important}html .align-self-lg-center,html[data-netbox-color-mode=dark] .align-self-lg-center,html[data-netbox-color-mode=light] .align-self-lg-center{align-self:center!important}html .align-self-lg-baseline,html[data-netbox-color-mode=dark] .align-self-lg-baseline,html[data-netbox-color-mode=light] .align-self-lg-baseline{align-self:baseline!important}html .align-self-lg-stretch,html[data-netbox-color-mode=dark] .align-self-lg-stretch,html[data-netbox-color-mode=light] .align-self-lg-stretch{align-self:stretch!important}html .order-lg-first,html[data-netbox-color-mode=dark] .order-lg-first,html[data-netbox-color-mode=light] .order-lg-first{order:-1!important}html .order-lg-0,html[data-netbox-color-mode=dark] .order-lg-0,html[data-netbox-color-mode=light] .order-lg-0{order:0!important}html .order-lg-1,html[data-netbox-color-mode=dark] .order-lg-1,html[data-netbox-color-mode=light] .order-lg-1{order:1!important}html .order-lg-2,html[data-netbox-color-mode=dark] .order-lg-2,html[data-netbox-color-mode=light] .order-lg-2{order:2!important}html .order-lg-3,html[data-netbox-color-mode=dark] .order-lg-3,html[data-netbox-color-mode=light] .order-lg-3{order:3!important}html .order-lg-4,html[data-netbox-color-mode=dark] .order-lg-4,html[data-netbox-color-mode=light] .order-lg-4{order:4!important}html .order-lg-5,html[data-netbox-color-mode=dark] .order-lg-5,html[data-netbox-color-mode=light] .order-lg-5{order:5!important}html .order-lg-last,html[data-netbox-color-mode=dark] .order-lg-last,html[data-netbox-color-mode=light] .order-lg-last{order:6!important}html .m-lg-0,html[data-netbox-color-mode=dark] .m-lg-0,html[data-netbox-color-mode=light] .m-lg-0{margin:0!important}html .m-lg-1,html[data-netbox-color-mode=dark] .m-lg-1,html[data-netbox-color-mode=light] .m-lg-1{margin:.25rem!important}html .m-lg-2,html[data-netbox-color-mode=dark] .m-lg-2,html[data-netbox-color-mode=light] .m-lg-2{margin:.5rem!important}html .m-lg-3,html[data-netbox-color-mode=dark] .m-lg-3,html[data-netbox-color-mode=light] .m-lg-3{margin:1rem!important}html .m-lg-4,html[data-netbox-color-mode=dark] .m-lg-4,html[data-netbox-color-mode=light] .m-lg-4{margin:1.5rem!important}html .m-lg-5,html[data-netbox-color-mode=dark] .m-lg-5,html[data-netbox-color-mode=light] .m-lg-5{margin:3rem!important}html .m-lg-auto,html[data-netbox-color-mode=dark] .m-lg-auto,html[data-netbox-color-mode=light] .m-lg-auto{margin:auto!important}html .mx-lg-0,html[data-netbox-color-mode=dark] .mx-lg-0,html[data-netbox-color-mode=light] .mx-lg-0{margin-right:0!important;margin-left:0!important}html .mx-lg-1,html[data-netbox-color-mode=dark] .mx-lg-1,html[data-netbox-color-mode=light] .mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-lg-2,html[data-netbox-color-mode=dark] .mx-lg-2,html[data-netbox-color-mode=light] .mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-lg-3,html[data-netbox-color-mode=dark] .mx-lg-3,html[data-netbox-color-mode=light] .mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-lg-4,html[data-netbox-color-mode=dark] .mx-lg-4,html[data-netbox-color-mode=light] .mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-lg-5,html[data-netbox-color-mode=dark] .mx-lg-5,html[data-netbox-color-mode=light] .mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-lg-auto,html[data-netbox-color-mode=dark] .mx-lg-auto,html[data-netbox-color-mode=light] .mx-lg-auto{margin-right:auto!important;margin-left:auto!important}html .my-lg-0,html[data-netbox-color-mode=dark] .my-lg-0,html[data-netbox-color-mode=light] .my-lg-0{margin-top:0!important;margin-bottom:0!important}html .my-lg-1,html[data-netbox-color-mode=dark] .my-lg-1,html[data-netbox-color-mode=light] .my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-lg-2,html[data-netbox-color-mode=dark] .my-lg-2,html[data-netbox-color-mode=light] .my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-lg-3,html[data-netbox-color-mode=dark] .my-lg-3,html[data-netbox-color-mode=light] .my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-lg-4,html[data-netbox-color-mode=dark] .my-lg-4,html[data-netbox-color-mode=light] .my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-lg-5,html[data-netbox-color-mode=dark] .my-lg-5,html[data-netbox-color-mode=light] .my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-lg-auto,html[data-netbox-color-mode=dark] .my-lg-auto,html[data-netbox-color-mode=light] .my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-lg-0,html[data-netbox-color-mode=dark] .mt-lg-0,html[data-netbox-color-mode=light] .mt-lg-0{margin-top:0!important}html .mt-lg-1,html[data-netbox-color-mode=dark] .mt-lg-1,html[data-netbox-color-mode=light] .mt-lg-1{margin-top:.25rem!important}html .mt-lg-2,html[data-netbox-color-mode=dark] .mt-lg-2,html[data-netbox-color-mode=light] .mt-lg-2{margin-top:.5rem!important}html .mt-lg-3,html[data-netbox-color-mode=dark] .mt-lg-3,html[data-netbox-color-mode=light] .mt-lg-3{margin-top:1rem!important}html .mt-lg-4,html[data-netbox-color-mode=dark] .mt-lg-4,html[data-netbox-color-mode=light] .mt-lg-4{margin-top:1.5rem!important}html .mt-lg-5,html[data-netbox-color-mode=dark] .mt-lg-5,html[data-netbox-color-mode=light] .mt-lg-5{margin-top:3rem!important}html .mt-lg-auto,html[data-netbox-color-mode=dark] .mt-lg-auto,html[data-netbox-color-mode=light] .mt-lg-auto{margin-top:auto!important}html .me-lg-0,html[data-netbox-color-mode=dark] .me-lg-0,html[data-netbox-color-mode=light] .me-lg-0{margin-right:0!important}html .me-lg-1,html[data-netbox-color-mode=dark] .me-lg-1,html[data-netbox-color-mode=light] .me-lg-1{margin-right:.25rem!important}html .me-lg-2,html[data-netbox-color-mode=dark] .me-lg-2,html[data-netbox-color-mode=light] .me-lg-2{margin-right:.5rem!important}html .me-lg-3,html[data-netbox-color-mode=dark] .me-lg-3,html[data-netbox-color-mode=light] .me-lg-3{margin-right:1rem!important}html .me-lg-4,html[data-netbox-color-mode=dark] .me-lg-4,html[data-netbox-color-mode=light] .me-lg-4{margin-right:1.5rem!important}html .me-lg-5,html[data-netbox-color-mode=dark] .me-lg-5,html[data-netbox-color-mode=light] .me-lg-5{margin-right:3rem!important}html .me-lg-auto,html[data-netbox-color-mode=dark] .me-lg-auto,html[data-netbox-color-mode=light] .me-lg-auto{margin-right:auto!important}html .mb-lg-0,html[data-netbox-color-mode=dark] .mb-lg-0,html[data-netbox-color-mode=light] .mb-lg-0{margin-bottom:0!important}html .mb-lg-1,html[data-netbox-color-mode=dark] .mb-lg-1,html[data-netbox-color-mode=light] .mb-lg-1{margin-bottom:.25rem!important}html .mb-lg-2,html[data-netbox-color-mode=dark] .mb-lg-2,html[data-netbox-color-mode=light] .mb-lg-2{margin-bottom:.5rem!important}html .mb-lg-3,html[data-netbox-color-mode=dark] .mb-lg-3,html[data-netbox-color-mode=light] .mb-lg-3{margin-bottom:1rem!important}html .mb-lg-4,html[data-netbox-color-mode=dark] .mb-lg-4,html[data-netbox-color-mode=light] .mb-lg-4{margin-bottom:1.5rem!important}html .mb-lg-5,html[data-netbox-color-mode=dark] .mb-lg-5,html[data-netbox-color-mode=light] .mb-lg-5{margin-bottom:3rem!important}html .mb-lg-auto,html[data-netbox-color-mode=dark] .mb-lg-auto,html[data-netbox-color-mode=light] .mb-lg-auto{margin-bottom:auto!important}html .ms-lg-0,html[data-netbox-color-mode=dark] .ms-lg-0,html[data-netbox-color-mode=light] .ms-lg-0{margin-left:0!important}html .ms-lg-1,html[data-netbox-color-mode=dark] .ms-lg-1,html[data-netbox-color-mode=light] .ms-lg-1{margin-left:.25rem!important}html .ms-lg-2,html[data-netbox-color-mode=dark] .ms-lg-2,html[data-netbox-color-mode=light] .ms-lg-2{margin-left:.5rem!important}html .ms-lg-3,html[data-netbox-color-mode=dark] .ms-lg-3,html[data-netbox-color-mode=light] .ms-lg-3{margin-left:1rem!important}html .ms-lg-4,html[data-netbox-color-mode=dark] .ms-lg-4,html[data-netbox-color-mode=light] .ms-lg-4{margin-left:1.5rem!important}html .ms-lg-5,html[data-netbox-color-mode=dark] .ms-lg-5,html[data-netbox-color-mode=light] .ms-lg-5{margin-left:3rem!important}html .ms-lg-auto,html[data-netbox-color-mode=dark] .ms-lg-auto,html[data-netbox-color-mode=light] .ms-lg-auto{margin-left:auto!important}html .p-lg-0,html[data-netbox-color-mode=dark] .p-lg-0,html[data-netbox-color-mode=light] .p-lg-0{padding:0!important}html .p-lg-1,html[data-netbox-color-mode=dark] .p-lg-1,html[data-netbox-color-mode=light] .p-lg-1{padding:.25rem!important}html .p-lg-2,html[data-netbox-color-mode=dark] .p-lg-2,html[data-netbox-color-mode=light] .p-lg-2{padding:.5rem!important}html .p-lg-3,html[data-netbox-color-mode=dark] .p-lg-3,html[data-netbox-color-mode=light] .p-lg-3{padding:1rem!important}html .p-lg-4,html[data-netbox-color-mode=dark] .p-lg-4,html[data-netbox-color-mode=light] .p-lg-4{padding:1.5rem!important}html .p-lg-5,html[data-netbox-color-mode=dark] .p-lg-5,html[data-netbox-color-mode=light] .p-lg-5{padding:3rem!important}html .px-lg-0,html[data-netbox-color-mode=dark] .px-lg-0,html[data-netbox-color-mode=light] .px-lg-0{padding-right:0!important;padding-left:0!important}html .px-lg-1,html[data-netbox-color-mode=dark] .px-lg-1,html[data-netbox-color-mode=light] .px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-lg-2,html[data-netbox-color-mode=dark] .px-lg-2,html[data-netbox-color-mode=light] .px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-lg-3,html[data-netbox-color-mode=dark] .px-lg-3,html[data-netbox-color-mode=light] .px-lg-3{padding-right:1rem!important;padding-left:1rem!important}html .px-lg-4,html[data-netbox-color-mode=dark] .px-lg-4,html[data-netbox-color-mode=light] .px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-lg-5,html[data-netbox-color-mode=dark] .px-lg-5,html[data-netbox-color-mode=light] .px-lg-5{padding-right:3rem!important;padding-left:3rem!important}html .py-lg-0,html[data-netbox-color-mode=dark] .py-lg-0,html[data-netbox-color-mode=light] .py-lg-0{padding-top:0!important;padding-bottom:0!important}html .py-lg-1,html[data-netbox-color-mode=dark] .py-lg-1,html[data-netbox-color-mode=light] .py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-lg-2,html[data-netbox-color-mode=dark] .py-lg-2,html[data-netbox-color-mode=light] .py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-lg-3,html[data-netbox-color-mode=dark] .py-lg-3,html[data-netbox-color-mode=light] .py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-lg-4,html[data-netbox-color-mode=dark] .py-lg-4,html[data-netbox-color-mode=light] .py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-lg-5,html[data-netbox-color-mode=dark] .py-lg-5,html[data-netbox-color-mode=light] .py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-lg-0,html[data-netbox-color-mode=dark] .pt-lg-0,html[data-netbox-color-mode=light] .pt-lg-0{padding-top:0!important}html .pt-lg-1,html[data-netbox-color-mode=dark] .pt-lg-1,html[data-netbox-color-mode=light] .pt-lg-1{padding-top:.25rem!important}html .pt-lg-2,html[data-netbox-color-mode=dark] .pt-lg-2,html[data-netbox-color-mode=light] .pt-lg-2{padding-top:.5rem!important}html .pt-lg-3,html[data-netbox-color-mode=dark] .pt-lg-3,html[data-netbox-color-mode=light] .pt-lg-3{padding-top:1rem!important}html .pt-lg-4,html[data-netbox-color-mode=dark] .pt-lg-4,html[data-netbox-color-mode=light] .pt-lg-4{padding-top:1.5rem!important}html .pt-lg-5,html[data-netbox-color-mode=dark] .pt-lg-5,html[data-netbox-color-mode=light] .pt-lg-5{padding-top:3rem!important}html .pe-lg-0,html[data-netbox-color-mode=dark] .pe-lg-0,html[data-netbox-color-mode=light] .pe-lg-0{padding-right:0!important}html .pe-lg-1,html[data-netbox-color-mode=dark] .pe-lg-1,html[data-netbox-color-mode=light] .pe-lg-1{padding-right:.25rem!important}html .pe-lg-2,html[data-netbox-color-mode=dark] .pe-lg-2,html[data-netbox-color-mode=light] .pe-lg-2{padding-right:.5rem!important}html .pe-lg-3,html[data-netbox-color-mode=dark] .pe-lg-3,html[data-netbox-color-mode=light] .pe-lg-3{padding-right:1rem!important}html .pe-lg-4,html[data-netbox-color-mode=dark] .pe-lg-4,html[data-netbox-color-mode=light] .pe-lg-4{padding-right:1.5rem!important}html .pe-lg-5,html[data-netbox-color-mode=dark] .pe-lg-5,html[data-netbox-color-mode=light] .pe-lg-5{padding-right:3rem!important}html .pb-lg-0,html[data-netbox-color-mode=dark] .pb-lg-0,html[data-netbox-color-mode=light] .pb-lg-0{padding-bottom:0!important}html .pb-lg-1,html[data-netbox-color-mode=dark] .pb-lg-1,html[data-netbox-color-mode=light] .pb-lg-1{padding-bottom:.25rem!important}html .pb-lg-2,html[data-netbox-color-mode=dark] .pb-lg-2,html[data-netbox-color-mode=light] .pb-lg-2{padding-bottom:.5rem!important}html .pb-lg-3,html[data-netbox-color-mode=dark] .pb-lg-3,html[data-netbox-color-mode=light] .pb-lg-3{padding-bottom:1rem!important}html .pb-lg-4,html[data-netbox-color-mode=dark] .pb-lg-4,html[data-netbox-color-mode=light] .pb-lg-4{padding-bottom:1.5rem!important}html .pb-lg-5,html[data-netbox-color-mode=dark] .pb-lg-5,html[data-netbox-color-mode=light] .pb-lg-5{padding-bottom:3rem!important}html .ps-lg-0,html[data-netbox-color-mode=dark] .ps-lg-0,html[data-netbox-color-mode=light] .ps-lg-0{padding-left:0!important}html .ps-lg-1,html[data-netbox-color-mode=dark] .ps-lg-1,html[data-netbox-color-mode=light] .ps-lg-1{padding-left:.25rem!important}html .ps-lg-2,html[data-netbox-color-mode=dark] .ps-lg-2,html[data-netbox-color-mode=light] .ps-lg-2{padding-left:.5rem!important}html .ps-lg-3,html[data-netbox-color-mode=dark] .ps-lg-3,html[data-netbox-color-mode=light] .ps-lg-3{padding-left:1rem!important}html .ps-lg-4,html[data-netbox-color-mode=dark] .ps-lg-4,html[data-netbox-color-mode=light] .ps-lg-4{padding-left:1.5rem!important}html .ps-lg-5,html[data-netbox-color-mode=dark] .ps-lg-5,html[data-netbox-color-mode=light] .ps-lg-5{padding-left:3rem!important}html .text-lg-start,html[data-netbox-color-mode=dark] .text-lg-start,html[data-netbox-color-mode=light] .text-lg-start{text-align:left!important}html .text-lg-end,html[data-netbox-color-mode=dark] .text-lg-end,html[data-netbox-color-mode=light] .text-lg-end{text-align:right!important}html .text-lg-center,html[data-netbox-color-mode=dark] .text-lg-center,html[data-netbox-color-mode=light] .text-lg-center{text-align:center!important}}@media print and (min-width: 1200px){html .float-xl-start,html[data-netbox-color-mode=dark] .float-xl-start,html[data-netbox-color-mode=light] .float-xl-start{float:left!important}html .float-xl-end,html[data-netbox-color-mode=dark] .float-xl-end,html[data-netbox-color-mode=light] .float-xl-end{float:right!important}html .float-xl-none,html[data-netbox-color-mode=dark] .float-xl-none,html[data-netbox-color-mode=light] .float-xl-none{float:none!important}html .d-xl-inline,html[data-netbox-color-mode=dark] .d-xl-inline,html[data-netbox-color-mode=light] .d-xl-inline{display:inline!important}html .d-xl-inline-block,html[data-netbox-color-mode=dark] .d-xl-inline-block,html[data-netbox-color-mode=light] .d-xl-inline-block{display:inline-block!important}html .d-xl-block,html[data-netbox-color-mode=dark] .d-xl-block,html[data-netbox-color-mode=light] .d-xl-block{display:block!important}html .d-xl-grid,html[data-netbox-color-mode=dark] .d-xl-grid,html[data-netbox-color-mode=light] .d-xl-grid{display:grid!important}html .d-xl-table,html[data-netbox-color-mode=dark] .d-xl-table,html[data-netbox-color-mode=light] .d-xl-table{display:table!important}html .d-xl-table-row,html[data-netbox-color-mode=dark] .d-xl-table-row,html[data-netbox-color-mode=light] .d-xl-table-row{display:table-row!important}html .d-xl-table-cell,html[data-netbox-color-mode=dark] .d-xl-table-cell,html[data-netbox-color-mode=light] .d-xl-table-cell{display:table-cell!important}html .d-xl-flex,html[data-netbox-color-mode=dark] .d-xl-flex,html[data-netbox-color-mode=light] .d-xl-flex{display:flex!important}html .d-xl-inline-flex,html[data-netbox-color-mode=dark] .d-xl-inline-flex,html[data-netbox-color-mode=light] .d-xl-inline-flex{display:inline-flex!important}html .d-xl-none,html[data-netbox-color-mode=dark] .d-xl-none,html[data-netbox-color-mode=light] .d-xl-none{display:none!important}html .flex-xl-fill,html[data-netbox-color-mode=dark] .flex-xl-fill,html[data-netbox-color-mode=light] .flex-xl-fill{flex:1 1 auto!important}html .flex-xl-row,html[data-netbox-color-mode=dark] .flex-xl-row,html[data-netbox-color-mode=light] .flex-xl-row{flex-direction:row!important}html .flex-xl-column,html[data-netbox-color-mode=dark] .flex-xl-column,html[data-netbox-color-mode=light] .flex-xl-column{flex-direction:column!important}html .flex-xl-row-reverse,html[data-netbox-color-mode=dark] .flex-xl-row-reverse,html[data-netbox-color-mode=light] .flex-xl-row-reverse{flex-direction:row-reverse!important}html .flex-xl-column-reverse,html[data-netbox-color-mode=dark] .flex-xl-column-reverse,html[data-netbox-color-mode=light] .flex-xl-column-reverse{flex-direction:column-reverse!important}html .flex-xl-grow-0,html[data-netbox-color-mode=dark] .flex-xl-grow-0,html[data-netbox-color-mode=light] .flex-xl-grow-0{flex-grow:0!important}html .flex-xl-grow-1,html[data-netbox-color-mode=dark] .flex-xl-grow-1,html[data-netbox-color-mode=light] .flex-xl-grow-1{flex-grow:1!important}html .flex-xl-shrink-0,html[data-netbox-color-mode=dark] .flex-xl-shrink-0,html[data-netbox-color-mode=light] .flex-xl-shrink-0{flex-shrink:0!important}html .flex-xl-shrink-1,html[data-netbox-color-mode=dark] .flex-xl-shrink-1,html[data-netbox-color-mode=light] .flex-xl-shrink-1{flex-shrink:1!important}html .flex-xl-wrap,html[data-netbox-color-mode=dark] .flex-xl-wrap,html[data-netbox-color-mode=light] .flex-xl-wrap{flex-wrap:wrap!important}html .flex-xl-nowrap,html[data-netbox-color-mode=dark] .flex-xl-nowrap,html[data-netbox-color-mode=light] .flex-xl-nowrap{flex-wrap:nowrap!important}html .flex-xl-wrap-reverse,html[data-netbox-color-mode=dark] .flex-xl-wrap-reverse,html[data-netbox-color-mode=light] .flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-xl-0,html[data-netbox-color-mode=dark] .gap-xl-0,html[data-netbox-color-mode=light] .gap-xl-0{gap:0!important}html .gap-xl-1,html[data-netbox-color-mode=dark] .gap-xl-1,html[data-netbox-color-mode=light] .gap-xl-1{gap:.25rem!important}html .gap-xl-2,html[data-netbox-color-mode=dark] .gap-xl-2,html[data-netbox-color-mode=light] .gap-xl-2{gap:.5rem!important}html .gap-xl-3,html[data-netbox-color-mode=dark] .gap-xl-3,html[data-netbox-color-mode=light] .gap-xl-3{gap:1rem!important}html .gap-xl-4,html[data-netbox-color-mode=dark] .gap-xl-4,html[data-netbox-color-mode=light] .gap-xl-4{gap:1.5rem!important}html .gap-xl-5,html[data-netbox-color-mode=dark] .gap-xl-5,html[data-netbox-color-mode=light] .gap-xl-5{gap:3rem!important}html .justify-content-xl-start,html[data-netbox-color-mode=dark] .justify-content-xl-start,html[data-netbox-color-mode=light] .justify-content-xl-start{justify-content:flex-start!important}html .justify-content-xl-end,html[data-netbox-color-mode=dark] .justify-content-xl-end,html[data-netbox-color-mode=light] .justify-content-xl-end{justify-content:flex-end!important}html .justify-content-xl-center,html[data-netbox-color-mode=dark] .justify-content-xl-center,html[data-netbox-color-mode=light] .justify-content-xl-center{justify-content:center!important}html .justify-content-xl-between,html[data-netbox-color-mode=dark] .justify-content-xl-between,html[data-netbox-color-mode=light] .justify-content-xl-between{justify-content:space-between!important}html .justify-content-xl-around,html[data-netbox-color-mode=dark] .justify-content-xl-around,html[data-netbox-color-mode=light] .justify-content-xl-around{justify-content:space-around!important}html .justify-content-xl-evenly,html[data-netbox-color-mode=dark] .justify-content-xl-evenly,html[data-netbox-color-mode=light] .justify-content-xl-evenly{justify-content:space-evenly!important}html .align-items-xl-start,html[data-netbox-color-mode=dark] .align-items-xl-start,html[data-netbox-color-mode=light] .align-items-xl-start{align-items:flex-start!important}html .align-items-xl-end,html[data-netbox-color-mode=dark] .align-items-xl-end,html[data-netbox-color-mode=light] .align-items-xl-end{align-items:flex-end!important}html .align-items-xl-center,html[data-netbox-color-mode=dark] .align-items-xl-center,html[data-netbox-color-mode=light] .align-items-xl-center{align-items:center!important}html .align-items-xl-baseline,html[data-netbox-color-mode=dark] .align-items-xl-baseline,html[data-netbox-color-mode=light] .align-items-xl-baseline{align-items:baseline!important}html .align-items-xl-stretch,html[data-netbox-color-mode=dark] .align-items-xl-stretch,html[data-netbox-color-mode=light] .align-items-xl-stretch{align-items:stretch!important}html .align-content-xl-start,html[data-netbox-color-mode=dark] .align-content-xl-start,html[data-netbox-color-mode=light] .align-content-xl-start{align-content:flex-start!important}html .align-content-xl-end,html[data-netbox-color-mode=dark] .align-content-xl-end,html[data-netbox-color-mode=light] .align-content-xl-end{align-content:flex-end!important}html .align-content-xl-center,html[data-netbox-color-mode=dark] .align-content-xl-center,html[data-netbox-color-mode=light] .align-content-xl-center{align-content:center!important}html .align-content-xl-between,html[data-netbox-color-mode=dark] .align-content-xl-between,html[data-netbox-color-mode=light] .align-content-xl-between{align-content:space-between!important}html .align-content-xl-around,html[data-netbox-color-mode=dark] .align-content-xl-around,html[data-netbox-color-mode=light] .align-content-xl-around{align-content:space-around!important}html .align-content-xl-stretch,html[data-netbox-color-mode=dark] .align-content-xl-stretch,html[data-netbox-color-mode=light] .align-content-xl-stretch{align-content:stretch!important}html .align-self-xl-auto,html[data-netbox-color-mode=dark] .align-self-xl-auto,html[data-netbox-color-mode=light] .align-self-xl-auto{align-self:auto!important}html .align-self-xl-start,html[data-netbox-color-mode=dark] .align-self-xl-start,html[data-netbox-color-mode=light] .align-self-xl-start{align-self:flex-start!important}html .align-self-xl-end,html[data-netbox-color-mode=dark] .align-self-xl-end,html[data-netbox-color-mode=light] .align-self-xl-end{align-self:flex-end!important}html .align-self-xl-center,html[data-netbox-color-mode=dark] .align-self-xl-center,html[data-netbox-color-mode=light] .align-self-xl-center{align-self:center!important}html .align-self-xl-baseline,html[data-netbox-color-mode=dark] .align-self-xl-baseline,html[data-netbox-color-mode=light] .align-self-xl-baseline{align-self:baseline!important}html .align-self-xl-stretch,html[data-netbox-color-mode=dark] .align-self-xl-stretch,html[data-netbox-color-mode=light] .align-self-xl-stretch{align-self:stretch!important}html .order-xl-first,html[data-netbox-color-mode=dark] .order-xl-first,html[data-netbox-color-mode=light] .order-xl-first{order:-1!important}html .order-xl-0,html[data-netbox-color-mode=dark] .order-xl-0,html[data-netbox-color-mode=light] .order-xl-0{order:0!important}html .order-xl-1,html[data-netbox-color-mode=dark] .order-xl-1,html[data-netbox-color-mode=light] .order-xl-1{order:1!important}html .order-xl-2,html[data-netbox-color-mode=dark] .order-xl-2,html[data-netbox-color-mode=light] .order-xl-2{order:2!important}html .order-xl-3,html[data-netbox-color-mode=dark] .order-xl-3,html[data-netbox-color-mode=light] .order-xl-3{order:3!important}html .order-xl-4,html[data-netbox-color-mode=dark] .order-xl-4,html[data-netbox-color-mode=light] .order-xl-4{order:4!important}html .order-xl-5,html[data-netbox-color-mode=dark] .order-xl-5,html[data-netbox-color-mode=light] .order-xl-5{order:5!important}html .order-xl-last,html[data-netbox-color-mode=dark] .order-xl-last,html[data-netbox-color-mode=light] .order-xl-last{order:6!important}html .m-xl-0,html[data-netbox-color-mode=dark] .m-xl-0,html[data-netbox-color-mode=light] .m-xl-0{margin:0!important}html .m-xl-1,html[data-netbox-color-mode=dark] .m-xl-1,html[data-netbox-color-mode=light] .m-xl-1{margin:.25rem!important}html .m-xl-2,html[data-netbox-color-mode=dark] .m-xl-2,html[data-netbox-color-mode=light] .m-xl-2{margin:.5rem!important}html .m-xl-3,html[data-netbox-color-mode=dark] .m-xl-3,html[data-netbox-color-mode=light] .m-xl-3{margin:1rem!important}html .m-xl-4,html[data-netbox-color-mode=dark] .m-xl-4,html[data-netbox-color-mode=light] .m-xl-4{margin:1.5rem!important}html .m-xl-5,html[data-netbox-color-mode=dark] .m-xl-5,html[data-netbox-color-mode=light] .m-xl-5{margin:3rem!important}html .m-xl-auto,html[data-netbox-color-mode=dark] .m-xl-auto,html[data-netbox-color-mode=light] .m-xl-auto{margin:auto!important}html .mx-xl-0,html[data-netbox-color-mode=dark] .mx-xl-0,html[data-netbox-color-mode=light] .mx-xl-0{margin-right:0!important;margin-left:0!important}html .mx-xl-1,html[data-netbox-color-mode=dark] .mx-xl-1,html[data-netbox-color-mode=light] .mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-xl-2,html[data-netbox-color-mode=dark] .mx-xl-2,html[data-netbox-color-mode=light] .mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-xl-3,html[data-netbox-color-mode=dark] .mx-xl-3,html[data-netbox-color-mode=light] .mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-xl-4,html[data-netbox-color-mode=dark] .mx-xl-4,html[data-netbox-color-mode=light] .mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-xl-5,html[data-netbox-color-mode=dark] .mx-xl-5,html[data-netbox-color-mode=light] .mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-xl-auto,html[data-netbox-color-mode=dark] .mx-xl-auto,html[data-netbox-color-mode=light] .mx-xl-auto{margin-right:auto!important;margin-left:auto!important}html .my-xl-0,html[data-netbox-color-mode=dark] .my-xl-0,html[data-netbox-color-mode=light] .my-xl-0{margin-top:0!important;margin-bottom:0!important}html .my-xl-1,html[data-netbox-color-mode=dark] .my-xl-1,html[data-netbox-color-mode=light] .my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-xl-2,html[data-netbox-color-mode=dark] .my-xl-2,html[data-netbox-color-mode=light] .my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-xl-3,html[data-netbox-color-mode=dark] .my-xl-3,html[data-netbox-color-mode=light] .my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-xl-4,html[data-netbox-color-mode=dark] .my-xl-4,html[data-netbox-color-mode=light] .my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-xl-5,html[data-netbox-color-mode=dark] .my-xl-5,html[data-netbox-color-mode=light] .my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-xl-auto,html[data-netbox-color-mode=dark] .my-xl-auto,html[data-netbox-color-mode=light] .my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-xl-0,html[data-netbox-color-mode=dark] .mt-xl-0,html[data-netbox-color-mode=light] .mt-xl-0{margin-top:0!important}html .mt-xl-1,html[data-netbox-color-mode=dark] .mt-xl-1,html[data-netbox-color-mode=light] .mt-xl-1{margin-top:.25rem!important}html .mt-xl-2,html[data-netbox-color-mode=dark] .mt-xl-2,html[data-netbox-color-mode=light] .mt-xl-2{margin-top:.5rem!important}html .mt-xl-3,html[data-netbox-color-mode=dark] .mt-xl-3,html[data-netbox-color-mode=light] .mt-xl-3{margin-top:1rem!important}html .mt-xl-4,html[data-netbox-color-mode=dark] .mt-xl-4,html[data-netbox-color-mode=light] .mt-xl-4{margin-top:1.5rem!important}html .mt-xl-5,html[data-netbox-color-mode=dark] .mt-xl-5,html[data-netbox-color-mode=light] .mt-xl-5{margin-top:3rem!important}html .mt-xl-auto,html[data-netbox-color-mode=dark] .mt-xl-auto,html[data-netbox-color-mode=light] .mt-xl-auto{margin-top:auto!important}html .me-xl-0,html[data-netbox-color-mode=dark] .me-xl-0,html[data-netbox-color-mode=light] .me-xl-0{margin-right:0!important}html .me-xl-1,html[data-netbox-color-mode=dark] .me-xl-1,html[data-netbox-color-mode=light] .me-xl-1{margin-right:.25rem!important}html .me-xl-2,html[data-netbox-color-mode=dark] .me-xl-2,html[data-netbox-color-mode=light] .me-xl-2{margin-right:.5rem!important}html .me-xl-3,html[data-netbox-color-mode=dark] .me-xl-3,html[data-netbox-color-mode=light] .me-xl-3{margin-right:1rem!important}html .me-xl-4,html[data-netbox-color-mode=dark] .me-xl-4,html[data-netbox-color-mode=light] .me-xl-4{margin-right:1.5rem!important}html .me-xl-5,html[data-netbox-color-mode=dark] .me-xl-5,html[data-netbox-color-mode=light] .me-xl-5{margin-right:3rem!important}html .me-xl-auto,html[data-netbox-color-mode=dark] .me-xl-auto,html[data-netbox-color-mode=light] .me-xl-auto{margin-right:auto!important}html .mb-xl-0,html[data-netbox-color-mode=dark] .mb-xl-0,html[data-netbox-color-mode=light] .mb-xl-0{margin-bottom:0!important}html .mb-xl-1,html[data-netbox-color-mode=dark] .mb-xl-1,html[data-netbox-color-mode=light] .mb-xl-1{margin-bottom:.25rem!important}html .mb-xl-2,html[data-netbox-color-mode=dark] .mb-xl-2,html[data-netbox-color-mode=light] .mb-xl-2{margin-bottom:.5rem!important}html .mb-xl-3,html[data-netbox-color-mode=dark] .mb-xl-3,html[data-netbox-color-mode=light] .mb-xl-3{margin-bottom:1rem!important}html .mb-xl-4,html[data-netbox-color-mode=dark] .mb-xl-4,html[data-netbox-color-mode=light] .mb-xl-4{margin-bottom:1.5rem!important}html .mb-xl-5,html[data-netbox-color-mode=dark] .mb-xl-5,html[data-netbox-color-mode=light] .mb-xl-5{margin-bottom:3rem!important}html .mb-xl-auto,html[data-netbox-color-mode=dark] .mb-xl-auto,html[data-netbox-color-mode=light] .mb-xl-auto{margin-bottom:auto!important}html .ms-xl-0,html[data-netbox-color-mode=dark] .ms-xl-0,html[data-netbox-color-mode=light] .ms-xl-0{margin-left:0!important}html .ms-xl-1,html[data-netbox-color-mode=dark] .ms-xl-1,html[data-netbox-color-mode=light] .ms-xl-1{margin-left:.25rem!important}html .ms-xl-2,html[data-netbox-color-mode=dark] .ms-xl-2,html[data-netbox-color-mode=light] .ms-xl-2{margin-left:.5rem!important}html .ms-xl-3,html[data-netbox-color-mode=dark] .ms-xl-3,html[data-netbox-color-mode=light] .ms-xl-3{margin-left:1rem!important}html .ms-xl-4,html[data-netbox-color-mode=dark] .ms-xl-4,html[data-netbox-color-mode=light] .ms-xl-4{margin-left:1.5rem!important}html .ms-xl-5,html[data-netbox-color-mode=dark] .ms-xl-5,html[data-netbox-color-mode=light] .ms-xl-5{margin-left:3rem!important}html .ms-xl-auto,html[data-netbox-color-mode=dark] .ms-xl-auto,html[data-netbox-color-mode=light] .ms-xl-auto{margin-left:auto!important}html .p-xl-0,html[data-netbox-color-mode=dark] .p-xl-0,html[data-netbox-color-mode=light] .p-xl-0{padding:0!important}html .p-xl-1,html[data-netbox-color-mode=dark] .p-xl-1,html[data-netbox-color-mode=light] .p-xl-1{padding:.25rem!important}html .p-xl-2,html[data-netbox-color-mode=dark] .p-xl-2,html[data-netbox-color-mode=light] .p-xl-2{padding:.5rem!important}html .p-xl-3,html[data-netbox-color-mode=dark] .p-xl-3,html[data-netbox-color-mode=light] .p-xl-3{padding:1rem!important}html .p-xl-4,html[data-netbox-color-mode=dark] .p-xl-4,html[data-netbox-color-mode=light] .p-xl-4{padding:1.5rem!important}html .p-xl-5,html[data-netbox-color-mode=dark] .p-xl-5,html[data-netbox-color-mode=light] .p-xl-5{padding:3rem!important}html .px-xl-0,html[data-netbox-color-mode=dark] .px-xl-0,html[data-netbox-color-mode=light] .px-xl-0{padding-right:0!important;padding-left:0!important}html .px-xl-1,html[data-netbox-color-mode=dark] .px-xl-1,html[data-netbox-color-mode=light] .px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-xl-2,html[data-netbox-color-mode=dark] .px-xl-2,html[data-netbox-color-mode=light] .px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-xl-3,html[data-netbox-color-mode=dark] .px-xl-3,html[data-netbox-color-mode=light] .px-xl-3{padding-right:1rem!important;padding-left:1rem!important}html .px-xl-4,html[data-netbox-color-mode=dark] .px-xl-4,html[data-netbox-color-mode=light] .px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-xl-5,html[data-netbox-color-mode=dark] .px-xl-5,html[data-netbox-color-mode=light] .px-xl-5{padding-right:3rem!important;padding-left:3rem!important}html .py-xl-0,html[data-netbox-color-mode=dark] .py-xl-0,html[data-netbox-color-mode=light] .py-xl-0{padding-top:0!important;padding-bottom:0!important}html .py-xl-1,html[data-netbox-color-mode=dark] .py-xl-1,html[data-netbox-color-mode=light] .py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-xl-2,html[data-netbox-color-mode=dark] .py-xl-2,html[data-netbox-color-mode=light] .py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-xl-3,html[data-netbox-color-mode=dark] .py-xl-3,html[data-netbox-color-mode=light] .py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-xl-4,html[data-netbox-color-mode=dark] .py-xl-4,html[data-netbox-color-mode=light] .py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-xl-5,html[data-netbox-color-mode=dark] .py-xl-5,html[data-netbox-color-mode=light] .py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-xl-0,html[data-netbox-color-mode=dark] .pt-xl-0,html[data-netbox-color-mode=light] .pt-xl-0{padding-top:0!important}html .pt-xl-1,html[data-netbox-color-mode=dark] .pt-xl-1,html[data-netbox-color-mode=light] .pt-xl-1{padding-top:.25rem!important}html .pt-xl-2,html[data-netbox-color-mode=dark] .pt-xl-2,html[data-netbox-color-mode=light] .pt-xl-2{padding-top:.5rem!important}html .pt-xl-3,html[data-netbox-color-mode=dark] .pt-xl-3,html[data-netbox-color-mode=light] .pt-xl-3{padding-top:1rem!important}html .pt-xl-4,html[data-netbox-color-mode=dark] .pt-xl-4,html[data-netbox-color-mode=light] .pt-xl-4{padding-top:1.5rem!important}html .pt-xl-5,html[data-netbox-color-mode=dark] .pt-xl-5,html[data-netbox-color-mode=light] .pt-xl-5{padding-top:3rem!important}html .pe-xl-0,html[data-netbox-color-mode=dark] .pe-xl-0,html[data-netbox-color-mode=light] .pe-xl-0{padding-right:0!important}html .pe-xl-1,html[data-netbox-color-mode=dark] .pe-xl-1,html[data-netbox-color-mode=light] .pe-xl-1{padding-right:.25rem!important}html .pe-xl-2,html[data-netbox-color-mode=dark] .pe-xl-2,html[data-netbox-color-mode=light] .pe-xl-2{padding-right:.5rem!important}html .pe-xl-3,html[data-netbox-color-mode=dark] .pe-xl-3,html[data-netbox-color-mode=light] .pe-xl-3{padding-right:1rem!important}html .pe-xl-4,html[data-netbox-color-mode=dark] .pe-xl-4,html[data-netbox-color-mode=light] .pe-xl-4{padding-right:1.5rem!important}html .pe-xl-5,html[data-netbox-color-mode=dark] .pe-xl-5,html[data-netbox-color-mode=light] .pe-xl-5{padding-right:3rem!important}html .pb-xl-0,html[data-netbox-color-mode=dark] .pb-xl-0,html[data-netbox-color-mode=light] .pb-xl-0{padding-bottom:0!important}html .pb-xl-1,html[data-netbox-color-mode=dark] .pb-xl-1,html[data-netbox-color-mode=light] .pb-xl-1{padding-bottom:.25rem!important}html .pb-xl-2,html[data-netbox-color-mode=dark] .pb-xl-2,html[data-netbox-color-mode=light] .pb-xl-2{padding-bottom:.5rem!important}html .pb-xl-3,html[data-netbox-color-mode=dark] .pb-xl-3,html[data-netbox-color-mode=light] .pb-xl-3{padding-bottom:1rem!important}html .pb-xl-4,html[data-netbox-color-mode=dark] .pb-xl-4,html[data-netbox-color-mode=light] .pb-xl-4{padding-bottom:1.5rem!important}html .pb-xl-5,html[data-netbox-color-mode=dark] .pb-xl-5,html[data-netbox-color-mode=light] .pb-xl-5{padding-bottom:3rem!important}html .ps-xl-0,html[data-netbox-color-mode=dark] .ps-xl-0,html[data-netbox-color-mode=light] .ps-xl-0{padding-left:0!important}html .ps-xl-1,html[data-netbox-color-mode=dark] .ps-xl-1,html[data-netbox-color-mode=light] .ps-xl-1{padding-left:.25rem!important}html .ps-xl-2,html[data-netbox-color-mode=dark] .ps-xl-2,html[data-netbox-color-mode=light] .ps-xl-2{padding-left:.5rem!important}html .ps-xl-3,html[data-netbox-color-mode=dark] .ps-xl-3,html[data-netbox-color-mode=light] .ps-xl-3{padding-left:1rem!important}html .ps-xl-4,html[data-netbox-color-mode=dark] .ps-xl-4,html[data-netbox-color-mode=light] .ps-xl-4{padding-left:1.5rem!important}html .ps-xl-5,html[data-netbox-color-mode=dark] .ps-xl-5,html[data-netbox-color-mode=light] .ps-xl-5{padding-left:3rem!important}html .text-xl-start,html[data-netbox-color-mode=dark] .text-xl-start,html[data-netbox-color-mode=light] .text-xl-start{text-align:left!important}html .text-xl-end,html[data-netbox-color-mode=dark] .text-xl-end,html[data-netbox-color-mode=light] .text-xl-end{text-align:right!important}html .text-xl-center,html[data-netbox-color-mode=dark] .text-xl-center,html[data-netbox-color-mode=light] .text-xl-center{text-align:center!important}}@media print and (min-width: 1400px){html .float-xxl-start,html[data-netbox-color-mode=dark] .float-xxl-start,html[data-netbox-color-mode=light] .float-xxl-start{float:left!important}html .float-xxl-end,html[data-netbox-color-mode=dark] .float-xxl-end,html[data-netbox-color-mode=light] .float-xxl-end{float:right!important}html .float-xxl-none,html[data-netbox-color-mode=dark] .float-xxl-none,html[data-netbox-color-mode=light] .float-xxl-none{float:none!important}html .d-xxl-inline,html[data-netbox-color-mode=dark] .d-xxl-inline,html[data-netbox-color-mode=light] .d-xxl-inline{display:inline!important}html .d-xxl-inline-block,html[data-netbox-color-mode=dark] .d-xxl-inline-block,html[data-netbox-color-mode=light] .d-xxl-inline-block{display:inline-block!important}html .d-xxl-block,html[data-netbox-color-mode=dark] .d-xxl-block,html[data-netbox-color-mode=light] .d-xxl-block{display:block!important}html .d-xxl-grid,html[data-netbox-color-mode=dark] .d-xxl-grid,html[data-netbox-color-mode=light] .d-xxl-grid{display:grid!important}html .d-xxl-table,html[data-netbox-color-mode=dark] .d-xxl-table,html[data-netbox-color-mode=light] .d-xxl-table{display:table!important}html .d-xxl-table-row,html[data-netbox-color-mode=dark] .d-xxl-table-row,html[data-netbox-color-mode=light] .d-xxl-table-row{display:table-row!important}html .d-xxl-table-cell,html[data-netbox-color-mode=dark] .d-xxl-table-cell,html[data-netbox-color-mode=light] .d-xxl-table-cell{display:table-cell!important}html .d-xxl-flex,html[data-netbox-color-mode=dark] .d-xxl-flex,html[data-netbox-color-mode=light] .d-xxl-flex{display:flex!important}html .d-xxl-inline-flex,html[data-netbox-color-mode=dark] .d-xxl-inline-flex,html[data-netbox-color-mode=light] .d-xxl-inline-flex{display:inline-flex!important}html .d-xxl-none,html[data-netbox-color-mode=dark] .d-xxl-none,html[data-netbox-color-mode=light] .d-xxl-none{display:none!important}html .flex-xxl-fill,html[data-netbox-color-mode=dark] .flex-xxl-fill,html[data-netbox-color-mode=light] .flex-xxl-fill{flex:1 1 auto!important}html .flex-xxl-row,html[data-netbox-color-mode=dark] .flex-xxl-row,html[data-netbox-color-mode=light] .flex-xxl-row{flex-direction:row!important}html .flex-xxl-column,html[data-netbox-color-mode=dark] .flex-xxl-column,html[data-netbox-color-mode=light] .flex-xxl-column{flex-direction:column!important}html .flex-xxl-row-reverse,html[data-netbox-color-mode=dark] .flex-xxl-row-reverse,html[data-netbox-color-mode=light] .flex-xxl-row-reverse{flex-direction:row-reverse!important}html .flex-xxl-column-reverse,html[data-netbox-color-mode=dark] .flex-xxl-column-reverse,html[data-netbox-color-mode=light] .flex-xxl-column-reverse{flex-direction:column-reverse!important}html .flex-xxl-grow-0,html[data-netbox-color-mode=dark] .flex-xxl-grow-0,html[data-netbox-color-mode=light] .flex-xxl-grow-0{flex-grow:0!important}html .flex-xxl-grow-1,html[data-netbox-color-mode=dark] .flex-xxl-grow-1,html[data-netbox-color-mode=light] .flex-xxl-grow-1{flex-grow:1!important}html .flex-xxl-shrink-0,html[data-netbox-color-mode=dark] .flex-xxl-shrink-0,html[data-netbox-color-mode=light] .flex-xxl-shrink-0{flex-shrink:0!important}html .flex-xxl-shrink-1,html[data-netbox-color-mode=dark] .flex-xxl-shrink-1,html[data-netbox-color-mode=light] .flex-xxl-shrink-1{flex-shrink:1!important}html .flex-xxl-wrap,html[data-netbox-color-mode=dark] .flex-xxl-wrap,html[data-netbox-color-mode=light] .flex-xxl-wrap{flex-wrap:wrap!important}html .flex-xxl-nowrap,html[data-netbox-color-mode=dark] .flex-xxl-nowrap,html[data-netbox-color-mode=light] .flex-xxl-nowrap{flex-wrap:nowrap!important}html .flex-xxl-wrap-reverse,html[data-netbox-color-mode=dark] .flex-xxl-wrap-reverse,html[data-netbox-color-mode=light] .flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-xxl-0,html[data-netbox-color-mode=dark] .gap-xxl-0,html[data-netbox-color-mode=light] .gap-xxl-0{gap:0!important}html .gap-xxl-1,html[data-netbox-color-mode=dark] .gap-xxl-1,html[data-netbox-color-mode=light] .gap-xxl-1{gap:.25rem!important}html .gap-xxl-2,html[data-netbox-color-mode=dark] .gap-xxl-2,html[data-netbox-color-mode=light] .gap-xxl-2{gap:.5rem!important}html .gap-xxl-3,html[data-netbox-color-mode=dark] .gap-xxl-3,html[data-netbox-color-mode=light] .gap-xxl-3{gap:1rem!important}html .gap-xxl-4,html[data-netbox-color-mode=dark] .gap-xxl-4,html[data-netbox-color-mode=light] .gap-xxl-4{gap:1.5rem!important}html .gap-xxl-5,html[data-netbox-color-mode=dark] .gap-xxl-5,html[data-netbox-color-mode=light] .gap-xxl-5{gap:3rem!important}html .justify-content-xxl-start,html[data-netbox-color-mode=dark] .justify-content-xxl-start,html[data-netbox-color-mode=light] .justify-content-xxl-start{justify-content:flex-start!important}html .justify-content-xxl-end,html[data-netbox-color-mode=dark] .justify-content-xxl-end,html[data-netbox-color-mode=light] .justify-content-xxl-end{justify-content:flex-end!important}html .justify-content-xxl-center,html[data-netbox-color-mode=dark] .justify-content-xxl-center,html[data-netbox-color-mode=light] .justify-content-xxl-center{justify-content:center!important}html .justify-content-xxl-between,html[data-netbox-color-mode=dark] .justify-content-xxl-between,html[data-netbox-color-mode=light] .justify-content-xxl-between{justify-content:space-between!important}html .justify-content-xxl-around,html[data-netbox-color-mode=dark] .justify-content-xxl-around,html[data-netbox-color-mode=light] .justify-content-xxl-around{justify-content:space-around!important}html .justify-content-xxl-evenly,html[data-netbox-color-mode=dark] .justify-content-xxl-evenly,html[data-netbox-color-mode=light] .justify-content-xxl-evenly{justify-content:space-evenly!important}html .align-items-xxl-start,html[data-netbox-color-mode=dark] .align-items-xxl-start,html[data-netbox-color-mode=light] .align-items-xxl-start{align-items:flex-start!important}html .align-items-xxl-end,html[data-netbox-color-mode=dark] .align-items-xxl-end,html[data-netbox-color-mode=light] .align-items-xxl-end{align-items:flex-end!important}html .align-items-xxl-center,html[data-netbox-color-mode=dark] .align-items-xxl-center,html[data-netbox-color-mode=light] .align-items-xxl-center{align-items:center!important}html .align-items-xxl-baseline,html[data-netbox-color-mode=dark] .align-items-xxl-baseline,html[data-netbox-color-mode=light] .align-items-xxl-baseline{align-items:baseline!important}html .align-items-xxl-stretch,html[data-netbox-color-mode=dark] .align-items-xxl-stretch,html[data-netbox-color-mode=light] .align-items-xxl-stretch{align-items:stretch!important}html .align-content-xxl-start,html[data-netbox-color-mode=dark] .align-content-xxl-start,html[data-netbox-color-mode=light] .align-content-xxl-start{align-content:flex-start!important}html .align-content-xxl-end,html[data-netbox-color-mode=dark] .align-content-xxl-end,html[data-netbox-color-mode=light] .align-content-xxl-end{align-content:flex-end!important}html .align-content-xxl-center,html[data-netbox-color-mode=dark] .align-content-xxl-center,html[data-netbox-color-mode=light] .align-content-xxl-center{align-content:center!important}html .align-content-xxl-between,html[data-netbox-color-mode=dark] .align-content-xxl-between,html[data-netbox-color-mode=light] .align-content-xxl-between{align-content:space-between!important}html .align-content-xxl-around,html[data-netbox-color-mode=dark] .align-content-xxl-around,html[data-netbox-color-mode=light] .align-content-xxl-around{align-content:space-around!important}html .align-content-xxl-stretch,html[data-netbox-color-mode=dark] .align-content-xxl-stretch,html[data-netbox-color-mode=light] .align-content-xxl-stretch{align-content:stretch!important}html .align-self-xxl-auto,html[data-netbox-color-mode=dark] .align-self-xxl-auto,html[data-netbox-color-mode=light] .align-self-xxl-auto{align-self:auto!important}html .align-self-xxl-start,html[data-netbox-color-mode=dark] .align-self-xxl-start,html[data-netbox-color-mode=light] .align-self-xxl-start{align-self:flex-start!important}html .align-self-xxl-end,html[data-netbox-color-mode=dark] .align-self-xxl-end,html[data-netbox-color-mode=light] .align-self-xxl-end{align-self:flex-end!important}html .align-self-xxl-center,html[data-netbox-color-mode=dark] .align-self-xxl-center,html[data-netbox-color-mode=light] .align-self-xxl-center{align-self:center!important}html .align-self-xxl-baseline,html[data-netbox-color-mode=dark] .align-self-xxl-baseline,html[data-netbox-color-mode=light] .align-self-xxl-baseline{align-self:baseline!important}html .align-self-xxl-stretch,html[data-netbox-color-mode=dark] .align-self-xxl-stretch,html[data-netbox-color-mode=light] .align-self-xxl-stretch{align-self:stretch!important}html .order-xxl-first,html[data-netbox-color-mode=dark] .order-xxl-first,html[data-netbox-color-mode=light] .order-xxl-first{order:-1!important}html .order-xxl-0,html[data-netbox-color-mode=dark] .order-xxl-0,html[data-netbox-color-mode=light] .order-xxl-0{order:0!important}html .order-xxl-1,html[data-netbox-color-mode=dark] .order-xxl-1,html[data-netbox-color-mode=light] .order-xxl-1{order:1!important}html .order-xxl-2,html[data-netbox-color-mode=dark] .order-xxl-2,html[data-netbox-color-mode=light] .order-xxl-2{order:2!important}html .order-xxl-3,html[data-netbox-color-mode=dark] .order-xxl-3,html[data-netbox-color-mode=light] .order-xxl-3{order:3!important}html .order-xxl-4,html[data-netbox-color-mode=dark] .order-xxl-4,html[data-netbox-color-mode=light] .order-xxl-4{order:4!important}html .order-xxl-5,html[data-netbox-color-mode=dark] .order-xxl-5,html[data-netbox-color-mode=light] .order-xxl-5{order:5!important}html .order-xxl-last,html[data-netbox-color-mode=dark] .order-xxl-last,html[data-netbox-color-mode=light] .order-xxl-last{order:6!important}html .m-xxl-0,html[data-netbox-color-mode=dark] .m-xxl-0,html[data-netbox-color-mode=light] .m-xxl-0{margin:0!important}html .m-xxl-1,html[data-netbox-color-mode=dark] .m-xxl-1,html[data-netbox-color-mode=light] .m-xxl-1{margin:.25rem!important}html .m-xxl-2,html[data-netbox-color-mode=dark] .m-xxl-2,html[data-netbox-color-mode=light] .m-xxl-2{margin:.5rem!important}html .m-xxl-3,html[data-netbox-color-mode=dark] .m-xxl-3,html[data-netbox-color-mode=light] .m-xxl-3{margin:1rem!important}html .m-xxl-4,html[data-netbox-color-mode=dark] .m-xxl-4,html[data-netbox-color-mode=light] .m-xxl-4{margin:1.5rem!important}html .m-xxl-5,html[data-netbox-color-mode=dark] .m-xxl-5,html[data-netbox-color-mode=light] .m-xxl-5{margin:3rem!important}html .m-xxl-auto,html[data-netbox-color-mode=dark] .m-xxl-auto,html[data-netbox-color-mode=light] .m-xxl-auto{margin:auto!important}html .mx-xxl-0,html[data-netbox-color-mode=dark] .mx-xxl-0,html[data-netbox-color-mode=light] .mx-xxl-0{margin-right:0!important;margin-left:0!important}html .mx-xxl-1,html[data-netbox-color-mode=dark] .mx-xxl-1,html[data-netbox-color-mode=light] .mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-xxl-2,html[data-netbox-color-mode=dark] .mx-xxl-2,html[data-netbox-color-mode=light] .mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-xxl-3,html[data-netbox-color-mode=dark] .mx-xxl-3,html[data-netbox-color-mode=light] .mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-xxl-4,html[data-netbox-color-mode=dark] .mx-xxl-4,html[data-netbox-color-mode=light] .mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-xxl-5,html[data-netbox-color-mode=dark] .mx-xxl-5,html[data-netbox-color-mode=light] .mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-xxl-auto,html[data-netbox-color-mode=dark] .mx-xxl-auto,html[data-netbox-color-mode=light] .mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}html .my-xxl-0,html[data-netbox-color-mode=dark] .my-xxl-0,html[data-netbox-color-mode=light] .my-xxl-0{margin-top:0!important;margin-bottom:0!important}html .my-xxl-1,html[data-netbox-color-mode=dark] .my-xxl-1,html[data-netbox-color-mode=light] .my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-xxl-2,html[data-netbox-color-mode=dark] .my-xxl-2,html[data-netbox-color-mode=light] .my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-xxl-3,html[data-netbox-color-mode=dark] .my-xxl-3,html[data-netbox-color-mode=light] .my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-xxl-4,html[data-netbox-color-mode=dark] .my-xxl-4,html[data-netbox-color-mode=light] .my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-xxl-5,html[data-netbox-color-mode=dark] .my-xxl-5,html[data-netbox-color-mode=light] .my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-xxl-auto,html[data-netbox-color-mode=dark] .my-xxl-auto,html[data-netbox-color-mode=light] .my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-xxl-0,html[data-netbox-color-mode=dark] .mt-xxl-0,html[data-netbox-color-mode=light] .mt-xxl-0{margin-top:0!important}html .mt-xxl-1,html[data-netbox-color-mode=dark] .mt-xxl-1,html[data-netbox-color-mode=light] .mt-xxl-1{margin-top:.25rem!important}html .mt-xxl-2,html[data-netbox-color-mode=dark] .mt-xxl-2,html[data-netbox-color-mode=light] .mt-xxl-2{margin-top:.5rem!important}html .mt-xxl-3,html[data-netbox-color-mode=dark] .mt-xxl-3,html[data-netbox-color-mode=light] .mt-xxl-3{margin-top:1rem!important}html .mt-xxl-4,html[data-netbox-color-mode=dark] .mt-xxl-4,html[data-netbox-color-mode=light] .mt-xxl-4{margin-top:1.5rem!important}html .mt-xxl-5,html[data-netbox-color-mode=dark] .mt-xxl-5,html[data-netbox-color-mode=light] .mt-xxl-5{margin-top:3rem!important}html .mt-xxl-auto,html[data-netbox-color-mode=dark] .mt-xxl-auto,html[data-netbox-color-mode=light] .mt-xxl-auto{margin-top:auto!important}html .me-xxl-0,html[data-netbox-color-mode=dark] .me-xxl-0,html[data-netbox-color-mode=light] .me-xxl-0{margin-right:0!important}html .me-xxl-1,html[data-netbox-color-mode=dark] .me-xxl-1,html[data-netbox-color-mode=light] .me-xxl-1{margin-right:.25rem!important}html .me-xxl-2,html[data-netbox-color-mode=dark] .me-xxl-2,html[data-netbox-color-mode=light] .me-xxl-2{margin-right:.5rem!important}html .me-xxl-3,html[data-netbox-color-mode=dark] .me-xxl-3,html[data-netbox-color-mode=light] .me-xxl-3{margin-right:1rem!important}html .me-xxl-4,html[data-netbox-color-mode=dark] .me-xxl-4,html[data-netbox-color-mode=light] .me-xxl-4{margin-right:1.5rem!important}html .me-xxl-5,html[data-netbox-color-mode=dark] .me-xxl-5,html[data-netbox-color-mode=light] .me-xxl-5{margin-right:3rem!important}html .me-xxl-auto,html[data-netbox-color-mode=dark] .me-xxl-auto,html[data-netbox-color-mode=light] .me-xxl-auto{margin-right:auto!important}html .mb-xxl-0,html[data-netbox-color-mode=dark] .mb-xxl-0,html[data-netbox-color-mode=light] .mb-xxl-0{margin-bottom:0!important}html .mb-xxl-1,html[data-netbox-color-mode=dark] .mb-xxl-1,html[data-netbox-color-mode=light] .mb-xxl-1{margin-bottom:.25rem!important}html .mb-xxl-2,html[data-netbox-color-mode=dark] .mb-xxl-2,html[data-netbox-color-mode=light] .mb-xxl-2{margin-bottom:.5rem!important}html .mb-xxl-3,html[data-netbox-color-mode=dark] .mb-xxl-3,html[data-netbox-color-mode=light] .mb-xxl-3{margin-bottom:1rem!important}html .mb-xxl-4,html[data-netbox-color-mode=dark] .mb-xxl-4,html[data-netbox-color-mode=light] .mb-xxl-4{margin-bottom:1.5rem!important}html .mb-xxl-5,html[data-netbox-color-mode=dark] .mb-xxl-5,html[data-netbox-color-mode=light] .mb-xxl-5{margin-bottom:3rem!important}html .mb-xxl-auto,html[data-netbox-color-mode=dark] .mb-xxl-auto,html[data-netbox-color-mode=light] .mb-xxl-auto{margin-bottom:auto!important}html .ms-xxl-0,html[data-netbox-color-mode=dark] .ms-xxl-0,html[data-netbox-color-mode=light] .ms-xxl-0{margin-left:0!important}html .ms-xxl-1,html[data-netbox-color-mode=dark] .ms-xxl-1,html[data-netbox-color-mode=light] .ms-xxl-1{margin-left:.25rem!important}html .ms-xxl-2,html[data-netbox-color-mode=dark] .ms-xxl-2,html[data-netbox-color-mode=light] .ms-xxl-2{margin-left:.5rem!important}html .ms-xxl-3,html[data-netbox-color-mode=dark] .ms-xxl-3,html[data-netbox-color-mode=light] .ms-xxl-3{margin-left:1rem!important}html .ms-xxl-4,html[data-netbox-color-mode=dark] .ms-xxl-4,html[data-netbox-color-mode=light] .ms-xxl-4{margin-left:1.5rem!important}html .ms-xxl-5,html[data-netbox-color-mode=dark] .ms-xxl-5,html[data-netbox-color-mode=light] .ms-xxl-5{margin-left:3rem!important}html .ms-xxl-auto,html[data-netbox-color-mode=dark] .ms-xxl-auto,html[data-netbox-color-mode=light] .ms-xxl-auto{margin-left:auto!important}html .p-xxl-0,html[data-netbox-color-mode=dark] .p-xxl-0,html[data-netbox-color-mode=light] .p-xxl-0{padding:0!important}html .p-xxl-1,html[data-netbox-color-mode=dark] .p-xxl-1,html[data-netbox-color-mode=light] .p-xxl-1{padding:.25rem!important}html .p-xxl-2,html[data-netbox-color-mode=dark] .p-xxl-2,html[data-netbox-color-mode=light] .p-xxl-2{padding:.5rem!important}html .p-xxl-3,html[data-netbox-color-mode=dark] .p-xxl-3,html[data-netbox-color-mode=light] .p-xxl-3{padding:1rem!important}html .p-xxl-4,html[data-netbox-color-mode=dark] .p-xxl-4,html[data-netbox-color-mode=light] .p-xxl-4{padding:1.5rem!important}html .p-xxl-5,html[data-netbox-color-mode=dark] .p-xxl-5,html[data-netbox-color-mode=light] .p-xxl-5{padding:3rem!important}html .px-xxl-0,html[data-netbox-color-mode=dark] .px-xxl-0,html[data-netbox-color-mode=light] .px-xxl-0{padding-right:0!important;padding-left:0!important}html .px-xxl-1,html[data-netbox-color-mode=dark] .px-xxl-1,html[data-netbox-color-mode=light] .px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-xxl-2,html[data-netbox-color-mode=dark] .px-xxl-2,html[data-netbox-color-mode=light] .px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-xxl-3,html[data-netbox-color-mode=dark] .px-xxl-3,html[data-netbox-color-mode=light] .px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}html .px-xxl-4,html[data-netbox-color-mode=dark] .px-xxl-4,html[data-netbox-color-mode=light] .px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-xxl-5,html[data-netbox-color-mode=dark] .px-xxl-5,html[data-netbox-color-mode=light] .px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}html .py-xxl-0,html[data-netbox-color-mode=dark] .py-xxl-0,html[data-netbox-color-mode=light] .py-xxl-0{padding-top:0!important;padding-bottom:0!important}html .py-xxl-1,html[data-netbox-color-mode=dark] .py-xxl-1,html[data-netbox-color-mode=light] .py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-xxl-2,html[data-netbox-color-mode=dark] .py-xxl-2,html[data-netbox-color-mode=light] .py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-xxl-3,html[data-netbox-color-mode=dark] .py-xxl-3,html[data-netbox-color-mode=light] .py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-xxl-4,html[data-netbox-color-mode=dark] .py-xxl-4,html[data-netbox-color-mode=light] .py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-xxl-5,html[data-netbox-color-mode=dark] .py-xxl-5,html[data-netbox-color-mode=light] .py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-xxl-0,html[data-netbox-color-mode=dark] .pt-xxl-0,html[data-netbox-color-mode=light] .pt-xxl-0{padding-top:0!important}html .pt-xxl-1,html[data-netbox-color-mode=dark] .pt-xxl-1,html[data-netbox-color-mode=light] .pt-xxl-1{padding-top:.25rem!important}html .pt-xxl-2,html[data-netbox-color-mode=dark] .pt-xxl-2,html[data-netbox-color-mode=light] .pt-xxl-2{padding-top:.5rem!important}html .pt-xxl-3,html[data-netbox-color-mode=dark] .pt-xxl-3,html[data-netbox-color-mode=light] .pt-xxl-3{padding-top:1rem!important}html .pt-xxl-4,html[data-netbox-color-mode=dark] .pt-xxl-4,html[data-netbox-color-mode=light] .pt-xxl-4{padding-top:1.5rem!important}html .pt-xxl-5,html[data-netbox-color-mode=dark] .pt-xxl-5,html[data-netbox-color-mode=light] .pt-xxl-5{padding-top:3rem!important}html .pe-xxl-0,html[data-netbox-color-mode=dark] .pe-xxl-0,html[data-netbox-color-mode=light] .pe-xxl-0{padding-right:0!important}html .pe-xxl-1,html[data-netbox-color-mode=dark] .pe-xxl-1,html[data-netbox-color-mode=light] .pe-xxl-1{padding-right:.25rem!important}html .pe-xxl-2,html[data-netbox-color-mode=dark] .pe-xxl-2,html[data-netbox-color-mode=light] .pe-xxl-2{padding-right:.5rem!important}html .pe-xxl-3,html[data-netbox-color-mode=dark] .pe-xxl-3,html[data-netbox-color-mode=light] .pe-xxl-3{padding-right:1rem!important}html .pe-xxl-4,html[data-netbox-color-mode=dark] .pe-xxl-4,html[data-netbox-color-mode=light] .pe-xxl-4{padding-right:1.5rem!important}html .pe-xxl-5,html[data-netbox-color-mode=dark] .pe-xxl-5,html[data-netbox-color-mode=light] .pe-xxl-5{padding-right:3rem!important}html .pb-xxl-0,html[data-netbox-color-mode=dark] .pb-xxl-0,html[data-netbox-color-mode=light] .pb-xxl-0{padding-bottom:0!important}html .pb-xxl-1,html[data-netbox-color-mode=dark] .pb-xxl-1,html[data-netbox-color-mode=light] .pb-xxl-1{padding-bottom:.25rem!important}html .pb-xxl-2,html[data-netbox-color-mode=dark] .pb-xxl-2,html[data-netbox-color-mode=light] .pb-xxl-2{padding-bottom:.5rem!important}html .pb-xxl-3,html[data-netbox-color-mode=dark] .pb-xxl-3,html[data-netbox-color-mode=light] .pb-xxl-3{padding-bottom:1rem!important}html .pb-xxl-4,html[data-netbox-color-mode=dark] .pb-xxl-4,html[data-netbox-color-mode=light] .pb-xxl-4{padding-bottom:1.5rem!important}html .pb-xxl-5,html[data-netbox-color-mode=dark] .pb-xxl-5,html[data-netbox-color-mode=light] .pb-xxl-5{padding-bottom:3rem!important}html .ps-xxl-0,html[data-netbox-color-mode=dark] .ps-xxl-0,html[data-netbox-color-mode=light] .ps-xxl-0{padding-left:0!important}html .ps-xxl-1,html[data-netbox-color-mode=dark] .ps-xxl-1,html[data-netbox-color-mode=light] .ps-xxl-1{padding-left:.25rem!important}html .ps-xxl-2,html[data-netbox-color-mode=dark] .ps-xxl-2,html[data-netbox-color-mode=light] .ps-xxl-2{padding-left:.5rem!important}html .ps-xxl-3,html[data-netbox-color-mode=dark] .ps-xxl-3,html[data-netbox-color-mode=light] .ps-xxl-3{padding-left:1rem!important}html .ps-xxl-4,html[data-netbox-color-mode=dark] .ps-xxl-4,html[data-netbox-color-mode=light] .ps-xxl-4{padding-left:1.5rem!important}html .ps-xxl-5,html[data-netbox-color-mode=dark] .ps-xxl-5,html[data-netbox-color-mode=light] .ps-xxl-5{padding-left:3rem!important}html .text-xxl-start,html[data-netbox-color-mode=dark] .text-xxl-start,html[data-netbox-color-mode=light] .text-xxl-start{text-align:left!important}html .text-xxl-end,html[data-netbox-color-mode=dark] .text-xxl-end,html[data-netbox-color-mode=light] .text-xxl-end{text-align:right!important}html .text-xxl-center,html[data-netbox-color-mode=dark] .text-xxl-center,html[data-netbox-color-mode=light] .text-xxl-center{text-align:center!important}}@media print and (min-width: 1200px){html .fs-1,html[data-netbox-color-mode=dark] .fs-1,html[data-netbox-color-mode=light] .fs-1{font-size:2.5rem!important}html .fs-2,html[data-netbox-color-mode=dark] .fs-2,html[data-netbox-color-mode=light] .fs-2{font-size:2rem!important}html .fs-3,html[data-netbox-color-mode=dark] .fs-3,html[data-netbox-color-mode=light] .fs-3{font-size:1.75rem!important}html .fs-4,html[data-netbox-color-mode=dark] .fs-4,html[data-netbox-color-mode=light] .fs-4{font-size:1.5rem!important}}@media print{html .d-print-inline,html[data-netbox-color-mode=dark] .d-print-inline,html[data-netbox-color-mode=light] .d-print-inline{display:inline!important}html .d-print-inline-block,html[data-netbox-color-mode=dark] .d-print-inline-block,html[data-netbox-color-mode=light] .d-print-inline-block{display:inline-block!important}html .d-print-block,html[data-netbox-color-mode=dark] .d-print-block,html[data-netbox-color-mode=light] .d-print-block{display:block!important}html .d-print-grid,html[data-netbox-color-mode=dark] .d-print-grid,html[data-netbox-color-mode=light] .d-print-grid{display:grid!important}html .d-print-table,html[data-netbox-color-mode=dark] .d-print-table,html[data-netbox-color-mode=light] .d-print-table{display:table!important}html .d-print-table-row,html[data-netbox-color-mode=dark] .d-print-table-row,html[data-netbox-color-mode=light] .d-print-table-row{display:table-row!important}html .d-print-table-cell,html[data-netbox-color-mode=dark] .d-print-table-cell,html[data-netbox-color-mode=light] .d-print-table-cell{display:table-cell!important}html .d-print-flex,html[data-netbox-color-mode=dark] .d-print-flex,html[data-netbox-color-mode=light] .d-print-flex{display:flex!important}html .d-print-inline-flex,html[data-netbox-color-mode=dark] .d-print-inline-flex,html[data-netbox-color-mode=light] .d-print-inline-flex{display:inline-flex!important}html .d-print-none,html[data-netbox-color-mode=dark] .d-print-none,html[data-netbox-color-mode=light] .d-print-none{display:none!important}}@media print{html :root,html[data-netbox-color-mode=dark] :root,html[data-netbox-color-mode=light] :root{--nbx-select-content-bg: #fff;--nbx-select-option-selected-bg: #dee2e6;--nbx-select-option-hover-bg: #0d6efd;--nbx-select-option-hover-color: #fff;--nbx-select-placeholder-color: #adb5bd;--nbx-select-value-color: #fff}html :root[data-netbox-color-mode=dark],html[data-netbox-color-mode=dark] :root[data-netbox-color-mode=dark],html[data-netbox-color-mode=light] :root[data-netbox-color-mode=dark]{--nbx-select-content-bg: #212529;--nbx-select-option-selected-bg: #adb5bd;--nbx-select-option-hover-bg: #9ec5fe;--nbx-select-option-hover-color: #000;--nbx-select-placeholder-color: #495057;--nbx-select-value-color: #000}}@media print{html .ss-main,html[data-netbox-color-mode=dark] .ss-main,html[data-netbox-color-mode=light] .ss-main{position:relative;display:inline-block;user-select:none;color:#212529;width:100%}html .ss-main .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected,html[data-netbox-color-mode=light] .ss-main .ss-single-selected{display:flex;cursor:pointer;width:100%;height:calc(1.5em + (.75rem + 2px));padding:.75rem;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}html .ss-main .ss-single-selected.ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-single-selected.ss-disabled{background-color:#ced4da;cursor:not-allowed}html .ss-main .ss-single-selected.ss-open-above,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-open-above,html[data-netbox-color-mode=light] .ss-main .ss-single-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}html .ss-main .ss-single-selected.ss-open-below,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-open-below,html[data-netbox-color-mode=light] .ss-main .ss-single-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}html .ss-main .ss-single-selected .placeholder,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .placeholder{display:flex;flex:1 1 100%;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;width:calc(100% - 30px);line-height:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html .ss-main .ss-single-selected .placeholder *,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder *,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .placeholder *{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}html .ss-main .ss-single-selected .placeholder .ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder .ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .placeholder .ss-disabled{color:#6c757d}html .ss-main .ss-single-selected .ss-deselect,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-deselect,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-deselect{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem;font-weight:bold}html .ss-main .ss-single-selected .ss-deselect.ss-hide,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-deselect.ss-hide,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-deselect.ss-hide{display:none}html .ss-main .ss-single-selected .ss-arrow,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-arrow{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem}html .ss-main .ss-single-selected .ss-arrow span,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-arrow span{border:solid #212529;border-width:0 2px 2px 0;display:inline-block;padding:3px;transition:transform .2s,margin .2s}html .ss-main .ss-single-selected .ss-arrow span.arrow-up,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span.arrow-up,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-arrow span.arrow-up{transform:rotate(-135deg);margin:3px 0 0}html .ss-main .ss-single-selected .ss-arrow span.arrow-down,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span.arrow-down,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-arrow span.arrow-down{transform:rotate(45deg);margin:-3px 0 0}html .ss-main .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected{display:flex;flex-direction:row;cursor:pointer;min-height:calc(1.5em + (.75rem + 2px));width:100%;padding:0 0 0 3px;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}html .ss-main .ss-multi-selected.ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-disabled{background-color:#ced4da;cursor:not-allowed}html .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled{color:#212529}html .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete{cursor:not-allowed}html .ss-main .ss-multi-selected.ss-open-above,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-open-above,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}html .ss-main .ss-multi-selected.ss-open-below,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-open-below,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}html .ss-main .ss-multi-selected .ss-values,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values{display:flex;flex-wrap:wrap;justify-content:flex-start;flex:1 1 100%;width:calc(100% - 30px)}html .ss-main .ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-disabled{display:flex;padding:4px 5px;margin:2px 0;line-height:1em;align-items:center;width:100%;color:#6c757d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes scaleOut{0%{transform:scale(1);opacity:1}to{transform:scale(0);opacity:0}}html .ss-main .ss-multi-selected .ss-values .ss-value,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value{display:flex;user-select:none;align-items:center;font-size:12px;padding:3px 5px;margin:3px 5px 3px 0;color:#fff;background-color:#0d6efd;border-radius:.375rem;animation-name:scaleIn;animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:both}html .ss-main .ss-multi-selected .ss-values .ss-value.ss-out,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value.ss-out,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value.ss-out{animation-name:scaleOut;animation-duration:.2s;animation-timing-function:ease-out}html .ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete{margin:0 0 0 5px;cursor:pointer}html .ss-main .ss-multi-selected .ss-add,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add{display:flex;flex:0 1 3px;margin:9px 12px 0 5px}html .ss-main .ss-multi-selected .ss-add .ss-plus,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add .ss-plus{display:flex;justify-content:center;align-items:center;background:#212529;position:relative;height:10px;width:2px;transition:transform .2s}html .ss-main .ss-multi-selected .ss-add .ss-plus:after,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus:after,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add .ss-plus:after{background:#212529;content:"";position:absolute;height:2px;width:10px;left:-4px;top:4px}html .ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross{transform:rotate(45deg)}}@media print{html .ss-content,html[data-netbox-color-mode=dark] .ss-content,html[data-netbox-color-mode=light] .ss-content{position:absolute;width:100%;margin:-1px 0 0;box-sizing:border-box;border:solid 1px #ced4da;z-index:1010;background-color:#fff;transform-origin:center top;transition:transform .2s,opacity .2s;opacity:0;transform:scaleY(0)}html .ss-content.ss-open,html[data-netbox-color-mode=dark] .ss-content.ss-open,html[data-netbox-color-mode=light] .ss-content.ss-open{display:block;opacity:1;transform:scaleY(1)}html .ss-content .ss-search,html[data-netbox-color-mode=dark] .ss-content .ss-search,html[data-netbox-color-mode=light] .ss-content .ss-search{display:flex;flex-direction:row;padding:.75rem}html .ss-content .ss-search.ss-hide,html[data-netbox-color-mode=dark] .ss-content .ss-search.ss-hide,html[data-netbox-color-mode=light] .ss-content .ss-search.ss-hide{height:0px;opacity:0;padding:0;margin:0}html .ss-content .ss-search.ss-hide input,html[data-netbox-color-mode=dark] .ss-content .ss-search.ss-hide input,html[data-netbox-color-mode=light] .ss-content .ss-search.ss-hide input{height:0px;opacity:0;padding:0;margin:0}html .ss-content .ss-search input,html[data-netbox-color-mode=dark] .ss-content .ss-search input,html[data-netbox-color-mode=light] .ss-content .ss-search input{display:inline-flex;font-size:inherit;line-height:inherit;flex:1 1 auto;width:100%;min-width:0px;height:30px;padding:.75rem;margin:0;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;text-align:left;box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-appearance:textfield}html .ss-content .ss-search input::placeholder,html[data-netbox-color-mode=dark] .ss-content .ss-search input::placeholder,html[data-netbox-color-mode=light] .ss-content .ss-search input::placeholder{color:#adb5bd;vertical-align:middle}html .ss-content .ss-search input:focus,html[data-netbox-color-mode=dark] .ss-content .ss-search input:focus,html[data-netbox-color-mode=light] .ss-content .ss-search input:focus{box-shadow:0 0 5px #0d6efd}html .ss-content .ss-search .ss-addable,html[data-netbox-color-mode=dark] .ss-content .ss-search .ss-addable,html[data-netbox-color-mode=light] .ss-content .ss-search .ss-addable{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;font-size:22px;font-weight:bold;flex:0 0 30px;height:30px;margin:0 0 0 8px;border:1px solid #ced4da;border-radius:.375rem;box-sizing:border-box}html .ss-content .ss-addable,html[data-netbox-color-mode=dark] .ss-content .ss-addable,html[data-netbox-color-mode=light] .ss-content .ss-addable{padding-top:0}html .ss-content .ss-list,html[data-netbox-color-mode=dark] .ss-content .ss-list,html[data-netbox-color-mode=light] .ss-content .ss-list{max-height:200px;overflow-x:hidden;overflow-y:auto;text-align:left}html .ss-content .ss-list .ss-optgroup .ss-optgroup-label,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup .ss-optgroup-label,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-optgroup .ss-optgroup-label{padding:6px 10px;font-weight:bold}html .ss-content .ss-list .ss-optgroup .ss-option,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup .ss-option,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-optgroup .ss-option{padding:6px 6px 6px 25px}html .ss-content .ss-list .ss-optgroup-label-selectable,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup-label-selectable,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-optgroup-label-selectable{cursor:pointer}html .ss-content .ss-list .ss-optgroup-label-selectable:hover,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup-label-selectable:hover,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-optgroup-label-selectable:hover{color:#fff;background-color:#0d6efd}html .ss-content .ss-list .ss-option,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option{padding:6px 10px;cursor:pointer;user-select:none}html .ss-content .ss-list .ss-option *,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option *,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option *{display:inline-block}html .ss-content .ss-list .ss-option:hover,html .ss-content .ss-list .ss-option.ss-highlighted,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-highlighted,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option.ss-highlighted{color:#fff;background-color:#0d6efd}html .ss-content .ss-list .ss-option.ss-disabled,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-disabled,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option.ss-disabled{cursor:not-allowed;color:#6c757d;background-color:#fff}html .ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected{color:#212529;background-color:#0d6efd1a}html .ss-content .ss-list .ss-option.ss-hide,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-hide,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option.ss-hide{display:none}html .ss-content .ss-list .ss-option .ss-search-highlight,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option .ss-search-highlight,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option .ss-search-highlight{background-color:#ffc107}}@media print{html .ss-main,html[data-netbox-color-mode=dark] .ss-main,html[data-netbox-color-mode=light] .ss-main{color:#212529}html .ss-main.is-invalid .ss-single-selected,html .ss-main.is-invalid .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main.is-invalid .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main.is-invalid .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main.is-invalid .ss-single-selected,html[data-netbox-color-mode=light] .ss-main.is-invalid .ss-multi-selected{border-color:#dc3545}html .ss-main.is-valid .ss-single-selected,html .ss-main.is-valid .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main.is-valid .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main.is-valid .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main.is-valid .ss-single-selected,html[data-netbox-color-mode=light] .ss-main.is-valid .ss-multi-selected{border-color:#198754}html .ss-main .ss-single-selected,html .ss-main .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main .ss-single-selected,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected{padding:.375rem .75rem;background-color:#fff;border:1px solid #e9ecef}html .ss-main .ss-single-selected[disabled],html .ss-main .ss-multi-selected[disabled],html[data-netbox-color-mode=dark] .ss-main .ss-single-selected[disabled],html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected[disabled],html[data-netbox-color-mode=light] .ss-main .ss-single-selected[disabled],html[data-netbox-color-mode=light] .ss-main .ss-multi-selected[disabled]{color:#6c757d;background-color:#e9ecef}html .ss-main div.ss-multi-selected .ss-values .ss-disabled,html .ss-main div.ss-single-selected span.placeholder .ss-disabled,html[data-netbox-color-mode=dark] .ss-main div.ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main div.ss-single-selected span.placeholder .ss-disabled,html[data-netbox-color-mode=light] .ss-main div.ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=light] .ss-main div.ss-single-selected span.placeholder .ss-disabled{color:var(--nbx-select-placeholder-color)}html .ss-main .ss-single-selected span.ss-arrow span.arrow-down,html .ss-main .ss-single-selected span.ss-arrow span.arrow-up,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.ss-arrow span.arrow-down,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.ss-arrow span.arrow-up,html[data-netbox-color-mode=light] .ss-main .ss-single-selected span.ss-arrow span.arrow-down,html[data-netbox-color-mode=light] .ss-main .ss-single-selected span.ss-arrow span.arrow-up{border-color:currentColor;color:#6c757d}html .ss-main .ss-single-selected .placeholder .depth,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder .depth,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .placeholder .depth{display:none}html .ss-main .ss-single-selected span.placeholder>*,html .ss-main .ss-single-selected span.placeholder,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.placeholder>*,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.placeholder,html[data-netbox-color-mode=light] .ss-main .ss-single-selected span.placeholder>*,html[data-netbox-color-mode=light] .ss-main .ss-single-selected span.placeholder{line-height:1.5}html .ss-main .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected{align-items:center;padding-right:.75rem;padding-left:.75rem}html .ss-main .ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-disabled{padding:4px 0}html .ss-main .ss-multi-selected .ss-values .ss-value,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value{color:var(--nbx-select-value-color);border-radius:.375rem}html .ss-main .ss-multi-selected .ss-values .ss-value .depth,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value .depth,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value .depth{display:none}html .ss-main .ss-multi-selected .ss-add,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add{margin:0 .75rem}html .ss-main .ss-content,html[data-netbox-color-mode=dark] .ss-main .ss-content,html[data-netbox-color-mode=light] .ss-main .ss-content{background-color:var(--nbx-select-content-bg);border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html .ss-main .ss-content .ss-list .ss-option.ss-option-selected,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-option-selected,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option.ss-option-selected{color:#212529;background-color:var(--nbx-select-option-selected-bg)}html .ss-main .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option:hover{color:var(--nbx-select-option-hover-color);background-color:var(--nbx-select-option-hover-bg)}html .ss-main .ss-content .ss-list .ss-option:last-child,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option:last-child,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option:last-child{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html .ss-main .ss-content .ss-list .ss-option.ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option.ss-disabled{background-color:unset}html .ss-main .ss-content .ss-list .ss-option.ss-disabled:hover,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-disabled:hover,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option.ss-disabled:hover{color:#6c757d}html .ss-main .ss-content .ss-list .ss-option .depth,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option .depth,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option .depth{opacity:.3}html .ss-main .ss-content .ss-list::-webkit-scrollbar,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list::-webkit-scrollbar{right:0;width:4px}html .ss-main .ss-content .ss-list::-webkit-scrollbar:hover,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar:hover,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list::-webkit-scrollbar:hover{opacity:.8}html .ss-main .ss-content .ss-list::-webkit-scrollbar-track,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar-track,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list::-webkit-scrollbar-track{background:transparent}html .ss-main .ss-content .ss-list::-webkit-scrollbar-thumb,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar-thumb,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list::-webkit-scrollbar-thumb{right:0;width:2px;background-color:var(--nbx-sidebar-scroll)}html .ss-main .ss-content .ss-search,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-search{padding-right:.5rem}html .ss-main .ss-content .ss-search button,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search button,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-search button{margin-left:.75rem}html .ss-main .ss-content .ss-search input[type=search],html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search input[type=search],html[data-netbox-color-mode=light] .ss-main .ss-content .ss-search input[type=search]{color:#212529;background-color:#fff;border:1px solid #e9ecef}html .ss-main .ss-content .ss-search input[type=search]:focus,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search input[type=search]:focus,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-search input[type=search]:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .sidenav,html[data-netbox-color-mode=dark] .sidenav,html[data-netbox-color-mode=light] .sidenav{position:fixed;top:0;bottom:0;left:0;z-index:1050;display:block;width:100%;max-width:3rem;padding-top:0;padding-right:0;padding-left:0;background-color:var(--nbx-sidebar-bg);border-right:1px solid #ced4da;transition:all .1s ease-in-out}}@media print and (max-width: 991.98px){html .sidenav,html[data-netbox-color-mode=dark] .sidenav,html[data-netbox-color-mode=light] .sidenav{transform:translate(-3rem)}html .sidenav+.content-container[class],html[data-netbox-color-mode=dark] .sidenav+.content-container[class],html[data-netbox-color-mode=light] .sidenav+.content-container[class]{margin-left:0}html .sidenav .profile-button-container[class],html[data-netbox-color-mode=dark] .sidenav .profile-button-container[class],html[data-netbox-color-mode=light] .sidenav .profile-button-container[class]{display:block}}@media print{html .sidenav .profile-button-container,html[data-netbox-color-mode=dark] .sidenav .profile-button-container,html[data-netbox-color-mode=light] .sidenav .profile-button-container{display:none;padding:.5rem 1rem}}@media print{html .sidenav+.content-container,html[data-netbox-color-mode=dark] .sidenav+.content-container,html[data-netbox-color-mode=light] .sidenav+.content-container{margin-left:3rem;transition:all .1s ease-in-out}}@media print{html .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] .sidenav .sidenav-brand{margin-right:0;transition:opacity .1s ease-in-out}}@media print{html .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] .sidenav .sidenav-brand-icon{transition:opacity .1s ease-in-out}}@media print{html .sidenav .sidenav-inner,html[data-netbox-color-mode=dark] .sidenav .sidenav-inner,html[data-netbox-color-mode=light] .sidenav .sidenav-inner{padding-right:1.5rem;padding-left:1.5rem}}@media print and (min-width: 768px){html .sidenav .sidenav-inner,html[data-netbox-color-mode=dark] .sidenav .sidenav-inner,html[data-netbox-color-mode=light] .sidenav .sidenav-inner{padding-right:0;padding-left:0}}@media print{html .sidenav .sidenav-brand-img,html .sidenav .sidenav-brand>img,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand-img,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand>img,html[data-netbox-color-mode=light] .sidenav .sidenav-brand-img,html[data-netbox-color-mode=light] .sidenav .sidenav-brand>img{max-width:100%;max-height:calc(16rem - 1rem)}}@media print{html .sidenav .navbar-heading,html[data-netbox-color-mode=dark] .sidenav .navbar-heading,html[data-netbox-color-mode=light] .sidenav .navbar-heading{padding-top:.5rem;padding-bottom:.5rem;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em}}@media print{html .sidenav .sidenav-header,html[data-netbox-color-mode=dark] .sidenav .sidenav-header,html[data-netbox-color-mode=light] .sidenav .sidenav-header{position:relative;display:flex;align-items:center;justify-content:space-between;height:78px;padding:1rem;transition:all .1s ease-in-out}}@media print{html .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] .sidenav .sidenav-toggle,html[data-netbox-color-mode=light] .sidenav .sidenav-toggle{position:absolute;display:inline-block;opacity:0;transition:opacity 10ms ease-in-out;transition-delay:.1s}}@media print{html .sidenav .sidenav-collapse,html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse,html[data-netbox-color-mode=light] .sidenav .sidenav-collapse{display:flex;flex:1;flex-direction:column;align-items:stretch;padding-right:1.5rem;padding-left:1.5rem;margin-right:-1.5rem;margin-left:-1.5rem}}@media print{html .sidenav .sidenav-collapse>*,html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse>*,html[data-netbox-color-mode=light] .sidenav .sidenav-collapse>*{min-width:100%}}@media print and (min-width: 768px){html .sidenav .sidenav-collapse,html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse,html[data-netbox-color-mode=light] .sidenav .sidenav-collapse{margin-right:0;margin-left:0}}@media print{html .sidenav .nav-group-header,html[data-netbox-color-mode=dark] .sidenav .nav-group-header,html[data-netbox-color-mode=light] .sidenav .nav-group-header{padding:.25rem 1rem;margin-top:.5rem;margin-bottom:0}}@media print{html .sidenav .nav .nav-item,html[data-netbox-color-mode=dark] .sidenav .nav .nav-item,html[data-netbox-color-mode=light] .sidenav .nav .nav-item{display:flex;align-items:center;justify-content:space-between;width:100%}}@media print{html .sidenav .nav .nav-item.no-buttons,html[data-netbox-color-mode=dark] .sidenav .nav .nav-item.no-buttons,html[data-netbox-color-mode=light] .sidenav .nav .nav-item.no-buttons{padding-right:5rem}}@media print{html .sidenav .collapse .nav .nav-item .nav-link,html[data-netbox-color-mode=dark] .sidenav .collapse .nav .nav-item .nav-link,html[data-netbox-color-mode=light] .sidenav .collapse .nav .nav-item .nav-link{width:100%;padding:.25rem .25rem .25rem 1rem;margin-top:0;margin-bottom:0;border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}}@media print{html .sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon,html[data-netbox-color-mode=dark] .sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon,html[data-netbox-color-mode=light] .sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon{width:1rem;text-align:center;transition:all .1s ease-in-out}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle],html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle],html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]{width:unset;height:100%;padding-left:.5rem;font-weight:700;color:var(--nbx-sidenav-parent-color)}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{color:#343a40;background:#cfe2ff}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after{display:inline-block;margin-left:auto;font-family:"Material Design Icons";font-style:normal;font-weight:700;font-variant:normal;color:#6c757d;text-rendering:auto;-webkit-font-smoothing:antialiased;content:"\f0142";transition:all .1s ease-in-out}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after{color:#343a40}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after{color:#0d6efd;transform:rotate(90deg)}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text{padding-left:.25rem;transition:all .1s ease-in-out}}@media print{html .sidenav .navbar-nav,html[data-netbox-color-mode=dark] .sidenav .navbar-nav,html[data-netbox-color-mode=light] .sidenav .navbar-nav{flex-direction:column;margin-right:-1.5rem;margin-left:-1.5rem}}@media print{html .sidenav .navbar-nav .nav-item,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item{margin-top:2px}}@media print{html .sidenav .navbar-nav .nav-item.disabled,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item.disabled,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item.disabled{cursor:not-allowed;opacity:.8}}@media print{html .sidenav .navbar-nav .nav-item .nav-link,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link{position:relative;display:flex;align-items:center;width:100%;padding:.5rem 1rem;font-size:.875rem;color:var(--nbx-sidenav-link-color);white-space:nowrap;transition:all .1s ease-in-out}}@media print{html .sidenav .navbar-nav .nav-item .nav-link.active,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link.active,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link.active{background-color:var(--nbx-sidebar-link-active-bg)}}@media print{html .sidenav .navbar-nav .nav-item .nav-link:hover:not(.active),html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link:hover:not(.active),html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link:hover:not(.active){color:var(--nbx-body-color);background-color:var(--nbx-sidebar-link-hover-bg)}}@media print{html .sidenav .navbar-nav .nav-item .nav-link>i,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link>i,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link>i{min-width:2rem;font-size:calc(45px / 2);text-align:center}}@media print{html .sidenav .navbar-nav .nav-group-label,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-group-label,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-group-label{display:block;font-size:.75rem;font-weight:700;color:var(--nbx-sidenav-group-color);text-transform:uppercase;white-space:nowrap}}@media print{html body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon{color:var(--nbx-sidenav-pin-color);transform:rotate(90deg)}}@media print and (min-width: 1200px){html body[data-sidenav-pinned] .sidenav+.content-container,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav+.content-container,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav+.content-container{margin-left:16rem}}@media print{html .g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon,html[data-netbox-color-mode=dark] .g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon,html[data-netbox-color-mode=light] .g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon{transform:rotate(0)}}@media print{html body[data-sidenav-show] .sidenav,html body[data-sidenav-pinned] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav{max-width:16rem}}@media print{html body[data-sidenav-show] .sidenav .sidenav-brand,html body[data-sidenav-show] .sidenav .navbar-heading,html body[data-sidenav-pinned] .sidenav .sidenav-brand,html body[data-sidenav-pinned] .sidenav .navbar-heading,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .navbar-heading,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .navbar-heading,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .navbar-heading,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .navbar-heading{display:block}}@media print{html body[data-sidenav-show] .sidenav .sidenav-brand,html body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .sidenav-brand{opacity:1;transform:translate(0)}}@media print{html body[data-sidenav-show] .sidenav .sidenav-brand-icon,html body[data-sidenav-pinned] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .sidenav-brand-icon{position:absolute;opacity:0}}@media print and (max-width: 991.98px){html body[data-sidenav-show] .sidenav,html body[data-sidenav-pinned] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav{transform:translate(0)}}@media print{html body[data-sidenav-hide] .sidenav .sidenav-header,html body[data-sidenav-hidden] .sidenav .sidenav-header,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-header,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-header,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .sidenav-header,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .sidenav-header{padding:.5rem}}@media print{html body[data-sidenav-hide] .sidenav .sidenav-brand,html body[data-sidenav-hidden] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .sidenav-brand{position:absolute;opacity:0}}@media print{html body[data-sidenav-hide] .sidenav .sidenav-brand-icon,html body[data-sidenav-hidden] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .sidenav-brand-icon{opacity:1}}@media print{html body[data-sidenav-hide] .sidenav .sidenav-toggle,html body[data-sidenav-hidden] .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-toggle,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .sidenav-toggle,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .sidenav-toggle{opacity:0;position:absolute;transition:unset;transition-delay:0ms}}@media print{html body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,html body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after{content:""}}@media print{html body[data-sidenav-hide] .sidenav .nav-item .collapse,html body[data-sidenav-hidden] .sidenav .nav-item .collapse,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .nav-item .collapse,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .nav-item .collapse,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .nav-item .collapse,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .nav-item .collapse{display:none}}@media print{html body[data-sidenav-hide] .sidenav .nav-link-text,html body[data-sidenav-hidden] .sidenav .nav-link-text,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .nav-link-text,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .nav-link-text,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .nav-link-text,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .nav-link-text{opacity:0}}@media print{html body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{margin-right:0;margin-left:0;border-radius:unset}}@media print{html body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-brand{display:block}}@media print{html body[data-sidenav-show] .sidenav .nav-item .collapse,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .collapse,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .nav-item .collapse{height:auto;transition:all .1s ease-in-out}}@media print{html body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text{opacity:1}}@media print{html body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon{opacity:0}}@media print and (min-width: 992px){html body[data-sidenav-show] .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-toggle,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-toggle{position:relative;opacity:1}}@media print{html .simplebar-track.simplebar-vertical,html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical,html[data-netbox-color-mode=light] .simplebar-track.simplebar-vertical{right:0;width:6px;background-color:transparent}}@media print{html .simplebar-track.simplebar-vertical .simplebar-scrollbar,html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical .simplebar-scrollbar,html[data-netbox-color-mode=light] .simplebar-track.simplebar-vertical .simplebar-scrollbar{transition:none}}@media print{html .simplebar-track.simplebar-vertical .simplebar-scrollbar:before,html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical .simplebar-scrollbar:before,html[data-netbox-color-mode=light] .simplebar-track.simplebar-vertical .simplebar-scrollbar:before{right:0;width:3px;background:var(--nbx-sidebar-scroll);border-radius:.375rem}}@media print{html .simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before,html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before,html[data-netbox-color-mode=light] .simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before{width:5px}}@media print{html body,html[data-netbox-color-mode=dark] body,html[data-netbox-color-mode=light] body{color:var(--nbx-body-color);background-color:var(--nbx-body-bg);font-size:.875rem}}@media print{html pre,html[data-netbox-color-mode=dark] pre,html[data-netbox-color-mode=light] pre{white-space:pre}}@media print{html small,html .small,html[data-netbox-color-mode=dark] .small,html[data-netbox-color-mode=light] .small,html[data-netbox-color-mode=dark] small,html[data-netbox-color-mode=light] small{font-size:smaller!important}}@media print{html a[type=button],html[data-netbox-color-mode=dark] a[type=button],html[data-netbox-color-mode=light] a[type=button]{-webkit-appearance:unset!important}}@media print{html *[data-href],html[data-netbox-color-mode=dark] *[data-href],html[data-netbox-color-mode=light] *[data-href]{cursor:pointer}}@media print{html .form-control:not([type=file]),html[data-netbox-color-mode=dark] .form-control:not([type=file]),html[data-netbox-color-mode=light] .form-control:not([type=file]){font-size:inherit}}@media print{html .badge,html[data-netbox-color-mode=dark] .badge,html[data-netbox-color-mode=light] .badge{font-size:.75rem}}@media print{html .text-xs,html[data-netbox-color-mode=dark] .text-xs,html[data-netbox-color-mode=light] .text-xs{font-size:.75rem!important;line-height:1.25!important}}@media print{html .border-input,html[data-netbox-color-mode=dark] .border-input,html[data-netbox-color-mode=light] .border-input{border:1px solid #e9ecef!important}}@media print{html .ws-nowrap,html[data-netbox-color-mode=dark] .ws-nowrap,html[data-netbox-color-mode=light] .ws-nowrap{white-space:nowrap!important}}@media print{html table tr .vertical-align,html table td .vertical-align,html[data-netbox-color-mode=dark] table tr .vertical-align,html[data-netbox-color-mode=dark] table td .vertical-align,html[data-netbox-color-mode=light] table tr .vertical-align,html[data-netbox-color-mode=light] table td .vertical-align{vertical-align:middle}}@media print{html .noprint,html[data-netbox-color-mode=dark] .noprint,html[data-netbox-color-mode=light] .noprint{display:none!important;visibility:hidden!important}}@media print{html .printonly,html[data-netbox-color-mode=dark] .printonly,html[data-netbox-color-mode=light] .printonly{display:none!important;visibility:hidden!important}}@media print{html .printonly,html[data-netbox-color-mode=dark] .printonly,html[data-netbox-color-mode=light] .printonly{display:block!important;visibility:visible!important}}@media print{html :root,html[data-netbox-color-mode=dark] :root,html[data-netbox-color-mode=light] :root{--nbx-sidebar-bg: #e9ecef;--nbx-sidebar-scroll: #adb5bd;--nbx-sidebar-link-hover-bg: rgba(108, 117, 125, .15);--nbx-sidebar-link-active-bg: #cfe2ff;--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(0, 0, 0, .25);--nbx-breadcrumb-bg: #e9ecef;--nbx-body-bg: #fff;--nbx-body-color: #343a40;--nbx-pre-bg: #f8f9fa;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(25, 135, 84, .4);--nbx-change-removed: rgba(220, 53, 69, .4);--nbx-cable-node-bg: #f8f9fa;--nbx-cable-node-border-color: #e9ecef;--nbx-cable-termination-bg: #e9ecef;--nbx-cable-termination-border-color: #dee2e6;--nbx-search-filter-border-left-color: #dee2e6;--nbx-color-mode-toggle-color: #0d6efd;--nbx-sidenav-link-color: #343a40;--nbx-sidenav-pin-color: #fd7e14;--nbx-sidenav-parent-color: #343a40;--nbx-sidenav-group-color: #343a40}}@media print{html :root[data-netbox-color-mode=dark],html[data-netbox-color-mode=dark] :root[data-netbox-color-mode=dark],html[data-netbox-color-mode=light] :root[data-netbox-color-mode=dark]{--nbx-sidebar-bg: #212529;--nbx-sidebar-scroll: #495057;--nbx-sidebar-link-active-bg: rgba(110, 168, 254, .25);--nbx-sidebar-link-hover-bg: rgba(173, 181, 189, .15);--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(255, 255, 255, .05);--nbx-breadcrumb-bg: #343a40;--nbx-body-bg: #1b1f22;--nbx-body-color: #f8f9fa;--nbx-pre-bg: #495057;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(117, 183, 152, .4);--nbx-change-removed: rgba(234, 134, 143, .4);--nbx-cable-node-bg: #495057;--nbx-cable-node-border-color: #6c757d;--nbx-cable-termination-bg: #343a40;--nbx-cable-termination-border-color: #495057;--nbx-search-filter-border-left-color: #6c757d;--nbx-color-mode-toggle-color: #ffda6a;--nbx-sidenav-link-color: #e9ecef;--nbx-sidenav-pin-color: #ffc107;--nbx-sidenav-parent-color: #e9ecef;--nbx-sidenav-group-color: #6c757d}}@media print{html .bg-primary button.btn-close,html[data-netbox-color-mode=dark] .bg-primary button.btn-close,html[data-netbox-color-mode=light] .bg-primary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f496e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-primary,html[data-netbox-color-mode=dark] .btn.btn-ghost-primary,html[data-netbox-color-mode=light] .btn.btn-ghost-primary{color:#337ab7}}@media print{html .btn.btn-ghost-primary:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-primary:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-primary:hover{background-color:#337ab71f}}@media print{html .alert.alert-primary a:not(.btn),html .table-primary a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-primary a:not(.btn),html[data-netbox-color-mode=dark] .table-primary a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-primary a:not(.btn),html[data-netbox-color-mode=light] .table-primary a:not(.btn){font-weight:700;color:#1f496e}}@media print{html .alert.alert-primary .btn:not([class*=btn-outline]),html .table-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-primary .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-primary a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-primary a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-primary a:not(.btn){font-weight:700;color:#adcae2}}@media print{html .badge.bg-primary,html .toast.bg-primary,html .toast-header.bg-primary,html .progress-bar.bg-primary,html[data-netbox-color-mode=dark] .badge.bg-primary,html[data-netbox-color-mode=dark] .toast.bg-primary,html[data-netbox-color-mode=dark] .toast-header.bg-primary,html[data-netbox-color-mode=dark] .progress-bar.bg-primary,html[data-netbox-color-mode=light] .badge.bg-primary,html[data-netbox-color-mode=light] .toast.bg-primary,html[data-netbox-color-mode=light] .toast-header.bg-primary,html[data-netbox-color-mode=light] .progress-bar.bg-primary{color:#fff}}@media print{html .bg-secondary button.btn-close,html[data-netbox-color-mode=dark] .bg-secondary button.btn-close,html[data-netbox-color-mode=light] .bg-secondary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2341464b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-secondary,html[data-netbox-color-mode=dark] .btn.btn-ghost-secondary,html[data-netbox-color-mode=light] .btn.btn-ghost-secondary{color:#6c757d}}@media print{html .btn.btn-ghost-secondary:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-secondary:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-secondary:hover{background-color:#6c757d1f}}@media print{html .alert.alert-secondary a:not(.btn),html .table-secondary a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-secondary a:not(.btn),html[data-netbox-color-mode=dark] .table-secondary a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-secondary a:not(.btn),html[data-netbox-color-mode=light] .table-secondary a:not(.btn){font-weight:700;color:#41464b}}@media print{html .alert.alert-secondary .btn:not([class*=btn-outline]),html .table-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-secondary .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-secondary a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-secondary a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-secondary a:not(.btn){font-weight:700;color:#c4c8cb}}@media print{html .badge.bg-secondary,html .toast.bg-secondary,html .toast-header.bg-secondary,html .progress-bar.bg-secondary,html[data-netbox-color-mode=dark] .badge.bg-secondary,html[data-netbox-color-mode=dark] .toast.bg-secondary,html[data-netbox-color-mode=dark] .toast-header.bg-secondary,html[data-netbox-color-mode=dark] .progress-bar.bg-secondary,html[data-netbox-color-mode=light] .badge.bg-secondary,html[data-netbox-color-mode=light] .toast.bg-secondary,html[data-netbox-color-mode=light] .toast-header.bg-secondary,html[data-netbox-color-mode=light] .progress-bar.bg-secondary{color:#fff}}@media print{html .bg-success button.btn-close,html[data-netbox-color-mode=dark] .bg-success button.btn-close,html[data-netbox-color-mode=light] .bg-success button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-success,html[data-netbox-color-mode=dark] .btn.btn-ghost-success,html[data-netbox-color-mode=light] .btn.btn-ghost-success{color:#198754}}@media print{html .btn.btn-ghost-success:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-success:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-success:hover{background-color:#1987541f}}@media print{html .alert.alert-success a:not(.btn),html .table-success a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-success a:not(.btn),html[data-netbox-color-mode=dark] .table-success a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-success a:not(.btn),html[data-netbox-color-mode=light] .table-success a:not(.btn){font-weight:700;color:#0f5132}}@media print{html .alert.alert-success .btn:not([class*=btn-outline]),html .table-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-success .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-success a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-success a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-success a:not(.btn){font-weight:700;color:#a3cfbb}}@media print{html .badge.bg-success,html .toast.bg-success,html .toast-header.bg-success,html .progress-bar.bg-success,html[data-netbox-color-mode=dark] .badge.bg-success,html[data-netbox-color-mode=dark] .toast.bg-success,html[data-netbox-color-mode=dark] .toast-header.bg-success,html[data-netbox-color-mode=dark] .progress-bar.bg-success,html[data-netbox-color-mode=light] .badge.bg-success,html[data-netbox-color-mode=light] .toast.bg-success,html[data-netbox-color-mode=light] .toast-header.bg-success,html[data-netbox-color-mode=light] .progress-bar.bg-success{color:#fff}}@media print{html .bg-info button.btn-close,html[data-netbox-color-mode=dark] .bg-info button.btn-close,html[data-netbox-color-mode=light] .bg-info button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23225660'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-info,html[data-netbox-color-mode=dark] .btn.btn-ghost-info,html[data-netbox-color-mode=light] .btn.btn-ghost-info{color:#54d6f0}}@media print{html .btn.btn-ghost-info:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-info:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-info:hover{background-color:#54d6f01f}}@media print{html .alert.alert-info a:not(.btn),html .table-info a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-info a:not(.btn),html[data-netbox-color-mode=dark] .table-info a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-info a:not(.btn),html[data-netbox-color-mode=light] .table-info a:not(.btn){font-weight:700;color:#225660}}@media print{html .alert.alert-info .btn:not([class*=btn-outline]),html .table-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-info .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-info a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-info a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-info a:not(.btn){font-weight:700;color:#225660}}@media print{html .badge.bg-info,html .toast.bg-info,html .toast-header.bg-info,html .progress-bar.bg-info,html[data-netbox-color-mode=dark] .badge.bg-info,html[data-netbox-color-mode=dark] .toast.bg-info,html[data-netbox-color-mode=dark] .toast-header.bg-info,html[data-netbox-color-mode=dark] .progress-bar.bg-info,html[data-netbox-color-mode=light] .badge.bg-info,html[data-netbox-color-mode=light] .toast.bg-info,html[data-netbox-color-mode=light] .toast-header.bg-info,html[data-netbox-color-mode=light] .progress-bar.bg-info{color:#000}}@media print{html .bg-warning button.btn-close,html[data-netbox-color-mode=dark] .bg-warning button.btn-close,html[data-netbox-color-mode=light] .bg-warning button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-warning,html[data-netbox-color-mode=dark] .btn.btn-ghost-warning,html[data-netbox-color-mode=light] .btn.btn-ghost-warning{color:#ffc107}}@media print{html .btn.btn-ghost-warning:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-warning:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-warning:hover{background-color:#ffc1071f}}@media print{html .alert.alert-warning a:not(.btn),html .table-warning a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-warning a:not(.btn),html[data-netbox-color-mode=dark] .table-warning a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-warning a:not(.btn),html[data-netbox-color-mode=light] .table-warning a:not(.btn){font-weight:700;color:#664d03}}@media print{html .alert.alert-warning .btn:not([class*=btn-outline]),html .table-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-warning .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-warning a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-warning a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-warning a:not(.btn){font-weight:700;color:#664d03}}@media print{html .badge.bg-warning,html .toast.bg-warning,html .toast-header.bg-warning,html .progress-bar.bg-warning,html[data-netbox-color-mode=dark] .badge.bg-warning,html[data-netbox-color-mode=dark] .toast.bg-warning,html[data-netbox-color-mode=dark] .toast-header.bg-warning,html[data-netbox-color-mode=dark] .progress-bar.bg-warning,html[data-netbox-color-mode=light] .badge.bg-warning,html[data-netbox-color-mode=light] .toast.bg-warning,html[data-netbox-color-mode=light] .toast-header.bg-warning,html[data-netbox-color-mode=light] .progress-bar.bg-warning{color:#000}}@media print{html .bg-danger button.btn-close,html[data-netbox-color-mode=dark] .bg-danger button.btn-close,html[data-netbox-color-mode=light] .bg-danger button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-danger,html[data-netbox-color-mode=dark] .btn.btn-ghost-danger,html[data-netbox-color-mode=light] .btn.btn-ghost-danger{color:#dc3545}}@media print{html .btn.btn-ghost-danger:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-danger:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-danger:hover{background-color:#dc35451f}}@media print{html .alert.alert-danger a:not(.btn),html .table-danger a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-danger a:not(.btn),html[data-netbox-color-mode=dark] .table-danger a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-danger a:not(.btn),html[data-netbox-color-mode=light] .table-danger a:not(.btn){font-weight:700;color:#842029}}@media print{html .alert.alert-danger .btn:not([class*=btn-outline]),html .table-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-danger .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-danger a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-danger a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-danger a:not(.btn){font-weight:700;color:#f1aeb5}}@media print{html .badge.bg-danger,html .toast.bg-danger,html .toast-header.bg-danger,html .progress-bar.bg-danger,html[data-netbox-color-mode=dark] .badge.bg-danger,html[data-netbox-color-mode=dark] .toast.bg-danger,html[data-netbox-color-mode=dark] .toast-header.bg-danger,html[data-netbox-color-mode=dark] .progress-bar.bg-danger,html[data-netbox-color-mode=light] .badge.bg-danger,html[data-netbox-color-mode=light] .toast.bg-danger,html[data-netbox-color-mode=light] .toast-header.bg-danger,html[data-netbox-color-mode=light] .progress-bar.bg-danger{color:#fff}}@media print{html .bg-light button.btn-close,html[data-netbox-color-mode=dark] .bg-light button.btn-close,html[data-netbox-color-mode=light] .bg-light button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23636464'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-light,html[data-netbox-color-mode=dark] .btn.btn-ghost-light,html[data-netbox-color-mode=light] .btn.btn-ghost-light{color:#f8f9fa}}@media print{html .btn.btn-ghost-light:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-light:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-light:hover{background-color:#f8f9fa1f}}@media print{html .alert.alert-light a:not(.btn),html .table-light a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-light a:not(.btn),html[data-netbox-color-mode=dark] .table-light a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-light a:not(.btn),html[data-netbox-color-mode=light] .table-light a:not(.btn){font-weight:700;color:#636464}}@media print{html .alert.alert-light .btn:not([class*=btn-outline]),html .table-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-light .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-light a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-light a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-light a:not(.btn){font-weight:700;color:#636464}}@media print{html .badge.bg-light,html .toast.bg-light,html .toast-header.bg-light,html .progress-bar.bg-light,html[data-netbox-color-mode=dark] .badge.bg-light,html[data-netbox-color-mode=dark] .toast.bg-light,html[data-netbox-color-mode=dark] .toast-header.bg-light,html[data-netbox-color-mode=dark] .progress-bar.bg-light,html[data-netbox-color-mode=light] .badge.bg-light,html[data-netbox-color-mode=light] .toast.bg-light,html[data-netbox-color-mode=light] .toast-header.bg-light,html[data-netbox-color-mode=light] .progress-bar.bg-light{color:#000}}@media print{html .bg-dark button.btn-close,html[data-netbox-color-mode=dark] .bg-dark button.btn-close,html[data-netbox-color-mode=light] .bg-dark button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23141619'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-dark,html[data-netbox-color-mode=dark] .btn.btn-ghost-dark,html[data-netbox-color-mode=light] .btn.btn-ghost-dark{color:#212529}}@media print{html .btn.btn-ghost-dark:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-dark:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-dark:hover{background-color:#2125291f}}@media print{html .alert.alert-dark a:not(.btn),html .table-dark a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-dark a:not(.btn),html[data-netbox-color-mode=dark] .table-dark a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-dark a:not(.btn),html[data-netbox-color-mode=light] .table-dark a:not(.btn){font-weight:700;color:#141619}}@media print{html .alert.alert-dark .btn:not([class*=btn-outline]),html .table-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-dark .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-dark a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-dark a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-dark a:not(.btn){font-weight:700;color:#a6a8a9}}@media print{html .badge.bg-dark,html .toast.bg-dark,html .toast-header.bg-dark,html .progress-bar.bg-dark,html[data-netbox-color-mode=dark] .badge.bg-dark,html[data-netbox-color-mode=dark] .toast.bg-dark,html[data-netbox-color-mode=dark] .toast-header.bg-dark,html[data-netbox-color-mode=dark] .progress-bar.bg-dark,html[data-netbox-color-mode=light] .badge.bg-dark,html[data-netbox-color-mode=light] .toast.bg-dark,html[data-netbox-color-mode=light] .toast-header.bg-dark,html[data-netbox-color-mode=light] .progress-bar.bg-dark{color:#fff}}@media print{html .bg-red button.btn-close,html[data-netbox-color-mode=dark] .bg-red button.btn-close,html[data-netbox-color-mode=light] .bg-red button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red,html[data-netbox-color-mode=dark] .btn.btn-ghost-red,html[data-netbox-color-mode=light] .btn.btn-ghost-red{color:#dc3545}}@media print{html .btn.btn-ghost-red:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red:hover{background-color:#dc35451f}}@media print{html .alert.alert-red a:not(.btn),html .table-red a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red a:not(.btn),html[data-netbox-color-mode=dark] .table-red a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red a:not(.btn),html[data-netbox-color-mode=light] .table-red a:not(.btn){font-weight:700;color:#842029}}@media print{html .alert.alert-red .btn:not([class*=btn-outline]),html .table-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red a:not(.btn){font-weight:700;color:#f1aeb5}}@media print{html .badge.bg-red,html .toast.bg-red,html .toast-header.bg-red,html .progress-bar.bg-red,html[data-netbox-color-mode=dark] .badge.bg-red,html[data-netbox-color-mode=dark] .toast.bg-red,html[data-netbox-color-mode=dark] .toast-header.bg-red,html[data-netbox-color-mode=dark] .progress-bar.bg-red,html[data-netbox-color-mode=light] .badge.bg-red,html[data-netbox-color-mode=light] .toast.bg-red,html[data-netbox-color-mode=light] .toast-header.bg-red,html[data-netbox-color-mode=light] .progress-bar.bg-red{color:#fff}}@media print{html .bg-yellow button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow button.btn-close,html[data-netbox-color-mode=light] .bg-yellow button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow{color:#ffc107}}@media print{html .btn.btn-ghost-yellow:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow:hover{background-color:#ffc1071f}}@media print{html .alert.alert-yellow a:not(.btn),html .table-yellow a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow a:not(.btn),html[data-netbox-color-mode=light] .table-yellow a:not(.btn){font-weight:700;color:#664d03}}@media print{html .alert.alert-yellow .btn:not([class*=btn-outline]),html .table-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow a:not(.btn){font-weight:700;color:#664d03}}@media print{html .badge.bg-yellow,html .toast.bg-yellow,html .toast-header.bg-yellow,html .progress-bar.bg-yellow,html[data-netbox-color-mode=dark] .badge.bg-yellow,html[data-netbox-color-mode=dark] .toast.bg-yellow,html[data-netbox-color-mode=dark] .toast-header.bg-yellow,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow,html[data-netbox-color-mode=light] .badge.bg-yellow,html[data-netbox-color-mode=light] .toast.bg-yellow,html[data-netbox-color-mode=light] .toast-header.bg-yellow,html[data-netbox-color-mode=light] .progress-bar.bg-yellow{color:#000}}@media print{html .bg-green button.btn-close,html[data-netbox-color-mode=dark] .bg-green button.btn-close,html[data-netbox-color-mode=light] .bg-green button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green,html[data-netbox-color-mode=dark] .btn.btn-ghost-green,html[data-netbox-color-mode=light] .btn.btn-ghost-green{color:#198754}}@media print{html .btn.btn-ghost-green:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green:hover{background-color:#1987541f}}@media print{html .alert.alert-green a:not(.btn),html .table-green a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green a:not(.btn),html[data-netbox-color-mode=dark] .table-green a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green a:not(.btn),html[data-netbox-color-mode=light] .table-green a:not(.btn){font-weight:700;color:#0f5132}}@media print{html .alert.alert-green .btn:not([class*=btn-outline]),html .table-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green a:not(.btn){font-weight:700;color:#a3cfbb}}@media print{html .badge.bg-green,html .toast.bg-green,html .toast-header.bg-green,html .progress-bar.bg-green,html[data-netbox-color-mode=dark] .badge.bg-green,html[data-netbox-color-mode=dark] .toast.bg-green,html[data-netbox-color-mode=dark] .toast-header.bg-green,html[data-netbox-color-mode=dark] .progress-bar.bg-green,html[data-netbox-color-mode=light] .badge.bg-green,html[data-netbox-color-mode=light] .toast.bg-green,html[data-netbox-color-mode=light] .toast-header.bg-green,html[data-netbox-color-mode=light] .progress-bar.bg-green{color:#fff}}@media print{html .bg-blue button.btn-close,html[data-netbox-color-mode=dark] .bg-blue button.btn-close,html[data-netbox-color-mode=light] .bg-blue button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23084298'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue,html[data-netbox-color-mode=light] .btn.btn-ghost-blue{color:#0d6efd}}@media print{html .btn.btn-ghost-blue:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue:hover{background-color:#0d6efd1f}}@media print{html .alert.alert-blue a:not(.btn),html .table-blue a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue a:not(.btn),html[data-netbox-color-mode=dark] .table-blue a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue a:not(.btn),html[data-netbox-color-mode=light] .table-blue a:not(.btn){font-weight:700;color:#084298}}@media print{html .alert.alert-blue .btn:not([class*=btn-outline]),html .table-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue a:not(.btn){font-weight:700;color:#9ec5fe}}@media print{html .badge.bg-blue,html .toast.bg-blue,html .toast-header.bg-blue,html .progress-bar.bg-blue,html[data-netbox-color-mode=dark] .badge.bg-blue,html[data-netbox-color-mode=dark] .toast.bg-blue,html[data-netbox-color-mode=dark] .toast-header.bg-blue,html[data-netbox-color-mode=dark] .progress-bar.bg-blue,html[data-netbox-color-mode=light] .badge.bg-blue,html[data-netbox-color-mode=light] .toast.bg-blue,html[data-netbox-color-mode=light] .toast-header.bg-blue,html[data-netbox-color-mode=light] .progress-bar.bg-blue{color:#fff}}@media print{html .bg-cyan button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan button.btn-close,html[data-netbox-color-mode=light] .bg-cyan button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23055160'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan{color:#0dcaf0}}@media print{html .btn.btn-ghost-cyan:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan:hover{background-color:#0dcaf01f}}@media print{html .alert.alert-cyan a:not(.btn),html .table-cyan a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan a:not(.btn),html[data-netbox-color-mode=light] .table-cyan a:not(.btn){font-weight:700;color:#055160}}@media print{html .alert.alert-cyan .btn:not([class*=btn-outline]),html .table-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan a:not(.btn){font-weight:700;color:#055160}}@media print{html .badge.bg-cyan,html .toast.bg-cyan,html .toast-header.bg-cyan,html .progress-bar.bg-cyan,html[data-netbox-color-mode=dark] .badge.bg-cyan,html[data-netbox-color-mode=dark] .toast.bg-cyan,html[data-netbox-color-mode=dark] .toast-header.bg-cyan,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan,html[data-netbox-color-mode=light] .badge.bg-cyan,html[data-netbox-color-mode=light] .toast.bg-cyan,html[data-netbox-color-mode=light] .toast-header.bg-cyan,html[data-netbox-color-mode=light] .progress-bar.bg-cyan{color:#000}}@media print{html .bg-indigo button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo button.btn-close,html[data-netbox-color-mode=light] .bg-indigo button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233d0a91'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo{color:#6610f2}}@media print{html .btn.btn-ghost-indigo:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo:hover{background-color:#6610f21f}}@media print{html .alert.alert-indigo a:not(.btn),html .table-indigo a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo a:not(.btn),html[data-netbox-color-mode=light] .table-indigo a:not(.btn){font-weight:700;color:#3d0a91}}@media print{html .alert.alert-indigo .btn:not([class*=btn-outline]),html .table-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo a:not(.btn){font-weight:700;color:#c29ffa}}@media print{html .badge.bg-indigo,html .toast.bg-indigo,html .toast-header.bg-indigo,html .progress-bar.bg-indigo,html[data-netbox-color-mode=dark] .badge.bg-indigo,html[data-netbox-color-mode=dark] .toast.bg-indigo,html[data-netbox-color-mode=dark] .toast-header.bg-indigo,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo,html[data-netbox-color-mode=light] .badge.bg-indigo,html[data-netbox-color-mode=light] .toast.bg-indigo,html[data-netbox-color-mode=light] .toast-header.bg-indigo,html[data-netbox-color-mode=light] .progress-bar.bg-indigo{color:#fff}}@media print{html .bg-purple button.btn-close,html[data-netbox-color-mode=dark] .bg-purple button.btn-close,html[data-netbox-color-mode=light] .bg-purple button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23432874'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple,html[data-netbox-color-mode=light] .btn.btn-ghost-purple{color:#6f42c1}}@media print{html .btn.btn-ghost-purple:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple:hover{background-color:#6f42c11f}}@media print{html .alert.alert-purple a:not(.btn),html .table-purple a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple a:not(.btn),html[data-netbox-color-mode=dark] .table-purple a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple a:not(.btn),html[data-netbox-color-mode=light] .table-purple a:not(.btn){font-weight:700;color:#432874}}@media print{html .alert.alert-purple .btn:not([class*=btn-outline]),html .table-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple a:not(.btn){font-weight:700;color:#c5b3e6}}@media print{html .badge.bg-purple,html .toast.bg-purple,html .toast-header.bg-purple,html .progress-bar.bg-purple,html[data-netbox-color-mode=dark] .badge.bg-purple,html[data-netbox-color-mode=dark] .toast.bg-purple,html[data-netbox-color-mode=dark] .toast-header.bg-purple,html[data-netbox-color-mode=dark] .progress-bar.bg-purple,html[data-netbox-color-mode=light] .badge.bg-purple,html[data-netbox-color-mode=light] .toast.bg-purple,html[data-netbox-color-mode=light] .toast-header.bg-purple,html[data-netbox-color-mode=light] .progress-bar.bg-purple{color:#fff}}@media print{html .bg-pink button.btn-close,html[data-netbox-color-mode=dark] .bg-pink button.btn-close,html[data-netbox-color-mode=light] .bg-pink button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23801f4f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink,html[data-netbox-color-mode=light] .btn.btn-ghost-pink{color:#d63384}}@media print{html .btn.btn-ghost-pink:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink:hover{background-color:#d633841f}}@media print{html .alert.alert-pink a:not(.btn),html .table-pink a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink a:not(.btn),html[data-netbox-color-mode=dark] .table-pink a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink a:not(.btn),html[data-netbox-color-mode=light] .table-pink a:not(.btn){font-weight:700;color:#801f4f}}@media print{html .alert.alert-pink .btn:not([class*=btn-outline]),html .table-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink a:not(.btn){font-weight:700;color:#efadce}}@media print{html .badge.bg-pink,html .toast.bg-pink,html .toast-header.bg-pink,html .progress-bar.bg-pink,html[data-netbox-color-mode=dark] .badge.bg-pink,html[data-netbox-color-mode=dark] .toast.bg-pink,html[data-netbox-color-mode=dark] .toast-header.bg-pink,html[data-netbox-color-mode=dark] .progress-bar.bg-pink,html[data-netbox-color-mode=light] .badge.bg-pink,html[data-netbox-color-mode=light] .toast.bg-pink,html[data-netbox-color-mode=light] .toast-header.bg-pink,html[data-netbox-color-mode=light] .progress-bar.bg-pink{color:#fff}}@media print{html .bg-darker button.btn-close,html[data-netbox-color-mode=dark] .bg-darker button.btn-close,html[data-netbox-color-mode=light] .bg-darker button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23101314'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-darker,html[data-netbox-color-mode=dark] .btn.btn-ghost-darker,html[data-netbox-color-mode=light] .btn.btn-ghost-darker{color:#1b1f22}}@media print{html .btn.btn-ghost-darker:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-darker:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-darker:hover{background-color:#1b1f221f}}@media print{html .alert.alert-darker a:not(.btn),html .table-darker a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-darker a:not(.btn),html[data-netbox-color-mode=dark] .table-darker a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-darker a:not(.btn),html[data-netbox-color-mode=light] .table-darker a:not(.btn){font-weight:700;color:#101314}}@media print{html .alert.alert-darker .btn:not([class*=btn-outline]),html .table-darker .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-darker .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-darker .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-darker .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-darker .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-darker a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-darker a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-darker a:not(.btn){font-weight:700;color:#a4a5a7}}@media print{html .badge.bg-darker,html .toast.bg-darker,html .toast-header.bg-darker,html .progress-bar.bg-darker,html[data-netbox-color-mode=dark] .badge.bg-darker,html[data-netbox-color-mode=dark] .toast.bg-darker,html[data-netbox-color-mode=dark] .toast-header.bg-darker,html[data-netbox-color-mode=dark] .progress-bar.bg-darker,html[data-netbox-color-mode=light] .badge.bg-darker,html[data-netbox-color-mode=light] .toast.bg-darker,html[data-netbox-color-mode=light] .toast-header.bg-darker,html[data-netbox-color-mode=light] .progress-bar.bg-darker{color:#fff}}@media print{html .bg-darkest button.btn-close,html[data-netbox-color-mode=dark] .bg-darkest button.btn-close,html[data-netbox-color-mode=light] .bg-darkest button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230e1011'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-darkest,html[data-netbox-color-mode=dark] .btn.btn-ghost-darkest,html[data-netbox-color-mode=light] .btn.btn-ghost-darkest{color:#171b1d}}@media print{html .btn.btn-ghost-darkest:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-darkest:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-darkest:hover{background-color:#171b1d1f}}@media print{html .alert.alert-darkest a:not(.btn),html .table-darkest a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-darkest a:not(.btn),html[data-netbox-color-mode=dark] .table-darkest a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-darkest a:not(.btn),html[data-netbox-color-mode=light] .table-darkest a:not(.btn){font-weight:700;color:#0e1011}}@media print{html .alert.alert-darkest .btn:not([class*=btn-outline]),html .table-darkest .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-darkest .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-darkest .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-darkest .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-darkest .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-darkest a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-darkest a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-darkest a:not(.btn){font-weight:700;color:#a2a4a5}}@media print{html .badge.bg-darkest,html .toast.bg-darkest,html .toast-header.bg-darkest,html .progress-bar.bg-darkest,html[data-netbox-color-mode=dark] .badge.bg-darkest,html[data-netbox-color-mode=dark] .toast.bg-darkest,html[data-netbox-color-mode=dark] .toast-header.bg-darkest,html[data-netbox-color-mode=dark] .progress-bar.bg-darkest,html[data-netbox-color-mode=light] .badge.bg-darkest,html[data-netbox-color-mode=light] .toast.bg-darkest,html[data-netbox-color-mode=light] .toast-header.bg-darkest,html[data-netbox-color-mode=light] .progress-bar.bg-darkest{color:#fff}}@media print{html .bg-gray button.btn-close,html[data-netbox-color-mode=dark] .bg-gray button.btn-close,html[data-netbox-color-mode=light] .bg-gray button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23525557'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray,html[data-netbox-color-mode=light] .btn.btn-ghost-gray{color:#ced4da}}@media print{html .btn.btn-ghost-gray:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray:hover{background-color:#ced4da1f}}@media print{html .alert.alert-gray a:not(.btn),html .table-gray a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray a:not(.btn),html[data-netbox-color-mode=dark] .table-gray a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray a:not(.btn),html[data-netbox-color-mode=light] .table-gray a:not(.btn){font-weight:700;color:#525557}}@media print{html .alert.alert-gray .btn:not([class*=btn-outline]),html .table-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray a:not(.btn){font-weight:700;color:#525557}}@media print{html .badge.bg-gray,html .toast.bg-gray,html .toast-header.bg-gray,html .progress-bar.bg-gray,html[data-netbox-color-mode=dark] .badge.bg-gray,html[data-netbox-color-mode=dark] .toast.bg-gray,html[data-netbox-color-mode=dark] .toast-header.bg-gray,html[data-netbox-color-mode=dark] .progress-bar.bg-gray,html[data-netbox-color-mode=light] .badge.bg-gray,html[data-netbox-color-mode=light] .toast.bg-gray,html[data-netbox-color-mode=light] .toast-header.bg-gray,html[data-netbox-color-mode=light] .progress-bar.bg-gray{color:#000}}@media print{html .bg-gray-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-100 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23636464'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-100,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-100{color:#f8f9fa}}@media print{html .btn.btn-ghost-gray-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-100:hover{background-color:#f8f9fa1f}}@media print{html .alert.alert-gray-100 a:not(.btn),html .table-gray-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-100 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-100 a:not(.btn){font-weight:700;color:#636464}}@media print{html .alert.alert-gray-100 .btn:not([class*=btn-outline]),html .table-gray-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-100 a:not(.btn){font-weight:700;color:#636464}}@media print{html .badge.bg-gray-100,html .toast.bg-gray-100,html .toast-header.bg-gray-100,html .progress-bar.bg-gray-100,html[data-netbox-color-mode=dark] .badge.bg-gray-100,html[data-netbox-color-mode=dark] .toast.bg-gray-100,html[data-netbox-color-mode=dark] .toast-header.bg-gray-100,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-100,html[data-netbox-color-mode=light] .badge.bg-gray-100,html[data-netbox-color-mode=light] .toast.bg-gray-100,html[data-netbox-color-mode=light] .toast-header.bg-gray-100,html[data-netbox-color-mode=light] .progress-bar.bg-gray-100{color:#000}}@media print{html .bg-gray-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-200 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235d5e60'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-200,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-200{color:#e9ecef}}@media print{html .btn.btn-ghost-gray-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-200:hover{background-color:#e9ecef1f}}@media print{html .alert.alert-gray-200 a:not(.btn),html .table-gray-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-200 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-200 a:not(.btn){font-weight:700;color:#5d5e60}}@media print{html .alert.alert-gray-200 .btn:not([class*=btn-outline]),html .table-gray-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-200 a:not(.btn){font-weight:700;color:#5d5e60}}@media print{html .badge.bg-gray-200,html .toast.bg-gray-200,html .toast-header.bg-gray-200,html .progress-bar.bg-gray-200,html[data-netbox-color-mode=dark] .badge.bg-gray-200,html[data-netbox-color-mode=dark] .toast.bg-gray-200,html[data-netbox-color-mode=dark] .toast-header.bg-gray-200,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-200,html[data-netbox-color-mode=light] .badge.bg-gray-200,html[data-netbox-color-mode=light] .toast.bg-gray-200,html[data-netbox-color-mode=light] .toast-header.bg-gray-200,html[data-netbox-color-mode=light] .progress-bar.bg-gray-200{color:#000}}@media print{html .bg-gray-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-300 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23595a5c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-300,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-300{color:#dee2e6}}@media print{html .btn.btn-ghost-gray-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-300:hover{background-color:#dee2e61f}}@media print{html .alert.alert-gray-300 a:not(.btn),html .table-gray-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-300 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-300 a:not(.btn){font-weight:700;color:#595a5c}}@media print{html .alert.alert-gray-300 .btn:not([class*=btn-outline]),html .table-gray-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-300 a:not(.btn){font-weight:700;color:#595a5c}}@media print{html .badge.bg-gray-300,html .toast.bg-gray-300,html .toast-header.bg-gray-300,html .progress-bar.bg-gray-300,html[data-netbox-color-mode=dark] .badge.bg-gray-300,html[data-netbox-color-mode=dark] .toast.bg-gray-300,html[data-netbox-color-mode=dark] .toast-header.bg-gray-300,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-300,html[data-netbox-color-mode=light] .badge.bg-gray-300,html[data-netbox-color-mode=light] .toast.bg-gray-300,html[data-netbox-color-mode=light] .toast-header.bg-gray-300,html[data-netbox-color-mode=light] .progress-bar.bg-gray-300{color:#000}}@media print{html .bg-gray-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-400 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23525557'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-400,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-400{color:#ced4da}}@media print{html .btn.btn-ghost-gray-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-400:hover{background-color:#ced4da1f}}@media print{html .alert.alert-gray-400 a:not(.btn),html .table-gray-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-400 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-400 a:not(.btn){font-weight:700;color:#525557}}@media print{html .alert.alert-gray-400 .btn:not([class*=btn-outline]),html .table-gray-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-400 a:not(.btn){font-weight:700;color:#525557}}@media print{html .badge.bg-gray-400,html .toast.bg-gray-400,html .toast-header.bg-gray-400,html .progress-bar.bg-gray-400,html[data-netbox-color-mode=dark] .badge.bg-gray-400,html[data-netbox-color-mode=dark] .toast.bg-gray-400,html[data-netbox-color-mode=dark] .toast-header.bg-gray-400,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-400,html[data-netbox-color-mode=light] .badge.bg-gray-400,html[data-netbox-color-mode=light] .toast.bg-gray-400,html[data-netbox-color-mode=light] .toast-header.bg-gray-400,html[data-netbox-color-mode=light] .progress-bar.bg-gray-400{color:#000}}@media print{html .bg-gray-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-500 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23686d71'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-500,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-500{color:#adb5bd}}@media print{html .btn.btn-ghost-gray-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-500:hover{background-color:#adb5bd1f}}@media print{html .alert.alert-gray-500 a:not(.btn),html .table-gray-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-500 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-500 a:not(.btn){font-weight:700;color:#686d71}}@media print{html .alert.alert-gray-500 .btn:not([class*=btn-outline]),html .table-gray-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-500 a:not(.btn){font-weight:700;color:#45484c}}@media print{html .badge.bg-gray-500,html .toast.bg-gray-500,html .toast-header.bg-gray-500,html .progress-bar.bg-gray-500,html[data-netbox-color-mode=dark] .badge.bg-gray-500,html[data-netbox-color-mode=dark] .toast.bg-gray-500,html[data-netbox-color-mode=dark] .toast-header.bg-gray-500,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-500,html[data-netbox-color-mode=light] .badge.bg-gray-500,html[data-netbox-color-mode=light] .toast.bg-gray-500,html[data-netbox-color-mode=light] .toast-header.bg-gray-500,html[data-netbox-color-mode=light] .progress-bar.bg-gray-500{color:#000}}@media print{html .bg-gray-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-600 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2341464b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-600,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-600{color:#6c757d}}@media print{html .btn.btn-ghost-gray-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-600:hover{background-color:#6c757d1f}}@media print{html .alert.alert-gray-600 a:not(.btn),html .table-gray-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-600 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-600 a:not(.btn){font-weight:700;color:#41464b}}@media print{html .alert.alert-gray-600 .btn:not([class*=btn-outline]),html .table-gray-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-600 a:not(.btn){font-weight:700;color:#c4c8cb}}@media print{html .badge.bg-gray-600,html .toast.bg-gray-600,html .toast-header.bg-gray-600,html .progress-bar.bg-gray-600,html[data-netbox-color-mode=dark] .badge.bg-gray-600,html[data-netbox-color-mode=dark] .toast.bg-gray-600,html[data-netbox-color-mode=dark] .toast-header.bg-gray-600,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-600,html[data-netbox-color-mode=light] .badge.bg-gray-600,html[data-netbox-color-mode=light] .toast.bg-gray-600,html[data-netbox-color-mode=light] .toast-header.bg-gray-600,html[data-netbox-color-mode=light] .progress-bar.bg-gray-600{color:#fff}}@media print{html .bg-gray-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-700 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c3034'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-700,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-700{color:#495057}}@media print{html .btn.btn-ghost-gray-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-700:hover{background-color:#4950571f}}@media print{html .alert.alert-gray-700 a:not(.btn),html .table-gray-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-700 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-700 a:not(.btn){font-weight:700;color:#2c3034}}@media print{html .alert.alert-gray-700 .btn:not([class*=btn-outline]),html .table-gray-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-700 a:not(.btn){font-weight:700;color:#b6b9bc}}@media print{html .badge.bg-gray-700,html .toast.bg-gray-700,html .toast-header.bg-gray-700,html .progress-bar.bg-gray-700,html[data-netbox-color-mode=dark] .badge.bg-gray-700,html[data-netbox-color-mode=dark] .toast.bg-gray-700,html[data-netbox-color-mode=dark] .toast-header.bg-gray-700,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-700,html[data-netbox-color-mode=light] .badge.bg-gray-700,html[data-netbox-color-mode=light] .toast.bg-gray-700,html[data-netbox-color-mode=light] .toast-header.bg-gray-700,html[data-netbox-color-mode=light] .progress-bar.bg-gray-700{color:#fff}}@media print{html .bg-gray-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-800 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f2326'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-800,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-800{color:#343a40}}@media print{html .btn.btn-ghost-gray-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-800:hover{background-color:#343a401f}}@media print{html .alert.alert-gray-800 a:not(.btn),html .table-gray-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-800 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-800 a:not(.btn){font-weight:700;color:#1f2326}}@media print{html .alert.alert-gray-800 .btn:not([class*=btn-outline]),html .table-gray-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-800 a:not(.btn){font-weight:700;color:#aeb0b3}}@media print{html .badge.bg-gray-800,html .toast.bg-gray-800,html .toast-header.bg-gray-800,html .progress-bar.bg-gray-800,html[data-netbox-color-mode=dark] .badge.bg-gray-800,html[data-netbox-color-mode=dark] .toast.bg-gray-800,html[data-netbox-color-mode=dark] .toast-header.bg-gray-800,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-800,html[data-netbox-color-mode=light] .badge.bg-gray-800,html[data-netbox-color-mode=light] .toast.bg-gray-800,html[data-netbox-color-mode=light] .toast-header.bg-gray-800,html[data-netbox-color-mode=light] .progress-bar.bg-gray-800{color:#fff}}@media print{html .bg-gray-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-gray-900 button.btn-close,html[data-netbox-color-mode=light] .bg-gray-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23141619'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-900,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-900{color:#212529}}@media print{html .btn.btn-ghost-gray-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray-900:hover{background-color:#2125291f}}@media print{html .alert.alert-gray-900 a:not(.btn),html .table-gray-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-gray-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray-900 a:not(.btn),html[data-netbox-color-mode=light] .table-gray-900 a:not(.btn){font-weight:700;color:#141619}}@media print{html .alert.alert-gray-900 .btn:not([class*=btn-outline]),html .table-gray-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray-900 a:not(.btn){font-weight:700;color:#a6a8a9}}@media print{html .badge.bg-gray-900,html .toast.bg-gray-900,html .toast-header.bg-gray-900,html .progress-bar.bg-gray-900,html[data-netbox-color-mode=dark] .badge.bg-gray-900,html[data-netbox-color-mode=dark] .toast.bg-gray-900,html[data-netbox-color-mode=dark] .toast-header.bg-gray-900,html[data-netbox-color-mode=dark] .progress-bar.bg-gray-900,html[data-netbox-color-mode=light] .badge.bg-gray-900,html[data-netbox-color-mode=light] .toast.bg-gray-900,html[data-netbox-color-mode=light] .toast-header.bg-gray-900,html[data-netbox-color-mode=light] .progress-bar.bg-gray-900{color:#fff}}@media print{html .bg-red-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-100 button.btn-close,html[data-netbox-color-mode=light] .bg-red-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23635657'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-100,html[data-netbox-color-mode=light] .btn.btn-ghost-red-100{color:#f8d7da}}@media print{html .btn.btn-ghost-red-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-100:hover{background-color:#f8d7da1f}}@media print{html .alert.alert-red-100 a:not(.btn),html .table-red-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-100 a:not(.btn),html[data-netbox-color-mode=light] .table-red-100 a:not(.btn){font-weight:700;color:#635657}}@media print{html .alert.alert-red-100 .btn:not([class*=btn-outline]),html .table-red-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-100 a:not(.btn){font-weight:700;color:#635657}}@media print{html .badge.bg-red-100,html .toast.bg-red-100,html .toast-header.bg-red-100,html .progress-bar.bg-red-100,html[data-netbox-color-mode=dark] .badge.bg-red-100,html[data-netbox-color-mode=dark] .toast.bg-red-100,html[data-netbox-color-mode=dark] .toast-header.bg-red-100,html[data-netbox-color-mode=dark] .progress-bar.bg-red-100,html[data-netbox-color-mode=light] .badge.bg-red-100,html[data-netbox-color-mode=light] .toast.bg-red-100,html[data-netbox-color-mode=light] .toast-header.bg-red-100,html[data-netbox-color-mode=light] .progress-bar.bg-red-100{color:#000}}@media print{html .bg-red-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-200 button.btn-close,html[data-netbox-color-mode=light] .bg-red-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23604648'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-200,html[data-netbox-color-mode=light] .btn.btn-ghost-red-200{color:#f1aeb5}}@media print{html .btn.btn-ghost-red-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-200:hover{background-color:#f1aeb51f}}@media print{html .alert.alert-red-200 a:not(.btn),html .table-red-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-200 a:not(.btn),html[data-netbox-color-mode=light] .table-red-200 a:not(.btn){font-weight:700;color:#604648}}@media print{html .alert.alert-red-200 .btn:not([class*=btn-outline]),html .table-red-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-200 a:not(.btn){font-weight:700;color:#604648}}@media print{html .badge.bg-red-200,html .toast.bg-red-200,html .toast-header.bg-red-200,html .progress-bar.bg-red-200,html[data-netbox-color-mode=dark] .badge.bg-red-200,html[data-netbox-color-mode=dark] .toast.bg-red-200,html[data-netbox-color-mode=dark] .toast-header.bg-red-200,html[data-netbox-color-mode=dark] .progress-bar.bg-red-200,html[data-netbox-color-mode=light] .badge.bg-red-200,html[data-netbox-color-mode=light] .toast.bg-red-200,html[data-netbox-color-mode=light] .toast-header.bg-red-200,html[data-netbox-color-mode=light] .progress-bar.bg-red-200{color:#000}}@media print{html .bg-red-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-300 button.btn-close,html[data-netbox-color-mode=light] .bg-red-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%238c5056'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-300,html[data-netbox-color-mode=light] .btn.btn-ghost-red-300{color:#ea868f}}@media print{html .btn.btn-ghost-red-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-300:hover{background-color:#ea868f1f}}@media print{html .alert.alert-red-300 a:not(.btn),html .table-red-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-300 a:not(.btn),html[data-netbox-color-mode=light] .table-red-300 a:not(.btn){font-weight:700;color:#8c5056}}@media print{html .alert.alert-red-300 .btn:not([class*=btn-outline]),html .table-red-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-300 a:not(.btn){font-weight:700;color:#5e3639}}@media print{html .badge.bg-red-300,html .toast.bg-red-300,html .toast-header.bg-red-300,html .progress-bar.bg-red-300,html[data-netbox-color-mode=dark] .badge.bg-red-300,html[data-netbox-color-mode=dark] .toast.bg-red-300,html[data-netbox-color-mode=dark] .toast-header.bg-red-300,html[data-netbox-color-mode=dark] .progress-bar.bg-red-300,html[data-netbox-color-mode=light] .badge.bg-red-300,html[data-netbox-color-mode=light] .toast.bg-red-300,html[data-netbox-color-mode=light] .toast-header.bg-red-300,html[data-netbox-color-mode=light] .progress-bar.bg-red-300{color:#000}}@media print{html .bg-red-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-400 button.btn-close,html[data-netbox-color-mode=light] .bg-red-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23883840'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-400,html[data-netbox-color-mode=light] .btn.btn-ghost-red-400{color:#e35d6a}}@media print{html .btn.btn-ghost-red-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-400:hover{background-color:#e35d6a1f}}@media print{html .alert.alert-red-400 a:not(.btn),html .table-red-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-400 a:not(.btn),html[data-netbox-color-mode=light] .table-red-400 a:not(.btn){font-weight:700;color:#883840}}@media print{html .alert.alert-red-400 .btn:not([class*=btn-outline]),html .table-red-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-400 a:not(.btn){font-weight:700;color:#5b252a}}@media print{html .badge.bg-red-400,html .toast.bg-red-400,html .toast-header.bg-red-400,html .progress-bar.bg-red-400,html[data-netbox-color-mode=dark] .badge.bg-red-400,html[data-netbox-color-mode=dark] .toast.bg-red-400,html[data-netbox-color-mode=dark] .toast-header.bg-red-400,html[data-netbox-color-mode=dark] .progress-bar.bg-red-400,html[data-netbox-color-mode=light] .badge.bg-red-400,html[data-netbox-color-mode=light] .toast.bg-red-400,html[data-netbox-color-mode=light] .toast-header.bg-red-400,html[data-netbox-color-mode=light] .progress-bar.bg-red-400{color:#000}}@media print{html .bg-red-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-500 button.btn-close,html[data-netbox-color-mode=light] .bg-red-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-500,html[data-netbox-color-mode=light] .btn.btn-ghost-red-500{color:#dc3545}}@media print{html .btn.btn-ghost-red-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-500:hover{background-color:#dc35451f}}@media print{html .alert.alert-red-500 a:not(.btn),html .table-red-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-500 a:not(.btn),html[data-netbox-color-mode=light] .table-red-500 a:not(.btn){font-weight:700;color:#842029}}@media print{html .alert.alert-red-500 .btn:not([class*=btn-outline]),html .table-red-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-500 a:not(.btn){font-weight:700;color:#f1aeb5}}@media print{html .badge.bg-red-500,html .toast.bg-red-500,html .toast-header.bg-red-500,html .progress-bar.bg-red-500,html[data-netbox-color-mode=dark] .badge.bg-red-500,html[data-netbox-color-mode=dark] .toast.bg-red-500,html[data-netbox-color-mode=dark] .toast-header.bg-red-500,html[data-netbox-color-mode=dark] .progress-bar.bg-red-500,html[data-netbox-color-mode=light] .badge.bg-red-500,html[data-netbox-color-mode=light] .toast.bg-red-500,html[data-netbox-color-mode=light] .toast-header.bg-red-500,html[data-netbox-color-mode=light] .progress-bar.bg-red-500{color:#fff}}@media print{html .bg-red-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-600 button.btn-close,html[data-netbox-color-mode=light] .bg-red-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236a1921'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-600,html[data-netbox-color-mode=light] .btn.btn-ghost-red-600{color:#b02a37}}@media print{html .btn.btn-ghost-red-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-600:hover{background-color:#b02a371f}}@media print{html .alert.alert-red-600 a:not(.btn),html .table-red-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-600 a:not(.btn),html[data-netbox-color-mode=light] .table-red-600 a:not(.btn){font-weight:700;color:#6a1921}}@media print{html .alert.alert-red-600 .btn:not([class*=btn-outline]),html .table-red-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-600 a:not(.btn){font-weight:700;color:#dfaaaf}}@media print{html .badge.bg-red-600,html .toast.bg-red-600,html .toast-header.bg-red-600,html .progress-bar.bg-red-600,html[data-netbox-color-mode=dark] .badge.bg-red-600,html[data-netbox-color-mode=dark] .toast.bg-red-600,html[data-netbox-color-mode=dark] .toast-header.bg-red-600,html[data-netbox-color-mode=dark] .progress-bar.bg-red-600,html[data-netbox-color-mode=light] .badge.bg-red-600,html[data-netbox-color-mode=light] .toast.bg-red-600,html[data-netbox-color-mode=light] .toast-header.bg-red-600,html[data-netbox-color-mode=light] .progress-bar.bg-red-600{color:#fff}}@media print{html .bg-red-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-700 button.btn-close,html[data-netbox-color-mode=light] .bg-red-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234f1319'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-700,html[data-netbox-color-mode=light] .btn.btn-ghost-red-700{color:#842029}}@media print{html .btn.btn-ghost-red-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-700:hover{background-color:#8420291f}}@media print{html .alert.alert-red-700 a:not(.btn),html .table-red-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-700 a:not(.btn),html[data-netbox-color-mode=light] .table-red-700 a:not(.btn){font-weight:700;color:#4f1319}}@media print{html .alert.alert-red-700 .btn:not([class*=btn-outline]),html .table-red-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-700 a:not(.btn){font-weight:700;color:#cea6a9}}@media print{html .badge.bg-red-700,html .toast.bg-red-700,html .toast-header.bg-red-700,html .progress-bar.bg-red-700,html[data-netbox-color-mode=dark] .badge.bg-red-700,html[data-netbox-color-mode=dark] .toast.bg-red-700,html[data-netbox-color-mode=dark] .toast-header.bg-red-700,html[data-netbox-color-mode=dark] .progress-bar.bg-red-700,html[data-netbox-color-mode=light] .badge.bg-red-700,html[data-netbox-color-mode=light] .toast.bg-red-700,html[data-netbox-color-mode=light] .toast-header.bg-red-700,html[data-netbox-color-mode=light] .progress-bar.bg-red-700{color:#fff}}@media print{html .bg-red-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-800 button.btn-close,html[data-netbox-color-mode=light] .bg-red-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23350d11'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-800,html[data-netbox-color-mode=light] .btn.btn-ghost-red-800{color:#58151c}}@media print{html .btn.btn-ghost-red-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-800:hover{background-color:#58151c1f}}@media print{html .alert.alert-red-800 a:not(.btn),html .table-red-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-800 a:not(.btn),html[data-netbox-color-mode=light] .table-red-800 a:not(.btn){font-weight:700;color:#350d11}}@media print{html .alert.alert-red-800 .btn:not([class*=btn-outline]),html .table-red-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-800 a:not(.btn){font-weight:700;color:#bca1a4}}@media print{html .badge.bg-red-800,html .toast.bg-red-800,html .toast-header.bg-red-800,html .progress-bar.bg-red-800,html[data-netbox-color-mode=dark] .badge.bg-red-800,html[data-netbox-color-mode=dark] .toast.bg-red-800,html[data-netbox-color-mode=dark] .toast-header.bg-red-800,html[data-netbox-color-mode=dark] .progress-bar.bg-red-800,html[data-netbox-color-mode=light] .badge.bg-red-800,html[data-netbox-color-mode=light] .toast.bg-red-800,html[data-netbox-color-mode=light] .toast-header.bg-red-800,html[data-netbox-color-mode=light] .progress-bar.bg-red-800{color:#fff}}@media print{html .bg-red-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-red-900 button.btn-close,html[data-netbox-color-mode=light] .bg-red-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231a0708'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-900,html[data-netbox-color-mode=light] .btn.btn-ghost-red-900{color:#2c0b0e}}@media print{html .btn.btn-ghost-red-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red-900:hover{background-color:#2c0b0e1f}}@media print{html .alert.alert-red-900 a:not(.btn),html .table-red-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-red-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red-900 a:not(.btn),html[data-netbox-color-mode=light] .table-red-900 a:not(.btn){font-weight:700;color:#1a0708}}@media print{html .alert.alert-red-900 .btn:not([class*=btn-outline]),html .table-red-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red-900 a:not(.btn){font-weight:700;color:#ab9d9f}}@media print{html .badge.bg-red-900,html .toast.bg-red-900,html .toast-header.bg-red-900,html .progress-bar.bg-red-900,html[data-netbox-color-mode=dark] .badge.bg-red-900,html[data-netbox-color-mode=dark] .toast.bg-red-900,html[data-netbox-color-mode=dark] .toast-header.bg-red-900,html[data-netbox-color-mode=dark] .progress-bar.bg-red-900,html[data-netbox-color-mode=light] .badge.bg-red-900,html[data-netbox-color-mode=light] .toast.bg-red-900,html[data-netbox-color-mode=light] .toast-header.bg-red-900,html[data-netbox-color-mode=light] .progress-bar.bg-red-900{color:#fff}}@media print{html .bg-yellow-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-100 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23666152'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-100,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-100{color:#fff3cd}}@media print{html .btn.btn-ghost-yellow-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-100:hover{background-color:#fff3cd1f}}@media print{html .alert.alert-yellow-100 a:not(.btn),html .table-yellow-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-100 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-100 a:not(.btn){font-weight:700;color:#666152}}@media print{html .alert.alert-yellow-100 .btn:not([class*=btn-outline]),html .table-yellow-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-100 a:not(.btn){font-weight:700;color:#666152}}@media print{html .badge.bg-yellow-100,html .toast.bg-yellow-100,html .toast-header.bg-yellow-100,html .progress-bar.bg-yellow-100,html[data-netbox-color-mode=dark] .badge.bg-yellow-100,html[data-netbox-color-mode=dark] .toast.bg-yellow-100,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-100,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-100,html[data-netbox-color-mode=light] .badge.bg-yellow-100,html[data-netbox-color-mode=light] .toast.bg-yellow-100,html[data-netbox-color-mode=light] .toast-header.bg-yellow-100,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-100{color:#000}}@media print{html .bg-yellow-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-200 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23665c3e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-200,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-200{color:#ffe69c}}@media print{html .btn.btn-ghost-yellow-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-200:hover{background-color:#ffe69c1f}}@media print{html .alert.alert-yellow-200 a:not(.btn),html .table-yellow-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-200 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-200 a:not(.btn){font-weight:700;color:#665c3e}}@media print{html .alert.alert-yellow-200 .btn:not([class*=btn-outline]),html .table-yellow-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-200 a:not(.btn){font-weight:700;color:#665c3e}}@media print{html .badge.bg-yellow-200,html .toast.bg-yellow-200,html .toast-header.bg-yellow-200,html .progress-bar.bg-yellow-200,html[data-netbox-color-mode=dark] .badge.bg-yellow-200,html[data-netbox-color-mode=dark] .toast.bg-yellow-200,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-200,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-200,html[data-netbox-color-mode=light] .badge.bg-yellow-200,html[data-netbox-color-mode=light] .toast.bg-yellow-200,html[data-netbox-color-mode=light] .toast-header.bg-yellow-200,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-200{color:#000}}@media print{html .bg-yellow-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-300 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2366572a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-300,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-300{color:#ffda6a}}@media print{html .btn.btn-ghost-yellow-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-300:hover{background-color:#ffda6a1f}}@media print{html .alert.alert-yellow-300 a:not(.btn),html .table-yellow-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-300 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-300 a:not(.btn){font-weight:700;color:#66572a}}@media print{html .alert.alert-yellow-300 .btn:not([class*=btn-outline]),html .table-yellow-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-300 a:not(.btn){font-weight:700;color:#66572a}}@media print{html .badge.bg-yellow-300,html .toast.bg-yellow-300,html .toast-header.bg-yellow-300,html .progress-bar.bg-yellow-300,html[data-netbox-color-mode=dark] .badge.bg-yellow-300,html[data-netbox-color-mode=dark] .toast.bg-yellow-300,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-300,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-300,html[data-netbox-color-mode=light] .badge.bg-yellow-300,html[data-netbox-color-mode=light] .toast.bg-yellow-300,html[data-netbox-color-mode=light] .toast-header.bg-yellow-300,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-300{color:#000}}@media print{html .bg-yellow-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-400 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23665217'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-400,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-400{color:#ffcd39}}@media print{html .btn.btn-ghost-yellow-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-400:hover{background-color:#ffcd391f}}@media print{html .alert.alert-yellow-400 a:not(.btn),html .table-yellow-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-400 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-400 a:not(.btn){font-weight:700;color:#665217}}@media print{html .alert.alert-yellow-400 .btn:not([class*=btn-outline]),html .table-yellow-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-400 a:not(.btn){font-weight:700;color:#665217}}@media print{html .badge.bg-yellow-400,html .toast.bg-yellow-400,html .toast-header.bg-yellow-400,html .progress-bar.bg-yellow-400,html[data-netbox-color-mode=dark] .badge.bg-yellow-400,html[data-netbox-color-mode=dark] .toast.bg-yellow-400,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-400,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-400,html[data-netbox-color-mode=light] .badge.bg-yellow-400,html[data-netbox-color-mode=light] .toast.bg-yellow-400,html[data-netbox-color-mode=light] .toast-header.bg-yellow-400,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-400{color:#000}}@media print{html .bg-yellow-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-500 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-500,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-500{color:#ffc107}}@media print{html .btn.btn-ghost-yellow-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-500:hover{background-color:#ffc1071f}}@media print{html .alert.alert-yellow-500 a:not(.btn),html .table-yellow-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-500 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-500 a:not(.btn){font-weight:700;color:#664d03}}@media print{html .alert.alert-yellow-500 .btn:not([class*=btn-outline]),html .table-yellow-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-500 a:not(.btn){font-weight:700;color:#664d03}}@media print{html .badge.bg-yellow-500,html .toast.bg-yellow-500,html .toast-header.bg-yellow-500,html .progress-bar.bg-yellow-500,html[data-netbox-color-mode=dark] .badge.bg-yellow-500,html[data-netbox-color-mode=dark] .toast.bg-yellow-500,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-500,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-500,html[data-netbox-color-mode=light] .badge.bg-yellow-500,html[data-netbox-color-mode=light] .toast.bg-yellow-500,html[data-netbox-color-mode=light] .toast-header.bg-yellow-500,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-500{color:#000}}@media print{html .bg-yellow-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-600 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237a5c04'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-600,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-600{color:#cc9a06}}@media print{html .btn.btn-ghost-yellow-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-600:hover{background-color:#cc9a061f}}@media print{html .alert.alert-yellow-600 a:not(.btn),html .table-yellow-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-600 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-600 a:not(.btn){font-weight:700;color:#7a5c04}}@media print{html .alert.alert-yellow-600 .btn:not([class*=btn-outline]),html .table-yellow-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-600 a:not(.btn){font-weight:700;color:#523e02}}@media print{html .badge.bg-yellow-600,html .toast.bg-yellow-600,html .toast-header.bg-yellow-600,html .progress-bar.bg-yellow-600,html[data-netbox-color-mode=dark] .badge.bg-yellow-600,html[data-netbox-color-mode=dark] .toast.bg-yellow-600,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-600,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-600,html[data-netbox-color-mode=light] .badge.bg-yellow-600,html[data-netbox-color-mode=light] .toast.bg-yellow-600,html[data-netbox-color-mode=light] .toast-header.bg-yellow-600,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-600{color:#000}}@media print{html .bg-yellow-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-700 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235c4602'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-700,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-700{color:#997404}}@media print{html .btn.btn-ghost-yellow-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-700:hover{background-color:#9974041f}}@media print{html .alert.alert-yellow-700 a:not(.btn),html .table-yellow-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-700 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-700 a:not(.btn){font-weight:700;color:#5c4602}}@media print{html .alert.alert-yellow-700 .btn:not([class*=btn-outline]),html .table-yellow-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-700 a:not(.btn){font-weight:700;color:#3d2e02}}@media print{html .badge.bg-yellow-700,html .toast.bg-yellow-700,html .toast-header.bg-yellow-700,html .progress-bar.bg-yellow-700,html[data-netbox-color-mode=dark] .badge.bg-yellow-700,html[data-netbox-color-mode=dark] .toast.bg-yellow-700,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-700,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-700,html[data-netbox-color-mode=light] .badge.bg-yellow-700,html[data-netbox-color-mode=light] .toast.bg-yellow-700,html[data-netbox-color-mode=light] .toast-header.bg-yellow-700,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-700{color:#000}}@media print{html .bg-yellow-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-800 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233d2e02'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-800,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-800{color:#664d03}}@media print{html .btn.btn-ghost-yellow-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-800:hover{background-color:#664d031f}}@media print{html .alert.alert-yellow-800 a:not(.btn),html .table-yellow-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-800 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-800 a:not(.btn){font-weight:700;color:#3d2e02}}@media print{html .alert.alert-yellow-800 .btn:not([class*=btn-outline]),html .table-yellow-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-800 a:not(.btn){font-weight:700;color:#c2b89a}}@media print{html .badge.bg-yellow-800,html .toast.bg-yellow-800,html .toast-header.bg-yellow-800,html .progress-bar.bg-yellow-800,html[data-netbox-color-mode=dark] .badge.bg-yellow-800,html[data-netbox-color-mode=dark] .toast.bg-yellow-800,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-800,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-800,html[data-netbox-color-mode=light] .badge.bg-yellow-800,html[data-netbox-color-mode=light] .toast.bg-yellow-800,html[data-netbox-color-mode=light] .toast-header.bg-yellow-800,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-800{color:#fff}}@media print{html .bg-yellow-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow-900 button.btn-close,html[data-netbox-color-mode=light] .bg-yellow-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f1701'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-900,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-900{color:#332701}}@media print{html .btn.btn-ghost-yellow-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow-900:hover{background-color:#3327011f}}@media print{html .alert.alert-yellow-900 a:not(.btn),html .table-yellow-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow-900 a:not(.btn),html[data-netbox-color-mode=light] .table-yellow-900 a:not(.btn){font-weight:700;color:#1f1701}}@media print{html .alert.alert-yellow-900 .btn:not([class*=btn-outline]),html .table-yellow-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow-900 a:not(.btn){font-weight:700;color:#ada999}}@media print{html .badge.bg-yellow-900,html .toast.bg-yellow-900,html .toast-header.bg-yellow-900,html .progress-bar.bg-yellow-900,html[data-netbox-color-mode=dark] .badge.bg-yellow-900,html[data-netbox-color-mode=dark] .toast.bg-yellow-900,html[data-netbox-color-mode=dark] .toast-header.bg-yellow-900,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow-900,html[data-netbox-color-mode=light] .badge.bg-yellow-900,html[data-netbox-color-mode=light] .toast.bg-yellow-900,html[data-netbox-color-mode=light] .toast-header.bg-yellow-900,html[data-netbox-color-mode=light] .progress-bar.bg-yellow-900{color:#fff}}@media print{html .bg-green-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-100 button.btn-close,html[data-netbox-color-mode=light] .bg-green-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23545c58'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-100,html[data-netbox-color-mode=light] .btn.btn-ghost-green-100{color:#d1e7dd}}@media print{html .btn.btn-ghost-green-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-100:hover{background-color:#d1e7dd1f}}@media print{html .alert.alert-green-100 a:not(.btn),html .table-green-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-100 a:not(.btn),html[data-netbox-color-mode=light] .table-green-100 a:not(.btn){font-weight:700;color:#545c58}}@media print{html .alert.alert-green-100 .btn:not([class*=btn-outline]),html .table-green-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-100 a:not(.btn){font-weight:700;color:#545c58}}@media print{html .badge.bg-green-100,html .toast.bg-green-100,html .toast-header.bg-green-100,html .progress-bar.bg-green-100,html[data-netbox-color-mode=dark] .badge.bg-green-100,html[data-netbox-color-mode=dark] .toast.bg-green-100,html[data-netbox-color-mode=dark] .toast-header.bg-green-100,html[data-netbox-color-mode=dark] .progress-bar.bg-green-100,html[data-netbox-color-mode=light] .badge.bg-green-100,html[data-netbox-color-mode=light] .toast.bg-green-100,html[data-netbox-color-mode=light] .toast-header.bg-green-100,html[data-netbox-color-mode=light] .progress-bar.bg-green-100{color:#000}}@media print{html .bg-green-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-200 button.btn-close,html[data-netbox-color-mode=light] .bg-green-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2341534b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-200,html[data-netbox-color-mode=light] .btn.btn-ghost-green-200{color:#a3cfbb}}@media print{html .btn.btn-ghost-green-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-200:hover{background-color:#a3cfbb1f}}@media print{html .alert.alert-green-200 a:not(.btn),html .table-green-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-200 a:not(.btn),html[data-netbox-color-mode=light] .table-green-200 a:not(.btn){font-weight:700;color:#41534b}}@media print{html .alert.alert-green-200 .btn:not([class*=btn-outline]),html .table-green-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-200 a:not(.btn){font-weight:700;color:#41534b}}@media print{html .badge.bg-green-200,html .toast.bg-green-200,html .toast-header.bg-green-200,html .progress-bar.bg-green-200,html[data-netbox-color-mode=dark] .badge.bg-green-200,html[data-netbox-color-mode=dark] .toast.bg-green-200,html[data-netbox-color-mode=dark] .toast-header.bg-green-200,html[data-netbox-color-mode=dark] .progress-bar.bg-green-200,html[data-netbox-color-mode=light] .badge.bg-green-200,html[data-netbox-color-mode=light] .toast.bg-green-200,html[data-netbox-color-mode=light] .toast-header.bg-green-200,html[data-netbox-color-mode=light] .progress-bar.bg-green-200{color:#000}}@media print{html .bg-green-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-300 button.btn-close,html[data-netbox-color-mode=light] .bg-green-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23466e5b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-300,html[data-netbox-color-mode=light] .btn.btn-ghost-green-300{color:#75b798}}@media print{html .btn.btn-ghost-green-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-300:hover{background-color:#75b7981f}}@media print{html .alert.alert-green-300 a:not(.btn),html .table-green-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-300 a:not(.btn),html[data-netbox-color-mode=light] .table-green-300 a:not(.btn){font-weight:700;color:#466e5b}}@media print{html .alert.alert-green-300 .btn:not([class*=btn-outline]),html .table-green-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-300 a:not(.btn){font-weight:700;color:#2f493d}}@media print{html .badge.bg-green-300,html .toast.bg-green-300,html .toast-header.bg-green-300,html .progress-bar.bg-green-300,html[data-netbox-color-mode=dark] .badge.bg-green-300,html[data-netbox-color-mode=dark] .toast.bg-green-300,html[data-netbox-color-mode=dark] .toast-header.bg-green-300,html[data-netbox-color-mode=dark] .progress-bar.bg-green-300,html[data-netbox-color-mode=light] .badge.bg-green-300,html[data-netbox-color-mode=light] .toast.bg-green-300,html[data-netbox-color-mode=light] .toast-header.bg-green-300,html[data-netbox-color-mode=light] .progress-bar.bg-green-300{color:#000}}@media print{html .bg-green-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-400 button.btn-close,html[data-netbox-color-mode=light] .bg-green-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232b5f47'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-400,html[data-netbox-color-mode=light] .btn.btn-ghost-green-400{color:#479f76}}@media print{html .btn.btn-ghost-green-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-400:hover{background-color:#479f761f}}@media print{html .alert.alert-green-400 a:not(.btn),html .table-green-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-400 a:not(.btn),html[data-netbox-color-mode=light] .table-green-400 a:not(.btn){font-weight:700;color:#2b5f47}}@media print{html .alert.alert-green-400 .btn:not([class*=btn-outline]),html .table-green-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-400 a:not(.btn){font-weight:700;color:#1c402f}}@media print{html .badge.bg-green-400,html .toast.bg-green-400,html .toast-header.bg-green-400,html .progress-bar.bg-green-400,html[data-netbox-color-mode=dark] .badge.bg-green-400,html[data-netbox-color-mode=dark] .toast.bg-green-400,html[data-netbox-color-mode=dark] .toast-header.bg-green-400,html[data-netbox-color-mode=dark] .progress-bar.bg-green-400,html[data-netbox-color-mode=light] .badge.bg-green-400,html[data-netbox-color-mode=light] .toast.bg-green-400,html[data-netbox-color-mode=light] .toast-header.bg-green-400,html[data-netbox-color-mode=light] .progress-bar.bg-green-400{color:#000}}@media print{html .bg-green-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-500 button.btn-close,html[data-netbox-color-mode=light] .bg-green-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-500,html[data-netbox-color-mode=light] .btn.btn-ghost-green-500{color:#198754}}@media print{html .btn.btn-ghost-green-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-500:hover{background-color:#1987541f}}@media print{html .alert.alert-green-500 a:not(.btn),html .table-green-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-500 a:not(.btn),html[data-netbox-color-mode=light] .table-green-500 a:not(.btn){font-weight:700;color:#0f5132}}@media print{html .alert.alert-green-500 .btn:not([class*=btn-outline]),html .table-green-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-500 a:not(.btn){font-weight:700;color:#a3cfbb}}@media print{html .badge.bg-green-500,html .toast.bg-green-500,html .toast-header.bg-green-500,html .progress-bar.bg-green-500,html[data-netbox-color-mode=dark] .badge.bg-green-500,html[data-netbox-color-mode=dark] .toast.bg-green-500,html[data-netbox-color-mode=dark] .toast-header.bg-green-500,html[data-netbox-color-mode=dark] .progress-bar.bg-green-500,html[data-netbox-color-mode=light] .badge.bg-green-500,html[data-netbox-color-mode=light] .toast.bg-green-500,html[data-netbox-color-mode=light] .toast-header.bg-green-500,html[data-netbox-color-mode=light] .progress-bar.bg-green-500{color:#fff}}@media print{html .bg-green-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-600 button.btn-close,html[data-netbox-color-mode=light] .bg-green-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c4128'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-600,html[data-netbox-color-mode=light] .btn.btn-ghost-green-600{color:#146c43}}@media print{html .btn.btn-ghost-green-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-600:hover{background-color:#146c431f}}@media print{html .alert.alert-green-600 a:not(.btn),html .table-green-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-600 a:not(.btn),html[data-netbox-color-mode=light] .table-green-600 a:not(.btn){font-weight:700;color:#0c4128}}@media print{html .alert.alert-green-600 .btn:not([class*=btn-outline]),html .table-green-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-600 a:not(.btn){font-weight:700;color:#a1c4b4}}@media print{html .badge.bg-green-600,html .toast.bg-green-600,html .toast-header.bg-green-600,html .progress-bar.bg-green-600,html[data-netbox-color-mode=dark] .badge.bg-green-600,html[data-netbox-color-mode=dark] .toast.bg-green-600,html[data-netbox-color-mode=dark] .toast-header.bg-green-600,html[data-netbox-color-mode=dark] .progress-bar.bg-green-600,html[data-netbox-color-mode=light] .badge.bg-green-600,html[data-netbox-color-mode=light] .toast.bg-green-600,html[data-netbox-color-mode=light] .toast-header.bg-green-600,html[data-netbox-color-mode=light] .progress-bar.bg-green-600{color:#fff}}@media print{html .bg-green-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-700 button.btn-close,html[data-netbox-color-mode=light] .bg-green-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2309311e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-700,html[data-netbox-color-mode=light] .btn.btn-ghost-green-700{color:#0f5132}}@media print{html .btn.btn-ghost-green-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-700:hover{background-color:#0f51321f}}@media print{html .alert.alert-green-700 a:not(.btn),html .table-green-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-700 a:not(.btn),html[data-netbox-color-mode=light] .table-green-700 a:not(.btn){font-weight:700;color:#09311e}}@media print{html .alert.alert-green-700 .btn:not([class*=btn-outline]),html .table-green-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-700 a:not(.btn){font-weight:700;color:#9fb9ad}}@media print{html .badge.bg-green-700,html .toast.bg-green-700,html .toast-header.bg-green-700,html .progress-bar.bg-green-700,html[data-netbox-color-mode=dark] .badge.bg-green-700,html[data-netbox-color-mode=dark] .toast.bg-green-700,html[data-netbox-color-mode=dark] .toast-header.bg-green-700,html[data-netbox-color-mode=dark] .progress-bar.bg-green-700,html[data-netbox-color-mode=light] .badge.bg-green-700,html[data-netbox-color-mode=light] .toast.bg-green-700,html[data-netbox-color-mode=light] .toast-header.bg-green-700,html[data-netbox-color-mode=light] .progress-bar.bg-green-700{color:#fff}}@media print{html .bg-green-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-800 button.btn-close,html[data-netbox-color-mode=light] .bg-green-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23062014'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-800,html[data-netbox-color-mode=light] .btn.btn-ghost-green-800{color:#0a3622}}@media print{html .btn.btn-ghost-green-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-800:hover{background-color:#0a36221f}}@media print{html .alert.alert-green-800 a:not(.btn),html .table-green-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-800 a:not(.btn),html[data-netbox-color-mode=light] .table-green-800 a:not(.btn){font-weight:700;color:#062014}}@media print{html .alert.alert-green-800 .btn:not([class*=btn-outline]),html .table-green-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-800 a:not(.btn){font-weight:700;color:#9dafa7}}@media print{html .badge.bg-green-800,html .toast.bg-green-800,html .toast-header.bg-green-800,html .progress-bar.bg-green-800,html[data-netbox-color-mode=dark] .badge.bg-green-800,html[data-netbox-color-mode=dark] .toast.bg-green-800,html[data-netbox-color-mode=dark] .toast-header.bg-green-800,html[data-netbox-color-mode=dark] .progress-bar.bg-green-800,html[data-netbox-color-mode=light] .badge.bg-green-800,html[data-netbox-color-mode=light] .toast.bg-green-800,html[data-netbox-color-mode=light] .toast-header.bg-green-800,html[data-netbox-color-mode=light] .progress-bar.bg-green-800{color:#fff}}@media print{html .bg-green-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-green-900 button.btn-close,html[data-netbox-color-mode=light] .bg-green-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2303100a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-900,html[data-netbox-color-mode=light] .btn.btn-ghost-green-900{color:#051b11}}@media print{html .btn.btn-ghost-green-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green-900:hover{background-color:#051b111f}}@media print{html .alert.alert-green-900 a:not(.btn),html .table-green-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-green-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green-900 a:not(.btn),html[data-netbox-color-mode=light] .table-green-900 a:not(.btn){font-weight:700;color:#03100a}}@media print{html .alert.alert-green-900 .btn:not([class*=btn-outline]),html .table-green-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green-900 a:not(.btn){font-weight:700;color:#9ba4a0}}@media print{html .badge.bg-green-900,html .toast.bg-green-900,html .toast-header.bg-green-900,html .progress-bar.bg-green-900,html[data-netbox-color-mode=dark] .badge.bg-green-900,html[data-netbox-color-mode=dark] .toast.bg-green-900,html[data-netbox-color-mode=dark] .toast-header.bg-green-900,html[data-netbox-color-mode=dark] .progress-bar.bg-green-900,html[data-netbox-color-mode=light] .badge.bg-green-900,html[data-netbox-color-mode=light] .toast.bg-green-900,html[data-netbox-color-mode=light] .toast-header.bg-green-900,html[data-netbox-color-mode=light] .progress-bar.bg-green-900{color:#fff}}@media print{html .bg-blue-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-100 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23535a66'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-100,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-100{color:#cfe2ff}}@media print{html .btn.btn-ghost-blue-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-100:hover{background-color:#cfe2ff1f}}@media print{html .alert.alert-blue-100 a:not(.btn),html .table-blue-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-100 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-100 a:not(.btn){font-weight:700;color:#535a66}}@media print{html .alert.alert-blue-100 .btn:not([class*=btn-outline]),html .table-blue-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-100 a:not(.btn){font-weight:700;color:#535a66}}@media print{html .badge.bg-blue-100,html .toast.bg-blue-100,html .toast-header.bg-blue-100,html .progress-bar.bg-blue-100,html[data-netbox-color-mode=dark] .badge.bg-blue-100,html[data-netbox-color-mode=dark] .toast.bg-blue-100,html[data-netbox-color-mode=dark] .toast-header.bg-blue-100,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-100,html[data-netbox-color-mode=light] .badge.bg-blue-100,html[data-netbox-color-mode=light] .toast.bg-blue-100,html[data-netbox-color-mode=light] .toast-header.bg-blue-100,html[data-netbox-color-mode=light] .progress-bar.bg-blue-100{color:#000}}@media print{html .bg-blue-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-200 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233f4f66'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-200,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-200{color:#9ec5fe}}@media print{html .btn.btn-ghost-blue-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-200:hover{background-color:#9ec5fe1f}}@media print{html .alert.alert-blue-200 a:not(.btn),html .table-blue-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-200 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-200 a:not(.btn){font-weight:700;color:#3f4f66}}@media print{html .alert.alert-blue-200 .btn:not([class*=btn-outline]),html .table-blue-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-200 a:not(.btn){font-weight:700;color:#3f4f66}}@media print{html .badge.bg-blue-200,html .toast.bg-blue-200,html .toast-header.bg-blue-200,html .progress-bar.bg-blue-200,html[data-netbox-color-mode=dark] .badge.bg-blue-200,html[data-netbox-color-mode=dark] .toast.bg-blue-200,html[data-netbox-color-mode=dark] .toast-header.bg-blue-200,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-200,html[data-netbox-color-mode=light] .badge.bg-blue-200,html[data-netbox-color-mode=light] .toast.bg-blue-200,html[data-netbox-color-mode=light] .toast-header.bg-blue-200,html[data-netbox-color-mode=light] .progress-bar.bg-blue-200{color:#000}}@media print{html .bg-blue-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-300 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23426598'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-300,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-300{color:#6ea8fe}}@media print{html .btn.btn-ghost-blue-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-300:hover{background-color:#6ea8fe1f}}@media print{html .alert.alert-blue-300 a:not(.btn),html .table-blue-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-300 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-300 a:not(.btn){font-weight:700;color:#426598}}@media print{html .alert.alert-blue-300 .btn:not([class*=btn-outline]),html .table-blue-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-300 a:not(.btn){font-weight:700;color:#2c4366}}@media print{html .badge.bg-blue-300,html .toast.bg-blue-300,html .toast-header.bg-blue-300,html .progress-bar.bg-blue-300,html[data-netbox-color-mode=dark] .badge.bg-blue-300,html[data-netbox-color-mode=dark] .toast.bg-blue-300,html[data-netbox-color-mode=dark] .toast-header.bg-blue-300,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-300,html[data-netbox-color-mode=light] .badge.bg-blue-300,html[data-netbox-color-mode=light] .toast.bg-blue-300,html[data-netbox-color-mode=light] .toast-header.bg-blue-300,html[data-netbox-color-mode=light] .progress-bar.bg-blue-300{color:#000}}@media print{html .bg-blue-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-400 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23255398'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-400,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-400{color:#3d8bfd}}@media print{html .btn.btn-ghost-blue-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-400:hover{background-color:#3d8bfd1f}}@media print{html .alert.alert-blue-400 a:not(.btn),html .table-blue-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-400 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-400 a:not(.btn){font-weight:700;color:#255398}}@media print{html .alert.alert-blue-400 .btn:not([class*=btn-outline]),html .table-blue-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-400 a:not(.btn){font-weight:700;color:#183865}}@media print{html .badge.bg-blue-400,html .toast.bg-blue-400,html .toast-header.bg-blue-400,html .progress-bar.bg-blue-400,html[data-netbox-color-mode=dark] .badge.bg-blue-400,html[data-netbox-color-mode=dark] .toast.bg-blue-400,html[data-netbox-color-mode=dark] .toast-header.bg-blue-400,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-400,html[data-netbox-color-mode=light] .badge.bg-blue-400,html[data-netbox-color-mode=light] .toast.bg-blue-400,html[data-netbox-color-mode=light] .toast-header.bg-blue-400,html[data-netbox-color-mode=light] .progress-bar.bg-blue-400{color:#000}}@media print{html .bg-blue-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-500 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23084298'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-500,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-500{color:#0d6efd}}@media print{html .btn.btn-ghost-blue-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-500:hover{background-color:#0d6efd1f}}@media print{html .alert.alert-blue-500 a:not(.btn),html .table-blue-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-500 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-500 a:not(.btn){font-weight:700;color:#084298}}@media print{html .alert.alert-blue-500 .btn:not([class*=btn-outline]),html .table-blue-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-500 a:not(.btn){font-weight:700;color:#9ec5fe}}@media print{html .badge.bg-blue-500,html .toast.bg-blue-500,html .toast-header.bg-blue-500,html .progress-bar.bg-blue-500,html[data-netbox-color-mode=dark] .badge.bg-blue-500,html[data-netbox-color-mode=dark] .toast.bg-blue-500,html[data-netbox-color-mode=dark] .toast-header.bg-blue-500,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-500,html[data-netbox-color-mode=light] .badge.bg-blue-500,html[data-netbox-color-mode=light] .toast.bg-blue-500,html[data-netbox-color-mode=light] .toast-header.bg-blue-500,html[data-netbox-color-mode=light] .progress-bar.bg-blue-500{color:#fff}}@media print{html .bg-blue-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-600 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23063579'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-600,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-600{color:#0a58ca}}@media print{html .btn.btn-ghost-blue-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-600:hover{background-color:#0a58ca1f}}@media print{html .alert.alert-blue-600 a:not(.btn),html .table-blue-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-600 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-600 a:not(.btn){font-weight:700;color:#063579}}@media print{html .alert.alert-blue-600 .btn:not([class*=btn-outline]),html .table-blue-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-600 a:not(.btn){font-weight:700;color:#9dbcea}}@media print{html .badge.bg-blue-600,html .toast.bg-blue-600,html .toast-header.bg-blue-600,html .progress-bar.bg-blue-600,html[data-netbox-color-mode=dark] .badge.bg-blue-600,html[data-netbox-color-mode=dark] .toast.bg-blue-600,html[data-netbox-color-mode=dark] .toast-header.bg-blue-600,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-600,html[data-netbox-color-mode=light] .badge.bg-blue-600,html[data-netbox-color-mode=light] .toast.bg-blue-600,html[data-netbox-color-mode=light] .toast-header.bg-blue-600,html[data-netbox-color-mode=light] .progress-bar.bg-blue-600{color:#fff}}@media print{html .bg-blue-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-700 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2305285b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-700,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-700{color:#084298}}@media print{html .btn.btn-ghost-blue-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-700:hover{background-color:#0842981f}}@media print{html .alert.alert-blue-700 a:not(.btn),html .table-blue-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-700 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-700 a:not(.btn){font-weight:700;color:#05285b}}@media print{html .alert.alert-blue-700 .btn:not([class*=btn-outline]),html .table-blue-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-700 a:not(.btn){font-weight:700;color:#9cb3d6}}@media print{html .badge.bg-blue-700,html .toast.bg-blue-700,html .toast-header.bg-blue-700,html .progress-bar.bg-blue-700,html[data-netbox-color-mode=dark] .badge.bg-blue-700,html[data-netbox-color-mode=dark] .toast.bg-blue-700,html[data-netbox-color-mode=dark] .toast-header.bg-blue-700,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-700,html[data-netbox-color-mode=light] .badge.bg-blue-700,html[data-netbox-color-mode=light] .toast.bg-blue-700,html[data-netbox-color-mode=light] .toast-header.bg-blue-700,html[data-netbox-color-mode=light] .progress-bar.bg-blue-700{color:#fff}}@media print{html .bg-blue-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-800 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23031a3d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-800,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-800{color:#052c65}}@media print{html .btn.btn-ghost-blue-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-800:hover{background-color:#052c651f}}@media print{html .alert.alert-blue-800 a:not(.btn),html .table-blue-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-800 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-800 a:not(.btn){font-weight:700;color:#031a3d}}@media print{html .alert.alert-blue-800 .btn:not([class*=btn-outline]),html .table-blue-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-800 a:not(.btn){font-weight:700;color:#9babc1}}@media print{html .badge.bg-blue-800,html .toast.bg-blue-800,html .toast-header.bg-blue-800,html .progress-bar.bg-blue-800,html[data-netbox-color-mode=dark] .badge.bg-blue-800,html[data-netbox-color-mode=dark] .toast.bg-blue-800,html[data-netbox-color-mode=dark] .toast-header.bg-blue-800,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-800,html[data-netbox-color-mode=light] .badge.bg-blue-800,html[data-netbox-color-mode=light] .toast.bg-blue-800,html[data-netbox-color-mode=light] .toast-header.bg-blue-800,html[data-netbox-color-mode=light] .progress-bar.bg-blue-800{color:#fff}}@media print{html .bg-blue-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-blue-900 button.btn-close,html[data-netbox-color-mode=light] .bg-blue-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23020d1f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-900,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-900{color:#031633}}@media print{html .btn.btn-ghost-blue-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue-900:hover{background-color:#0316331f}}@media print{html .alert.alert-blue-900 a:not(.btn),html .table-blue-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-blue-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue-900 a:not(.btn),html[data-netbox-color-mode=light] .table-blue-900 a:not(.btn){font-weight:700;color:#020d1f}}@media print{html .alert.alert-blue-900 .btn:not([class*=btn-outline]),html .table-blue-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue-900 a:not(.btn){font-weight:700;color:#9aa2ad}}@media print{html .badge.bg-blue-900,html .toast.bg-blue-900,html .toast-header.bg-blue-900,html .progress-bar.bg-blue-900,html[data-netbox-color-mode=dark] .badge.bg-blue-900,html[data-netbox-color-mode=dark] .toast.bg-blue-900,html[data-netbox-color-mode=dark] .toast-header.bg-blue-900,html[data-netbox-color-mode=dark] .progress-bar.bg-blue-900,html[data-netbox-color-mode=light] .badge.bg-blue-900,html[data-netbox-color-mode=light] .toast.bg-blue-900,html[data-netbox-color-mode=light] .toast-header.bg-blue-900,html[data-netbox-color-mode=light] .progress-bar.bg-blue-900{color:#fff}}@media print{html .bg-cyan-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-100 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23536265'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-100,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-100{color:#cff4fc}}@media print{html .btn.btn-ghost-cyan-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-100:hover{background-color:#cff4fc1f}}@media print{html .alert.alert-cyan-100 a:not(.btn),html .table-cyan-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-100 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-100 a:not(.btn){font-weight:700;color:#536265}}@media print{html .alert.alert-cyan-100 .btn:not([class*=btn-outline]),html .table-cyan-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-100 a:not(.btn){font-weight:700;color:#536265}}@media print{html .badge.bg-cyan-100,html .toast.bg-cyan-100,html .toast-header.bg-cyan-100,html .progress-bar.bg-cyan-100,html[data-netbox-color-mode=dark] .badge.bg-cyan-100,html[data-netbox-color-mode=dark] .toast.bg-cyan-100,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-100,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-100,html[data-netbox-color-mode=light] .badge.bg-cyan-100,html[data-netbox-color-mode=light] .toast.bg-cyan-100,html[data-netbox-color-mode=light] .toast-header.bg-cyan-100,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-100{color:#000}}@media print{html .bg-cyan-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-200 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233f5e64'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-200,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-200{color:#9eeaf9}}@media print{html .btn.btn-ghost-cyan-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-200:hover{background-color:#9eeaf91f}}@media print{html .alert.alert-cyan-200 a:not(.btn),html .table-cyan-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-200 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-200 a:not(.btn){font-weight:700;color:#3f5e64}}@media print{html .alert.alert-cyan-200 .btn:not([class*=btn-outline]),html .table-cyan-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-200 a:not(.btn){font-weight:700;color:#3f5e64}}@media print{html .badge.bg-cyan-200,html .toast.bg-cyan-200,html .toast-header.bg-cyan-200,html .progress-bar.bg-cyan-200,html[data-netbox-color-mode=dark] .badge.bg-cyan-200,html[data-netbox-color-mode=dark] .toast.bg-cyan-200,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-200,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-200,html[data-netbox-color-mode=light] .badge.bg-cyan-200,html[data-netbox-color-mode=light] .toast.bg-cyan-200,html[data-netbox-color-mode=light] .toast-header.bg-cyan-200,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-200{color:#000}}@media print{html .bg-cyan-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-300 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232c5962'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-300,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-300{color:#6edff6}}@media print{html .btn.btn-ghost-cyan-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-300:hover{background-color:#6edff61f}}@media print{html .alert.alert-cyan-300 a:not(.btn),html .table-cyan-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-300 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-300 a:not(.btn){font-weight:700;color:#2c5962}}@media print{html .alert.alert-cyan-300 .btn:not([class*=btn-outline]),html .table-cyan-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-300 a:not(.btn){font-weight:700;color:#2c5962}}@media print{html .badge.bg-cyan-300,html .toast.bg-cyan-300,html .toast-header.bg-cyan-300,html .progress-bar.bg-cyan-300,html[data-netbox-color-mode=dark] .badge.bg-cyan-300,html[data-netbox-color-mode=dark] .toast.bg-cyan-300,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-300,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-300,html[data-netbox-color-mode=light] .badge.bg-cyan-300,html[data-netbox-color-mode=light] .toast.bg-cyan-300,html[data-netbox-color-mode=light] .toast-header.bg-cyan-300,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-300{color:#000}}@media print{html .bg-cyan-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-400 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23185561'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-400,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-400{color:#3dd5f3}}@media print{html .btn.btn-ghost-cyan-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-400:hover{background-color:#3dd5f31f}}@media print{html .alert.alert-cyan-400 a:not(.btn),html .table-cyan-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-400 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-400 a:not(.btn){font-weight:700;color:#185561}}@media print{html .alert.alert-cyan-400 .btn:not([class*=btn-outline]),html .table-cyan-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-400 a:not(.btn){font-weight:700;color:#185561}}@media print{html .badge.bg-cyan-400,html .toast.bg-cyan-400,html .toast-header.bg-cyan-400,html .progress-bar.bg-cyan-400,html[data-netbox-color-mode=dark] .badge.bg-cyan-400,html[data-netbox-color-mode=dark] .toast.bg-cyan-400,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-400,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-400,html[data-netbox-color-mode=light] .badge.bg-cyan-400,html[data-netbox-color-mode=light] .toast.bg-cyan-400,html[data-netbox-color-mode=light] .toast-header.bg-cyan-400,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-400{color:#000}}@media print{html .bg-cyan-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-500 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23055160'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-500,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-500{color:#0dcaf0}}@media print{html .btn.btn-ghost-cyan-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-500:hover{background-color:#0dcaf01f}}@media print{html .alert.alert-cyan-500 a:not(.btn),html .table-cyan-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-500 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-500 a:not(.btn){font-weight:700;color:#055160}}@media print{html .alert.alert-cyan-500 .btn:not([class*=btn-outline]),html .table-cyan-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-500 a:not(.btn){font-weight:700;color:#055160}}@media print{html .badge.bg-cyan-500,html .toast.bg-cyan-500,html .toast-header.bg-cyan-500,html .progress-bar.bg-cyan-500,html[data-netbox-color-mode=dark] .badge.bg-cyan-500,html[data-netbox-color-mode=dark] .toast.bg-cyan-500,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-500,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-500,html[data-netbox-color-mode=light] .badge.bg-cyan-500,html[data-netbox-color-mode=light] .toast.bg-cyan-500,html[data-netbox-color-mode=light] .toast-header.bg-cyan-500,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-500{color:#000}}@media print{html .bg-cyan-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-600 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23066173'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-600,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-600{color:#0aa2c0}}@media print{html .btn.btn-ghost-cyan-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-600:hover{background-color:#0aa2c01f}}@media print{html .alert.alert-cyan-600 a:not(.btn),html .table-cyan-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-600 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-600 a:not(.btn){font-weight:700;color:#066173}}@media print{html .alert.alert-cyan-600 .btn:not([class*=btn-outline]),html .table-cyan-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-600 a:not(.btn){font-weight:700;color:#04414d}}@media print{html .badge.bg-cyan-600,html .toast.bg-cyan-600,html .toast-header.bg-cyan-600,html .progress-bar.bg-cyan-600,html[data-netbox-color-mode=dark] .badge.bg-cyan-600,html[data-netbox-color-mode=dark] .toast.bg-cyan-600,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-600,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-600,html[data-netbox-color-mode=light] .badge.bg-cyan-600,html[data-netbox-color-mode=light] .toast.bg-cyan-600,html[data-netbox-color-mode=light] .toast-header.bg-cyan-600,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-600{color:#000}}@media print{html .bg-cyan-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-700 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23054956'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-700,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-700{color:#087990}}@media print{html .btn.btn-ghost-cyan-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-700:hover{background-color:#0879901f}}@media print{html .alert.alert-cyan-700 a:not(.btn),html .table-cyan-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-700 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-700 a:not(.btn){font-weight:700;color:#054956}}@media print{html .alert.alert-cyan-700 .btn:not([class*=btn-outline]),html .table-cyan-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-700 a:not(.btn){font-weight:700;color:#9cc9d3}}@media print{html .badge.bg-cyan-700,html .toast.bg-cyan-700,html .toast-header.bg-cyan-700,html .progress-bar.bg-cyan-700,html[data-netbox-color-mode=dark] .badge.bg-cyan-700,html[data-netbox-color-mode=dark] .toast.bg-cyan-700,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-700,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-700,html[data-netbox-color-mode=light] .badge.bg-cyan-700,html[data-netbox-color-mode=light] .toast.bg-cyan-700,html[data-netbox-color-mode=light] .toast-header.bg-cyan-700,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-700{color:#fff}}@media print{html .bg-cyan-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-800 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2303313a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-800,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-800{color:#055160}}@media print{html .btn.btn-ghost-cyan-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-800:hover{background-color:#0551601f}}@media print{html .alert.alert-cyan-800 a:not(.btn),html .table-cyan-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-800 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-800 a:not(.btn){font-weight:700;color:#03313a}}@media print{html .alert.alert-cyan-800 .btn:not([class*=btn-outline]),html .table-cyan-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-800 a:not(.btn){font-weight:700;color:#9bb9bf}}@media print{html .badge.bg-cyan-800,html .toast.bg-cyan-800,html .toast-header.bg-cyan-800,html .progress-bar.bg-cyan-800,html[data-netbox-color-mode=dark] .badge.bg-cyan-800,html[data-netbox-color-mode=dark] .toast.bg-cyan-800,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-800,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-800,html[data-netbox-color-mode=light] .badge.bg-cyan-800,html[data-netbox-color-mode=light] .toast.bg-cyan-800,html[data-netbox-color-mode=light] .toast-header.bg-cyan-800,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-800{color:#fff}}@media print{html .bg-cyan-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan-900 button.btn-close,html[data-netbox-color-mode=light] .bg-cyan-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2302181d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-900,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-900{color:#032830}}@media print{html .btn.btn-ghost-cyan-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan-900:hover{background-color:#0328301f}}@media print{html .alert.alert-cyan-900 a:not(.btn),html .table-cyan-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan-900 a:not(.btn),html[data-netbox-color-mode=light] .table-cyan-900 a:not(.btn){font-weight:700;color:#02181d}}@media print{html .alert.alert-cyan-900 .btn:not([class*=btn-outline]),html .table-cyan-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan-900 a:not(.btn){font-weight:700;color:#9aa9ac}}@media print{html .badge.bg-cyan-900,html .toast.bg-cyan-900,html .toast-header.bg-cyan-900,html .progress-bar.bg-cyan-900,html[data-netbox-color-mode=dark] .badge.bg-cyan-900,html[data-netbox-color-mode=dark] .toast.bg-cyan-900,html[data-netbox-color-mode=dark] .toast-header.bg-cyan-900,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan-900,html[data-netbox-color-mode=light] .badge.bg-cyan-900,html[data-netbox-color-mode=light] .toast.bg-cyan-900,html[data-netbox-color-mode=light] .toast-header.bg-cyan-900,html[data-netbox-color-mode=light] .progress-bar.bg-cyan-900{color:#fff}}@media print{html .bg-indigo-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-100 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235a5365'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-100,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-100{color:#e0cffc}}@media print{html .btn.btn-ghost-indigo-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-100:hover{background-color:#e0cffc1f}}@media print{html .alert.alert-indigo-100 a:not(.btn),html .table-indigo-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-100 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-100 a:not(.btn){font-weight:700;color:#5a5365}}@media print{html .alert.alert-indigo-100 .btn:not([class*=btn-outline]),html .table-indigo-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-100 a:not(.btn){font-weight:700;color:#5a5365}}@media print{html .badge.bg-indigo-100,html .toast.bg-indigo-100,html .toast-header.bg-indigo-100,html .progress-bar.bg-indigo-100,html[data-netbox-color-mode=dark] .badge.bg-indigo-100,html[data-netbox-color-mode=dark] .toast.bg-indigo-100,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-100,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-100,html[data-netbox-color-mode=light] .badge.bg-indigo-100,html[data-netbox-color-mode=light] .toast.bg-indigo-100,html[data-netbox-color-mode=light] .toast-header.bg-indigo-100,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-100{color:#000}}@media print{html .bg-indigo-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-200 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23745f96'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-200,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-200{color:#c29ffa}}@media print{html .btn.btn-ghost-indigo-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-200:hover{background-color:#c29ffa1f}}@media print{html .alert.alert-indigo-200 a:not(.btn),html .table-indigo-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-200 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-200 a:not(.btn){font-weight:700;color:#745f96}}@media print{html .alert.alert-indigo-200 .btn:not([class*=btn-outline]),html .table-indigo-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-200 a:not(.btn){font-weight:700;color:#4e4064}}@media print{html .badge.bg-indigo-200,html .toast.bg-indigo-200,html .toast-header.bg-indigo-200,html .progress-bar.bg-indigo-200,html[data-netbox-color-mode=dark] .badge.bg-indigo-200,html[data-netbox-color-mode=dark] .toast.bg-indigo-200,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-200,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-200,html[data-netbox-color-mode=light] .badge.bg-indigo-200,html[data-netbox-color-mode=light] .toast.bg-indigo-200,html[data-netbox-color-mode=light] .toast-header.bg-indigo-200,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-200{color:#000}}@media print{html .bg-indigo-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-300 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23624394'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-300,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-300{color:#a370f7}}@media print{html .btn.btn-ghost-indigo-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-300:hover{background-color:#a370f71f}}@media print{html .alert.alert-indigo-300 a:not(.btn),html .table-indigo-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-300 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-300 a:not(.btn){font-weight:700;color:#624394}}@media print{html .alert.alert-indigo-300 .btn:not([class*=btn-outline]),html .table-indigo-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-300 a:not(.btn){font-weight:700;color:#412d63}}@media print{html .badge.bg-indigo-300,html .toast.bg-indigo-300,html .toast-header.bg-indigo-300,html .progress-bar.bg-indigo-300,html[data-netbox-color-mode=dark] .badge.bg-indigo-300,html[data-netbox-color-mode=dark] .toast.bg-indigo-300,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-300,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-300,html[data-netbox-color-mode=light] .badge.bg-indigo-300,html[data-netbox-color-mode=light] .toast.bg-indigo-300,html[data-netbox-color-mode=light] .toast-header.bg-indigo-300,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-300{color:#000}}@media print{html .bg-indigo-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-400 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23502693'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-400,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-400{color:#8540f5}}@media print{html .btn.btn-ghost-indigo-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-400:hover{background-color:#8540f51f}}@media print{html .alert.alert-indigo-400 a:not(.btn),html .table-indigo-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-400 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-400 a:not(.btn){font-weight:700;color:#502693}}@media print{html .alert.alert-indigo-400 .btn:not([class*=btn-outline]),html .table-indigo-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-400 a:not(.btn){font-weight:700;color:#ceb3fb}}@media print{html .badge.bg-indigo-400,html .toast.bg-indigo-400,html .toast-header.bg-indigo-400,html .progress-bar.bg-indigo-400,html[data-netbox-color-mode=dark] .badge.bg-indigo-400,html[data-netbox-color-mode=dark] .toast.bg-indigo-400,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-400,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-400,html[data-netbox-color-mode=light] .badge.bg-indigo-400,html[data-netbox-color-mode=light] .toast.bg-indigo-400,html[data-netbox-color-mode=light] .toast-header.bg-indigo-400,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-400{color:#fff}}@media print{html .bg-indigo-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-500 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233d0a91'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-500,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-500{color:#6610f2}}@media print{html .btn.btn-ghost-indigo-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-500:hover{background-color:#6610f21f}}@media print{html .alert.alert-indigo-500 a:not(.btn),html .table-indigo-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-500 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-500 a:not(.btn){font-weight:700;color:#3d0a91}}@media print{html .alert.alert-indigo-500 .btn:not([class*=btn-outline]),html .table-indigo-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-500 a:not(.btn){font-weight:700;color:#c29ffa}}@media print{html .badge.bg-indigo-500,html .toast.bg-indigo-500,html .toast-header.bg-indigo-500,html .progress-bar.bg-indigo-500,html[data-netbox-color-mode=dark] .badge.bg-indigo-500,html[data-netbox-color-mode=dark] .toast.bg-indigo-500,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-500,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-500,html[data-netbox-color-mode=light] .badge.bg-indigo-500,html[data-netbox-color-mode=light] .toast.bg-indigo-500,html[data-netbox-color-mode=light] .toast-header.bg-indigo-500,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-500{color:#fff}}@media print{html .bg-indigo-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-600 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23310874'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-600,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-600{color:#520dc2}}@media print{html .btn.btn-ghost-indigo-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-600:hover{background-color:#520dc21f}}@media print{html .alert.alert-indigo-600 a:not(.btn),html .table-indigo-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-600 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-600 a:not(.btn){font-weight:700;color:#310874}}@media print{html .alert.alert-indigo-600 .btn:not([class*=btn-outline]),html .table-indigo-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-600 a:not(.btn){font-weight:700;color:#ba9ee7}}@media print{html .badge.bg-indigo-600,html .toast.bg-indigo-600,html .toast-header.bg-indigo-600,html .progress-bar.bg-indigo-600,html[data-netbox-color-mode=dark] .badge.bg-indigo-600,html[data-netbox-color-mode=dark] .toast.bg-indigo-600,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-600,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-600,html[data-netbox-color-mode=light] .badge.bg-indigo-600,html[data-netbox-color-mode=light] .toast.bg-indigo-600,html[data-netbox-color-mode=light] .toast-header.bg-indigo-600,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-600{color:#fff}}@media print{html .bg-indigo-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-700 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23250657'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-700,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-700{color:#3d0a91}}@media print{html .btn.btn-ghost-indigo-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-700:hover{background-color:#3d0a911f}}@media print{html .alert.alert-indigo-700 a:not(.btn),html .table-indigo-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-700 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-700 a:not(.btn){font-weight:700;color:#250657}}@media print{html .alert.alert-indigo-700 .btn:not([class*=btn-outline]),html .table-indigo-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-700 a:not(.btn){font-weight:700;color:#b19dd3}}@media print{html .badge.bg-indigo-700,html .toast.bg-indigo-700,html .toast-header.bg-indigo-700,html .progress-bar.bg-indigo-700,html[data-netbox-color-mode=dark] .badge.bg-indigo-700,html[data-netbox-color-mode=dark] .toast.bg-indigo-700,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-700,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-700,html[data-netbox-color-mode=light] .badge.bg-indigo-700,html[data-netbox-color-mode=light] .toast.bg-indigo-700,html[data-netbox-color-mode=light] .toast-header.bg-indigo-700,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-700{color:#fff}}@media print{html .bg-indigo-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-800 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2319043a'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-800,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-800{color:#290661}}@media print{html .btn.btn-ghost-indigo-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-800:hover{background-color:#2906611f}}@media print{html .alert.alert-indigo-800 a:not(.btn),html .table-indigo-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-800 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-800 a:not(.btn){font-weight:700;color:#19043a}}@media print{html .alert.alert-indigo-800 .btn:not([class*=btn-outline]),html .table-indigo-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-800 a:not(.btn){font-weight:700;color:#a99bc0}}@media print{html .badge.bg-indigo-800,html .toast.bg-indigo-800,html .toast-header.bg-indigo-800,html .progress-bar.bg-indigo-800,html[data-netbox-color-mode=dark] .badge.bg-indigo-800,html[data-netbox-color-mode=dark] .toast.bg-indigo-800,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-800,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-800,html[data-netbox-color-mode=light] .badge.bg-indigo-800,html[data-netbox-color-mode=light] .toast.bg-indigo-800,html[data-netbox-color-mode=light] .toast-header.bg-indigo-800,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-800{color:#fff}}@media print{html .bg-indigo-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo-900 button.btn-close,html[data-netbox-color-mode=light] .bg-indigo-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c021d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-900,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-900{color:#140330}}@media print{html .btn.btn-ghost-indigo-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo-900:hover{background-color:#1403301f}}@media print{html .alert.alert-indigo-900 a:not(.btn),html .table-indigo-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo-900 a:not(.btn),html[data-netbox-color-mode=light] .table-indigo-900 a:not(.btn){font-weight:700;color:#0c021d}}@media print{html .alert.alert-indigo-900 .btn:not([class*=btn-outline]),html .table-indigo-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo-900 a:not(.btn){font-weight:700;color:#a19aac}}@media print{html .badge.bg-indigo-900,html .toast.bg-indigo-900,html .toast-header.bg-indigo-900,html .progress-bar.bg-indigo-900,html[data-netbox-color-mode=dark] .badge.bg-indigo-900,html[data-netbox-color-mode=dark] .toast.bg-indigo-900,html[data-netbox-color-mode=dark] .toast-header.bg-indigo-900,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo-900,html[data-netbox-color-mode=light] .badge.bg-indigo-900,html[data-netbox-color-mode=light] .toast.bg-indigo-900,html[data-netbox-color-mode=light] .toast-header.bg-indigo-900,html[data-netbox-color-mode=light] .progress-bar.bg-indigo-900{color:#fff}}@media print{html .bg-purple-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-100 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235a5761'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-100,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-100{color:#e2d9f3}}@media print{html .btn.btn-ghost-purple-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-100:hover{background-color:#e2d9f31f}}@media print{html .alert.alert-purple-100 a:not(.btn),html .table-purple-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-100 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-100 a:not(.btn){font-weight:700;color:#5a5761}}@media print{html .alert.alert-purple-100 .btn:not([class*=btn-outline]),html .table-purple-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-100 a:not(.btn){font-weight:700;color:#5a5761}}@media print{html .badge.bg-purple-100,html .toast.bg-purple-100,html .toast-header.bg-purple-100,html .progress-bar.bg-purple-100,html[data-netbox-color-mode=dark] .badge.bg-purple-100,html[data-netbox-color-mode=dark] .toast.bg-purple-100,html[data-netbox-color-mode=dark] .toast-header.bg-purple-100,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-100,html[data-netbox-color-mode=light] .badge.bg-purple-100,html[data-netbox-color-mode=light] .toast.bg-purple-100,html[data-netbox-color-mode=light] .toast-header.bg-purple-100,html[data-netbox-color-mode=light] .progress-bar.bg-purple-100{color:#000}}@media print{html .bg-purple-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-200 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234f485c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-200,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-200{color:#c5b3e6}}@media print{html .btn.btn-ghost-purple-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-200:hover{background-color:#c5b3e61f}}@media print{html .alert.alert-purple-200 a:not(.btn),html .table-purple-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-200 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-200 a:not(.btn){font-weight:700;color:#4f485c}}@media print{html .alert.alert-purple-200 .btn:not([class*=btn-outline]),html .table-purple-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-200 a:not(.btn){font-weight:700;color:#4f485c}}@media print{html .badge.bg-purple-200,html .toast.bg-purple-200,html .toast-header.bg-purple-200,html .progress-bar.bg-purple-200,html[data-netbox-color-mode=dark] .badge.bg-purple-200,html[data-netbox-color-mode=dark] .toast.bg-purple-200,html[data-netbox-color-mode=dark] .toast-header.bg-purple-200,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-200,html[data-netbox-color-mode=light] .badge.bg-purple-200,html[data-netbox-color-mode=light] .toast.bg-purple-200,html[data-netbox-color-mode=light] .toast-header.bg-purple-200,html[data-netbox-color-mode=light] .progress-bar.bg-purple-200{color:#000}}@media print{html .bg-purple-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-300 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23655583'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-300,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-300{color:#a98eda}}@media print{html .btn.btn-ghost-purple-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-300:hover{background-color:#a98eda1f}}@media print{html .alert.alert-purple-300 a:not(.btn),html .table-purple-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-300 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-300 a:not(.btn){font-weight:700;color:#655583}}@media print{html .alert.alert-purple-300 .btn:not([class*=btn-outline]),html .table-purple-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-300 a:not(.btn){font-weight:700;color:#443957}}@media print{html .badge.bg-purple-300,html .toast.bg-purple-300,html .toast-header.bg-purple-300,html .progress-bar.bg-purple-300,html[data-netbox-color-mode=dark] .badge.bg-purple-300,html[data-netbox-color-mode=dark] .toast.bg-purple-300,html[data-netbox-color-mode=dark] .toast-header.bg-purple-300,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-300,html[data-netbox-color-mode=light] .badge.bg-purple-300,html[data-netbox-color-mode=light] .toast.bg-purple-300,html[data-netbox-color-mode=light] .toast-header.bg-purple-300,html[data-netbox-color-mode=light] .progress-bar.bg-purple-300{color:#000}}@media print{html .bg-purple-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-400 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23543e7b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-400,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-400{color:#8c68cd}}@media print{html .btn.btn-ghost-purple-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-400:hover{background-color:#8c68cd1f}}@media print{html .alert.alert-purple-400 a:not(.btn),html .table-purple-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-400 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-400 a:not(.btn){font-weight:700;color:#543e7b}}@media print{html .alert.alert-purple-400 .btn:not([class*=btn-outline]),html .table-purple-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-400 a:not(.btn){font-weight:700;color:#382a52}}@media print{html .badge.bg-purple-400,html .toast.bg-purple-400,html .toast-header.bg-purple-400,html .progress-bar.bg-purple-400,html[data-netbox-color-mode=dark] .badge.bg-purple-400,html[data-netbox-color-mode=dark] .toast.bg-purple-400,html[data-netbox-color-mode=dark] .toast-header.bg-purple-400,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-400,html[data-netbox-color-mode=light] .badge.bg-purple-400,html[data-netbox-color-mode=light] .toast.bg-purple-400,html[data-netbox-color-mode=light] .toast-header.bg-purple-400,html[data-netbox-color-mode=light] .progress-bar.bg-purple-400{color:#000}}@media print{html .bg-purple-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-500 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23432874'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-500,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-500{color:#6f42c1}}@media print{html .btn.btn-ghost-purple-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-500:hover{background-color:#6f42c11f}}@media print{html .alert.alert-purple-500 a:not(.btn),html .table-purple-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-500 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-500 a:not(.btn){font-weight:700;color:#432874}}@media print{html .alert.alert-purple-500 .btn:not([class*=btn-outline]),html .table-purple-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-500 a:not(.btn){font-weight:700;color:#c5b3e6}}@media print{html .badge.bg-purple-500,html .toast.bg-purple-500,html .toast-header.bg-purple-500,html .progress-bar.bg-purple-500,html[data-netbox-color-mode=dark] .badge.bg-purple-500,html[data-netbox-color-mode=dark] .toast.bg-purple-500,html[data-netbox-color-mode=dark] .toast-header.bg-purple-500,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-500,html[data-netbox-color-mode=light] .badge.bg-purple-500,html[data-netbox-color-mode=light] .toast.bg-purple-500,html[data-netbox-color-mode=light] .toast-header.bg-purple-500,html[data-netbox-color-mode=light] .progress-bar.bg-purple-500{color:#fff}}@media print{html .bg-purple-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-600 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2335205c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-600,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-600{color:#59359a}}@media print{html .btn.btn-ghost-purple-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-600:hover{background-color:#59359a1f}}@media print{html .alert.alert-purple-600 a:not(.btn),html .table-purple-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-600 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-600 a:not(.btn){font-weight:700;color:#35205c}}@media print{html .alert.alert-purple-600 .btn:not([class*=btn-outline]),html .table-purple-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-600 a:not(.btn){font-weight:700;color:#bdaed7}}@media print{html .badge.bg-purple-600,html .toast.bg-purple-600,html .toast-header.bg-purple-600,html .progress-bar.bg-purple-600,html[data-netbox-color-mode=dark] .badge.bg-purple-600,html[data-netbox-color-mode=dark] .toast.bg-purple-600,html[data-netbox-color-mode=dark] .toast-header.bg-purple-600,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-600,html[data-netbox-color-mode=light] .badge.bg-purple-600,html[data-netbox-color-mode=light] .toast.bg-purple-600,html[data-netbox-color-mode=light] .toast-header.bg-purple-600,html[data-netbox-color-mode=light] .progress-bar.bg-purple-600{color:#fff}}@media print{html .bg-purple-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-700 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23281846'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-700,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-700{color:#432874}}@media print{html .btn.btn-ghost-purple-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-700:hover{background-color:#4328741f}}@media print{html .alert.alert-purple-700 a:not(.btn),html .table-purple-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-700 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-700 a:not(.btn){font-weight:700;color:#281846}}@media print{html .alert.alert-purple-700 .btn:not([class*=btn-outline]),html .table-purple-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-700 a:not(.btn){font-weight:700;color:#b4a9c7}}@media print{html .badge.bg-purple-700,html .toast.bg-purple-700,html .toast-header.bg-purple-700,html .progress-bar.bg-purple-700,html[data-netbox-color-mode=dark] .badge.bg-purple-700,html[data-netbox-color-mode=dark] .toast.bg-purple-700,html[data-netbox-color-mode=dark] .toast-header.bg-purple-700,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-700,html[data-netbox-color-mode=light] .badge.bg-purple-700,html[data-netbox-color-mode=light] .toast.bg-purple-700,html[data-netbox-color-mode=light] .toast-header.bg-purple-700,html[data-netbox-color-mode=light] .progress-bar.bg-purple-700{color:#fff}}@media print{html .bg-purple-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-800 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231a102e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-800,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-800{color:#2c1a4d}}@media print{html .btn.btn-ghost-purple-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-800:hover{background-color:#2c1a4d1f}}@media print{html .alert.alert-purple-800 a:not(.btn),html .table-purple-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-800 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-800 a:not(.btn){font-weight:700;color:#1a102e}}@media print{html .alert.alert-purple-800 .btn:not([class*=btn-outline]),html .table-purple-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-800 a:not(.btn){font-weight:700;color:#aba3b8}}@media print{html .badge.bg-purple-800,html .toast.bg-purple-800,html .toast-header.bg-purple-800,html .progress-bar.bg-purple-800,html[data-netbox-color-mode=dark] .badge.bg-purple-800,html[data-netbox-color-mode=dark] .toast.bg-purple-800,html[data-netbox-color-mode=dark] .toast-header.bg-purple-800,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-800,html[data-netbox-color-mode=light] .badge.bg-purple-800,html[data-netbox-color-mode=light] .toast.bg-purple-800,html[data-netbox-color-mode=light] .toast-header.bg-purple-800,html[data-netbox-color-mode=light] .progress-bar.bg-purple-800{color:#fff}}@media print{html .bg-purple-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-purple-900 button.btn-close,html[data-netbox-color-mode=light] .bg-purple-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230d0817'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-900,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-900{color:#160d27}}@media print{html .btn.btn-ghost-purple-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple-900:hover{background-color:#160d271f}}@media print{html .alert.alert-purple-900 a:not(.btn),html .table-purple-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-purple-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple-900 a:not(.btn),html[data-netbox-color-mode=light] .table-purple-900 a:not(.btn){font-weight:700;color:#0d0817}}@media print{html .alert.alert-purple-900 .btn:not([class*=btn-outline]),html .table-purple-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple-900 a:not(.btn){font-weight:700;color:#a29ea9}}@media print{html .badge.bg-purple-900,html .toast.bg-purple-900,html .toast-header.bg-purple-900,html .progress-bar.bg-purple-900,html[data-netbox-color-mode=dark] .badge.bg-purple-900,html[data-netbox-color-mode=dark] .toast.bg-purple-900,html[data-netbox-color-mode=dark] .toast-header.bg-purple-900,html[data-netbox-color-mode=dark] .progress-bar.bg-purple-900,html[data-netbox-color-mode=light] .badge.bg-purple-900,html[data-netbox-color-mode=light] .toast.bg-purple-900,html[data-netbox-color-mode=light] .toast-header.bg-purple-900,html[data-netbox-color-mode=light] .progress-bar.bg-purple-900{color:#fff}}@media print{html .bg-pink-100 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-100 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-100 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2363565c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-100,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-100,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-100{color:#f7d6e6}}@media print{html .btn.btn-ghost-pink-100:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-100:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-100:hover{background-color:#f7d6e61f}}@media print{html .alert.alert-pink-100 a:not(.btn),html .table-pink-100 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-100 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-100 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-100 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-100 a:not(.btn){font-weight:700;color:#63565c}}@media print{html .alert.alert-pink-100 .btn:not([class*=btn-outline]),html .table-pink-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-100 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-100 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-100 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-100 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-100 a:not(.btn){font-weight:700;color:#63565c}}@media print{html .badge.bg-pink-100,html .toast.bg-pink-100,html .toast-header.bg-pink-100,html .progress-bar.bg-pink-100,html[data-netbox-color-mode=dark] .badge.bg-pink-100,html[data-netbox-color-mode=dark] .toast.bg-pink-100,html[data-netbox-color-mode=dark] .toast-header.bg-pink-100,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-100,html[data-netbox-color-mode=light] .badge.bg-pink-100,html[data-netbox-color-mode=light] .toast.bg-pink-100,html[data-netbox-color-mode=light] .toast-header.bg-pink-100,html[data-netbox-color-mode=light] .progress-bar.bg-pink-100{color:#000}}@media print{html .bg-pink-200 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-200 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-200 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23604552'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-200,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-200,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-200{color:#efadce}}@media print{html .btn.btn-ghost-pink-200:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-200:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-200:hover{background-color:#efadce1f}}@media print{html .alert.alert-pink-200 a:not(.btn),html .table-pink-200 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-200 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-200 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-200 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-200 a:not(.btn){font-weight:700;color:#604552}}@media print{html .alert.alert-pink-200 .btn:not([class*=btn-outline]),html .table-pink-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-200 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-200 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-200 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-200 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-200 a:not(.btn){font-weight:700;color:#604552}}@media print{html .badge.bg-pink-200,html .toast.bg-pink-200,html .toast-header.bg-pink-200,html .progress-bar.bg-pink-200,html[data-netbox-color-mode=dark] .badge.bg-pink-200,html[data-netbox-color-mode=dark] .toast.bg-pink-200,html[data-netbox-color-mode=dark] .toast-header.bg-pink-200,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-200,html[data-netbox-color-mode=light] .badge.bg-pink-200,html[data-netbox-color-mode=light] .toast.bg-pink-200,html[data-netbox-color-mode=light] .toast-header.bg-pink-200,html[data-netbox-color-mode=light] .progress-bar.bg-pink-200{color:#000}}@media print{html .bg-pink-300 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-300 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-300 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%238a506d'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-300,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-300,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-300{color:#e685b5}}@media print{html .btn.btn-ghost-pink-300:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-300:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-300:hover{background-color:#e685b51f}}@media print{html .alert.alert-pink-300 a:not(.btn),html .table-pink-300 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-300 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-300 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-300 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-300 a:not(.btn){font-weight:700;color:#8a506d}}@media print{html .alert.alert-pink-300 .btn:not([class*=btn-outline]),html .table-pink-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-300 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-300 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-300 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-300 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-300 a:not(.btn){font-weight:700;color:#5c3548}}@media print{html .badge.bg-pink-300,html .toast.bg-pink-300,html .toast-header.bg-pink-300,html .progress-bar.bg-pink-300,html[data-netbox-color-mode=dark] .badge.bg-pink-300,html[data-netbox-color-mode=dark] .toast.bg-pink-300,html[data-netbox-color-mode=dark] .toast-header.bg-pink-300,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-300,html[data-netbox-color-mode=light] .badge.bg-pink-300,html[data-netbox-color-mode=light] .toast.bg-pink-300,html[data-netbox-color-mode=light] .toast-header.bg-pink-300,html[data-netbox-color-mode=light] .progress-bar.bg-pink-300{color:#000}}@media print{html .bg-pink-400 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-400 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-400 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2385375e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-400,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-400,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-400{color:#de5c9d}}@media print{html .btn.btn-ghost-pink-400:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-400:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-400:hover{background-color:#de5c9d1f}}@media print{html .alert.alert-pink-400 a:not(.btn),html .table-pink-400 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-400 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-400 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-400 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-400 a:not(.btn){font-weight:700;color:#85375e}}@media print{html .alert.alert-pink-400 .btn:not([class*=btn-outline]),html .table-pink-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-400 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-400 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-400 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-400 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-400 a:not(.btn){font-weight:700;color:#59253f}}@media print{html .badge.bg-pink-400,html .toast.bg-pink-400,html .toast-header.bg-pink-400,html .progress-bar.bg-pink-400,html[data-netbox-color-mode=dark] .badge.bg-pink-400,html[data-netbox-color-mode=dark] .toast.bg-pink-400,html[data-netbox-color-mode=dark] .toast-header.bg-pink-400,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-400,html[data-netbox-color-mode=light] .badge.bg-pink-400,html[data-netbox-color-mode=light] .toast.bg-pink-400,html[data-netbox-color-mode=light] .toast-header.bg-pink-400,html[data-netbox-color-mode=light] .progress-bar.bg-pink-400{color:#000}}@media print{html .bg-pink-500 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-500 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-500 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23801f4f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-500,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-500,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-500{color:#d63384}}@media print{html .btn.btn-ghost-pink-500:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-500:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-500:hover{background-color:#d633841f}}@media print{html .alert.alert-pink-500 a:not(.btn),html .table-pink-500 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-500 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-500 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-500 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-500 a:not(.btn){font-weight:700;color:#801f4f}}@media print{html .alert.alert-pink-500 .btn:not([class*=btn-outline]),html .table-pink-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-500 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-500 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-500 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-500 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-500 a:not(.btn){font-weight:700;color:#efadce}}@media print{html .badge.bg-pink-500,html .toast.bg-pink-500,html .toast-header.bg-pink-500,html .progress-bar.bg-pink-500,html[data-netbox-color-mode=dark] .badge.bg-pink-500,html[data-netbox-color-mode=dark] .toast.bg-pink-500,html[data-netbox-color-mode=dark] .toast-header.bg-pink-500,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-500,html[data-netbox-color-mode=light] .badge.bg-pink-500,html[data-netbox-color-mode=light] .toast.bg-pink-500,html[data-netbox-color-mode=light] .toast-header.bg-pink-500,html[data-netbox-color-mode=light] .progress-bar.bg-pink-500{color:#fff}}@media print{html .bg-pink-600 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-600 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-600 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23671940'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-600,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-600,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-600{color:#ab296a}}@media print{html .btn.btn-ghost-pink-600:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-600:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-600:hover{background-color:#ab296a1f}}@media print{html .alert.alert-pink-600 a:not(.btn),html .table-pink-600 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-600 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-600 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-600 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-600 a:not(.btn){font-weight:700;color:#671940}}@media print{html .alert.alert-pink-600 .btn:not([class*=btn-outline]),html .table-pink-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-600 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-600 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-600 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-600 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-600 a:not(.btn){font-weight:700;color:#dda9c3}}@media print{html .badge.bg-pink-600,html .toast.bg-pink-600,html .toast-header.bg-pink-600,html .progress-bar.bg-pink-600,html[data-netbox-color-mode=dark] .badge.bg-pink-600,html[data-netbox-color-mode=dark] .toast.bg-pink-600,html[data-netbox-color-mode=dark] .toast-header.bg-pink-600,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-600,html[data-netbox-color-mode=light] .badge.bg-pink-600,html[data-netbox-color-mode=light] .toast.bg-pink-600,html[data-netbox-color-mode=light] .toast-header.bg-pink-600,html[data-netbox-color-mode=light] .progress-bar.bg-pink-600{color:#fff}}@media print{html .bg-pink-700 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-700 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-700 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234d132f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-700,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-700,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-700{color:#801f4f}}@media print{html .btn.btn-ghost-pink-700:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-700:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-700:hover{background-color:#801f4f1f}}@media print{html .alert.alert-pink-700 a:not(.btn),html .table-pink-700 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-700 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-700 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-700 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-700 a:not(.btn){font-weight:700;color:#4d132f}}@media print{html .alert.alert-pink-700 .btn:not([class*=btn-outline]),html .table-pink-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-700 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-700 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-700 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-700 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-700 a:not(.btn){font-weight:700;color:#cca5b9}}@media print{html .badge.bg-pink-700,html .toast.bg-pink-700,html .toast-header.bg-pink-700,html .progress-bar.bg-pink-700,html[data-netbox-color-mode=dark] .badge.bg-pink-700,html[data-netbox-color-mode=dark] .toast.bg-pink-700,html[data-netbox-color-mode=dark] .toast-header.bg-pink-700,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-700,html[data-netbox-color-mode=light] .badge.bg-pink-700,html[data-netbox-color-mode=light] .toast.bg-pink-700,html[data-netbox-color-mode=light] .toast-header.bg-pink-700,html[data-netbox-color-mode=light] .progress-bar.bg-pink-700{color:#fff}}@media print{html .bg-pink-800 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-800 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-800 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23340c20'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-800,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-800,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-800{color:#561435}}@media print{html .btn.btn-ghost-pink-800:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-800:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-800:hover{background-color:#5614351f}}@media print{html .alert.alert-pink-800 a:not(.btn),html .table-pink-800 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-800 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-800 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-800 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-800 a:not(.btn){font-weight:700;color:#340c20}}@media print{html .alert.alert-pink-800 .btn:not([class*=btn-outline]),html .table-pink-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-800 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-800 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-800 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-800 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-800 a:not(.btn){font-weight:700;color:#bba1ae}}@media print{html .badge.bg-pink-800,html .toast.bg-pink-800,html .toast-header.bg-pink-800,html .progress-bar.bg-pink-800,html[data-netbox-color-mode=dark] .badge.bg-pink-800,html[data-netbox-color-mode=dark] .toast.bg-pink-800,html[data-netbox-color-mode=dark] .toast-header.bg-pink-800,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-800,html[data-netbox-color-mode=light] .badge.bg-pink-800,html[data-netbox-color-mode=light] .toast.bg-pink-800,html[data-netbox-color-mode=light] .toast-header.bg-pink-800,html[data-netbox-color-mode=light] .progress-bar.bg-pink-800{color:#fff}}@media print{html .bg-pink-900 button.btn-close,html[data-netbox-color-mode=dark] .bg-pink-900 button.btn-close,html[data-netbox-color-mode=light] .bg-pink-900 button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231a0610'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink-900,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-900,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-900{color:#2b0a1a}}@media print{html .btn.btn-ghost-pink-900:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink-900:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink-900:hover{background-color:#2b0a1a1f}}@media print{html .alert.alert-pink-900 a:not(.btn),html .table-pink-900 a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink-900 a:not(.btn),html[data-netbox-color-mode=dark] .table-pink-900 a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink-900 a:not(.btn),html[data-netbox-color-mode=light] .table-pink-900 a:not(.btn){font-weight:700;color:#1a0610}}@media print{html .alert.alert-pink-900 .btn:not([class*=btn-outline]),html .table-pink-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink-900 .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink-900 .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink-900 a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink-900 a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink-900 a:not(.btn){font-weight:700;color:#aa9da3}}@media print{html .badge.bg-pink-900,html .toast.bg-pink-900,html .toast-header.bg-pink-900,html .progress-bar.bg-pink-900,html[data-netbox-color-mode=dark] .badge.bg-pink-900,html[data-netbox-color-mode=dark] .toast.bg-pink-900,html[data-netbox-color-mode=dark] .toast-header.bg-pink-900,html[data-netbox-color-mode=dark] .progress-bar.bg-pink-900,html[data-netbox-color-mode=light] .badge.bg-pink-900,html[data-netbox-color-mode=light] .toast.bg-pink-900,html[data-netbox-color-mode=light] .toast-header.bg-pink-900,html[data-netbox-color-mode=light] .progress-bar.bg-pink-900{color:#fff}}@media print{html table td>.progress,html[data-netbox-color-mode=dark] table td>.progress,html[data-netbox-color-mode=light] table td>.progress{min-width:6rem}}@media print{html .small .form-control,html[data-netbox-color-mode=dark] .small .form-control,html[data-netbox-color-mode=light] .small .form-control{font-size:.875rem}}@media print{html :not(.card-body)>.col:not(:last-child):not(:only-child),html[data-netbox-color-mode=dark] :not(.card-body)>.col:not(:last-child):not(:only-child),html[data-netbox-color-mode=light] :not(.card-body)>.col:not(:last-child):not(:only-child){margin-bottom:1rem}}@media print{html .nav-mobile,html[data-netbox-color-mode=dark] .nav-mobile,html[data-netbox-color-mode=light] .nav-mobile{display:none;flex-direction:column;align-items:center;justify-content:space-between;width:100%}}@media print and (max-width: 991.98px){html .nav-mobile,html[data-netbox-color-mode=dark] .nav-mobile,html[data-netbox-color-mode=light] .nav-mobile{display:flex}}@media print{html .nav-mobile .nav-mobile-top,html[data-netbox-color-mode=dark] .nav-mobile .nav-mobile-top,html[data-netbox-color-mode=light] .nav-mobile .nav-mobile-top{display:flex;align-items:center;justify-content:space-between;width:100%}}@media print{html .card>.table.table-flush,html[data-netbox-color-mode=dark] .card>.table.table-flush,html[data-netbox-color-mode=light] .card>.table.table-flush{margin-bottom:0;overflow:hidden;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}}@media print{html .card>.table.table-flush thead th[scope=col],html[data-netbox-color-mode=dark] .card>.table.table-flush thead th[scope=col],html[data-netbox-color-mode=light] .card>.table.table-flush thead th[scope=col]{padding-top:1rem;padding-bottom:1rem;text-transform:uppercase;vertical-align:middle;background-color:#f8f9fa;border-top:1px solid rgba(0,0,0,.125);border-bottom-color:#00000020}}@media print{html .card>.table.table-flush th,html .card>.table.table-flush td,html[data-netbox-color-mode=dark] .card>.table.table-flush th,html[data-netbox-color-mode=dark] .card>.table.table-flush td,html[data-netbox-color-mode=light] .card>.table.table-flush th,html[data-netbox-color-mode=light] .card>.table.table-flush td{padding-right:1.5rem!important;padding-left:1.5rem!important;border-right:0;border-left:0}}@media print{html .card>.table.table-flush tr[class],html[data-netbox-color-mode=dark] .card>.table.table-flush tr[class],html[data-netbox-color-mode=light] .card>.table.table-flush tr[class]{border-color:#00000020!important}}@media print{html .card>.table.table-flush tr[class]:last-of-type,html[data-netbox-color-mode=dark] .card>.table.table-flush tr[class]:last-of-type,html[data-netbox-color-mode=light] .card>.table.table-flush tr[class]:last-of-type{border-bottom-color:transparent!important;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}}@media print{html .header-alert-container,html[data-netbox-color-mode=dark] .header-alert-container,html[data-netbox-color-mode=light] .header-alert-container{display:flex;align-items:center;justify-content:center;padding:0 1rem}}@media print{html .header-alert-container .alert,html[data-netbox-color-mode=dark] .header-alert-container .alert,html[data-netbox-color-mode=light] .header-alert-container .alert{width:100%}}@media print and (min-width: 768px){html .header-alert-container .alert,html[data-netbox-color-mode=dark] .header-alert-container .alert,html[data-netbox-color-mode=light] .header-alert-container .alert{max-width:75%}}@media print and (min-width: 992px){html .header-alert-container .alert,html[data-netbox-color-mode=dark] .header-alert-container .alert,html[data-netbox-color-mode=light] .header-alert-container .alert{max-width:50%}}@media print{html span.profile-button .dropdown-menu,html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu,html[data-netbox-color-mode=light] span.profile-button .dropdown-menu{right:0;left:auto;display:block!important;margin-top:.5rem;box-shadow:0 .5rem 1rem #00000026;transition:opacity .2s ease-in-out}}@media print{html span.profile-button .dropdown-menu:not(.show),html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu:not(.show),html[data-netbox-color-mode=light] span.profile-button .dropdown-menu:not(.show){pointer-events:none;opacity:0}}@media print{html span.profile-button .dropdown-menu.show,html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu.show,html[data-netbox-color-mode=light] span.profile-button .dropdown-menu.show{pointer-events:auto;opacity:1}}@media print{html div#advanced-search-content div.card div.card-body div.col:not(:last-child),html[data-netbox-color-mode=dark] div#advanced-search-content div.card div.card-body div.col:not(:last-child),html[data-netbox-color-mode=light] div#advanced-search-content div.card div.card-body div.col:not(:last-child){margin-right:1rem}}@media print{html table td a,html[data-netbox-color-mode=dark] table td a,html[data-netbox-color-mode=light] table td a{text-decoration:none}}@media print{html table td a:hover,html[data-netbox-color-mode=dark] table td a:hover,html[data-netbox-color-mode=light] table td a:hover{text-decoration:underline}}@media print{html table td .dropdown,html[data-netbox-color-mode=dark] table td .dropdown,html[data-netbox-color-mode=light] table td .dropdown{position:static}}@media print{html table th a,html table th a:hover,html[data-netbox-color-mode=dark] table th a,html[data-netbox-color-mode=dark] table th a:hover,html[data-netbox-color-mode=light] table th a,html[data-netbox-color-mode=light] table th a:hover{color:#212529;text-decoration:none}}@media print{html table td,html table th,html[data-netbox-color-mode=dark] table td,html[data-netbox-color-mode=dark] table th,html[data-netbox-color-mode=light] table td,html[data-netbox-color-mode=light] table th{font-size:.875rem;line-height:1.25;vertical-align:middle}}@media print{html table td.min-width,html table th.min-width,html[data-netbox-color-mode=dark] table td.min-width,html[data-netbox-color-mode=dark] table th.min-width,html[data-netbox-color-mode=light] table td.min-width,html[data-netbox-color-mode=light] table th.min-width{width:1%}}@media print{html table td .form-check-input,html table th .form-check-input,html[data-netbox-color-mode=dark] table td .form-check-input,html[data-netbox-color-mode=dark] table th .form-check-input,html[data-netbox-color-mode=light] table td .form-check-input,html[data-netbox-color-mode=light] table th .form-check-input{margin-top:.125em;font-size:1rem}}@media print{html table td .btn-sm,html table td .btn-group-sm>.btn,html table th .btn-sm,html table th .btn-group-sm>.btn,html[data-netbox-color-mode=dark] table td .btn-sm,html[data-netbox-color-mode=dark] table td html[data-netbox-color-mode=light] .btn-group-sm>.btn,html[data-netbox-color-mode=dark] table th .btn-sm,html[data-netbox-color-mode=dark] table th html[data-netbox-color-mode=light] .btn-group-sm>.btn,html[data-netbox-color-mode=light] table td .btn-sm,html[data-netbox-color-mode=light] table td html[data-netbox-color-mode=dark] .btn-group-sm>.btn,html[data-netbox-color-mode=light] table th .btn-sm,html[data-netbox-color-mode=light] table th html[data-netbox-color-mode=dark] .btn-group-sm>.btn{line-height:1}}@media print{html table td p,html table th p,html[data-netbox-color-mode=dark] table td p,html[data-netbox-color-mode=dark] table th p,html[data-netbox-color-mode=light] table td p,html[data-netbox-color-mode=light] table th p{margin-bottom:0}}@media print{html table th.asc a:after,html[data-netbox-color-mode=dark] table th.asc a:after,html[data-netbox-color-mode=light] table th.asc a:after{content:"\f0140";font-family:"Material Design Icons"}}@media print{html table th.desc a:after,html[data-netbox-color-mode=dark] table th.desc a:after,html[data-netbox-color-mode=light] table th.desc a:after{content:"\f0143";font-family:"Material Design Icons"}}@media print{html table.table>:not(caption)>*>*,html[data-netbox-color-mode=dark] table.table>:not(caption)>*>*,html[data-netbox-color-mode=light] table.table>:not(caption)>*>*{padding-right:.25rem!important;padding-left:.25rem!important}}@media print{html table.object-list th,html[data-netbox-color-mode=dark] table.object-list th,html[data-netbox-color-mode=light] table.object-list th{font-size:.75rem;line-height:1;vertical-align:bottom}}@media print{html table.attr-table th,html[data-netbox-color-mode=dark] table.attr-table th,html[data-netbox-color-mode=light] table.attr-table th{font-weight:normal;width:25%}}@media print{html div.title-container,html[data-netbox-color-mode=dark] div.title-container,html[data-netbox-color-mode=light] div.title-container{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:space-between}}@media print and (min-width: 992px){html div.title-container,html[data-netbox-color-mode=dark] div.title-container,html[data-netbox-color-mode=light] div.title-container{flex-direction:row}}@media print{html div.title-container #content-title,html[data-netbox-color-mode=dark] div.title-container #content-title,html[data-netbox-color-mode=light] div.title-container #content-title{display:flex;flex:1 0;flex-direction:column;padding-bottom:.5rem}}@media print{html .controls,html[data-netbox-color-mode=dark] .controls,html[data-netbox-color-mode=light] .controls{margin-bottom:.5rem}}@media print{html .controls,html[data-netbox-color-mode=dark] .controls,html[data-netbox-color-mode=light] .controls{display:none!important}}@media print{html .controls .control-group,html[data-netbox-color-mode=dark] .controls .control-group,html[data-netbox-color-mode=light] .controls .control-group{display:flex;flex-wrap:wrap;justify-content:flex-start}}@media print and (min-width: 992px){html .controls .control-group,html[data-netbox-color-mode=dark] .controls .control-group,html[data-netbox-color-mode=light] .controls .control-group{justify-content:flex-end}}@media print{html .controls .control-group>*,html[data-netbox-color-mode=dark] .controls .control-group>*,html[data-netbox-color-mode=light] .controls .control-group>*{margin:.25rem}}@media print{html .controls .control-group>*:first-child,html[data-netbox-color-mode=dark] .controls .control-group>*:first-child,html[data-netbox-color-mode=light] .controls .control-group>*:first-child{margin-left:0}}@media print{html .controls .control-group>*:last-child,html[data-netbox-color-mode=dark] .controls .control-group>*:last-child,html[data-netbox-color-mode=light] .controls .control-group>*:last-child{margin-right:0}}@media print{html .object-subtitle,html[data-netbox-color-mode=dark] .object-subtitle,html[data-netbox-color-mode=light] .object-subtitle{display:block;font-size:.875rem;color:#6c757d}}@media print and (min-width: 768px){html .object-subtitle,html[data-netbox-color-mode=dark] .object-subtitle,html[data-netbox-color-mode=light] .object-subtitle{display:inline-block}}@media print{html .object-subtitle>span,html[data-netbox-color-mode=dark] .object-subtitle>span,html[data-netbox-color-mode=light] .object-subtitle>span{display:block}}@media print{html .object-subtitle>span.separator,html[data-netbox-color-mode=dark] .object-subtitle>span.separator,html[data-netbox-color-mode=light] .object-subtitle>span.separator{display:none}}@media print and (min-width: 768px){html .object-subtitle>span,html .object-subtitle>span.separator,html[data-netbox-color-mode=dark] .object-subtitle>span,html[data-netbox-color-mode=dark] .object-subtitle>span.separator,html[data-netbox-color-mode=light] .object-subtitle>span,html[data-netbox-color-mode=light] .object-subtitle>span.separator{display:inline-block}}@media print{html nav.search,html[data-netbox-color-mode=dark] nav.search,html[data-netbox-color-mode=light] nav.search{z-index:999;justify-content:center;background-color:var(--nbx-body-bg)}}@media print{html nav.search .search-container,html[data-netbox-color-mode=dark] nav.search .search-container,html[data-netbox-color-mode=light] nav.search .search-container{display:flex;width:100%}}@media print and (max-width: 991.98px){html nav.search .search-container,html[data-netbox-color-mode=dark] nav.search .search-container,html[data-netbox-color-mode=light] nav.search .search-container{display:none}}@media print{html nav.search .input-group .search-obj-selected,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selected,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selected{border-color:#e9ecef}}@media print{html nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle{color:#000;border-color:#e9ecef;margin-left:0;font-weight:400;line-height:1.5;color:#212529;background-color:#e9ecef;border:1px solid #e9ecef;border-radius:.375rem;border-left:1px solid var(--nbx-search-filter-border-left-color)}}@media print{html nav.search .input-group .dropdown-toggle:hover,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:hover,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}}@media print{.btn-check:focus+html nav.search .input-group .dropdown-toggle,html nav.search .input-group .dropdown-toggle:focus,.btn-check:focus+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,.btn-check:focus+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}}@media print{.btn-check:checked+html nav.search .input-group .dropdown-toggle,.btn-check:active+html nav.search .input-group .dropdown-toggle,html nav.search .input-group .dropdown-toggle:active,html nav.search .input-group .dropdown-toggle.active,.show>html nav.search .input-group .dropdown-toggle.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,.btn-check:active+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:active,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.active,.show>html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle,.btn-check:active+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:active,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.active,.show>html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}}@media print{.btn-check:checked+html nav.search .input-group .dropdown-toggle:focus,.btn-check:active+html nav.search .input-group .dropdown-toggle:focus,html nav.search .input-group .dropdown-toggle:active:focus,html nav.search .input-group .dropdown-toggle.active:focus,.show>html nav.search .input-group .dropdown-toggle.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,.btn-check:active+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:active:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.active:focus,.show>html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:focus,.btn-check:active+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:active:focus,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.active:focus,.show>html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}}@media print{html nav.search .input-group .dropdown-toggle:disabled,html nav.search .input-group .dropdown-toggle.disabled,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:disabled,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.disabled,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:disabled,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}}@media print{html nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:focus{box-shadow:unset!important}}@media print{html nav.search .input-group .dropdown-toggle:after,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:after,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:after{display:none}}@media print{html nav.search .input-group .search-obj-selector,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selector{max-height:70vh;overflow-y:auto}}@media print{html nav.search .input-group .search-obj-selector .dropdown-item,html nav.search .input-group .search-obj-selector .dropdown-header,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-item,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-header,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selector .dropdown-item,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selector .dropdown-header{font-size:.875rem}}@media print{html nav.search .input-group .search-obj-selector .dropdown-header,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-header,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selector .dropdown-header{text-transform:uppercase}}@media print{html main.layout,html[data-netbox-color-mode=dark] main.layout,html[data-netbox-color-mode=light] main.layout{display:flex;flex-wrap:nowrap;height:100vh;height:-webkit-fill-available;max-height:100vh;overflow-x:auto;overflow-y:hidden}}@media print{html main.layout,html[data-netbox-color-mode=dark] main.layout,html[data-netbox-color-mode=light] main.layout{position:static!important;display:block!important;height:100%;overflow-x:visible!important;overflow-y:visible!important}}@media print{html main.login-container,html[data-netbox-color-mode=dark] main.login-container,html[data-netbox-color-mode=light] main.login-container{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;max-width:100vw;height:calc(100vh - 4rem);padding-top:40px;padding-bottom:40px}}@media print{html main.login-container+footer.footer button.color-mode-toggle,html[data-netbox-color-mode=dark] main.login-container+footer.footer button.color-mode-toggle,html[data-netbox-color-mode=light] main.login-container+footer.footer button.color-mode-toggle{color:var(--nbx-color-mode-toggle-color)}}@media print{html .footer,html[data-netbox-color-mode=dark] .footer,html[data-netbox-color-mode=light] .footer{padding:0}}@media print{html .footer .nav-link,html[data-netbox-color-mode=dark] .footer .nav-link,html[data-netbox-color-mode=light] .footer .nav-link{padding:.5rem}}@media print and (max-width: 767.98px){html .footer,html[data-netbox-color-mode=dark] .footer,html[data-netbox-color-mode=light] .footer{margin-bottom:8rem}}@media print{html footer.login-footer,html[data-netbox-color-mode=dark] footer.login-footer,html[data-netbox-color-mode=light] footer.login-footer{height:4rem;margin-top:auto}}@media print{html footer.login-footer .container-fluid,html footer.login-footer .container-sm,html footer.login-footer .container-md,html footer.login-footer .container-lg,html footer.login-footer .container-xl,html footer.login-footer .container-xxl,html[data-netbox-color-mode=dark] footer.login-footer .container-fluid,html[data-netbox-color-mode=light] footer.login-footer .container-fluid{display:flex;justify-content:flex-end;padding:.75rem 1.5rem}}@media print{html h1.accordion-item-title,html .accordion-item-title.h1,html h2.accordion-item-title,html .accordion-item-title.h2,html h3.accordion-item-title,html .accordion-item-title.h3,html h4.accordion-item-title,html .accordion-item-title.h4,html h5.accordion-item-title,html .accordion-item-title.h5,html h6.accordion-item-title,html .accordion-item-title.h6,html[data-netbox-color-mode=dark] h1.accordion-item-title,html[data-netbox-color-mode=dark] h2.accordion-item-title,html[data-netbox-color-mode=dark] h3.accordion-item-title,html[data-netbox-color-mode=dark] h4.accordion-item-title,html[data-netbox-color-mode=dark] h5.accordion-item-title,html[data-netbox-color-mode=dark] h6.accordion-item-title,html[data-netbox-color-mode=light] h1.accordion-item-title,html[data-netbox-color-mode=light] h2.accordion-item-title,html[data-netbox-color-mode=light] h3.accordion-item-title,html[data-netbox-color-mode=light] h4.accordion-item-title,html[data-netbox-color-mode=light] h5.accordion-item-title,html[data-netbox-color-mode=light] h6.accordion-item-title{padding:.25rem .5rem;font-size:.875rem;font-weight:700;color:var(--nbx-sidebar-title-color);text-transform:uppercase}}@media print{html .form-login,html[data-netbox-color-mode=dark] .form-login,html[data-netbox-color-mode=light] .form-login{width:100%;max-width:330px;padding:15px}}@media print{html .form-login input:focus,html[data-netbox-color-mode=dark] .form-login input:focus,html[data-netbox-color-mode=light] .form-login input:focus{z-index:1}}@media print{html .form-login input[type=text],html[data-netbox-color-mode=dark] .form-login input[type=text],html[data-netbox-color-mode=light] .form-login input[type=text]{margin-bottom:-1px;border-bottom-right-radius:0;border-bottom-left-radius:0}}@media print{html .form-login input[type=password],html[data-netbox-color-mode=dark] .form-login input[type=password],html[data-netbox-color-mode=light] .form-login input[type=password]{margin-bottom:10px;border-top-left-radius:0;border-top-right-radius:0}}@media print{html .form-login .form-control,html[data-netbox-color-mode=dark] .form-login .form-control,html[data-netbox-color-mode=light] .form-login .form-control{position:relative;box-sizing:border-box;height:auto;padding:10px;font-size:16px}}@media print{html .navbar-brand,html[data-netbox-color-mode=dark] .navbar-brand,html[data-netbox-color-mode=light] .navbar-brand{padding-top:.75rem;padding-bottom:.75rem;font-size:1rem}}@media print{html nav.nav.nav-pills .nav-item.nav-link,html[data-netbox-color-mode=dark] nav.nav.nav-pills .nav-item.nav-link,html[data-netbox-color-mode=light] nav.nav.nav-pills .nav-item.nav-link{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}}@media print{html nav.nav.nav-pills .nav-item.nav-link:hover,html[data-netbox-color-mode=dark] nav.nav.nav-pills .nav-item.nav-link:hover,html[data-netbox-color-mode=light] nav.nav.nav-pills .nav-item.nav-link:hover{color:#343a40;background-color:#cfe2ff}}@media print{html div.content-container,html[data-netbox-color-mode=dark] div.content-container,html[data-netbox-color-mode=light] div.content-container{position:relative;display:flex;flex-direction:column;width:calc(100% - 3rem);min-height:100vh;overflow-x:hidden;overflow-y:auto}}@media print{html div.content-container:focus,html div.content-container:focus-visible,html[data-netbox-color-mode=dark] div.content-container:focus,html[data-netbox-color-mode=dark] div.content-container:focus-visible,html[data-netbox-color-mode=light] div.content-container:focus,html[data-netbox-color-mode=light] div.content-container:focus-visible{outline:0}}@media print{html div.content-container div.content,html[data-netbox-color-mode=dark] div.content-container div.content,html[data-netbox-color-mode=light] div.content-container div.content{flex:1}}@media print and (max-width: 991.98px){html div.content-container,html[data-netbox-color-mode=dark] div.content-container,html[data-netbox-color-mode=light] div.content-container{width:100%}}@media print{html div.content-container,html[data-netbox-color-mode=dark] div.content-container,html[data-netbox-color-mode=light] div.content-container{width:100%!important;margin-left:0!important}}@media print and (max-width: 768px){html .sidebar.collapse.show~.content-container>.content,html[data-netbox-color-mode=dark] .sidebar.collapse.show~.content-container>.content,html[data-netbox-color-mode=light] .sidebar.collapse.show~.content-container>.content{position:fixed;top:0;left:0;overflow-y:hidden}}@media print{html .tooltip,html[data-netbox-color-mode=dark] .tooltip,html[data-netbox-color-mode=light] .tooltip{pointer-events:none}}@media print{html span.color-label,html[data-netbox-color-mode=dark] span.color-label,html[data-netbox-color-mode=light] span.color-label{display:block;width:5rem;height:1rem;padding:.35em .65em;border:1px solid #303030;border-radius:.375rem;box-shadow:0 .125rem .25rem #00000013}}@media print{html .btn,html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=light] .btn{white-space:nowrap}}@media print{html .card,html[data-netbox-color-mode=dark] .card,html[data-netbox-color-mode=light] .card{box-shadow:0 .125rem .25rem #00000013}}@media print{html .card .card-header,html[data-netbox-color-mode=dark] .card .card-header,html[data-netbox-color-mode=light] .card .card-header{padding:1rem;color:var(--nbx-body-color);border-bottom:none}}@media print{html .card .card-header+.card-body,html[data-netbox-color-mode=dark] .card .card-header+.card-body,html[data-netbox-color-mode=light] .card .card-header+.card-body{padding-top:0}}@media print{html .card .card-body.small .form-control,html .card .card-body.small .form-select,html[data-netbox-color-mode=dark] .card .card-body.small .form-control,html[data-netbox-color-mode=dark] .card .card-body.small .form-select,html[data-netbox-color-mode=light] .card .card-body.small .form-control,html[data-netbox-color-mode=light] .card .card-body.small .form-select{font-size:.875rem}}@media print{html .card .card-divider,html[data-netbox-color-mode=dark] .card .card-divider,html[data-netbox-color-mode=light] .card .card-divider{width:100%;height:1px;margin:1rem 0;border-top:1px solid rgba(0,0,0,.125);opacity:.25}}@media print{html .card,html[data-netbox-color-mode=dark] .card,html[data-netbox-color-mode=light] .card{box-shadow:unset!important}}@media print{html .form-floating,html[data-netbox-color-mode=dark] .form-floating,html[data-netbox-color-mode=light] .form-floating{position:relative}}@media print{html .form-floating>.input-group>.form-control,html .form-floating>.input-group>.form-select,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}}@media print{html .form-floating>.input-group>label,html[data-netbox-color-mode=dark] .form-floating>.input-group>label,html[data-netbox-color-mode=light] .form-floating>.input-group>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .form-floating>.input-group>label,html[data-netbox-color-mode=dark] .form-floating>.input-group>label,html[data-netbox-color-mode=light] .form-floating>.input-group>label{transition:none}}@media print{html .form-floating>.input-group>.form-control::placeholder,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control::placeholder,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control::placeholder{color:transparent}}@media print{html .form-floating>.input-group>.form-control:focus,html .form-floating>.input-group>.form-control:not(:placeholder-shown),html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:focus,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:not(:placeholder-shown),html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:focus,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.input-group>.form-control:-webkit-autofill,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:-webkit-autofill,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.input-group>.form-select,html .form-floating>.choices>.choices__inner,html .form-floating>.ss-main span.placeholder,html .form-floating>.ss-main div.ss-values,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select,html[data-netbox-color-mode=dark] .form-floating>.choices>.choices__inner,html[data-netbox-color-mode=dark] .form-floating>.ss-main span.placeholder,html[data-netbox-color-mode=dark] .form-floating>.ss-main div.ss-values,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-select,html[data-netbox-color-mode=light] .form-floating>.choices>.choices__inner,html[data-netbox-color-mode=light] .form-floating>.ss-main span.placeholder,html[data-netbox-color-mode=light] .form-floating>.ss-main div.ss-values{padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.input-group>.form-control:focus~label,html .form-floating>.input-group>.form-control:not(:placeholder-shown)~label,html .form-floating>.input-group>.form-select~label,html .form-floating>.choices~label,html .form-floating>.ss-main~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:focus~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select~label,html[data-netbox-color-mode=dark] .form-floating>.choices~label,html[data-netbox-color-mode=dark] .form-floating>.ss-main~label,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:focus~label,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-select~label,html[data-netbox-color-mode=light] .form-floating>.choices~label,html[data-netbox-color-mode=light] .form-floating>.ss-main~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem);z-index:4}}@media print{html .form-floating>.input-group>.form-control:-webkit-autofill~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:-webkit-autofill~label,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:-webkit-autofill~label{z-index:4;opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}}@media print{html .form-object-edit,html[data-netbox-color-mode=dark] .form-object-edit,html[data-netbox-color-mode=light] .form-object-edit{margin:0 auto;max-width:800px}}@media print{html textarea.form-control[rows="10"],html[data-netbox-color-mode=dark] textarea.form-control[rows="10"],html[data-netbox-color-mode=light] textarea.form-control[rows="10"]{height:18rem}}@media print{html textarea#id_local_context_data,html textarea.markdown,html textarea#id_public_key,html textarea.form-control[name=csv],html textarea.form-control[name=data],html[data-netbox-color-mode=dark] textarea#id_local_context_data,html[data-netbox-color-mode=dark] textarea.markdown,html[data-netbox-color-mode=dark] textarea#id_public_key,html[data-netbox-color-mode=dark] textarea.form-control[name=csv],html[data-netbox-color-mode=dark] textarea.form-control[name=data],html[data-netbox-color-mode=light] textarea#id_local_context_data,html[data-netbox-color-mode=light] textarea.markdown,html[data-netbox-color-mode=light] textarea#id_public_key,html[data-netbox-color-mode=light] textarea.form-control[name=csv],html[data-netbox-color-mode=light] textarea.form-control[name=data]{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}}@media print{html .card:not(:only-of-type),html[data-netbox-color-mode=dark] .card:not(:only-of-type),html[data-netbox-color-mode=light] .card:not(:only-of-type){margin-bottom:1rem}}@media print{html .stat-btn,html[data-netbox-color-mode=dark] .stat-btn,html[data-netbox-color-mode=light] .stat-btn{min-width:3rem}}@media print{html nav.breadcrumb-container,html[data-netbox-color-mode=dark] nav.breadcrumb-container,html[data-netbox-color-mode=light] nav.breadcrumb-container{width:fit-content;padding:.35em .65em;font-size:.875rem}}@media print{html nav.breadcrumb-container ol.breadcrumb,html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb,html[data-netbox-color-mode=light] nav.breadcrumb-container ol.breadcrumb{margin-bottom:0}}@media print{html nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a,html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a,html[data-netbox-color-mode=light] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a{text-decoration:none}}@media print{html nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover,html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover,html[data-netbox-color-mode=light] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover{text-decoration:underline}}@media print{html label.required,html[data-netbox-color-mode=dark] label.required,html[data-netbox-color-mode=light] label.required{font-weight:700}}@media print{html label.required:after,html[data-netbox-color-mode=dark] label.required:after,html[data-netbox-color-mode=light] label.required:after{position:absolute;display:inline-block;margin:0 0 0 2px;font-family:"Material Design Icons";font-size:8px;font-style:normal;font-weight:600;text-decoration:none;content:"\f06c4"}}@media print{html div.bulk-buttons,html[data-netbox-color-mode=dark] div.bulk-buttons,html[data-netbox-color-mode=light] div.bulk-buttons{display:flex;justify-content:space-between;margin:.5rem 0}}@media print{html div.bulk-buttons>div.bulk-button-group,html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group,html[data-netbox-color-mode=light] div.bulk-buttons>div.bulk-button-group{display:flex;flex-wrap:wrap;align-items:flex-start}}@media print{html div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child,html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child,html[data-netbox-color-mode=light] div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child{margin-left:0}}@media print{html div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child,html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child,html[data-netbox-color-mode=light] div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child{margin-right:0}}@media print{html div.bulk-buttons>div.bulk-button-group>*,html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group>*,html[data-netbox-color-mode=light] div.bulk-buttons>div.bulk-button-group>*{margin:.25rem}}@media print{html table tbody tr.primary,html[data-netbox-color-mode=dark] table tbody tr.primary,html[data-netbox-color-mode=light] table tbody tr.primary{background-color:#337ab726;border-color:#adb5bd}}@media print{html table tbody tr.secondary,html[data-netbox-color-mode=dark] table tbody tr.secondary,html[data-netbox-color-mode=light] table tbody tr.secondary{background-color:#6c757d26;border-color:#adb5bd}}@media print{html table tbody tr.success,html[data-netbox-color-mode=dark] table tbody tr.success,html[data-netbox-color-mode=light] table tbody tr.success{background-color:#19875426;border-color:#adb5bd}}@media print{html table tbody tr.info,html[data-netbox-color-mode=dark] table tbody tr.info,html[data-netbox-color-mode=light] table tbody tr.info{background-color:#54d6f026;border-color:#adb5bd}}@media print{html table tbody tr.warning,html[data-netbox-color-mode=dark] table tbody tr.warning,html[data-netbox-color-mode=light] table tbody tr.warning{background-color:#ffc10726;border-color:#adb5bd}}@media print{html table tbody tr.danger,html[data-netbox-color-mode=dark] table tbody tr.danger,html[data-netbox-color-mode=light] table tbody tr.danger{background-color:#dc354526;border-color:#adb5bd}}@media print{html table tbody tr.light,html[data-netbox-color-mode=dark] table tbody tr.light,html[data-netbox-color-mode=light] table tbody tr.light{background-color:#f8f9fa26;border-color:#adb5bd}}@media print{html table tbody tr.dark,html[data-netbox-color-mode=dark] table tbody tr.dark,html[data-netbox-color-mode=light] table tbody tr.dark{background-color:#21252926;border-color:#adb5bd}}@media print{html table tbody tr.red,html[data-netbox-color-mode=dark] table tbody tr.red,html[data-netbox-color-mode=light] table tbody tr.red{background-color:#dc354526;border-color:#adb5bd}}@media print{html table tbody tr.yellow,html[data-netbox-color-mode=dark] table tbody tr.yellow,html[data-netbox-color-mode=light] table tbody tr.yellow{background-color:#ffc10726;border-color:#adb5bd}}@media print{html table tbody tr.green,html[data-netbox-color-mode=dark] table tbody tr.green,html[data-netbox-color-mode=light] table tbody tr.green{background-color:#19875426;border-color:#adb5bd}}@media print{html table tbody tr.blue,html[data-netbox-color-mode=dark] table tbody tr.blue,html[data-netbox-color-mode=light] table tbody tr.blue{background-color:#0d6efd26;border-color:#adb5bd}}@media print{html table tbody tr.cyan,html[data-netbox-color-mode=dark] table tbody tr.cyan,html[data-netbox-color-mode=light] table tbody tr.cyan{background-color:#0dcaf026;border-color:#adb5bd}}@media print{html table tbody tr.indigo,html[data-netbox-color-mode=dark] table tbody tr.indigo,html[data-netbox-color-mode=light] table tbody tr.indigo{background-color:#6610f226;border-color:#adb5bd}}@media print{html table tbody tr.purple,html[data-netbox-color-mode=dark] table tbody tr.purple,html[data-netbox-color-mode=light] table tbody tr.purple{background-color:#6f42c126;border-color:#adb5bd}}@media print{html table tbody tr.pink,html[data-netbox-color-mode=dark] table tbody tr.pink,html[data-netbox-color-mode=light] table tbody tr.pink{background-color:#d6338426;border-color:#adb5bd}}@media print{html table tbody tr.darker,html[data-netbox-color-mode=dark] table tbody tr.darker,html[data-netbox-color-mode=light] table tbody tr.darker{background-color:#1b1f2226;border-color:#adb5bd}}@media print{html table tbody tr.darkest,html[data-netbox-color-mode=dark] table tbody tr.darkest,html[data-netbox-color-mode=light] table tbody tr.darkest{background-color:#171b1d26;border-color:#adb5bd}}@media print{html table tbody tr.gray,html[data-netbox-color-mode=dark] table tbody tr.gray,html[data-netbox-color-mode=light] table tbody tr.gray{background-color:#ced4da26;border-color:#adb5bd}}@media print{html table tbody tr.gray-100,html[data-netbox-color-mode=dark] table tbody tr.gray-100,html[data-netbox-color-mode=light] table tbody tr.gray-100{background-color:#f8f9fa26;border-color:#adb5bd}}@media print{html table tbody tr.gray-200,html[data-netbox-color-mode=dark] table tbody tr.gray-200,html[data-netbox-color-mode=light] table tbody tr.gray-200{background-color:#e9ecef26;border-color:#adb5bd}}@media print{html table tbody tr.gray-300,html[data-netbox-color-mode=dark] table tbody tr.gray-300,html[data-netbox-color-mode=light] table tbody tr.gray-300{background-color:#dee2e626;border-color:#adb5bd}}@media print{html table tbody tr.gray-400,html[data-netbox-color-mode=dark] table tbody tr.gray-400,html[data-netbox-color-mode=light] table tbody tr.gray-400{background-color:#ced4da26;border-color:#adb5bd}}@media print{html table tbody tr.gray-500,html[data-netbox-color-mode=dark] table tbody tr.gray-500,html[data-netbox-color-mode=light] table tbody tr.gray-500{background-color:#adb5bd26;border-color:#adb5bd}}@media print{html table tbody tr.gray-600,html[data-netbox-color-mode=dark] table tbody tr.gray-600,html[data-netbox-color-mode=light] table tbody tr.gray-600{background-color:#6c757d26;border-color:#adb5bd}}@media print{html table tbody tr.gray-700,html[data-netbox-color-mode=dark] table tbody tr.gray-700,html[data-netbox-color-mode=light] table tbody tr.gray-700{background-color:#49505726;border-color:#adb5bd}}@media print{html table tbody tr.gray-800,html[data-netbox-color-mode=dark] table tbody tr.gray-800,html[data-netbox-color-mode=light] table tbody tr.gray-800{background-color:#343a4026;border-color:#adb5bd}}@media print{html table tbody tr.gray-900,html[data-netbox-color-mode=dark] table tbody tr.gray-900,html[data-netbox-color-mode=light] table tbody tr.gray-900{background-color:#21252926;border-color:#adb5bd}}@media print{html table tbody tr.red-100,html[data-netbox-color-mode=dark] table tbody tr.red-100,html[data-netbox-color-mode=light] table tbody tr.red-100{background-color:#f8d7da26;border-color:#adb5bd}}@media print{html table tbody tr.red-200,html[data-netbox-color-mode=dark] table tbody tr.red-200,html[data-netbox-color-mode=light] table tbody tr.red-200{background-color:#f1aeb526;border-color:#adb5bd}}@media print{html table tbody tr.red-300,html[data-netbox-color-mode=dark] table tbody tr.red-300,html[data-netbox-color-mode=light] table tbody tr.red-300{background-color:#ea868f26;border-color:#adb5bd}}@media print{html table tbody tr.red-400,html[data-netbox-color-mode=dark] table tbody tr.red-400,html[data-netbox-color-mode=light] table tbody tr.red-400{background-color:#e35d6a26;border-color:#adb5bd}}@media print{html table tbody tr.red-500,html[data-netbox-color-mode=dark] table tbody tr.red-500,html[data-netbox-color-mode=light] table tbody tr.red-500{background-color:#dc354526;border-color:#adb5bd}}@media print{html table tbody tr.red-600,html[data-netbox-color-mode=dark] table tbody tr.red-600,html[data-netbox-color-mode=light] table tbody tr.red-600{background-color:#b02a3726;border-color:#adb5bd}}@media print{html table tbody tr.red-700,html[data-netbox-color-mode=dark] table tbody tr.red-700,html[data-netbox-color-mode=light] table tbody tr.red-700{background-color:#84202926;border-color:#adb5bd}}@media print{html table tbody tr.red-800,html[data-netbox-color-mode=dark] table tbody tr.red-800,html[data-netbox-color-mode=light] table tbody tr.red-800{background-color:#58151c26;border-color:#adb5bd}}@media print{html table tbody tr.red-900,html[data-netbox-color-mode=dark] table tbody tr.red-900,html[data-netbox-color-mode=light] table tbody tr.red-900{background-color:#2c0b0e26;border-color:#adb5bd}}@media print{html table tbody tr.yellow-100,html[data-netbox-color-mode=dark] table tbody tr.yellow-100,html[data-netbox-color-mode=light] table tbody tr.yellow-100{background-color:#fff3cd26;border-color:#adb5bd}}@media print{html table tbody tr.yellow-200,html[data-netbox-color-mode=dark] table tbody tr.yellow-200,html[data-netbox-color-mode=light] table tbody tr.yellow-200{background-color:#ffe69c26;border-color:#adb5bd}}@media print{html table tbody tr.yellow-300,html[data-netbox-color-mode=dark] table tbody tr.yellow-300,html[data-netbox-color-mode=light] table tbody tr.yellow-300{background-color:#ffda6a26;border-color:#adb5bd}}@media print{html table tbody tr.yellow-400,html[data-netbox-color-mode=dark] table tbody tr.yellow-400,html[data-netbox-color-mode=light] table tbody tr.yellow-400{background-color:#ffcd3926;border-color:#adb5bd}}@media print{html table tbody tr.yellow-500,html[data-netbox-color-mode=dark] table tbody tr.yellow-500,html[data-netbox-color-mode=light] table tbody tr.yellow-500{background-color:#ffc10726;border-color:#adb5bd}}@media print{html table tbody tr.yellow-600,html[data-netbox-color-mode=dark] table tbody tr.yellow-600,html[data-netbox-color-mode=light] table tbody tr.yellow-600{background-color:#cc9a0626;border-color:#adb5bd}}@media print{html table tbody tr.yellow-700,html[data-netbox-color-mode=dark] table tbody tr.yellow-700,html[data-netbox-color-mode=light] table tbody tr.yellow-700{background-color:#99740426;border-color:#adb5bd}}@media print{html table tbody tr.yellow-800,html[data-netbox-color-mode=dark] table tbody tr.yellow-800,html[data-netbox-color-mode=light] table tbody tr.yellow-800{background-color:#664d0326;border-color:#adb5bd}}@media print{html table tbody tr.yellow-900,html[data-netbox-color-mode=dark] table tbody tr.yellow-900,html[data-netbox-color-mode=light] table tbody tr.yellow-900{background-color:#33270126;border-color:#adb5bd}}@media print{html table tbody tr.green-100,html[data-netbox-color-mode=dark] table tbody tr.green-100,html[data-netbox-color-mode=light] table tbody tr.green-100{background-color:#d1e7dd26;border-color:#adb5bd}}@media print{html table tbody tr.green-200,html[data-netbox-color-mode=dark] table tbody tr.green-200,html[data-netbox-color-mode=light] table tbody tr.green-200{background-color:#a3cfbb26;border-color:#adb5bd}}@media print{html table tbody tr.green-300,html[data-netbox-color-mode=dark] table tbody tr.green-300,html[data-netbox-color-mode=light] table tbody tr.green-300{background-color:#75b79826;border-color:#adb5bd}}@media print{html table tbody tr.green-400,html[data-netbox-color-mode=dark] table tbody tr.green-400,html[data-netbox-color-mode=light] table tbody tr.green-400{background-color:#479f7626;border-color:#adb5bd}}@media print{html table tbody tr.green-500,html[data-netbox-color-mode=dark] table tbody tr.green-500,html[data-netbox-color-mode=light] table tbody tr.green-500{background-color:#19875426;border-color:#adb5bd}}@media print{html table tbody tr.green-600,html[data-netbox-color-mode=dark] table tbody tr.green-600,html[data-netbox-color-mode=light] table tbody tr.green-600{background-color:#146c4326;border-color:#adb5bd}}@media print{html table tbody tr.green-700,html[data-netbox-color-mode=dark] table tbody tr.green-700,html[data-netbox-color-mode=light] table tbody tr.green-700{background-color:#0f513226;border-color:#adb5bd}}@media print{html table tbody tr.green-800,html[data-netbox-color-mode=dark] table tbody tr.green-800,html[data-netbox-color-mode=light] table tbody tr.green-800{background-color:#0a362226;border-color:#adb5bd}}@media print{html table tbody tr.green-900,html[data-netbox-color-mode=dark] table tbody tr.green-900,html[data-netbox-color-mode=light] table tbody tr.green-900{background-color:#051b1126;border-color:#adb5bd}}@media print{html table tbody tr.blue-100,html[data-netbox-color-mode=dark] table tbody tr.blue-100,html[data-netbox-color-mode=light] table tbody tr.blue-100{background-color:#cfe2ff26;border-color:#adb5bd}}@media print{html table tbody tr.blue-200,html[data-netbox-color-mode=dark] table tbody tr.blue-200,html[data-netbox-color-mode=light] table tbody tr.blue-200{background-color:#9ec5fe26;border-color:#adb5bd}}@media print{html table tbody tr.blue-300,html[data-netbox-color-mode=dark] table tbody tr.blue-300,html[data-netbox-color-mode=light] table tbody tr.blue-300{background-color:#6ea8fe26;border-color:#adb5bd}}@media print{html table tbody tr.blue-400,html[data-netbox-color-mode=dark] table tbody tr.blue-400,html[data-netbox-color-mode=light] table tbody tr.blue-400{background-color:#3d8bfd26;border-color:#adb5bd}}@media print{html table tbody tr.blue-500,html[data-netbox-color-mode=dark] table tbody tr.blue-500,html[data-netbox-color-mode=light] table tbody tr.blue-500{background-color:#0d6efd26;border-color:#adb5bd}}@media print{html table tbody tr.blue-600,html[data-netbox-color-mode=dark] table tbody tr.blue-600,html[data-netbox-color-mode=light] table tbody tr.blue-600{background-color:#0a58ca26;border-color:#adb5bd}}@media print{html table tbody tr.blue-700,html[data-netbox-color-mode=dark] table tbody tr.blue-700,html[data-netbox-color-mode=light] table tbody tr.blue-700{background-color:#08429826;border-color:#adb5bd}}@media print{html table tbody tr.blue-800,html[data-netbox-color-mode=dark] table tbody tr.blue-800,html[data-netbox-color-mode=light] table tbody tr.blue-800{background-color:#052c6526;border-color:#adb5bd}}@media print{html table tbody tr.blue-900,html[data-netbox-color-mode=dark] table tbody tr.blue-900,html[data-netbox-color-mode=light] table tbody tr.blue-900{background-color:#03163326;border-color:#adb5bd}}@media print{html table tbody tr.cyan-100,html[data-netbox-color-mode=dark] table tbody tr.cyan-100,html[data-netbox-color-mode=light] table tbody tr.cyan-100{background-color:#cff4fc26;border-color:#adb5bd}}@media print{html table tbody tr.cyan-200,html[data-netbox-color-mode=dark] table tbody tr.cyan-200,html[data-netbox-color-mode=light] table tbody tr.cyan-200{background-color:#9eeaf926;border-color:#adb5bd}}@media print{html table tbody tr.cyan-300,html[data-netbox-color-mode=dark] table tbody tr.cyan-300,html[data-netbox-color-mode=light] table tbody tr.cyan-300{background-color:#6edff626;border-color:#adb5bd}}@media print{html table tbody tr.cyan-400,html[data-netbox-color-mode=dark] table tbody tr.cyan-400,html[data-netbox-color-mode=light] table tbody tr.cyan-400{background-color:#3dd5f326;border-color:#adb5bd}}@media print{html table tbody tr.cyan-500,html[data-netbox-color-mode=dark] table tbody tr.cyan-500,html[data-netbox-color-mode=light] table tbody tr.cyan-500{background-color:#0dcaf026;border-color:#adb5bd}}@media print{html table tbody tr.cyan-600,html[data-netbox-color-mode=dark] table tbody tr.cyan-600,html[data-netbox-color-mode=light] table tbody tr.cyan-600{background-color:#0aa2c026;border-color:#adb5bd}}@media print{html table tbody tr.cyan-700,html[data-netbox-color-mode=dark] table tbody tr.cyan-700,html[data-netbox-color-mode=light] table tbody tr.cyan-700{background-color:#08799026;border-color:#adb5bd}}@media print{html table tbody tr.cyan-800,html[data-netbox-color-mode=dark] table tbody tr.cyan-800,html[data-netbox-color-mode=light] table tbody tr.cyan-800{background-color:#05516026;border-color:#adb5bd}}@media print{html table tbody tr.cyan-900,html[data-netbox-color-mode=dark] table tbody tr.cyan-900,html[data-netbox-color-mode=light] table tbody tr.cyan-900{background-color:#03283026;border-color:#adb5bd}}@media print{html table tbody tr.indigo-100,html[data-netbox-color-mode=dark] table tbody tr.indigo-100,html[data-netbox-color-mode=light] table tbody tr.indigo-100{background-color:#e0cffc26;border-color:#adb5bd}}@media print{html table tbody tr.indigo-200,html[data-netbox-color-mode=dark] table tbody tr.indigo-200,html[data-netbox-color-mode=light] table tbody tr.indigo-200{background-color:#c29ffa26;border-color:#adb5bd}}@media print{html table tbody tr.indigo-300,html[data-netbox-color-mode=dark] table tbody tr.indigo-300,html[data-netbox-color-mode=light] table tbody tr.indigo-300{background-color:#a370f726;border-color:#adb5bd}}@media print{html table tbody tr.indigo-400,html[data-netbox-color-mode=dark] table tbody tr.indigo-400,html[data-netbox-color-mode=light] table tbody tr.indigo-400{background-color:#8540f526;border-color:#adb5bd}}@media print{html table tbody tr.indigo-500,html[data-netbox-color-mode=dark] table tbody tr.indigo-500,html[data-netbox-color-mode=light] table tbody tr.indigo-500{background-color:#6610f226;border-color:#adb5bd}}@media print{html table tbody tr.indigo-600,html[data-netbox-color-mode=dark] table tbody tr.indigo-600,html[data-netbox-color-mode=light] table tbody tr.indigo-600{background-color:#520dc226;border-color:#adb5bd}}@media print{html table tbody tr.indigo-700,html[data-netbox-color-mode=dark] table tbody tr.indigo-700,html[data-netbox-color-mode=light] table tbody tr.indigo-700{background-color:#3d0a9126;border-color:#adb5bd}}@media print{html table tbody tr.indigo-800,html[data-netbox-color-mode=dark] table tbody tr.indigo-800,html[data-netbox-color-mode=light] table tbody tr.indigo-800{background-color:#29066126;border-color:#adb5bd}}@media print{html table tbody tr.indigo-900,html[data-netbox-color-mode=dark] table tbody tr.indigo-900,html[data-netbox-color-mode=light] table tbody tr.indigo-900{background-color:#14033026;border-color:#adb5bd}}@media print{html table tbody tr.purple-100,html[data-netbox-color-mode=dark] table tbody tr.purple-100,html[data-netbox-color-mode=light] table tbody tr.purple-100{background-color:#e2d9f326;border-color:#adb5bd}}@media print{html table tbody tr.purple-200,html[data-netbox-color-mode=dark] table tbody tr.purple-200,html[data-netbox-color-mode=light] table tbody tr.purple-200{background-color:#c5b3e626;border-color:#adb5bd}}@media print{html table tbody tr.purple-300,html[data-netbox-color-mode=dark] table tbody tr.purple-300,html[data-netbox-color-mode=light] table tbody tr.purple-300{background-color:#a98eda26;border-color:#adb5bd}}@media print{html table tbody tr.purple-400,html[data-netbox-color-mode=dark] table tbody tr.purple-400,html[data-netbox-color-mode=light] table tbody tr.purple-400{background-color:#8c68cd26;border-color:#adb5bd}}@media print{html table tbody tr.purple-500,html[data-netbox-color-mode=dark] table tbody tr.purple-500,html[data-netbox-color-mode=light] table tbody tr.purple-500{background-color:#6f42c126;border-color:#adb5bd}}@media print{html table tbody tr.purple-600,html[data-netbox-color-mode=dark] table tbody tr.purple-600,html[data-netbox-color-mode=light] table tbody tr.purple-600{background-color:#59359a26;border-color:#adb5bd}}@media print{html table tbody tr.purple-700,html[data-netbox-color-mode=dark] table tbody tr.purple-700,html[data-netbox-color-mode=light] table tbody tr.purple-700{background-color:#43287426;border-color:#adb5bd}}@media print{html table tbody tr.purple-800,html[data-netbox-color-mode=dark] table tbody tr.purple-800,html[data-netbox-color-mode=light] table tbody tr.purple-800{background-color:#2c1a4d26;border-color:#adb5bd}}@media print{html table tbody tr.purple-900,html[data-netbox-color-mode=dark] table tbody tr.purple-900,html[data-netbox-color-mode=light] table tbody tr.purple-900{background-color:#160d2726;border-color:#adb5bd}}@media print{html table tbody tr.pink-100,html[data-netbox-color-mode=dark] table tbody tr.pink-100,html[data-netbox-color-mode=light] table tbody tr.pink-100{background-color:#f7d6e626;border-color:#adb5bd}}@media print{html table tbody tr.pink-200,html[data-netbox-color-mode=dark] table tbody tr.pink-200,html[data-netbox-color-mode=light] table tbody tr.pink-200{background-color:#efadce26;border-color:#adb5bd}}@media print{html table tbody tr.pink-300,html[data-netbox-color-mode=dark] table tbody tr.pink-300,html[data-netbox-color-mode=light] table tbody tr.pink-300{background-color:#e685b526;border-color:#adb5bd}}@media print{html table tbody tr.pink-400,html[data-netbox-color-mode=dark] table tbody tr.pink-400,html[data-netbox-color-mode=light] table tbody tr.pink-400{background-color:#de5c9d26;border-color:#adb5bd}}@media print{html table tbody tr.pink-500,html[data-netbox-color-mode=dark] table tbody tr.pink-500,html[data-netbox-color-mode=light] table tbody tr.pink-500{background-color:#d6338426;border-color:#adb5bd}}@media print{html table tbody tr.pink-600,html[data-netbox-color-mode=dark] table tbody tr.pink-600,html[data-netbox-color-mode=light] table tbody tr.pink-600{background-color:#ab296a26;border-color:#adb5bd}}@media print{html table tbody tr.pink-700,html[data-netbox-color-mode=dark] table tbody tr.pink-700,html[data-netbox-color-mode=light] table tbody tr.pink-700{background-color:#801f4f26;border-color:#adb5bd}}@media print{html table tbody tr.pink-800,html[data-netbox-color-mode=dark] table tbody tr.pink-800,html[data-netbox-color-mode=light] table tbody tr.pink-800{background-color:#56143526;border-color:#adb5bd}}@media print{html table tbody tr.pink-900,html[data-netbox-color-mode=dark] table tbody tr.pink-900,html[data-netbox-color-mode=light] table tbody tr.pink-900{background-color:#2b0a1a26;border-color:#adb5bd}}@media print{html table .table-badge-group .table-badge,html[data-netbox-color-mode=dark] table .table-badge-group .table-badge,html[data-netbox-color-mode=light] table .table-badge-group .table-badge{display:block;width:min-content;font-size:.875rem;font-weight:400}}@media print{html table .table-badge-group .table-badge:not(.badge),html[data-netbox-color-mode=dark] table .table-badge-group .table-badge:not(.badge),html[data-netbox-color-mode=light] table .table-badge-group .table-badge:not(.badge){padding:0 .65em}}@media print{html table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child),html[data-netbox-color-mode=dark] table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child),html[data-netbox-color-mode=light] table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child){margin-bottom:.25rem}}@media print{html pre.change-data,html[data-netbox-color-mode=dark] pre.change-data,html[data-netbox-color-mode=light] pre.change-data{padding-right:0;padding-left:0}}@media print{html pre.change-data>span,html[data-netbox-color-mode=dark] pre.change-data>span,html[data-netbox-color-mode=light] pre.change-data>span{display:block;padding-right:1rem;padding-left:1rem}}@media print{html pre.change-data>span.added,html[data-netbox-color-mode=dark] pre.change-data>span.added,html[data-netbox-color-mode=light] pre.change-data>span.added{background-color:var(--nbx-change-added)}}@media print{html pre.change-data>span.removed,html[data-netbox-color-mode=dark] pre.change-data>span.removed,html[data-netbox-color-mode=light] pre.change-data>span.removed{background-color:var(--nbx-change-removed)}}@media print{html pre.change-diff,html[data-netbox-color-mode=dark] pre.change-diff,html[data-netbox-color-mode=light] pre.change-diff{border-color:transparent}}@media print{html pre.change-diff.change-removed,html[data-netbox-color-mode=dark] pre.change-diff.change-removed,html[data-netbox-color-mode=light] pre.change-diff.change-removed{background-color:var(--nbx-change-removed)}}@media print{html pre.change-diff.change-added,html[data-netbox-color-mode=dark] pre.change-diff.change-added,html[data-netbox-color-mode=light] pre.change-diff.change-added{background-color:var(--nbx-change-added)}}@media print{html div.card-overlay,html[data-netbox-color-mode=dark] div.card-overlay,html[data-netbox-color-mode=light] div.card-overlay{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#ffffffbf;border-radius:.375rem}}@media print{html div.card-overlay>div.spinner-border,html[data-netbox-color-mode=dark] div.card-overlay>div.spinner-border,html[data-netbox-color-mode=light] div.card-overlay>div.spinner-border{width:6rem;height:6rem;color:#6c757d}}@media print{html .table-controls,html[data-netbox-color-mode=dark] .table-controls,html[data-netbox-color-mode=light] .table-controls{display:flex}}@media print and (min-width: 768px){html .table-controls,html[data-netbox-color-mode=dark] .table-controls,html[data-netbox-color-mode=light] .table-controls{margin-top:0!important;margin-bottom:0!important}}@media print{html .table-controls .table-configure,html[data-netbox-color-mode=dark] .table-controls .table-configure,html[data-netbox-color-mode=light] .table-controls .table-configure{justify-content:flex-start}}@media print and (min-width: 768px){html .table-controls .table-configure,html[data-netbox-color-mode=dark] .table-controls .table-configure,html[data-netbox-color-mode=light] .table-controls .table-configure{justify-content:flex-end}}@media print{html .table-controls .form-switch.form-check-inline,html[data-netbox-color-mode=dark] .table-controls .form-switch.form-check-inline,html[data-netbox-color-mode=light] .table-controls .form-switch.form-check-inline{flex:1 0 auto;font-size:.875rem}}@media print{html .nav-tabs .nav-link:hover,html[data-netbox-color-mode=dark] .nav-tabs .nav-link:hover,html[data-netbox-color-mode=light] .nav-tabs .nav-link:hover{border-bottom-color:transparent}}@media print{html .nav-tabs .nav-link.active,html[data-netbox-color-mode=dark] .nav-tabs .nav-link.active,html[data-netbox-color-mode=light] .nav-tabs .nav-link.active{background-color:#f8f9fa;border-bottom-color:#f8f9fa;transform:translateY(1px)}}@media print{html .tab-content,html[data-netbox-color-mode=dark] .tab-content,html[data-netbox-color-mode=light] .tab-content{display:flex;flex-direction:column;padding:1rem;background-color:#f8f9fa;border-bottom:1px solid #dee2e6}}@media print{html .tab-content,html[data-netbox-color-mode=dark] .tab-content,html[data-netbox-color-mode=light] .tab-content{background-color:var(--nbx-body-bg)!important;border-bottom:none!important}}@media print{html .masonry,html[data-netbox-color-mode=dark] .masonry,html[data-netbox-color-mode=light] .masonry{position:static!important;display:block!important;height:unset!important}}@media print{html .masonry .masonry-item,html[data-netbox-color-mode=dark] .masonry .masonry-item,html[data-netbox-color-mode=light] .masonry .masonry-item{position:static!important;top:unset!important;left:unset!important;display:block!important}}@media print{html .record-depth,html[data-netbox-color-mode=dark] .record-depth,html[data-netbox-color-mode=light] .record-depth{display:inline;font-size:1rem;user-select:none;opacity:.33}}@media print{html .record-depth span:only-of-type,html .record-depth span:last-of-type,html[data-netbox-color-mode=dark] .record-depth span:only-of-type,html[data-netbox-color-mode=dark] .record-depth span:last-of-type,html[data-netbox-color-mode=light] .record-depth span:only-of-type,html[data-netbox-color-mode=light] .record-depth span:last-of-type{margin-right:.25rem}}@media print{html .popover.image-preview-popover,html[data-netbox-color-mode=dark] .popover.image-preview-popover,html[data-netbox-color-mode=light] .popover.image-preview-popover{max-width:unset}}@media print{html .rendered-markdown table,html[data-netbox-color-mode=dark] .rendered-markdown table,html[data-netbox-color-mode=light] .rendered-markdown table{width:100%}}@media print{html .rendered-markdown th,html[data-netbox-color-mode=dark] .rendered-markdown th,html[data-netbox-color-mode=light] .rendered-markdown th{border-bottom:2px solid #ddd;padding:8px}}@media print{html .rendered-markdown td,html[data-netbox-color-mode=dark] .rendered-markdown td,html[data-netbox-color-mode=light] .rendered-markdown td{border-top:1px solid #ddd;padding:8px}}@media print{html td pre,html[data-netbox-color-mode=dark] td pre,html[data-netbox-color-mode=light] td pre{margin-bottom:0}}@media print{html pre.block,html[data-netbox-color-mode=dark] pre.block,html[data-netbox-color-mode=light] pre.block{padding:1rem;background-color:var(--nbx-pre-bg);border:1px solid var(--nbx-pre-border-color);border-radius:.375rem}}@media print{html #django-messages,html[data-netbox-color-mode=dark] #django-messages,html[data-netbox-color-mode=light] #django-messages{position:fixed;right:1rem;bottom:0;margin:1rem}}@media print{html html[data-netbox-url-name=home] .content-container,html html[data-netbox-url-name=home] .search,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home] .content-container,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home] .search,html[data-netbox-color-mode=light] html[data-netbox-url-name=home] .content-container,html[data-netbox-color-mode=light] html[data-netbox-url-name=home] .search{background-color:#f8f9fa!important}}@media print{html html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search,html[data-netbox-color-mode=light] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html[data-netbox-color-mode=light] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search{background-color:#171b1d!important}}@media print{html html[data-netbox-url-name=login] #django-messages,html[data-netbox-color-mode=dark] html[data-netbox-url-name=login] #django-messages,html[data-netbox-color-mode=light] html[data-netbox-url-name=login] #django-messages{display:none}} +@media print{:root{--nbx-body-bg: #fff !important;--nbx-body-color: #000 !important}html :root,html[data-netbox-color-mode=dark] :root,html[data-netbox-color-mode=light] :root{--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #337ab7;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #54d6f0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #e9ecef;--bs-dark: #343a40;--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-gray: #adb5bd;--bs-black: #000;--bs-white: #fff;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0))}html *,html *:before,html *:after,html[data-netbox-color-mode=dark] *,html[data-netbox-color-mode=dark] *:before,html[data-netbox-color-mode=dark] *:after,html[data-netbox-color-mode=light] *,html[data-netbox-color-mode=light] *:before,html[data-netbox-color-mode=light] *:after{box-sizing:border-box}}@media print and (prefers-reduced-motion: no-preference){html :root,html[data-netbox-color-mode=dark] :root,html[data-netbox-color-mode=light] :root{scroll-behavior:smooth}}@media print{html body,html[data-netbox-color-mode=dark] body,html[data-netbox-color-mode=light] body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}}@media print{html hr,html[data-netbox-color-mode=dark] hr,html[data-netbox-color-mode=light] hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}}@media print{html hr:not([size]),html[data-netbox-color-mode=dark] hr:not([size]),html[data-netbox-color-mode=light] hr:not([size]){height:1px}}@media print{html h6,html .h6,html[data-netbox-color-mode=dark] .h6,html[data-netbox-color-mode=light] .h6,html[data-netbox-color-mode=dark] h6,html[data-netbox-color-mode=light] h6,html h5,html .h5,html[data-netbox-color-mode=dark] .h5,html[data-netbox-color-mode=light] .h5,html[data-netbox-color-mode=dark] h5,html[data-netbox-color-mode=light] h5,html h4,html .h4,html[data-netbox-color-mode=dark] .h4,html[data-netbox-color-mode=light] .h4,html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=light] h4,html h3,html .h3,html[data-netbox-color-mode=dark] .h3,html[data-netbox-color-mode=light] .h3,html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=light] h3,html h2,html .h2,html[data-netbox-color-mode=dark] .h2,html[data-netbox-color-mode=light] .h2,html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=light] h2,html h1,html .h1,html[data-netbox-color-mode=dark] .h1,html[data-netbox-color-mode=light] .h1,html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=light] h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}}@media print{html h1,html .h1,html[data-netbox-color-mode=dark] .h1,html[data-netbox-color-mode=light] .h1,html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=light] h1{font-size:calc(1.375rem + 1.5vw)}}@media print and (min-width: 1200px){html h1,html .h1,html[data-netbox-color-mode=dark] .h1,html[data-netbox-color-mode=light] .h1,html[data-netbox-color-mode=dark] h1,html[data-netbox-color-mode=light] h1{font-size:2.5rem}}@media print{html h2,html .h2,html[data-netbox-color-mode=dark] .h2,html[data-netbox-color-mode=light] .h2,html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=light] h2{font-size:calc(1.325rem + .9vw)}}@media print and (min-width: 1200px){html h2,html .h2,html[data-netbox-color-mode=dark] .h2,html[data-netbox-color-mode=light] .h2,html[data-netbox-color-mode=dark] h2,html[data-netbox-color-mode=light] h2{font-size:2rem}}@media print{html h3,html .h3,html[data-netbox-color-mode=dark] .h3,html[data-netbox-color-mode=light] .h3,html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=light] h3{font-size:calc(1.3rem + .6vw)}}@media print and (min-width: 1200px){html h3,html .h3,html[data-netbox-color-mode=dark] .h3,html[data-netbox-color-mode=light] .h3,html[data-netbox-color-mode=dark] h3,html[data-netbox-color-mode=light] h3{font-size:1.75rem}}@media print{html h4,html .h4,html[data-netbox-color-mode=dark] .h4,html[data-netbox-color-mode=light] .h4,html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=light] h4{font-size:calc(1.275rem + .3vw)}}@media print and (min-width: 1200px){html h4,html .h4,html[data-netbox-color-mode=dark] .h4,html[data-netbox-color-mode=light] .h4,html[data-netbox-color-mode=dark] h4,html[data-netbox-color-mode=light] h4{font-size:1.5rem}}@media print{html h5,html .h5,html[data-netbox-color-mode=dark] .h5,html[data-netbox-color-mode=light] .h5,html[data-netbox-color-mode=dark] h5,html[data-netbox-color-mode=light] h5{font-size:1.25rem}}@media print{html h6,html .h6,html[data-netbox-color-mode=dark] .h6,html[data-netbox-color-mode=light] .h6,html[data-netbox-color-mode=dark] h6,html[data-netbox-color-mode=light] h6{font-size:1rem}}@media print{html p,html[data-netbox-color-mode=dark] p,html[data-netbox-color-mode=light] p{margin-top:0;margin-bottom:1rem}}@media print{html abbr[title],html abbr[data-bs-original-title],html[data-netbox-color-mode=dark] abbr[title],html[data-netbox-color-mode=dark] abbr[data-bs-original-title],html[data-netbox-color-mode=light] abbr[title],html[data-netbox-color-mode=light] abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}}@media print{html address,html[data-netbox-color-mode=dark] address,html[data-netbox-color-mode=light] address{margin-bottom:1rem;font-style:normal;line-height:inherit}}@media print{html ol,html ul,html[data-netbox-color-mode=dark] ol,html[data-netbox-color-mode=dark] ul,html[data-netbox-color-mode=light] ol,html[data-netbox-color-mode=light] ul{padding-left:2rem}}@media print{html ol,html ul,html dl,html[data-netbox-color-mode=dark] ol,html[data-netbox-color-mode=dark] ul,html[data-netbox-color-mode=dark] dl,html[data-netbox-color-mode=light] ol,html[data-netbox-color-mode=light] ul,html[data-netbox-color-mode=light] dl{margin-top:0;margin-bottom:1rem}}@media print{html ol ol,html ul ul,html ol ul,html ul ol,html[data-netbox-color-mode=dark] ol ol,html[data-netbox-color-mode=dark] ul ul,html[data-netbox-color-mode=dark] ol ul,html[data-netbox-color-mode=dark] ul ol,html[data-netbox-color-mode=light] ol ol,html[data-netbox-color-mode=light] ul ul,html[data-netbox-color-mode=light] ol ul,html[data-netbox-color-mode=light] ul ol{margin-bottom:0}}@media print{html dt,html[data-netbox-color-mode=dark] dt,html[data-netbox-color-mode=light] dt{font-weight:700}}@media print{html dd,html[data-netbox-color-mode=dark] dd,html[data-netbox-color-mode=light] dd{margin-bottom:.5rem;margin-left:0}}@media print{html blockquote,html[data-netbox-color-mode=dark] blockquote,html[data-netbox-color-mode=light] blockquote{margin:0 0 1rem}}@media print{html b,html strong,html[data-netbox-color-mode=dark] b,html[data-netbox-color-mode=dark] strong,html[data-netbox-color-mode=light] b,html[data-netbox-color-mode=light] strong{font-weight:800}}@media print{html small,html .small,html[data-netbox-color-mode=dark] .small,html[data-netbox-color-mode=light] .small,html[data-netbox-color-mode=dark] small,html[data-netbox-color-mode=light] small{font-size:.875em}}@media print{html mark,html .mark,html[data-netbox-color-mode=dark] .mark,html[data-netbox-color-mode=light] .mark,html[data-netbox-color-mode=dark] mark,html[data-netbox-color-mode=light] mark{padding:.2em;background-color:#fcf8e3}}@media print{html sub,html sup,html[data-netbox-color-mode=dark] sub,html[data-netbox-color-mode=dark] sup,html[data-netbox-color-mode=light] sub,html[data-netbox-color-mode=light] sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}}@media print{html sub,html[data-netbox-color-mode=dark] sub,html[data-netbox-color-mode=light] sub{bottom:-.25em}}@media print{html sup,html[data-netbox-color-mode=dark] sup,html[data-netbox-color-mode=light] sup{top:-.5em}}@media print{html a,html[data-netbox-color-mode=dark] a,html[data-netbox-color-mode=light] a{color:#0d6efd;text-decoration:underline}html a:hover,html[data-netbox-color-mode=dark] a:hover,html[data-netbox-color-mode=light] a:hover{color:#0a58ca}}@media print{html a:not([href]):not([class]),html a:not([href]):not([class]):hover,html[data-netbox-color-mode=dark] a:not([href]):not([class]),html[data-netbox-color-mode=dark] a:not([href]):not([class]):hover,html[data-netbox-color-mode=light] a:not([href]):not([class]),html[data-netbox-color-mode=light] a:not([href]):not([class]):hover{color:inherit;text-decoration:none}}@media print{html pre,html code,html kbd,html samp,html[data-netbox-color-mode=dark] pre,html[data-netbox-color-mode=dark] code,html[data-netbox-color-mode=dark] kbd,html[data-netbox-color-mode=dark] samp,html[data-netbox-color-mode=light] pre,html[data-netbox-color-mode=light] code,html[data-netbox-color-mode=light] kbd,html[data-netbox-color-mode=light] samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}}@media print{html pre,html[data-netbox-color-mode=dark] pre,html[data-netbox-color-mode=light] pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}html pre code,html[data-netbox-color-mode=dark] pre code,html[data-netbox-color-mode=light] pre code{font-size:inherit;color:inherit;word-break:normal}}@media print{html code,html[data-netbox-color-mode=dark] code,html[data-netbox-color-mode=light] code{font-size:.875em;color:#212529;word-wrap:break-word}a>html code,a>html[data-netbox-color-mode=dark] code,a>html[data-netbox-color-mode=light] code{color:inherit}}@media print{html kbd,html[data-netbox-color-mode=dark] kbd,html[data-netbox-color-mode=light] kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.375rem}html kbd kbd,html[data-netbox-color-mode=dark] kbd kbd,html[data-netbox-color-mode=light] kbd kbd{padding:0;font-size:1em;font-weight:700}}@media print{html figure,html[data-netbox-color-mode=dark] figure,html[data-netbox-color-mode=light] figure{margin:0 0 1rem}}@media print{html img,html svg,html[data-netbox-color-mode=dark] img,html[data-netbox-color-mode=dark] svg,html[data-netbox-color-mode=light] img,html[data-netbox-color-mode=light] svg{vertical-align:middle}}@media print{html table,html[data-netbox-color-mode=dark] table,html[data-netbox-color-mode=light] table{caption-side:bottom;border-collapse:collapse}}@media print{html caption,html[data-netbox-color-mode=dark] caption,html[data-netbox-color-mode=light] caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}}@media print{html th,html[data-netbox-color-mode=dark] th,html[data-netbox-color-mode=light] th{text-align:inherit;text-align:-webkit-match-parent}}@media print{html thead,html tbody,html tfoot,html tr,html td,html th,html[data-netbox-color-mode=dark] thead,html[data-netbox-color-mode=dark] tbody,html[data-netbox-color-mode=dark] tfoot,html[data-netbox-color-mode=dark] tr,html[data-netbox-color-mode=dark] td,html[data-netbox-color-mode=dark] th,html[data-netbox-color-mode=light] thead,html[data-netbox-color-mode=light] tbody,html[data-netbox-color-mode=light] tfoot,html[data-netbox-color-mode=light] tr,html[data-netbox-color-mode=light] td,html[data-netbox-color-mode=light] th{border-color:inherit;border-style:solid;border-width:0}}@media print{html label,html[data-netbox-color-mode=dark] label,html[data-netbox-color-mode=light] label{display:inline-block}}@media print{html button,html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=light] button{border-radius:0}}@media print{html button:focus:not(:focus-visible),html[data-netbox-color-mode=dark] button:focus:not(:focus-visible),html[data-netbox-color-mode=light] button:focus:not(:focus-visible){outline:0}}@media print{html input,html button,html select,html optgroup,html textarea,html[data-netbox-color-mode=dark] input,html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] select,html[data-netbox-color-mode=dark] optgroup,html[data-netbox-color-mode=dark] textarea,html[data-netbox-color-mode=light] input,html[data-netbox-color-mode=light] button,html[data-netbox-color-mode=light] select,html[data-netbox-color-mode=light] optgroup,html[data-netbox-color-mode=light] textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}}@media print{html button,html select,html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] select,html[data-netbox-color-mode=light] button,html[data-netbox-color-mode=light] select{text-transform:none}}@media print{html [role=button],html[data-netbox-color-mode=dark] [role=button],html[data-netbox-color-mode=light] [role=button]{cursor:pointer}}@media print{html select,html[data-netbox-color-mode=dark] select,html[data-netbox-color-mode=light] select{word-wrap:normal}html select:disabled,html[data-netbox-color-mode=dark] select:disabled,html[data-netbox-color-mode=light] select:disabled{opacity:1}}@media print{html [list]::-webkit-calendar-picker-indicator,html[data-netbox-color-mode=dark] [list]::-webkit-calendar-picker-indicator,html[data-netbox-color-mode=light] [list]::-webkit-calendar-picker-indicator{display:none}}@media print{html button,html [type=button],html [type=reset],html [type=submit],html[data-netbox-color-mode=dark] button,html[data-netbox-color-mode=dark] [type=button],html[data-netbox-color-mode=dark] [type=reset],html[data-netbox-color-mode=dark] [type=submit],html[data-netbox-color-mode=light] button,html[data-netbox-color-mode=light] [type=button],html[data-netbox-color-mode=light] [type=reset],html[data-netbox-color-mode=light] [type=submit]{-webkit-appearance:button}html button:not(:disabled),html [type=button]:not(:disabled),html [type=reset]:not(:disabled),html [type=submit]:not(:disabled),html[data-netbox-color-mode=dark] button:not(:disabled),html[data-netbox-color-mode=dark] [type=button]:not(:disabled),html[data-netbox-color-mode=dark] [type=reset]:not(:disabled),html[data-netbox-color-mode=dark] [type=submit]:not(:disabled),html[data-netbox-color-mode=light] button:not(:disabled),html[data-netbox-color-mode=light] [type=button]:not(:disabled),html[data-netbox-color-mode=light] [type=reset]:not(:disabled),html[data-netbox-color-mode=light] [type=submit]:not(:disabled){cursor:pointer}}@media print{html ::-moz-focus-inner,html[data-netbox-color-mode=dark] ::-moz-focus-inner,html[data-netbox-color-mode=light] ::-moz-focus-inner{padding:0;border-style:none}}@media print{html textarea,html[data-netbox-color-mode=dark] textarea,html[data-netbox-color-mode=light] textarea{resize:vertical}}@media print{html fieldset,html[data-netbox-color-mode=dark] fieldset,html[data-netbox-color-mode=light] fieldset{min-width:0;padding:0;margin:0;border:0}}@media print{html legend,html[data-netbox-color-mode=dark] legend,html[data-netbox-color-mode=light] legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}}@media print and (min-width: 1200px){html legend,html[data-netbox-color-mode=dark] legend,html[data-netbox-color-mode=light] legend{font-size:1.5rem}}@media print{html legend+*,html[data-netbox-color-mode=dark] legend+*,html[data-netbox-color-mode=light] legend+*{clear:left}}@media print{html ::-webkit-datetime-edit-fields-wrapper,html ::-webkit-datetime-edit-text,html ::-webkit-datetime-edit-minute,html ::-webkit-datetime-edit-hour-field,html ::-webkit-datetime-edit-day-field,html ::-webkit-datetime-edit-month-field,html ::-webkit-datetime-edit-year-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-fields-wrapper,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-text,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-minute,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-hour-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-day-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-month-field,html[data-netbox-color-mode=dark] ::-webkit-datetime-edit-year-field,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-fields-wrapper,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-text,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-minute,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-hour-field,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-day-field,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-month-field,html[data-netbox-color-mode=light] ::-webkit-datetime-edit-year-field{padding:0}}@media print{html ::-webkit-inner-spin-button,html[data-netbox-color-mode=dark] ::-webkit-inner-spin-button,html[data-netbox-color-mode=light] ::-webkit-inner-spin-button{height:auto}}@media print{html [type=search],html[data-netbox-color-mode=dark] [type=search],html[data-netbox-color-mode=light] [type=search]{outline-offset:-2px;-webkit-appearance:textfield}}@media print{html ::-webkit-search-decoration,html[data-netbox-color-mode=dark] ::-webkit-search-decoration,html[data-netbox-color-mode=light] ::-webkit-search-decoration{-webkit-appearance:none}}@media print{html ::-webkit-color-swatch-wrapper,html[data-netbox-color-mode=dark] ::-webkit-color-swatch-wrapper,html[data-netbox-color-mode=light] ::-webkit-color-swatch-wrapper{padding:0}}@media print{html ::file-selector-button,html[data-netbox-color-mode=dark] ::file-selector-button,html[data-netbox-color-mode=light] ::file-selector-button{font:inherit}}@media print{html ::-webkit-file-upload-button,html[data-netbox-color-mode=dark] ::-webkit-file-upload-button,html[data-netbox-color-mode=light] ::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}}@media print{html output,html[data-netbox-color-mode=dark] output,html[data-netbox-color-mode=light] output{display:inline-block}}@media print{html iframe,html[data-netbox-color-mode=dark] iframe,html[data-netbox-color-mode=light] iframe{border:0}}@media print{html summary,html[data-netbox-color-mode=dark] summary,html[data-netbox-color-mode=light] summary{display:list-item;cursor:pointer}}@media print{html progress,html[data-netbox-color-mode=dark] progress,html[data-netbox-color-mode=light] progress{vertical-align:baseline}}@media print{html [hidden],html[data-netbox-color-mode=dark] [hidden],html[data-netbox-color-mode=light] [hidden]{display:none!important}}@media print{html .lead,html[data-netbox-color-mode=dark] .lead,html[data-netbox-color-mode=light] .lead{font-size:1.25rem;font-weight:300}}@media print{html .display-1,html[data-netbox-color-mode=dark] .display-1,html[data-netbox-color-mode=light] .display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-1,html[data-netbox-color-mode=dark] .display-1,html[data-netbox-color-mode=light] .display-1{font-size:5rem}}@media print{html .display-2,html[data-netbox-color-mode=dark] .display-2,html[data-netbox-color-mode=light] .display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-2,html[data-netbox-color-mode=dark] .display-2,html[data-netbox-color-mode=light] .display-2{font-size:4.5rem}}@media print{html .display-3,html[data-netbox-color-mode=dark] .display-3,html[data-netbox-color-mode=light] .display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-3,html[data-netbox-color-mode=dark] .display-3,html[data-netbox-color-mode=light] .display-3{font-size:4rem}}@media print{html .display-4,html[data-netbox-color-mode=dark] .display-4,html[data-netbox-color-mode=light] .display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-4,html[data-netbox-color-mode=dark] .display-4,html[data-netbox-color-mode=light] .display-4{font-size:3.5rem}}@media print{html .display-5,html[data-netbox-color-mode=dark] .display-5,html[data-netbox-color-mode=light] .display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-5,html[data-netbox-color-mode=dark] .display-5,html[data-netbox-color-mode=light] .display-5{font-size:3rem}}@media print{html .display-6,html[data-netbox-color-mode=dark] .display-6,html[data-netbox-color-mode=light] .display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}}@media print and (min-width: 1200px){html .display-6,html[data-netbox-color-mode=dark] .display-6,html[data-netbox-color-mode=light] .display-6{font-size:2.5rem}}@media print{html .list-unstyled,html[data-netbox-color-mode=dark] .list-unstyled,html[data-netbox-color-mode=light] .list-unstyled{padding-left:0;list-style:none}}@media print{html .list-inline,html[data-netbox-color-mode=dark] .list-inline,html[data-netbox-color-mode=light] .list-inline{padding-left:0;list-style:none}}@media print{html .list-inline-item,html[data-netbox-color-mode=dark] .list-inline-item,html[data-netbox-color-mode=light] .list-inline-item{display:inline-block}html .list-inline-item:not(:last-child),html[data-netbox-color-mode=dark] .list-inline-item:not(:last-child),html[data-netbox-color-mode=light] .list-inline-item:not(:last-child){margin-right:.5rem}}@media print{html .initialism,html[data-netbox-color-mode=dark] .initialism,html[data-netbox-color-mode=light] .initialism{font-size:.875em;text-transform:uppercase}}@media print{html .blockquote,html[data-netbox-color-mode=dark] .blockquote,html[data-netbox-color-mode=light] .blockquote{margin-bottom:1rem;font-size:1.25rem}html .blockquote>:last-child,html[data-netbox-color-mode=dark] .blockquote>:last-child,html[data-netbox-color-mode=light] .blockquote>:last-child{margin-bottom:0}}@media print{html .blockquote-footer,html[data-netbox-color-mode=dark] .blockquote-footer,html[data-netbox-color-mode=light] .blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}html .blockquote-footer:before,html[data-netbox-color-mode=dark] .blockquote-footer:before,html[data-netbox-color-mode=light] .blockquote-footer:before{content:"\2014\a0"}}@media print{html .img-fluid,html[data-netbox-color-mode=dark] .img-fluid,html[data-netbox-color-mode=light] .img-fluid{max-width:100%;height:auto}}@media print{html .img-thumbnail,html[data-netbox-color-mode=dark] .img-thumbnail,html[data-netbox-color-mode=light] .img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.375rem;max-width:100%;height:auto}}@media print{html .figure,html[data-netbox-color-mode=dark] .figure,html[data-netbox-color-mode=light] .figure{display:inline-block}}@media print{html .figure-img,html[data-netbox-color-mode=dark] .figure-img,html[data-netbox-color-mode=light] .figure-img{margin-bottom:.5rem;line-height:1}}@media print{html .figure-caption,html[data-netbox-color-mode=dark] .figure-caption,html[data-netbox-color-mode=light] .figure-caption{font-size:.875em;color:#6c757d}}@media print{html .container,html .container-fluid,html .container-xxl,html[data-netbox-color-mode=dark] .container-xxl,html[data-netbox-color-mode=light] .container-xxl,html .container-xl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=light] .container-xl,html .container-lg,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=light] .container-lg,html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=dark] .container-fluid,html[data-netbox-color-mode=light] .container,html[data-netbox-color-mode=light] .container-fluid{width:100%;padding-right:var(--bs-gutter-x, .75rem);padding-left:var(--bs-gutter-x, .75rem);margin-right:auto;margin-left:auto}}@media print and (min-width: 576px){html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:540px}}@media print and (min-width: 768px){html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:720px}}@media print and (min-width: 992px){html .container-lg,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=light] .container-lg,html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:960px}}@media print and (min-width: 1200px){html .container-xl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=light] .container-xl,html .container-lg,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=light] .container-lg,html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:1140px}}@media print and (min-width: 1400px){html .container-xxl,html[data-netbox-color-mode=dark] .container-xxl,html[data-netbox-color-mode=light] .container-xxl,html .container-xl,html[data-netbox-color-mode=dark] .container-xl,html[data-netbox-color-mode=light] .container-xl,html .container-lg,html[data-netbox-color-mode=dark] .container-lg,html[data-netbox-color-mode=light] .container-lg,html .container-md,html[data-netbox-color-mode=dark] .container-md,html[data-netbox-color-mode=light] .container-md,html .container-sm,html[data-netbox-color-mode=dark] .container-sm,html[data-netbox-color-mode=light] .container-sm,html .container,html[data-netbox-color-mode=dark] .container,html[data-netbox-color-mode=light] .container{max-width:1320px}}@media print{html .row,html[data-netbox-color-mode=dark] .row,html[data-netbox-color-mode=light] .row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}html .row>*,html[data-netbox-color-mode=dark] .row>*,html[data-netbox-color-mode=light] .row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}}@media print{html .col,html[data-netbox-color-mode=dark] .col,html[data-netbox-color-mode=light] .col{flex:1 0 0%}}@media print{html .row-cols-auto>*,html[data-netbox-color-mode=dark] .row-cols-auto>*,html[data-netbox-color-mode=light] .row-cols-auto>*{flex:0 0 auto;width:auto}}@media print{html .row-cols-1>*,html[data-netbox-color-mode=dark] .row-cols-1>*,html[data-netbox-color-mode=light] .row-cols-1>*{flex:0 0 auto;width:100%}}@media print{html .row-cols-2>*,html[data-netbox-color-mode=dark] .row-cols-2>*,html[data-netbox-color-mode=light] .row-cols-2>*{flex:0 0 auto;width:50%}}@media print{html .row-cols-3>*,html[data-netbox-color-mode=dark] .row-cols-3>*,html[data-netbox-color-mode=light] .row-cols-3>*{flex:0 0 auto;width:33.3333333333%}}@media print{html .row-cols-4>*,html[data-netbox-color-mode=dark] .row-cols-4>*,html[data-netbox-color-mode=light] .row-cols-4>*{flex:0 0 auto;width:25%}}@media print{html .row-cols-5>*,html[data-netbox-color-mode=dark] .row-cols-5>*,html[data-netbox-color-mode=light] .row-cols-5>*{flex:0 0 auto;width:20%}}@media print{html .row-cols-6>*,html[data-netbox-color-mode=dark] .row-cols-6>*,html[data-netbox-color-mode=light] .row-cols-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 576px){html .col-sm,html[data-netbox-color-mode=dark] .col-sm,html[data-netbox-color-mode=light] .col-sm{flex:1 0 0%}html .row-cols-sm-auto>*,html[data-netbox-color-mode=dark] .row-cols-sm-auto>*,html[data-netbox-color-mode=light] .row-cols-sm-auto>*{flex:0 0 auto;width:auto}html .row-cols-sm-1>*,html[data-netbox-color-mode=dark] .row-cols-sm-1>*,html[data-netbox-color-mode=light] .row-cols-sm-1>*{flex:0 0 auto;width:100%}html .row-cols-sm-2>*,html[data-netbox-color-mode=dark] .row-cols-sm-2>*,html[data-netbox-color-mode=light] .row-cols-sm-2>*{flex:0 0 auto;width:50%}html .row-cols-sm-3>*,html[data-netbox-color-mode=dark] .row-cols-sm-3>*,html[data-netbox-color-mode=light] .row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-sm-4>*,html[data-netbox-color-mode=dark] .row-cols-sm-4>*,html[data-netbox-color-mode=light] .row-cols-sm-4>*{flex:0 0 auto;width:25%}html .row-cols-sm-5>*,html[data-netbox-color-mode=dark] .row-cols-sm-5>*,html[data-netbox-color-mode=light] .row-cols-sm-5>*{flex:0 0 auto;width:20%}html .row-cols-sm-6>*,html[data-netbox-color-mode=dark] .row-cols-sm-6>*,html[data-netbox-color-mode=light] .row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 768px){html .col-md,html[data-netbox-color-mode=dark] .col-md,html[data-netbox-color-mode=light] .col-md{flex:1 0 0%}html .row-cols-md-auto>*,html[data-netbox-color-mode=dark] .row-cols-md-auto>*,html[data-netbox-color-mode=light] .row-cols-md-auto>*{flex:0 0 auto;width:auto}html .row-cols-md-1>*,html[data-netbox-color-mode=dark] .row-cols-md-1>*,html[data-netbox-color-mode=light] .row-cols-md-1>*{flex:0 0 auto;width:100%}html .row-cols-md-2>*,html[data-netbox-color-mode=dark] .row-cols-md-2>*,html[data-netbox-color-mode=light] .row-cols-md-2>*{flex:0 0 auto;width:50%}html .row-cols-md-3>*,html[data-netbox-color-mode=dark] .row-cols-md-3>*,html[data-netbox-color-mode=light] .row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-md-4>*,html[data-netbox-color-mode=dark] .row-cols-md-4>*,html[data-netbox-color-mode=light] .row-cols-md-4>*{flex:0 0 auto;width:25%}html .row-cols-md-5>*,html[data-netbox-color-mode=dark] .row-cols-md-5>*,html[data-netbox-color-mode=light] .row-cols-md-5>*{flex:0 0 auto;width:20%}html .row-cols-md-6>*,html[data-netbox-color-mode=dark] .row-cols-md-6>*,html[data-netbox-color-mode=light] .row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 992px){html .col-lg,html[data-netbox-color-mode=dark] .col-lg,html[data-netbox-color-mode=light] .col-lg{flex:1 0 0%}html .row-cols-lg-auto>*,html[data-netbox-color-mode=dark] .row-cols-lg-auto>*,html[data-netbox-color-mode=light] .row-cols-lg-auto>*{flex:0 0 auto;width:auto}html .row-cols-lg-1>*,html[data-netbox-color-mode=dark] .row-cols-lg-1>*,html[data-netbox-color-mode=light] .row-cols-lg-1>*{flex:0 0 auto;width:100%}html .row-cols-lg-2>*,html[data-netbox-color-mode=dark] .row-cols-lg-2>*,html[data-netbox-color-mode=light] .row-cols-lg-2>*{flex:0 0 auto;width:50%}html .row-cols-lg-3>*,html[data-netbox-color-mode=dark] .row-cols-lg-3>*,html[data-netbox-color-mode=light] .row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-lg-4>*,html[data-netbox-color-mode=dark] .row-cols-lg-4>*,html[data-netbox-color-mode=light] .row-cols-lg-4>*{flex:0 0 auto;width:25%}html .row-cols-lg-5>*,html[data-netbox-color-mode=dark] .row-cols-lg-5>*,html[data-netbox-color-mode=light] .row-cols-lg-5>*{flex:0 0 auto;width:20%}html .row-cols-lg-6>*,html[data-netbox-color-mode=dark] .row-cols-lg-6>*,html[data-netbox-color-mode=light] .row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 1200px){html .col-xl,html[data-netbox-color-mode=dark] .col-xl,html[data-netbox-color-mode=light] .col-xl{flex:1 0 0%}html .row-cols-xl-auto>*,html[data-netbox-color-mode=dark] .row-cols-xl-auto>*,html[data-netbox-color-mode=light] .row-cols-xl-auto>*{flex:0 0 auto;width:auto}html .row-cols-xl-1>*,html[data-netbox-color-mode=dark] .row-cols-xl-1>*,html[data-netbox-color-mode=light] .row-cols-xl-1>*{flex:0 0 auto;width:100%}html .row-cols-xl-2>*,html[data-netbox-color-mode=dark] .row-cols-xl-2>*,html[data-netbox-color-mode=light] .row-cols-xl-2>*{flex:0 0 auto;width:50%}html .row-cols-xl-3>*,html[data-netbox-color-mode=dark] .row-cols-xl-3>*,html[data-netbox-color-mode=light] .row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-xl-4>*,html[data-netbox-color-mode=dark] .row-cols-xl-4>*,html[data-netbox-color-mode=light] .row-cols-xl-4>*{flex:0 0 auto;width:25%}html .row-cols-xl-5>*,html[data-netbox-color-mode=dark] .row-cols-xl-5>*,html[data-netbox-color-mode=light] .row-cols-xl-5>*{flex:0 0 auto;width:20%}html .row-cols-xl-6>*,html[data-netbox-color-mode=dark] .row-cols-xl-6>*,html[data-netbox-color-mode=light] .row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media print and (min-width: 1400px){html .col-xxl,html[data-netbox-color-mode=dark] .col-xxl,html[data-netbox-color-mode=light] .col-xxl{flex:1 0 0%}html .row-cols-xxl-auto>*,html[data-netbox-color-mode=dark] .row-cols-xxl-auto>*,html[data-netbox-color-mode=light] .row-cols-xxl-auto>*{flex:0 0 auto;width:auto}html .row-cols-xxl-1>*,html[data-netbox-color-mode=dark] .row-cols-xxl-1>*,html[data-netbox-color-mode=light] .row-cols-xxl-1>*{flex:0 0 auto;width:100%}html .row-cols-xxl-2>*,html[data-netbox-color-mode=dark] .row-cols-xxl-2>*,html[data-netbox-color-mode=light] .row-cols-xxl-2>*{flex:0 0 auto;width:50%}html .row-cols-xxl-3>*,html[data-netbox-color-mode=dark] .row-cols-xxl-3>*,html[data-netbox-color-mode=light] .row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}html .row-cols-xxl-4>*,html[data-netbox-color-mode=dark] .row-cols-xxl-4>*,html[data-netbox-color-mode=light] .row-cols-xxl-4>*{flex:0 0 auto;width:25%}html .row-cols-xxl-5>*,html[data-netbox-color-mode=dark] .row-cols-xxl-5>*,html[data-netbox-color-mode=light] .row-cols-xxl-5>*{flex:0 0 auto;width:20%}html .row-cols-xxl-6>*,html[data-netbox-color-mode=dark] .row-cols-xxl-6>*,html[data-netbox-color-mode=light] .row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}@media print{html .col-auto,html[data-netbox-color-mode=dark] .col-auto,html[data-netbox-color-mode=light] .col-auto{flex:0 0 auto;width:auto}}@media print{html .col-1,html[data-netbox-color-mode=dark] .col-1,html[data-netbox-color-mode=light] .col-1{flex:0 0 auto;width:8.33333333%}}@media print{html .col-2,html[data-netbox-color-mode=dark] .col-2,html[data-netbox-color-mode=light] .col-2{flex:0 0 auto;width:16.66666667%}}@media print{html .col-3,html[data-netbox-color-mode=dark] .col-3,html[data-netbox-color-mode=light] .col-3{flex:0 0 auto;width:25%}}@media print{html .col-4,html[data-netbox-color-mode=dark] .col-4,html[data-netbox-color-mode=light] .col-4{flex:0 0 auto;width:33.33333333%}}@media print{html .col-5,html[data-netbox-color-mode=dark] .col-5,html[data-netbox-color-mode=light] .col-5{flex:0 0 auto;width:41.66666667%}}@media print{html .col-6,html[data-netbox-color-mode=dark] .col-6,html[data-netbox-color-mode=light] .col-6{flex:0 0 auto;width:50%}}@media print{html .col-7,html[data-netbox-color-mode=dark] .col-7,html[data-netbox-color-mode=light] .col-7{flex:0 0 auto;width:58.33333333%}}@media print{html .col-8,html[data-netbox-color-mode=dark] .col-8,html[data-netbox-color-mode=light] .col-8{flex:0 0 auto;width:66.66666667%}}@media print{html .col-9,html[data-netbox-color-mode=dark] .col-9,html[data-netbox-color-mode=light] .col-9{flex:0 0 auto;width:75%}}@media print{html .col-10,html[data-netbox-color-mode=dark] .col-10,html[data-netbox-color-mode=light] .col-10{flex:0 0 auto;width:83.33333333%}}@media print{html .col-11,html[data-netbox-color-mode=dark] .col-11,html[data-netbox-color-mode=light] .col-11{flex:0 0 auto;width:91.66666667%}}@media print{html .col-12,html[data-netbox-color-mode=dark] .col-12,html[data-netbox-color-mode=light] .col-12{flex:0 0 auto;width:100%}}@media print{html .offset-1,html[data-netbox-color-mode=dark] .offset-1,html[data-netbox-color-mode=light] .offset-1{margin-left:8.33333333%}}@media print{html .offset-2,html[data-netbox-color-mode=dark] .offset-2,html[data-netbox-color-mode=light] .offset-2{margin-left:16.66666667%}}@media print{html .offset-3,html[data-netbox-color-mode=dark] .offset-3,html[data-netbox-color-mode=light] .offset-3{margin-left:25%}}@media print{html .offset-4,html[data-netbox-color-mode=dark] .offset-4,html[data-netbox-color-mode=light] .offset-4{margin-left:33.33333333%}}@media print{html .offset-5,html[data-netbox-color-mode=dark] .offset-5,html[data-netbox-color-mode=light] .offset-5{margin-left:41.66666667%}}@media print{html .offset-6,html[data-netbox-color-mode=dark] .offset-6,html[data-netbox-color-mode=light] .offset-6{margin-left:50%}}@media print{html .offset-7,html[data-netbox-color-mode=dark] .offset-7,html[data-netbox-color-mode=light] .offset-7{margin-left:58.33333333%}}@media print{html .offset-8,html[data-netbox-color-mode=dark] .offset-8,html[data-netbox-color-mode=light] .offset-8{margin-left:66.66666667%}}@media print{html .offset-9,html[data-netbox-color-mode=dark] .offset-9,html[data-netbox-color-mode=light] .offset-9{margin-left:75%}}@media print{html .offset-10,html[data-netbox-color-mode=dark] .offset-10,html[data-netbox-color-mode=light] .offset-10{margin-left:83.33333333%}}@media print{html .offset-11,html[data-netbox-color-mode=dark] .offset-11,html[data-netbox-color-mode=light] .offset-11{margin-left:91.66666667%}}@media print{html .g-0,html .gx-0,html[data-netbox-color-mode=dark] .g-0,html[data-netbox-color-mode=dark] .gx-0,html[data-netbox-color-mode=light] .g-0,html[data-netbox-color-mode=light] .gx-0{--bs-gutter-x: 0}}@media print{html .g-0,html .gy-0,html[data-netbox-color-mode=dark] .g-0,html[data-netbox-color-mode=dark] .gy-0,html[data-netbox-color-mode=light] .g-0,html[data-netbox-color-mode=light] .gy-0{--bs-gutter-y: 0}}@media print{html .g-1,html .gx-1,html[data-netbox-color-mode=dark] .g-1,html[data-netbox-color-mode=dark] .gx-1,html[data-netbox-color-mode=light] .g-1,html[data-netbox-color-mode=light] .gx-1{--bs-gutter-x: .25rem}}@media print{html .g-1,html .gy-1,html[data-netbox-color-mode=dark] .g-1,html[data-netbox-color-mode=dark] .gy-1,html[data-netbox-color-mode=light] .g-1,html[data-netbox-color-mode=light] .gy-1{--bs-gutter-y: .25rem}}@media print{html .g-2,html .gx-2,html[data-netbox-color-mode=dark] .g-2,html[data-netbox-color-mode=dark] .gx-2,html[data-netbox-color-mode=light] .g-2,html[data-netbox-color-mode=light] .gx-2{--bs-gutter-x: .5rem}}@media print{html .g-2,html .gy-2,html[data-netbox-color-mode=dark] .g-2,html[data-netbox-color-mode=dark] .gy-2,html[data-netbox-color-mode=light] .g-2,html[data-netbox-color-mode=light] .gy-2{--bs-gutter-y: .5rem}}@media print{html .g-3,html .gx-3,html[data-netbox-color-mode=dark] .g-3,html[data-netbox-color-mode=dark] .gx-3,html[data-netbox-color-mode=light] .g-3,html[data-netbox-color-mode=light] .gx-3{--bs-gutter-x: 1rem}}@media print{html .g-3,html .gy-3,html[data-netbox-color-mode=dark] .g-3,html[data-netbox-color-mode=dark] .gy-3,html[data-netbox-color-mode=light] .g-3,html[data-netbox-color-mode=light] .gy-3{--bs-gutter-y: 1rem}}@media print{html .g-4,html .gx-4,html[data-netbox-color-mode=dark] .g-4,html[data-netbox-color-mode=dark] .gx-4,html[data-netbox-color-mode=light] .g-4,html[data-netbox-color-mode=light] .gx-4{--bs-gutter-x: 1.5rem}}@media print{html .g-4,html .gy-4,html[data-netbox-color-mode=dark] .g-4,html[data-netbox-color-mode=dark] .gy-4,html[data-netbox-color-mode=light] .g-4,html[data-netbox-color-mode=light] .gy-4{--bs-gutter-y: 1.5rem}}@media print{html .g-5,html .gx-5,html[data-netbox-color-mode=dark] .g-5,html[data-netbox-color-mode=dark] .gx-5,html[data-netbox-color-mode=light] .g-5,html[data-netbox-color-mode=light] .gx-5{--bs-gutter-x: 3rem}}@media print{html .g-5,html .gy-5,html[data-netbox-color-mode=dark] .g-5,html[data-netbox-color-mode=dark] .gy-5,html[data-netbox-color-mode=light] .g-5,html[data-netbox-color-mode=light] .gy-5{--bs-gutter-y: 3rem}}@media print and (min-width: 576px){html .col-sm-auto,html[data-netbox-color-mode=dark] .col-sm-auto,html[data-netbox-color-mode=light] .col-sm-auto{flex:0 0 auto;width:auto}html .col-sm-1,html[data-netbox-color-mode=dark] .col-sm-1,html[data-netbox-color-mode=light] .col-sm-1{flex:0 0 auto;width:8.33333333%}html .col-sm-2,html[data-netbox-color-mode=dark] .col-sm-2,html[data-netbox-color-mode=light] .col-sm-2{flex:0 0 auto;width:16.66666667%}html .col-sm-3,html[data-netbox-color-mode=dark] .col-sm-3,html[data-netbox-color-mode=light] .col-sm-3{flex:0 0 auto;width:25%}html .col-sm-4,html[data-netbox-color-mode=dark] .col-sm-4,html[data-netbox-color-mode=light] .col-sm-4{flex:0 0 auto;width:33.33333333%}html .col-sm-5,html[data-netbox-color-mode=dark] .col-sm-5,html[data-netbox-color-mode=light] .col-sm-5{flex:0 0 auto;width:41.66666667%}html .col-sm-6,html[data-netbox-color-mode=dark] .col-sm-6,html[data-netbox-color-mode=light] .col-sm-6{flex:0 0 auto;width:50%}html .col-sm-7,html[data-netbox-color-mode=dark] .col-sm-7,html[data-netbox-color-mode=light] .col-sm-7{flex:0 0 auto;width:58.33333333%}html .col-sm-8,html[data-netbox-color-mode=dark] .col-sm-8,html[data-netbox-color-mode=light] .col-sm-8{flex:0 0 auto;width:66.66666667%}html .col-sm-9,html[data-netbox-color-mode=dark] .col-sm-9,html[data-netbox-color-mode=light] .col-sm-9{flex:0 0 auto;width:75%}html .col-sm-10,html[data-netbox-color-mode=dark] .col-sm-10,html[data-netbox-color-mode=light] .col-sm-10{flex:0 0 auto;width:83.33333333%}html .col-sm-11,html[data-netbox-color-mode=dark] .col-sm-11,html[data-netbox-color-mode=light] .col-sm-11{flex:0 0 auto;width:91.66666667%}html .col-sm-12,html[data-netbox-color-mode=dark] .col-sm-12,html[data-netbox-color-mode=light] .col-sm-12{flex:0 0 auto;width:100%}html .offset-sm-0,html[data-netbox-color-mode=dark] .offset-sm-0,html[data-netbox-color-mode=light] .offset-sm-0{margin-left:0}html .offset-sm-1,html[data-netbox-color-mode=dark] .offset-sm-1,html[data-netbox-color-mode=light] .offset-sm-1{margin-left:8.33333333%}html .offset-sm-2,html[data-netbox-color-mode=dark] .offset-sm-2,html[data-netbox-color-mode=light] .offset-sm-2{margin-left:16.66666667%}html .offset-sm-3,html[data-netbox-color-mode=dark] .offset-sm-3,html[data-netbox-color-mode=light] .offset-sm-3{margin-left:25%}html .offset-sm-4,html[data-netbox-color-mode=dark] .offset-sm-4,html[data-netbox-color-mode=light] .offset-sm-4{margin-left:33.33333333%}html .offset-sm-5,html[data-netbox-color-mode=dark] .offset-sm-5,html[data-netbox-color-mode=light] .offset-sm-5{margin-left:41.66666667%}html .offset-sm-6,html[data-netbox-color-mode=dark] .offset-sm-6,html[data-netbox-color-mode=light] .offset-sm-6{margin-left:50%}html .offset-sm-7,html[data-netbox-color-mode=dark] .offset-sm-7,html[data-netbox-color-mode=light] .offset-sm-7{margin-left:58.33333333%}html .offset-sm-8,html[data-netbox-color-mode=dark] .offset-sm-8,html[data-netbox-color-mode=light] .offset-sm-8{margin-left:66.66666667%}html .offset-sm-9,html[data-netbox-color-mode=dark] .offset-sm-9,html[data-netbox-color-mode=light] .offset-sm-9{margin-left:75%}html .offset-sm-10,html[data-netbox-color-mode=dark] .offset-sm-10,html[data-netbox-color-mode=light] .offset-sm-10{margin-left:83.33333333%}html .offset-sm-11,html[data-netbox-color-mode=dark] .offset-sm-11,html[data-netbox-color-mode=light] .offset-sm-11{margin-left:91.66666667%}html .g-sm-0,html .gx-sm-0,html[data-netbox-color-mode=dark] .g-sm-0,html[data-netbox-color-mode=dark] .gx-sm-0,html[data-netbox-color-mode=light] .g-sm-0,html[data-netbox-color-mode=light] .gx-sm-0{--bs-gutter-x: 0}html .g-sm-0,html .gy-sm-0,html[data-netbox-color-mode=dark] .g-sm-0,html[data-netbox-color-mode=dark] .gy-sm-0,html[data-netbox-color-mode=light] .g-sm-0,html[data-netbox-color-mode=light] .gy-sm-0{--bs-gutter-y: 0}html .g-sm-1,html .gx-sm-1,html[data-netbox-color-mode=dark] .g-sm-1,html[data-netbox-color-mode=dark] .gx-sm-1,html[data-netbox-color-mode=light] .g-sm-1,html[data-netbox-color-mode=light] .gx-sm-1{--bs-gutter-x: .25rem}html .g-sm-1,html .gy-sm-1,html[data-netbox-color-mode=dark] .g-sm-1,html[data-netbox-color-mode=dark] .gy-sm-1,html[data-netbox-color-mode=light] .g-sm-1,html[data-netbox-color-mode=light] .gy-sm-1{--bs-gutter-y: .25rem}html .g-sm-2,html .gx-sm-2,html[data-netbox-color-mode=dark] .g-sm-2,html[data-netbox-color-mode=dark] .gx-sm-2,html[data-netbox-color-mode=light] .g-sm-2,html[data-netbox-color-mode=light] .gx-sm-2{--bs-gutter-x: .5rem}html .g-sm-2,html .gy-sm-2,html[data-netbox-color-mode=dark] .g-sm-2,html[data-netbox-color-mode=dark] .gy-sm-2,html[data-netbox-color-mode=light] .g-sm-2,html[data-netbox-color-mode=light] .gy-sm-2{--bs-gutter-y: .5rem}html .g-sm-3,html .gx-sm-3,html[data-netbox-color-mode=dark] .g-sm-3,html[data-netbox-color-mode=dark] .gx-sm-3,html[data-netbox-color-mode=light] .g-sm-3,html[data-netbox-color-mode=light] .gx-sm-3{--bs-gutter-x: 1rem}html .g-sm-3,html .gy-sm-3,html[data-netbox-color-mode=dark] .g-sm-3,html[data-netbox-color-mode=dark] .gy-sm-3,html[data-netbox-color-mode=light] .g-sm-3,html[data-netbox-color-mode=light] .gy-sm-3{--bs-gutter-y: 1rem}html .g-sm-4,html .gx-sm-4,html[data-netbox-color-mode=dark] .g-sm-4,html[data-netbox-color-mode=dark] .gx-sm-4,html[data-netbox-color-mode=light] .g-sm-4,html[data-netbox-color-mode=light] .gx-sm-4{--bs-gutter-x: 1.5rem}html .g-sm-4,html .gy-sm-4,html[data-netbox-color-mode=dark] .g-sm-4,html[data-netbox-color-mode=dark] .gy-sm-4,html[data-netbox-color-mode=light] .g-sm-4,html[data-netbox-color-mode=light] .gy-sm-4{--bs-gutter-y: 1.5rem}html .g-sm-5,html .gx-sm-5,html[data-netbox-color-mode=dark] .g-sm-5,html[data-netbox-color-mode=dark] .gx-sm-5,html[data-netbox-color-mode=light] .g-sm-5,html[data-netbox-color-mode=light] .gx-sm-5{--bs-gutter-x: 3rem}html .g-sm-5,html .gy-sm-5,html[data-netbox-color-mode=dark] .g-sm-5,html[data-netbox-color-mode=dark] .gy-sm-5,html[data-netbox-color-mode=light] .g-sm-5,html[data-netbox-color-mode=light] .gy-sm-5{--bs-gutter-y: 3rem}}@media print and (min-width: 768px){html .col-md-auto,html[data-netbox-color-mode=dark] .col-md-auto,html[data-netbox-color-mode=light] .col-md-auto{flex:0 0 auto;width:auto}html .col-md-1,html[data-netbox-color-mode=dark] .col-md-1,html[data-netbox-color-mode=light] .col-md-1{flex:0 0 auto;width:8.33333333%}html .col-md-2,html[data-netbox-color-mode=dark] .col-md-2,html[data-netbox-color-mode=light] .col-md-2{flex:0 0 auto;width:16.66666667%}html .col-md-3,html[data-netbox-color-mode=dark] .col-md-3,html[data-netbox-color-mode=light] .col-md-3{flex:0 0 auto;width:25%}html .col-md-4,html[data-netbox-color-mode=dark] .col-md-4,html[data-netbox-color-mode=light] .col-md-4{flex:0 0 auto;width:33.33333333%}html .col-md-5,html[data-netbox-color-mode=dark] .col-md-5,html[data-netbox-color-mode=light] .col-md-5{flex:0 0 auto;width:41.66666667%}html .col-md-6,html[data-netbox-color-mode=dark] .col-md-6,html[data-netbox-color-mode=light] .col-md-6{flex:0 0 auto;width:50%}html .col-md-7,html[data-netbox-color-mode=dark] .col-md-7,html[data-netbox-color-mode=light] .col-md-7{flex:0 0 auto;width:58.33333333%}html .col-md-8,html[data-netbox-color-mode=dark] .col-md-8,html[data-netbox-color-mode=light] .col-md-8{flex:0 0 auto;width:66.66666667%}html .col-md-9,html[data-netbox-color-mode=dark] .col-md-9,html[data-netbox-color-mode=light] .col-md-9{flex:0 0 auto;width:75%}html .col-md-10,html[data-netbox-color-mode=dark] .col-md-10,html[data-netbox-color-mode=light] .col-md-10{flex:0 0 auto;width:83.33333333%}html .col-md-11,html[data-netbox-color-mode=dark] .col-md-11,html[data-netbox-color-mode=light] .col-md-11{flex:0 0 auto;width:91.66666667%}html .col-md-12,html[data-netbox-color-mode=dark] .col-md-12,html[data-netbox-color-mode=light] .col-md-12{flex:0 0 auto;width:100%}html .offset-md-0,html[data-netbox-color-mode=dark] .offset-md-0,html[data-netbox-color-mode=light] .offset-md-0{margin-left:0}html .offset-md-1,html[data-netbox-color-mode=dark] .offset-md-1,html[data-netbox-color-mode=light] .offset-md-1{margin-left:8.33333333%}html .offset-md-2,html[data-netbox-color-mode=dark] .offset-md-2,html[data-netbox-color-mode=light] .offset-md-2{margin-left:16.66666667%}html .offset-md-3,html[data-netbox-color-mode=dark] .offset-md-3,html[data-netbox-color-mode=light] .offset-md-3{margin-left:25%}html .offset-md-4,html[data-netbox-color-mode=dark] .offset-md-4,html[data-netbox-color-mode=light] .offset-md-4{margin-left:33.33333333%}html .offset-md-5,html[data-netbox-color-mode=dark] .offset-md-5,html[data-netbox-color-mode=light] .offset-md-5{margin-left:41.66666667%}html .offset-md-6,html[data-netbox-color-mode=dark] .offset-md-6,html[data-netbox-color-mode=light] .offset-md-6{margin-left:50%}html .offset-md-7,html[data-netbox-color-mode=dark] .offset-md-7,html[data-netbox-color-mode=light] .offset-md-7{margin-left:58.33333333%}html .offset-md-8,html[data-netbox-color-mode=dark] .offset-md-8,html[data-netbox-color-mode=light] .offset-md-8{margin-left:66.66666667%}html .offset-md-9,html[data-netbox-color-mode=dark] .offset-md-9,html[data-netbox-color-mode=light] .offset-md-9{margin-left:75%}html .offset-md-10,html[data-netbox-color-mode=dark] .offset-md-10,html[data-netbox-color-mode=light] .offset-md-10{margin-left:83.33333333%}html .offset-md-11,html[data-netbox-color-mode=dark] .offset-md-11,html[data-netbox-color-mode=light] .offset-md-11{margin-left:91.66666667%}html .g-md-0,html .gx-md-0,html[data-netbox-color-mode=dark] .g-md-0,html[data-netbox-color-mode=dark] .gx-md-0,html[data-netbox-color-mode=light] .g-md-0,html[data-netbox-color-mode=light] .gx-md-0{--bs-gutter-x: 0}html .g-md-0,html .gy-md-0,html[data-netbox-color-mode=dark] .g-md-0,html[data-netbox-color-mode=dark] .gy-md-0,html[data-netbox-color-mode=light] .g-md-0,html[data-netbox-color-mode=light] .gy-md-0{--bs-gutter-y: 0}html .g-md-1,html .gx-md-1,html[data-netbox-color-mode=dark] .g-md-1,html[data-netbox-color-mode=dark] .gx-md-1,html[data-netbox-color-mode=light] .g-md-1,html[data-netbox-color-mode=light] .gx-md-1{--bs-gutter-x: .25rem}html .g-md-1,html .gy-md-1,html[data-netbox-color-mode=dark] .g-md-1,html[data-netbox-color-mode=dark] .gy-md-1,html[data-netbox-color-mode=light] .g-md-1,html[data-netbox-color-mode=light] .gy-md-1{--bs-gutter-y: .25rem}html .g-md-2,html .gx-md-2,html[data-netbox-color-mode=dark] .g-md-2,html[data-netbox-color-mode=dark] .gx-md-2,html[data-netbox-color-mode=light] .g-md-2,html[data-netbox-color-mode=light] .gx-md-2{--bs-gutter-x: .5rem}html .g-md-2,html .gy-md-2,html[data-netbox-color-mode=dark] .g-md-2,html[data-netbox-color-mode=dark] .gy-md-2,html[data-netbox-color-mode=light] .g-md-2,html[data-netbox-color-mode=light] .gy-md-2{--bs-gutter-y: .5rem}html .g-md-3,html .gx-md-3,html[data-netbox-color-mode=dark] .g-md-3,html[data-netbox-color-mode=dark] .gx-md-3,html[data-netbox-color-mode=light] .g-md-3,html[data-netbox-color-mode=light] .gx-md-3{--bs-gutter-x: 1rem}html .g-md-3,html .gy-md-3,html[data-netbox-color-mode=dark] .g-md-3,html[data-netbox-color-mode=dark] .gy-md-3,html[data-netbox-color-mode=light] .g-md-3,html[data-netbox-color-mode=light] .gy-md-3{--bs-gutter-y: 1rem}html .g-md-4,html .gx-md-4,html[data-netbox-color-mode=dark] .g-md-4,html[data-netbox-color-mode=dark] .gx-md-4,html[data-netbox-color-mode=light] .g-md-4,html[data-netbox-color-mode=light] .gx-md-4{--bs-gutter-x: 1.5rem}html .g-md-4,html .gy-md-4,html[data-netbox-color-mode=dark] .g-md-4,html[data-netbox-color-mode=dark] .gy-md-4,html[data-netbox-color-mode=light] .g-md-4,html[data-netbox-color-mode=light] .gy-md-4{--bs-gutter-y: 1.5rem}html .g-md-5,html .gx-md-5,html[data-netbox-color-mode=dark] .g-md-5,html[data-netbox-color-mode=dark] .gx-md-5,html[data-netbox-color-mode=light] .g-md-5,html[data-netbox-color-mode=light] .gx-md-5{--bs-gutter-x: 3rem}html .g-md-5,html .gy-md-5,html[data-netbox-color-mode=dark] .g-md-5,html[data-netbox-color-mode=dark] .gy-md-5,html[data-netbox-color-mode=light] .g-md-5,html[data-netbox-color-mode=light] .gy-md-5{--bs-gutter-y: 3rem}}@media print and (min-width: 992px){html .col-lg-auto,html[data-netbox-color-mode=dark] .col-lg-auto,html[data-netbox-color-mode=light] .col-lg-auto{flex:0 0 auto;width:auto}html .col-lg-1,html[data-netbox-color-mode=dark] .col-lg-1,html[data-netbox-color-mode=light] .col-lg-1{flex:0 0 auto;width:8.33333333%}html .col-lg-2,html[data-netbox-color-mode=dark] .col-lg-2,html[data-netbox-color-mode=light] .col-lg-2{flex:0 0 auto;width:16.66666667%}html .col-lg-3,html[data-netbox-color-mode=dark] .col-lg-3,html[data-netbox-color-mode=light] .col-lg-3{flex:0 0 auto;width:25%}html .col-lg-4,html[data-netbox-color-mode=dark] .col-lg-4,html[data-netbox-color-mode=light] .col-lg-4{flex:0 0 auto;width:33.33333333%}html .col-lg-5,html[data-netbox-color-mode=dark] .col-lg-5,html[data-netbox-color-mode=light] .col-lg-5{flex:0 0 auto;width:41.66666667%}html .col-lg-6,html[data-netbox-color-mode=dark] .col-lg-6,html[data-netbox-color-mode=light] .col-lg-6{flex:0 0 auto;width:50%}html .col-lg-7,html[data-netbox-color-mode=dark] .col-lg-7,html[data-netbox-color-mode=light] .col-lg-7{flex:0 0 auto;width:58.33333333%}html .col-lg-8,html[data-netbox-color-mode=dark] .col-lg-8,html[data-netbox-color-mode=light] .col-lg-8{flex:0 0 auto;width:66.66666667%}html .col-lg-9,html[data-netbox-color-mode=dark] .col-lg-9,html[data-netbox-color-mode=light] .col-lg-9{flex:0 0 auto;width:75%}html .col-lg-10,html[data-netbox-color-mode=dark] .col-lg-10,html[data-netbox-color-mode=light] .col-lg-10{flex:0 0 auto;width:83.33333333%}html .col-lg-11,html[data-netbox-color-mode=dark] .col-lg-11,html[data-netbox-color-mode=light] .col-lg-11{flex:0 0 auto;width:91.66666667%}html .col-lg-12,html[data-netbox-color-mode=dark] .col-lg-12,html[data-netbox-color-mode=light] .col-lg-12{flex:0 0 auto;width:100%}html .offset-lg-0,html[data-netbox-color-mode=dark] .offset-lg-0,html[data-netbox-color-mode=light] .offset-lg-0{margin-left:0}html .offset-lg-1,html[data-netbox-color-mode=dark] .offset-lg-1,html[data-netbox-color-mode=light] .offset-lg-1{margin-left:8.33333333%}html .offset-lg-2,html[data-netbox-color-mode=dark] .offset-lg-2,html[data-netbox-color-mode=light] .offset-lg-2{margin-left:16.66666667%}html .offset-lg-3,html[data-netbox-color-mode=dark] .offset-lg-3,html[data-netbox-color-mode=light] .offset-lg-3{margin-left:25%}html .offset-lg-4,html[data-netbox-color-mode=dark] .offset-lg-4,html[data-netbox-color-mode=light] .offset-lg-4{margin-left:33.33333333%}html .offset-lg-5,html[data-netbox-color-mode=dark] .offset-lg-5,html[data-netbox-color-mode=light] .offset-lg-5{margin-left:41.66666667%}html .offset-lg-6,html[data-netbox-color-mode=dark] .offset-lg-6,html[data-netbox-color-mode=light] .offset-lg-6{margin-left:50%}html .offset-lg-7,html[data-netbox-color-mode=dark] .offset-lg-7,html[data-netbox-color-mode=light] .offset-lg-7{margin-left:58.33333333%}html .offset-lg-8,html[data-netbox-color-mode=dark] .offset-lg-8,html[data-netbox-color-mode=light] .offset-lg-8{margin-left:66.66666667%}html .offset-lg-9,html[data-netbox-color-mode=dark] .offset-lg-9,html[data-netbox-color-mode=light] .offset-lg-9{margin-left:75%}html .offset-lg-10,html[data-netbox-color-mode=dark] .offset-lg-10,html[data-netbox-color-mode=light] .offset-lg-10{margin-left:83.33333333%}html .offset-lg-11,html[data-netbox-color-mode=dark] .offset-lg-11,html[data-netbox-color-mode=light] .offset-lg-11{margin-left:91.66666667%}html .g-lg-0,html .gx-lg-0,html[data-netbox-color-mode=dark] .g-lg-0,html[data-netbox-color-mode=dark] .gx-lg-0,html[data-netbox-color-mode=light] .g-lg-0,html[data-netbox-color-mode=light] .gx-lg-0{--bs-gutter-x: 0}html .g-lg-0,html .gy-lg-0,html[data-netbox-color-mode=dark] .g-lg-0,html[data-netbox-color-mode=dark] .gy-lg-0,html[data-netbox-color-mode=light] .g-lg-0,html[data-netbox-color-mode=light] .gy-lg-0{--bs-gutter-y: 0}html .g-lg-1,html .gx-lg-1,html[data-netbox-color-mode=dark] .g-lg-1,html[data-netbox-color-mode=dark] .gx-lg-1,html[data-netbox-color-mode=light] .g-lg-1,html[data-netbox-color-mode=light] .gx-lg-1{--bs-gutter-x: .25rem}html .g-lg-1,html .gy-lg-1,html[data-netbox-color-mode=dark] .g-lg-1,html[data-netbox-color-mode=dark] .gy-lg-1,html[data-netbox-color-mode=light] .g-lg-1,html[data-netbox-color-mode=light] .gy-lg-1{--bs-gutter-y: .25rem}html .g-lg-2,html .gx-lg-2,html[data-netbox-color-mode=dark] .g-lg-2,html[data-netbox-color-mode=dark] .gx-lg-2,html[data-netbox-color-mode=light] .g-lg-2,html[data-netbox-color-mode=light] .gx-lg-2{--bs-gutter-x: .5rem}html .g-lg-2,html .gy-lg-2,html[data-netbox-color-mode=dark] .g-lg-2,html[data-netbox-color-mode=dark] .gy-lg-2,html[data-netbox-color-mode=light] .g-lg-2,html[data-netbox-color-mode=light] .gy-lg-2{--bs-gutter-y: .5rem}html .g-lg-3,html .gx-lg-3,html[data-netbox-color-mode=dark] .g-lg-3,html[data-netbox-color-mode=dark] .gx-lg-3,html[data-netbox-color-mode=light] .g-lg-3,html[data-netbox-color-mode=light] .gx-lg-3{--bs-gutter-x: 1rem}html .g-lg-3,html .gy-lg-3,html[data-netbox-color-mode=dark] .g-lg-3,html[data-netbox-color-mode=dark] .gy-lg-3,html[data-netbox-color-mode=light] .g-lg-3,html[data-netbox-color-mode=light] .gy-lg-3{--bs-gutter-y: 1rem}html .g-lg-4,html .gx-lg-4,html[data-netbox-color-mode=dark] .g-lg-4,html[data-netbox-color-mode=dark] .gx-lg-4,html[data-netbox-color-mode=light] .g-lg-4,html[data-netbox-color-mode=light] .gx-lg-4{--bs-gutter-x: 1.5rem}html .g-lg-4,html .gy-lg-4,html[data-netbox-color-mode=dark] .g-lg-4,html[data-netbox-color-mode=dark] .gy-lg-4,html[data-netbox-color-mode=light] .g-lg-4,html[data-netbox-color-mode=light] .gy-lg-4{--bs-gutter-y: 1.5rem}html .g-lg-5,html .gx-lg-5,html[data-netbox-color-mode=dark] .g-lg-5,html[data-netbox-color-mode=dark] .gx-lg-5,html[data-netbox-color-mode=light] .g-lg-5,html[data-netbox-color-mode=light] .gx-lg-5{--bs-gutter-x: 3rem}html .g-lg-5,html .gy-lg-5,html[data-netbox-color-mode=dark] .g-lg-5,html[data-netbox-color-mode=dark] .gy-lg-5,html[data-netbox-color-mode=light] .g-lg-5,html[data-netbox-color-mode=light] .gy-lg-5{--bs-gutter-y: 3rem}}@media print and (min-width: 1200px){html .col-xl-auto,html[data-netbox-color-mode=dark] .col-xl-auto,html[data-netbox-color-mode=light] .col-xl-auto{flex:0 0 auto;width:auto}html .col-xl-1,html[data-netbox-color-mode=dark] .col-xl-1,html[data-netbox-color-mode=light] .col-xl-1{flex:0 0 auto;width:8.33333333%}html .col-xl-2,html[data-netbox-color-mode=dark] .col-xl-2,html[data-netbox-color-mode=light] .col-xl-2{flex:0 0 auto;width:16.66666667%}html .col-xl-3,html[data-netbox-color-mode=dark] .col-xl-3,html[data-netbox-color-mode=light] .col-xl-3{flex:0 0 auto;width:25%}html .col-xl-4,html[data-netbox-color-mode=dark] .col-xl-4,html[data-netbox-color-mode=light] .col-xl-4{flex:0 0 auto;width:33.33333333%}html .col-xl-5,html[data-netbox-color-mode=dark] .col-xl-5,html[data-netbox-color-mode=light] .col-xl-5{flex:0 0 auto;width:41.66666667%}html .col-xl-6,html[data-netbox-color-mode=dark] .col-xl-6,html[data-netbox-color-mode=light] .col-xl-6{flex:0 0 auto;width:50%}html .col-xl-7,html[data-netbox-color-mode=dark] .col-xl-7,html[data-netbox-color-mode=light] .col-xl-7{flex:0 0 auto;width:58.33333333%}html .col-xl-8,html[data-netbox-color-mode=dark] .col-xl-8,html[data-netbox-color-mode=light] .col-xl-8{flex:0 0 auto;width:66.66666667%}html .col-xl-9,html[data-netbox-color-mode=dark] .col-xl-9,html[data-netbox-color-mode=light] .col-xl-9{flex:0 0 auto;width:75%}html .col-xl-10,html[data-netbox-color-mode=dark] .col-xl-10,html[data-netbox-color-mode=light] .col-xl-10{flex:0 0 auto;width:83.33333333%}html .col-xl-11,html[data-netbox-color-mode=dark] .col-xl-11,html[data-netbox-color-mode=light] .col-xl-11{flex:0 0 auto;width:91.66666667%}html .col-xl-12,html[data-netbox-color-mode=dark] .col-xl-12,html[data-netbox-color-mode=light] .col-xl-12{flex:0 0 auto;width:100%}html .offset-xl-0,html[data-netbox-color-mode=dark] .offset-xl-0,html[data-netbox-color-mode=light] .offset-xl-0{margin-left:0}html .offset-xl-1,html[data-netbox-color-mode=dark] .offset-xl-1,html[data-netbox-color-mode=light] .offset-xl-1{margin-left:8.33333333%}html .offset-xl-2,html[data-netbox-color-mode=dark] .offset-xl-2,html[data-netbox-color-mode=light] .offset-xl-2{margin-left:16.66666667%}html .offset-xl-3,html[data-netbox-color-mode=dark] .offset-xl-3,html[data-netbox-color-mode=light] .offset-xl-3{margin-left:25%}html .offset-xl-4,html[data-netbox-color-mode=dark] .offset-xl-4,html[data-netbox-color-mode=light] .offset-xl-4{margin-left:33.33333333%}html .offset-xl-5,html[data-netbox-color-mode=dark] .offset-xl-5,html[data-netbox-color-mode=light] .offset-xl-5{margin-left:41.66666667%}html .offset-xl-6,html[data-netbox-color-mode=dark] .offset-xl-6,html[data-netbox-color-mode=light] .offset-xl-6{margin-left:50%}html .offset-xl-7,html[data-netbox-color-mode=dark] .offset-xl-7,html[data-netbox-color-mode=light] .offset-xl-7{margin-left:58.33333333%}html .offset-xl-8,html[data-netbox-color-mode=dark] .offset-xl-8,html[data-netbox-color-mode=light] .offset-xl-8{margin-left:66.66666667%}html .offset-xl-9,html[data-netbox-color-mode=dark] .offset-xl-9,html[data-netbox-color-mode=light] .offset-xl-9{margin-left:75%}html .offset-xl-10,html[data-netbox-color-mode=dark] .offset-xl-10,html[data-netbox-color-mode=light] .offset-xl-10{margin-left:83.33333333%}html .offset-xl-11,html[data-netbox-color-mode=dark] .offset-xl-11,html[data-netbox-color-mode=light] .offset-xl-11{margin-left:91.66666667%}html .g-xl-0,html .gx-xl-0,html[data-netbox-color-mode=dark] .g-xl-0,html[data-netbox-color-mode=dark] .gx-xl-0,html[data-netbox-color-mode=light] .g-xl-0,html[data-netbox-color-mode=light] .gx-xl-0{--bs-gutter-x: 0}html .g-xl-0,html .gy-xl-0,html[data-netbox-color-mode=dark] .g-xl-0,html[data-netbox-color-mode=dark] .gy-xl-0,html[data-netbox-color-mode=light] .g-xl-0,html[data-netbox-color-mode=light] .gy-xl-0{--bs-gutter-y: 0}html .g-xl-1,html .gx-xl-1,html[data-netbox-color-mode=dark] .g-xl-1,html[data-netbox-color-mode=dark] .gx-xl-1,html[data-netbox-color-mode=light] .g-xl-1,html[data-netbox-color-mode=light] .gx-xl-1{--bs-gutter-x: .25rem}html .g-xl-1,html .gy-xl-1,html[data-netbox-color-mode=dark] .g-xl-1,html[data-netbox-color-mode=dark] .gy-xl-1,html[data-netbox-color-mode=light] .g-xl-1,html[data-netbox-color-mode=light] .gy-xl-1{--bs-gutter-y: .25rem}html .g-xl-2,html .gx-xl-2,html[data-netbox-color-mode=dark] .g-xl-2,html[data-netbox-color-mode=dark] .gx-xl-2,html[data-netbox-color-mode=light] .g-xl-2,html[data-netbox-color-mode=light] .gx-xl-2{--bs-gutter-x: .5rem}html .g-xl-2,html .gy-xl-2,html[data-netbox-color-mode=dark] .g-xl-2,html[data-netbox-color-mode=dark] .gy-xl-2,html[data-netbox-color-mode=light] .g-xl-2,html[data-netbox-color-mode=light] .gy-xl-2{--bs-gutter-y: .5rem}html .g-xl-3,html .gx-xl-3,html[data-netbox-color-mode=dark] .g-xl-3,html[data-netbox-color-mode=dark] .gx-xl-3,html[data-netbox-color-mode=light] .g-xl-3,html[data-netbox-color-mode=light] .gx-xl-3{--bs-gutter-x: 1rem}html .g-xl-3,html .gy-xl-3,html[data-netbox-color-mode=dark] .g-xl-3,html[data-netbox-color-mode=dark] .gy-xl-3,html[data-netbox-color-mode=light] .g-xl-3,html[data-netbox-color-mode=light] .gy-xl-3{--bs-gutter-y: 1rem}html .g-xl-4,html .gx-xl-4,html[data-netbox-color-mode=dark] .g-xl-4,html[data-netbox-color-mode=dark] .gx-xl-4,html[data-netbox-color-mode=light] .g-xl-4,html[data-netbox-color-mode=light] .gx-xl-4{--bs-gutter-x: 1.5rem}html .g-xl-4,html .gy-xl-4,html[data-netbox-color-mode=dark] .g-xl-4,html[data-netbox-color-mode=dark] .gy-xl-4,html[data-netbox-color-mode=light] .g-xl-4,html[data-netbox-color-mode=light] .gy-xl-4{--bs-gutter-y: 1.5rem}html .g-xl-5,html .gx-xl-5,html[data-netbox-color-mode=dark] .g-xl-5,html[data-netbox-color-mode=dark] .gx-xl-5,html[data-netbox-color-mode=light] .g-xl-5,html[data-netbox-color-mode=light] .gx-xl-5{--bs-gutter-x: 3rem}html .g-xl-5,html .gy-xl-5,html[data-netbox-color-mode=dark] .g-xl-5,html[data-netbox-color-mode=dark] .gy-xl-5,html[data-netbox-color-mode=light] .g-xl-5,html[data-netbox-color-mode=light] .gy-xl-5{--bs-gutter-y: 3rem}}@media print and (min-width: 1400px){html .col-xxl-auto,html[data-netbox-color-mode=dark] .col-xxl-auto,html[data-netbox-color-mode=light] .col-xxl-auto{flex:0 0 auto;width:auto}html .col-xxl-1,html[data-netbox-color-mode=dark] .col-xxl-1,html[data-netbox-color-mode=light] .col-xxl-1{flex:0 0 auto;width:8.33333333%}html .col-xxl-2,html[data-netbox-color-mode=dark] .col-xxl-2,html[data-netbox-color-mode=light] .col-xxl-2{flex:0 0 auto;width:16.66666667%}html .col-xxl-3,html[data-netbox-color-mode=dark] .col-xxl-3,html[data-netbox-color-mode=light] .col-xxl-3{flex:0 0 auto;width:25%}html .col-xxl-4,html[data-netbox-color-mode=dark] .col-xxl-4,html[data-netbox-color-mode=light] .col-xxl-4{flex:0 0 auto;width:33.33333333%}html .col-xxl-5,html[data-netbox-color-mode=dark] .col-xxl-5,html[data-netbox-color-mode=light] .col-xxl-5{flex:0 0 auto;width:41.66666667%}html .col-xxl-6,html[data-netbox-color-mode=dark] .col-xxl-6,html[data-netbox-color-mode=light] .col-xxl-6{flex:0 0 auto;width:50%}html .col-xxl-7,html[data-netbox-color-mode=dark] .col-xxl-7,html[data-netbox-color-mode=light] .col-xxl-7{flex:0 0 auto;width:58.33333333%}html .col-xxl-8,html[data-netbox-color-mode=dark] .col-xxl-8,html[data-netbox-color-mode=light] .col-xxl-8{flex:0 0 auto;width:66.66666667%}html .col-xxl-9,html[data-netbox-color-mode=dark] .col-xxl-9,html[data-netbox-color-mode=light] .col-xxl-9{flex:0 0 auto;width:75%}html .col-xxl-10,html[data-netbox-color-mode=dark] .col-xxl-10,html[data-netbox-color-mode=light] .col-xxl-10{flex:0 0 auto;width:83.33333333%}html .col-xxl-11,html[data-netbox-color-mode=dark] .col-xxl-11,html[data-netbox-color-mode=light] .col-xxl-11{flex:0 0 auto;width:91.66666667%}html .col-xxl-12,html[data-netbox-color-mode=dark] .col-xxl-12,html[data-netbox-color-mode=light] .col-xxl-12{flex:0 0 auto;width:100%}html .offset-xxl-0,html[data-netbox-color-mode=dark] .offset-xxl-0,html[data-netbox-color-mode=light] .offset-xxl-0{margin-left:0}html .offset-xxl-1,html[data-netbox-color-mode=dark] .offset-xxl-1,html[data-netbox-color-mode=light] .offset-xxl-1{margin-left:8.33333333%}html .offset-xxl-2,html[data-netbox-color-mode=dark] .offset-xxl-2,html[data-netbox-color-mode=light] .offset-xxl-2{margin-left:16.66666667%}html .offset-xxl-3,html[data-netbox-color-mode=dark] .offset-xxl-3,html[data-netbox-color-mode=light] .offset-xxl-3{margin-left:25%}html .offset-xxl-4,html[data-netbox-color-mode=dark] .offset-xxl-4,html[data-netbox-color-mode=light] .offset-xxl-4{margin-left:33.33333333%}html .offset-xxl-5,html[data-netbox-color-mode=dark] .offset-xxl-5,html[data-netbox-color-mode=light] .offset-xxl-5{margin-left:41.66666667%}html .offset-xxl-6,html[data-netbox-color-mode=dark] .offset-xxl-6,html[data-netbox-color-mode=light] .offset-xxl-6{margin-left:50%}html .offset-xxl-7,html[data-netbox-color-mode=dark] .offset-xxl-7,html[data-netbox-color-mode=light] .offset-xxl-7{margin-left:58.33333333%}html .offset-xxl-8,html[data-netbox-color-mode=dark] .offset-xxl-8,html[data-netbox-color-mode=light] .offset-xxl-8{margin-left:66.66666667%}html .offset-xxl-9,html[data-netbox-color-mode=dark] .offset-xxl-9,html[data-netbox-color-mode=light] .offset-xxl-9{margin-left:75%}html .offset-xxl-10,html[data-netbox-color-mode=dark] .offset-xxl-10,html[data-netbox-color-mode=light] .offset-xxl-10{margin-left:83.33333333%}html .offset-xxl-11,html[data-netbox-color-mode=dark] .offset-xxl-11,html[data-netbox-color-mode=light] .offset-xxl-11{margin-left:91.66666667%}html .g-xxl-0,html .gx-xxl-0,html[data-netbox-color-mode=dark] .g-xxl-0,html[data-netbox-color-mode=dark] .gx-xxl-0,html[data-netbox-color-mode=light] .g-xxl-0,html[data-netbox-color-mode=light] .gx-xxl-0{--bs-gutter-x: 0}html .g-xxl-0,html .gy-xxl-0,html[data-netbox-color-mode=dark] .g-xxl-0,html[data-netbox-color-mode=dark] .gy-xxl-0,html[data-netbox-color-mode=light] .g-xxl-0,html[data-netbox-color-mode=light] .gy-xxl-0{--bs-gutter-y: 0}html .g-xxl-1,html .gx-xxl-1,html[data-netbox-color-mode=dark] .g-xxl-1,html[data-netbox-color-mode=dark] .gx-xxl-1,html[data-netbox-color-mode=light] .g-xxl-1,html[data-netbox-color-mode=light] .gx-xxl-1{--bs-gutter-x: .25rem}html .g-xxl-1,html .gy-xxl-1,html[data-netbox-color-mode=dark] .g-xxl-1,html[data-netbox-color-mode=dark] .gy-xxl-1,html[data-netbox-color-mode=light] .g-xxl-1,html[data-netbox-color-mode=light] .gy-xxl-1{--bs-gutter-y: .25rem}html .g-xxl-2,html .gx-xxl-2,html[data-netbox-color-mode=dark] .g-xxl-2,html[data-netbox-color-mode=dark] .gx-xxl-2,html[data-netbox-color-mode=light] .g-xxl-2,html[data-netbox-color-mode=light] .gx-xxl-2{--bs-gutter-x: .5rem}html .g-xxl-2,html .gy-xxl-2,html[data-netbox-color-mode=dark] .g-xxl-2,html[data-netbox-color-mode=dark] .gy-xxl-2,html[data-netbox-color-mode=light] .g-xxl-2,html[data-netbox-color-mode=light] .gy-xxl-2{--bs-gutter-y: .5rem}html .g-xxl-3,html .gx-xxl-3,html[data-netbox-color-mode=dark] .g-xxl-3,html[data-netbox-color-mode=dark] .gx-xxl-3,html[data-netbox-color-mode=light] .g-xxl-3,html[data-netbox-color-mode=light] .gx-xxl-3{--bs-gutter-x: 1rem}html .g-xxl-3,html .gy-xxl-3,html[data-netbox-color-mode=dark] .g-xxl-3,html[data-netbox-color-mode=dark] .gy-xxl-3,html[data-netbox-color-mode=light] .g-xxl-3,html[data-netbox-color-mode=light] .gy-xxl-3{--bs-gutter-y: 1rem}html .g-xxl-4,html .gx-xxl-4,html[data-netbox-color-mode=dark] .g-xxl-4,html[data-netbox-color-mode=dark] .gx-xxl-4,html[data-netbox-color-mode=light] .g-xxl-4,html[data-netbox-color-mode=light] .gx-xxl-4{--bs-gutter-x: 1.5rem}html .g-xxl-4,html .gy-xxl-4,html[data-netbox-color-mode=dark] .g-xxl-4,html[data-netbox-color-mode=dark] .gy-xxl-4,html[data-netbox-color-mode=light] .g-xxl-4,html[data-netbox-color-mode=light] .gy-xxl-4{--bs-gutter-y: 1.5rem}html .g-xxl-5,html .gx-xxl-5,html[data-netbox-color-mode=dark] .g-xxl-5,html[data-netbox-color-mode=dark] .gx-xxl-5,html[data-netbox-color-mode=light] .g-xxl-5,html[data-netbox-color-mode=light] .gx-xxl-5{--bs-gutter-x: 3rem}html .g-xxl-5,html .gy-xxl-5,html[data-netbox-color-mode=dark] .g-xxl-5,html[data-netbox-color-mode=dark] .gy-xxl-5,html[data-netbox-color-mode=light] .g-xxl-5,html[data-netbox-color-mode=light] .gy-xxl-5{--bs-gutter-y: 3rem}}@media print{html .table,html[data-netbox-color-mode=dark] .table,html[data-netbox-color-mode=light] .table{--bs-table-bg: transparent;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, .05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, .1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, .075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}html .table>:not(caption)>*>*,html[data-netbox-color-mode=dark] .table>:not(caption)>*>*,html[data-netbox-color-mode=light] .table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}html .table>tbody,html[data-netbox-color-mode=dark] .table>tbody,html[data-netbox-color-mode=light] .table>tbody{vertical-align:inherit}html .table>thead,html[data-netbox-color-mode=dark] .table>thead,html[data-netbox-color-mode=light] .table>thead{vertical-align:bottom}html .table>:not(:last-child)>:last-child>*,html[data-netbox-color-mode=dark] .table>:not(:last-child)>:last-child>*,html[data-netbox-color-mode=light] .table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}}@media print{html .caption-top,html[data-netbox-color-mode=dark] .caption-top,html[data-netbox-color-mode=light] .caption-top{caption-side:top}}@media print{html .table-sm>:not(caption)>*>*,html[data-netbox-color-mode=dark] .table-sm>:not(caption)>*>*,html[data-netbox-color-mode=light] .table-sm>:not(caption)>*>*{padding:.25rem}}@media print{html .table-bordered>:not(caption)>*,html[data-netbox-color-mode=dark] .table-bordered>:not(caption)>*,html[data-netbox-color-mode=light] .table-bordered>:not(caption)>*{border-width:1px 0}html .table-bordered>:not(caption)>*>*,html[data-netbox-color-mode=dark] .table-bordered>:not(caption)>*>*,html[data-netbox-color-mode=light] .table-bordered>:not(caption)>*>*{border-width:0 1px}}@media print{html .table-borderless>:not(caption)>*>*,html[data-netbox-color-mode=dark] .table-borderless>:not(caption)>*>*,html[data-netbox-color-mode=light] .table-borderless>:not(caption)>*>*{border-bottom-width:0}}@media print{html .table-striped>tbody>tr:nth-of-type(odd),html[data-netbox-color-mode=dark] .table-striped>tbody>tr:nth-of-type(odd),html[data-netbox-color-mode=light] .table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}}@media print{html .table-active,html[data-netbox-color-mode=dark] .table-active,html[data-netbox-color-mode=light] .table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}}@media print{html .table-hover>tbody>tr:hover,html[data-netbox-color-mode=dark] .table-hover>tbody>tr:hover,html[data-netbox-color-mode=light] .table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}}@media print{html .table-primary,html[data-netbox-color-mode=dark] .table-primary,html[data-netbox-color-mode=light] .table-primary{--bs-table-bg: #cfe2ff;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:#000;border-color:#bacbe6}}@media print{html .table-secondary,html[data-netbox-color-mode=dark] .table-secondary,html[data-netbox-color-mode=light] .table-secondary{--bs-table-bg: #e2e3e5;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:#000;border-color:#cbccce}}@media print{html .table-success,html[data-netbox-color-mode=dark] .table-success,html[data-netbox-color-mode=light] .table-success{--bs-table-bg: #d1e7dd;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:#000;border-color:#bcd0c7}}@media print{html .table-info,html[data-netbox-color-mode=dark] .table-info,html[data-netbox-color-mode=light] .table-info{--bs-table-bg: #cff4fc;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:#000;border-color:#badce3}}@media print{html .table-warning,html[data-netbox-color-mode=dark] .table-warning,html[data-netbox-color-mode=light] .table-warning{--bs-table-bg: #fff3cd;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:#000;border-color:#e6dbb9}}@media print{html .table-danger,html[data-netbox-color-mode=dark] .table-danger,html[data-netbox-color-mode=light] .table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}}@media print{html .table-light,html[data-netbox-color-mode=dark] .table-light,html[data-netbox-color-mode=light] .table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}}@media print{html .table-dark,html[data-netbox-color-mode=dark] .table-dark,html[data-netbox-color-mode=light] .table-dark{--bs-table-bg: #212529;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:#fff;border-color:#373b3e}}@media print{html .table-responsive,html[data-netbox-color-mode=dark] .table-responsive,html[data-netbox-color-mode=light] .table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 575.98px){html .table-responsive-sm,html[data-netbox-color-mode=dark] .table-responsive-sm,html[data-netbox-color-mode=light] .table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 767.98px){html .table-responsive-md,html[data-netbox-color-mode=dark] .table-responsive-md,html[data-netbox-color-mode=light] .table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 991.98px){html .table-responsive-lg,html[data-netbox-color-mode=dark] .table-responsive-lg,html[data-netbox-color-mode=light] .table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 1199.98px){html .table-responsive-xl,html[data-netbox-color-mode=dark] .table-responsive-xl,html[data-netbox-color-mode=light] .table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print and (max-width: 1399.98px){html .table-responsive-xxl,html[data-netbox-color-mode=dark] .table-responsive-xxl,html[data-netbox-color-mode=light] .table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media print{html .form-label,html[data-netbox-color-mode=dark] .form-label,html[data-netbox-color-mode=light] .form-label{margin-bottom:.5rem}}@media print{html .col-form-label,html[data-netbox-color-mode=dark] .col-form-label,html[data-netbox-color-mode=light] .col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}}@media print{html .col-form-label-lg,html[data-netbox-color-mode=dark] .col-form-label-lg,html[data-netbox-color-mode=light] .col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}}@media print{html .col-form-label-sm,html[data-netbox-color-mode=dark] .col-form-label-sm,html[data-netbox-color-mode=light] .col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}}@media print{html .form-text,html[data-netbox-color-mode=dark] .form-text,html[data-netbox-color-mode=light] .form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}}@media print{html .form-control,html[data-netbox-color-mode=dark] .form-control,html[data-netbox-color-mode=light] .form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #e9ecef;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .form-control,html[data-netbox-color-mode=dark] .form-control,html[data-netbox-color-mode=light] .form-control{transition:none}}@media print{html .form-control[type=file],html[data-netbox-color-mode=dark] .form-control[type=file],html[data-netbox-color-mode=light] .form-control[type=file]{overflow:hidden}html .form-control[type=file]:not(:disabled):not([readonly]),html[data-netbox-color-mode=dark] .form-control[type=file]:not(:disabled):not([readonly]),html[data-netbox-color-mode=light] .form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}}@media print{html .form-control:focus,html[data-netbox-color-mode=dark] .form-control:focus,html[data-netbox-color-mode=light] .form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .form-control::-webkit-date-and-time-value,html[data-netbox-color-mode=dark] .form-control::-webkit-date-and-time-value,html[data-netbox-color-mode=light] .form-control::-webkit-date-and-time-value{height:1.5em}}@media print{html .form-control::placeholder,html[data-netbox-color-mode=dark] .form-control::placeholder,html[data-netbox-color-mode=light] .form-control::placeholder{color:#adb5bd;opacity:1}}@media print{html .form-control:disabled,html .form-control[readonly],html[data-netbox-color-mode=dark] .form-control:disabled,html[data-netbox-color-mode=dark] .form-control[readonly],html[data-netbox-color-mode=light] .form-control:disabled,html[data-netbox-color-mode=light] .form-control[readonly]{background-color:#e9ecef;opacity:1}}@media print{html .form-control::file-selector-button,html[data-netbox-color-mode=dark] .form-control::file-selector-button,html[data-netbox-color-mode=light] .form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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 print and (prefers-reduced-motion: reduce){html .form-control::file-selector-button,html[data-netbox-color-mode=dark] .form-control::file-selector-button,html[data-netbox-color-mode=light] .form-control::file-selector-button{transition:none}}@media print{html .form-control:hover:not(:disabled):not([readonly])::file-selector-button,html[data-netbox-color-mode=dark] .form-control:hover:not(:disabled):not([readonly])::file-selector-button,html[data-netbox-color-mode=light] .form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}}@media print{html .form-control::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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 print and (prefers-reduced-motion: reduce){html .form-control::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control::-webkit-file-upload-button{transition:none}}@media print{html .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}}@media print{html .form-control-plaintext,html[data-netbox-color-mode=dark] .form-control-plaintext,html[data-netbox-color-mode=light] .form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}html .form-control-plaintext.form-control-sm,html .form-control-plaintext.form-control-lg,html[data-netbox-color-mode=dark] .form-control-plaintext.form-control-sm,html[data-netbox-color-mode=dark] .form-control-plaintext.form-control-lg,html[data-netbox-color-mode=light] .form-control-plaintext.form-control-sm,html[data-netbox-color-mode=light] .form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}}@media print{html .form-control-sm,html[data-netbox-color-mode=dark] .form-control-sm,html[data-netbox-color-mode=light] .form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}html .form-control-sm::file-selector-button,html[data-netbox-color-mode=dark] .form-control-sm::file-selector-button,html[data-netbox-color-mode=light] .form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}html .form-control-sm::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control-sm::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}}@media print{html .form-control-lg,html[data-netbox-color-mode=dark] .form-control-lg,html[data-netbox-color-mode=light] .form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}html .form-control-lg::file-selector-button,html[data-netbox-color-mode=dark] .form-control-lg::file-selector-button,html[data-netbox-color-mode=light] .form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}html .form-control-lg::-webkit-file-upload-button,html[data-netbox-color-mode=dark] .form-control-lg::-webkit-file-upload-button,html[data-netbox-color-mode=light] .form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}}@media print{html textarea.form-control,html[data-netbox-color-mode=dark] textarea.form-control,html[data-netbox-color-mode=light] textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}html textarea.form-control-sm,html[data-netbox-color-mode=dark] textarea.form-control-sm,html[data-netbox-color-mode=light] textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}html textarea.form-control-lg,html[data-netbox-color-mode=dark] textarea.form-control-lg,html[data-netbox-color-mode=light] textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}}@media print{html .form-control-color,html[data-netbox-color-mode=dark] .form-control-color,html[data-netbox-color-mode=light] .form-control-color{max-width:3rem;height:auto;padding:.375rem}html .form-control-color:not(:disabled):not([readonly]),html[data-netbox-color-mode=dark] .form-control-color:not(:disabled):not([readonly]),html[data-netbox-color-mode=light] .form-control-color:not(:disabled):not([readonly]){cursor:pointer}html .form-control-color::-moz-color-swatch,html[data-netbox-color-mode=dark] .form-control-color::-moz-color-swatch,html[data-netbox-color-mode=light] .form-control-color::-moz-color-swatch{height:1.5em;border-radius:.375rem}html .form-control-color::-webkit-color-swatch,html[data-netbox-color-mode=dark] .form-control-color::-webkit-color-swatch,html[data-netbox-color-mode=light] .form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.375rem}}@media print{html .form-select,html[data-netbox-color-mode=dark] .form-select,html[data-netbox-color-mode=light] .form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}}@media print and (prefers-reduced-motion: reduce){html .form-select,html[data-netbox-color-mode=dark] .form-select,html[data-netbox-color-mode=light] .form-select{transition:none}}@media print{html .form-select:focus,html[data-netbox-color-mode=dark] .form-select:focus,html[data-netbox-color-mode=light] .form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .form-select[multiple],html .form-select[size]:not([size="1"]),html[data-netbox-color-mode=dark] .form-select[multiple],html[data-netbox-color-mode=dark] .form-select[size]:not([size="1"]),html[data-netbox-color-mode=light] .form-select[multiple],html[data-netbox-color-mode=light] .form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}}@media print{html .form-select:disabled,html[data-netbox-color-mode=dark] .form-select:disabled,html[data-netbox-color-mode=light] .form-select:disabled{color:#6c757d;background-color:#e9ecef}}@media print{html .form-select:-moz-focusring,html[data-netbox-color-mode=dark] .form-select:-moz-focusring,html[data-netbox-color-mode=light] .form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}}@media print{html .form-select-sm,html[data-netbox-color-mode=dark] .form-select-sm,html[data-netbox-color-mode=light] .form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}}@media print{html .form-select-lg,html[data-netbox-color-mode=dark] .form-select-lg,html[data-netbox-color-mode=light] .form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}}@media print{html .form-check,html[data-netbox-color-mode=dark] .form-check,html[data-netbox-color-mode=light] .form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}html .form-check .form-check-input,html[data-netbox-color-mode=dark] .form-check .form-check-input,html[data-netbox-color-mode=light] .form-check .form-check-input{float:left;margin-left:-1.5em}}@media print{html .form-check-input,html[data-netbox-color-mode=dark] .form-check-input,html[data-netbox-color-mode=light] .form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;color-adjust:exact}html .form-check-input[type=checkbox],html[data-netbox-color-mode=dark] .form-check-input[type=checkbox],html[data-netbox-color-mode=light] .form-check-input[type=checkbox]{border-radius:.25em}html .form-check-input[type=radio],html[data-netbox-color-mode=dark] .form-check-input[type=radio],html[data-netbox-color-mode=light] .form-check-input[type=radio]{border-radius:50%}html .form-check-input:active,html[data-netbox-color-mode=dark] .form-check-input:active,html[data-netbox-color-mode=light] .form-check-input:active{filter:brightness(90%)}html .form-check-input:focus,html[data-netbox-color-mode=dark] .form-check-input:focus,html[data-netbox-color-mode=light] .form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}html .form-check-input:checked,html[data-netbox-color-mode=dark] .form-check-input:checked,html[data-netbox-color-mode=light] .form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}html .form-check-input:checked[type=checkbox],html[data-netbox-color-mode=dark] .form-check-input:checked[type=checkbox],html[data-netbox-color-mode=light] .form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}html .form-check-input:checked[type=radio],html[data-netbox-color-mode=dark] .form-check-input:checked[type=radio],html[data-netbox-color-mode=light] .form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}html .form-check-input[type=checkbox]:indeterminate,html[data-netbox-color-mode=dark] .form-check-input[type=checkbox]:indeterminate,html[data-netbox-color-mode=light] .form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}html .form-check-input:disabled,html[data-netbox-color-mode=dark] .form-check-input:disabled,html[data-netbox-color-mode=light] .form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}html .form-check-input[disabled]~.form-check-label,html .form-check-input:disabled~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input[disabled]~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input:disabled~.form-check-label,html[data-netbox-color-mode=light] .form-check-input[disabled]~.form-check-label,html[data-netbox-color-mode=light] .form-check-input:disabled~.form-check-label{opacity:.5}}@media print{html .form-switch,html[data-netbox-color-mode=dark] .form-switch,html[data-netbox-color-mode=light] .form-switch{padding-left:2.5em}html .form-switch .form-check-input,html[data-netbox-color-mode=dark] .form-switch .form-check-input,html[data-netbox-color-mode=light] .form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .form-switch .form-check-input,html[data-netbox-color-mode=dark] .form-switch .form-check-input,html[data-netbox-color-mode=light] .form-switch .form-check-input{transition:none}}@media print{html .form-switch .form-check-input:focus,html[data-netbox-color-mode=dark] .form-switch .form-check-input:focus,html[data-netbox-color-mode=light] .form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}}@media print{html .form-switch .form-check-input:checked,html[data-netbox-color-mode=dark] .form-switch .form-check-input:checked,html[data-netbox-color-mode=light] .form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}}@media print{html .form-check-inline,html[data-netbox-color-mode=dark] .form-check-inline,html[data-netbox-color-mode=light] .form-check-inline{display:inline-block;margin-right:1rem}}@media print{html .btn-check,html[data-netbox-color-mode=dark] .btn-check,html[data-netbox-color-mode=light] .btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}html .btn-check[disabled]+.btn,html .btn-check:disabled+.btn,html[data-netbox-color-mode=dark] .btn-check[disabled]+.btn,html[data-netbox-color-mode=dark] .btn-check:disabled+.btn,html[data-netbox-color-mode=light] .btn-check[disabled]+.btn,html[data-netbox-color-mode=light] .btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}}@media print{html .form-range,html[data-netbox-color-mode=dark] .form-range,html[data-netbox-color-mode=light] .form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}html .form-range:focus,html[data-netbox-color-mode=dark] .form-range:focus,html[data-netbox-color-mode=light] .form-range:focus{outline:0}html .form-range:focus::-webkit-slider-thumb,html[data-netbox-color-mode=dark] .form-range:focus::-webkit-slider-thumb,html[data-netbox-color-mode=light] .form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}html .form-range:focus::-moz-range-thumb,html[data-netbox-color-mode=dark] .form-range:focus::-moz-range-thumb,html[data-netbox-color-mode=light] .form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}html .form-range::-moz-focus-outer,html[data-netbox-color-mode=dark] .form-range::-moz-focus-outer,html[data-netbox-color-mode=light] .form-range::-moz-focus-outer{border:0}html .form-range::-webkit-slider-thumb,html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb,html[data-netbox-color-mode=light] .form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}}@media print and (prefers-reduced-motion: reduce){html .form-range::-webkit-slider-thumb,html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb,html[data-netbox-color-mode=light] .form-range::-webkit-slider-thumb{transition:none}}@media print{html .form-range::-webkit-slider-thumb:active,html[data-netbox-color-mode=dark] .form-range::-webkit-slider-thumb:active,html[data-netbox-color-mode=light] .form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}}@media print{html .form-range::-webkit-slider-runnable-track,html[data-netbox-color-mode=dark] .form-range::-webkit-slider-runnable-track,html[data-netbox-color-mode=light] .form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}}@media print{html .form-range::-moz-range-thumb,html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb,html[data-netbox-color-mode=light] .form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}}@media print and (prefers-reduced-motion: reduce){html .form-range::-moz-range-thumb,html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb,html[data-netbox-color-mode=light] .form-range::-moz-range-thumb{transition:none}}@media print{html .form-range::-moz-range-thumb:active,html[data-netbox-color-mode=dark] .form-range::-moz-range-thumb:active,html[data-netbox-color-mode=light] .form-range::-moz-range-thumb:active{background-color:#b6d4fe}}@media print{html .form-range::-moz-range-track,html[data-netbox-color-mode=dark] .form-range::-moz-range-track,html[data-netbox-color-mode=light] .form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}}@media print{html .form-range:disabled,html[data-netbox-color-mode=dark] .form-range:disabled,html[data-netbox-color-mode=light] .form-range:disabled{pointer-events:none}html .form-range:disabled::-webkit-slider-thumb,html[data-netbox-color-mode=dark] .form-range:disabled::-webkit-slider-thumb,html[data-netbox-color-mode=light] .form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}html .form-range:disabled::-moz-range-thumb,html[data-netbox-color-mode=dark] .form-range:disabled::-moz-range-thumb,html[data-netbox-color-mode=light] .form-range:disabled::-moz-range-thumb{background-color:#adb5bd}}@media print{html .form-floating,html[data-netbox-color-mode=dark] .form-floating,html[data-netbox-color-mode=light] .form-floating{position:relative}html .form-floating>.form-control,html .form-floating>.form-select,html[data-netbox-color-mode=dark] .form-floating>.form-control,html[data-netbox-color-mode=dark] .form-floating>.form-select,html[data-netbox-color-mode=light] .form-floating>.form-control,html[data-netbox-color-mode=light] .form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}html .form-floating>label,html[data-netbox-color-mode=dark] .form-floating>label,html[data-netbox-color-mode=light] .form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .form-floating>label,html[data-netbox-color-mode=dark] .form-floating>label,html[data-netbox-color-mode=light] .form-floating>label{transition:none}}@media print{html .form-floating>.form-control,html[data-netbox-color-mode=dark] .form-floating>.form-control,html[data-netbox-color-mode=light] .form-floating>.form-control{padding:1rem .75rem}html .form-floating>.form-control::placeholder,html[data-netbox-color-mode=dark] .form-floating>.form-control::placeholder,html[data-netbox-color-mode=light] .form-floating>.form-control::placeholder{color:transparent}html .form-floating>.form-control:focus,html .form-floating>.form-control:not(:placeholder-shown),html[data-netbox-color-mode=dark] .form-floating>.form-control:focus,html[data-netbox-color-mode=dark] .form-floating>.form-control:not(:placeholder-shown),html[data-netbox-color-mode=light] .form-floating>.form-control:focus,html[data-netbox-color-mode=light] .form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}html .form-floating>.form-control:-webkit-autofill,html[data-netbox-color-mode=dark] .form-floating>.form-control:-webkit-autofill,html[data-netbox-color-mode=light] .form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.form-select,html[data-netbox-color-mode=dark] .form-floating>.form-select,html[data-netbox-color-mode=light] .form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.form-control:focus~label,html .form-floating>.form-control:not(:placeholder-shown)~label,html .form-floating>.form-select~label,html[data-netbox-color-mode=dark] .form-floating>.form-control:focus~label,html[data-netbox-color-mode=dark] .form-floating>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=dark] .form-floating>.form-select~label,html[data-netbox-color-mode=light] .form-floating>.form-control:focus~label,html[data-netbox-color-mode=light] .form-floating>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=light] .form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}}@media print{html .form-floating>.form-control:-webkit-autofill~label,html[data-netbox-color-mode=dark] .form-floating>.form-control:-webkit-autofill~label,html[data-netbox-color-mode=light] .form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}}@media print{html .input-group,html[data-netbox-color-mode=dark] .input-group,html[data-netbox-color-mode=light] .input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}html .input-group>.form-control,html .input-group>.form-select,html[data-netbox-color-mode=dark] .input-group>.form-control,html[data-netbox-color-mode=dark] .input-group>.form-select,html[data-netbox-color-mode=light] .input-group>.form-control,html[data-netbox-color-mode=light] .input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}html .input-group>.form-control:focus,html .input-group>.form-select:focus,html[data-netbox-color-mode=dark] .input-group>.form-control:focus,html[data-netbox-color-mode=dark] .input-group>.form-select:focus,html[data-netbox-color-mode=light] .input-group>.form-control:focus,html[data-netbox-color-mode=light] .input-group>.form-select:focus{z-index:3}html .input-group .btn,html[data-netbox-color-mode=dark] .input-group .btn,html[data-netbox-color-mode=light] .input-group .btn{position:relative;z-index:2}html .input-group .btn:focus,html[data-netbox-color-mode=dark] .input-group .btn:focus,html[data-netbox-color-mode=light] .input-group .btn:focus{z-index:3}}@media print{html .input-group-text,html[data-netbox-color-mode=dark] .input-group-text,html[data-netbox-color-mode=light] .input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}}@media print{html .input-group-lg>.form-control,html .input-group-lg>.form-select,html .input-group-lg>.input-group-text,html .input-group-lg>.btn,html[data-netbox-color-mode=dark] .input-group-lg>.form-control,html[data-netbox-color-mode=dark] .input-group-lg>.form-select,html[data-netbox-color-mode=dark] .input-group-lg>.input-group-text,html[data-netbox-color-mode=dark] .input-group-lg>.btn,html[data-netbox-color-mode=light] .input-group-lg>.form-control,html[data-netbox-color-mode=light] .input-group-lg>.form-select,html[data-netbox-color-mode=light] .input-group-lg>.input-group-text,html[data-netbox-color-mode=light] .input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}}@media print{html .input-group-sm>.form-control,html .input-group-sm>.form-select,html .input-group-sm>.input-group-text,html .input-group-sm>.btn,html[data-netbox-color-mode=dark] .input-group-sm>.form-control,html[data-netbox-color-mode=dark] .input-group-sm>.form-select,html[data-netbox-color-mode=dark] .input-group-sm>.input-group-text,html[data-netbox-color-mode=dark] .input-group-sm>.btn,html[data-netbox-color-mode=light] .input-group-sm>.form-control,html[data-netbox-color-mode=light] .input-group-sm>.form-select,html[data-netbox-color-mode=light] .input-group-sm>.input-group-text,html[data-netbox-color-mode=light] .input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}}@media print{html .input-group-lg>.form-select,html .input-group-sm>.form-select,html[data-netbox-color-mode=dark] .input-group-lg>.form-select,html[data-netbox-color-mode=dark] .input-group-sm>.form-select,html[data-netbox-color-mode=light] .input-group-lg>.form-select,html[data-netbox-color-mode=light] .input-group-sm>.form-select{padding-right:3rem}}@media print{html .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),html .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),html[data-netbox-color-mode=dark] .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=dark] .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),html[data-netbox-color-mode=light] .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=light] .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}html .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),html .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),html[data-netbox-color-mode=dark] .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=dark] .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),html[data-netbox-color-mode=light] .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),html[data-netbox-color-mode=light] .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}html .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback),html[data-netbox-color-mode=dark] .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback),html[data-netbox-color-mode=light] .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}}@media print{html .valid-feedback,html[data-netbox-color-mode=dark] .valid-feedback,html[data-netbox-color-mode=light] .valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}}@media print{html .valid-tooltip,html[data-netbox-color-mode=dark] .valid-tooltip,html[data-netbox-color-mode=light] .valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#198754e6;border-radius:.375rem}}@media print{.was-validated html:valid~.valid-feedback,.was-validated html:valid~.valid-tooltip,html.is-valid~.valid-feedback,html.is-valid~.valid-tooltip,.was-validated html[data-netbox-color-mode=dark]:valid~.valid-feedback,.was-validated html[data-netbox-color-mode=dark]:valid~.valid-tooltip,html[data-netbox-color-mode=dark].is-valid~.valid-feedback,html[data-netbox-color-mode=dark].is-valid~.valid-tooltip,.was-validated html[data-netbox-color-mode=light]:valid~.valid-feedback,.was-validated html[data-netbox-color-mode=light]:valid~.valid-tooltip,html[data-netbox-color-mode=light].is-valid~.valid-feedback,html[data-netbox-color-mode=light].is-valid~.valid-tooltip{display:block}}@media print{.was-validated html .form-control:valid,html .form-control.is-valid,.was-validated html[data-netbox-color-mode=dark] .form-control:valid,html[data-netbox-color-mode=dark] .form-control.is-valid,.was-validated html[data-netbox-color-mode=light] .form-control:valid,html[data-netbox-color-mode=light] .form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html .form-control:valid:focus,html .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .form-control:valid:focus,html[data-netbox-color-mode=dark] .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .form-control:valid:focus,html[data-netbox-color-mode=light] .form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}}@media print{.was-validated html textarea.form-control:valid,html textarea.form-control.is-valid,.was-validated html[data-netbox-color-mode=dark] textarea.form-control:valid,html[data-netbox-color-mode=dark] textarea.form-control.is-valid,.was-validated html[data-netbox-color-mode=light] textarea.form-control:valid,html[data-netbox-color-mode=light] textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}}@media print{.was-validated html .form-select:valid,html .form-select.is-valid,.was-validated html[data-netbox-color-mode=dark] .form-select:valid,html[data-netbox-color-mode=dark] .form-select.is-valid,.was-validated html[data-netbox-color-mode=light] .form-select:valid,html[data-netbox-color-mode=light] .form-select.is-valid{border-color:#198754}.was-validated html .form-select:valid:not([multiple]):not([size]),.was-validated html .form-select:valid:not([multiple])[size="1"],html .form-select.is-valid:not([multiple]):not([size]),html .form-select.is-valid:not([multiple])[size="1"],.was-validated html[data-netbox-color-mode=dark] .form-select:valid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=dark] .form-select:valid:not([multiple])[size="1"],html[data-netbox-color-mode=dark] .form-select.is-valid:not([multiple]):not([size]),html[data-netbox-color-mode=dark] .form-select.is-valid:not([multiple])[size="1"],.was-validated html[data-netbox-color-mode=light] .form-select:valid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=light] .form-select:valid:not([multiple])[size="1"],html[data-netbox-color-mode=light] .form-select.is-valid:not([multiple]):not([size]),html[data-netbox-color-mode=light] .form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html .form-select:valid:focus,html .form-select.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .form-select:valid:focus,html[data-netbox-color-mode=dark] .form-select.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .form-select:valid:focus,html[data-netbox-color-mode=light] .form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem #19875440}}@media print{.was-validated html .form-check-input:valid,html .form-check-input.is-valid,.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid,html[data-netbox-color-mode=dark] .form-check-input.is-valid,.was-validated html[data-netbox-color-mode=light] .form-check-input:valid,html[data-netbox-color-mode=light] .form-check-input.is-valid{border-color:#198754}.was-validated html .form-check-input:valid:checked,html .form-check-input.is-valid:checked,.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid:checked,html[data-netbox-color-mode=dark] .form-check-input.is-valid:checked,.was-validated html[data-netbox-color-mode=light] .form-check-input:valid:checked,html[data-netbox-color-mode=light] .form-check-input.is-valid:checked{background-color:#198754}.was-validated html .form-check-input:valid:focus,html .form-check-input.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid:focus,html[data-netbox-color-mode=dark] .form-check-input.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .form-check-input:valid:focus,html[data-netbox-color-mode=light] .form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem #19875440}.was-validated html .form-check-input:valid~.form-check-label,html .form-check-input.is-valid~.form-check-label,.was-validated html[data-netbox-color-mode=dark] .form-check-input:valid~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input.is-valid~.form-check-label,.was-validated html[data-netbox-color-mode=light] .form-check-input:valid~.form-check-label,html[data-netbox-color-mode=light] .form-check-input.is-valid~.form-check-label{color:#198754}}@media print{html .form-check-inline .form-check-input~.valid-feedback,html[data-netbox-color-mode=dark] .form-check-inline .form-check-input~.valid-feedback,html[data-netbox-color-mode=light] .form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}}@media print{.was-validated html .input-group .form-control:valid,html .input-group .form-control.is-valid,.was-validated html .input-group .form-select:valid,html .input-group .form-select.is-valid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:valid,html[data-netbox-color-mode=dark] .input-group .form-control.is-valid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:valid,html[data-netbox-color-mode=dark] .input-group .form-select.is-valid,.was-validated html[data-netbox-color-mode=light] .input-group .form-control:valid,html[data-netbox-color-mode=light] .input-group .form-control.is-valid,.was-validated html[data-netbox-color-mode=light] .input-group .form-select:valid,html[data-netbox-color-mode=light] .input-group .form-select.is-valid{z-index:1}.was-validated html .input-group .form-control:valid:focus,html .input-group .form-control.is-valid:focus,.was-validated html .input-group .form-select:valid:focus,html .input-group .form-select.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:valid:focus,html[data-netbox-color-mode=dark] .input-group .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:valid:focus,html[data-netbox-color-mode=dark] .input-group .form-select.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .input-group .form-control:valid:focus,html[data-netbox-color-mode=light] .input-group .form-control.is-valid:focus,.was-validated html[data-netbox-color-mode=light] .input-group .form-select:valid:focus,html[data-netbox-color-mode=light] .input-group .form-select.is-valid:focus{z-index:3}}@media print{html .invalid-feedback,html[data-netbox-color-mode=dark] .invalid-feedback,html[data-netbox-color-mode=light] .invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}}@media print{html .invalid-tooltip,html[data-netbox-color-mode=dark] .invalid-tooltip,html[data-netbox-color-mode=light] .invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#dc3545e6;border-radius:.375rem}}@media print{.was-validated html:invalid~.invalid-feedback,.was-validated html:invalid~.invalid-tooltip,html.is-invalid~.invalid-feedback,html.is-invalid~.invalid-tooltip,.was-validated html[data-netbox-color-mode=dark]:invalid~.invalid-feedback,.was-validated html[data-netbox-color-mode=dark]:invalid~.invalid-tooltip,html[data-netbox-color-mode=dark].is-invalid~.invalid-feedback,html[data-netbox-color-mode=dark].is-invalid~.invalid-tooltip,.was-validated html[data-netbox-color-mode=light]:invalid~.invalid-feedback,.was-validated html[data-netbox-color-mode=light]:invalid~.invalid-tooltip,html[data-netbox-color-mode=light].is-invalid~.invalid-feedback,html[data-netbox-color-mode=light].is-invalid~.invalid-tooltip{display:block}}@media print{.was-validated html .form-control:invalid,html .form-control.is-invalid,.was-validated html[data-netbox-color-mode=dark] .form-control:invalid,html[data-netbox-color-mode=dark] .form-control.is-invalid,.was-validated html[data-netbox-color-mode=light] .form-control:invalid,html[data-netbox-color-mode=light] .form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html .form-control:invalid:focus,html .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .form-control:invalid:focus,html[data-netbox-color-mode=dark] .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .form-control:invalid:focus,html[data-netbox-color-mode=light] .form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}}@media print{.was-validated html textarea.form-control:invalid,html textarea.form-control.is-invalid,.was-validated html[data-netbox-color-mode=dark] textarea.form-control:invalid,html[data-netbox-color-mode=dark] textarea.form-control.is-invalid,.was-validated html[data-netbox-color-mode=light] textarea.form-control:invalid,html[data-netbox-color-mode=light] textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}}@media print{.was-validated html .form-select:invalid,html .form-select.is-invalid,.was-validated html[data-netbox-color-mode=dark] .form-select:invalid,html[data-netbox-color-mode=dark] .form-select.is-invalid,.was-validated html[data-netbox-color-mode=light] .form-select:invalid,html[data-netbox-color-mode=light] .form-select.is-invalid{border-color:#dc3545}.was-validated html .form-select:invalid:not([multiple]):not([size]),.was-validated html .form-select:invalid:not([multiple])[size="1"],html .form-select.is-invalid:not([multiple]):not([size]),html .form-select.is-invalid:not([multiple])[size="1"],.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:not([multiple])[size="1"],html[data-netbox-color-mode=dark] .form-select.is-invalid:not([multiple]):not([size]),html[data-netbox-color-mode=dark] .form-select.is-invalid:not([multiple])[size="1"],.was-validated html[data-netbox-color-mode=light] .form-select:invalid:not([multiple]):not([size]),.was-validated html[data-netbox-color-mode=light] .form-select:invalid:not([multiple])[size="1"],html[data-netbox-color-mode=light] .form-select.is-invalid:not([multiple]):not([size]),html[data-netbox-color-mode=light] .form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated html .form-select:invalid:focus,html .form-select.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .form-select:invalid:focus,html[data-netbox-color-mode=dark] .form-select.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .form-select:invalid:focus,html[data-netbox-color-mode=light] .form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}}@media print{.was-validated html .form-check-input:invalid,html .form-check-input.is-invalid,.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid,html[data-netbox-color-mode=dark] .form-check-input.is-invalid,.was-validated html[data-netbox-color-mode=light] .form-check-input:invalid,html[data-netbox-color-mode=light] .form-check-input.is-invalid{border-color:#dc3545}.was-validated html .form-check-input:invalid:checked,html .form-check-input.is-invalid:checked,.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid:checked,html[data-netbox-color-mode=dark] .form-check-input.is-invalid:checked,.was-validated html[data-netbox-color-mode=light] .form-check-input:invalid:checked,html[data-netbox-color-mode=light] .form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated html .form-check-input:invalid:focus,html .form-check-input.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid:focus,html[data-netbox-color-mode=dark] .form-check-input.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .form-check-input:invalid:focus,html[data-netbox-color-mode=light] .form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem #dc354540}.was-validated html .form-check-input:invalid~.form-check-label,html .form-check-input.is-invalid~.form-check-label,.was-validated html[data-netbox-color-mode=dark] .form-check-input:invalid~.form-check-label,html[data-netbox-color-mode=dark] .form-check-input.is-invalid~.form-check-label,.was-validated html[data-netbox-color-mode=light] .form-check-input:invalid~.form-check-label,html[data-netbox-color-mode=light] .form-check-input.is-invalid~.form-check-label{color:#dc3545}}@media print{html .form-check-inline .form-check-input~.invalid-feedback,html[data-netbox-color-mode=dark] .form-check-inline .form-check-input~.invalid-feedback,html[data-netbox-color-mode=light] .form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}}@media print{.was-validated html .input-group .form-control:invalid,html .input-group .form-control.is-invalid,.was-validated html .input-group .form-select:invalid,html .input-group .form-select.is-invalid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:invalid,html[data-netbox-color-mode=dark] .input-group .form-control.is-invalid,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:invalid,html[data-netbox-color-mode=dark] .input-group .form-select.is-invalid,.was-validated html[data-netbox-color-mode=light] .input-group .form-control:invalid,html[data-netbox-color-mode=light] .input-group .form-control.is-invalid,.was-validated html[data-netbox-color-mode=light] .input-group .form-select:invalid,html[data-netbox-color-mode=light] .input-group .form-select.is-invalid{z-index:2}.was-validated html .input-group .form-control:invalid:focus,html .input-group .form-control.is-invalid:focus,.was-validated html .input-group .form-select:invalid:focus,html .input-group .form-select.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-control:invalid:focus,html[data-netbox-color-mode=dark] .input-group .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=dark] .input-group .form-select:invalid:focus,html[data-netbox-color-mode=dark] .input-group .form-select.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .input-group .form-control:invalid:focus,html[data-netbox-color-mode=light] .input-group .form-control.is-invalid:focus,.was-validated html[data-netbox-color-mode=light] .input-group .form-select:invalid:focus,html[data-netbox-color-mode=light] .input-group .form-select.is-invalid:focus{z-index:3}}@media print{html .btn,html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=light] .btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.375rem;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 print and (prefers-reduced-motion: reduce){html .btn,html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=light] .btn{transition:none}}@media print{html .btn:hover,html[data-netbox-color-mode=dark] .btn:hover,html[data-netbox-color-mode=light] .btn:hover{color:#212529}}@media print{.btn-check:focus+html .btn,html .btn:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=dark] .btn:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn,html[data-netbox-color-mode=light] .btn:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .btn:disabled,html .btn.disabled,fieldset:disabled html .btn,html[data-netbox-color-mode=dark] .btn:disabled,html[data-netbox-color-mode=dark] .btn.disabled,fieldset:disabled html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=light] .btn:disabled,html[data-netbox-color-mode=light] .btn.disabled,fieldset:disabled html[data-netbox-color-mode=light] .btn{pointer-events:none;opacity:.65}}@media print{html .btn-primary,html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=light] .btn-primary{color:#fff;background-color:#337ab7;border-color:#337ab7}html .btn-primary:hover,html[data-netbox-color-mode=dark] .btn-primary:hover,html[data-netbox-color-mode=light] .btn-primary:hover{color:#fff;background-color:#2b689c;border-color:#296292}.btn-check:focus+html .btn-primary,html .btn-primary:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=dark] .btn-primary:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-primary,html[data-netbox-color-mode=light] .btn-primary:focus{color:#fff;background-color:#2b689c;border-color:#296292;box-shadow:0 0 0 .25rem #528ec280}.btn-check:checked+html .btn-primary,.btn-check:active+html .btn-primary,html .btn-primary:active,html .btn-primary.active,.show>html .btn-primary.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-primary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-primary,html[data-netbox-color-mode=dark] .btn-primary:active,html[data-netbox-color-mode=dark] .btn-primary.active,.show>html[data-netbox-color-mode=dark] .btn-primary.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-primary,.btn-check:active+html[data-netbox-color-mode=light] .btn-primary,html[data-netbox-color-mode=light] .btn-primary:active,html[data-netbox-color-mode=light] .btn-primary.active,.show>html[data-netbox-color-mode=light] .btn-primary.dropdown-toggle{color:#fff;background-color:#296292;border-color:#265c89}.btn-check:checked+html .btn-primary:focus,.btn-check:active+html .btn-primary:focus,html .btn-primary:active:focus,html .btn-primary.active:focus,.show>html .btn-primary.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-primary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-primary:focus,html[data-netbox-color-mode=dark] .btn-primary:active:focus,html[data-netbox-color-mode=dark] .btn-primary.active:focus,.show>html[data-netbox-color-mode=dark] .btn-primary.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-primary:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-primary:focus,html[data-netbox-color-mode=light] .btn-primary:active:focus,html[data-netbox-color-mode=light] .btn-primary.active:focus,.show>html[data-netbox-color-mode=light] .btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #528ec280}html .btn-primary:disabled,html .btn-primary.disabled,html[data-netbox-color-mode=dark] .btn-primary:disabled,html[data-netbox-color-mode=dark] .btn-primary.disabled,html[data-netbox-color-mode=light] .btn-primary:disabled,html[data-netbox-color-mode=light] .btn-primary.disabled{color:#fff;background-color:#337ab7;border-color:#337ab7}}@media print{html .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=light] .btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}html .btn-secondary:hover,html[data-netbox-color-mode=dark] .btn-secondary:hover,html[data-netbox-color-mode=light] .btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+html .btn-secondary,html .btn-secondary:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-secondary,html[data-netbox-color-mode=light] .btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem #828a9180}.btn-check:checked+html .btn-secondary,.btn-check:active+html .btn-secondary,html .btn-secondary:active,html .btn-secondary.active,.show>html .btn-secondary.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-secondary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-secondary,html[data-netbox-color-mode=dark] .btn-secondary:active,html[data-netbox-color-mode=dark] .btn-secondary.active,.show>html[data-netbox-color-mode=dark] .btn-secondary.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-secondary,.btn-check:active+html[data-netbox-color-mode=light] .btn-secondary,html[data-netbox-color-mode=light] .btn-secondary:active,html[data-netbox-color-mode=light] .btn-secondary.active,.show>html[data-netbox-color-mode=light] .btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:checked+html .btn-secondary:focus,.btn-check:active+html .btn-secondary:focus,html .btn-secondary:active:focus,html .btn-secondary.active:focus,.show>html .btn-secondary.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-secondary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-secondary:focus,html[data-netbox-color-mode=dark] .btn-secondary:active:focus,html[data-netbox-color-mode=dark] .btn-secondary.active:focus,.show>html[data-netbox-color-mode=dark] .btn-secondary.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-secondary:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-secondary:focus,html[data-netbox-color-mode=light] .btn-secondary:active:focus,html[data-netbox-color-mode=light] .btn-secondary.active:focus,.show>html[data-netbox-color-mode=light] .btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #828a9180}html .btn-secondary:disabled,html .btn-secondary.disabled,html[data-netbox-color-mode=dark] .btn-secondary:disabled,html[data-netbox-color-mode=dark] .btn-secondary.disabled,html[data-netbox-color-mode=light] .btn-secondary:disabled,html[data-netbox-color-mode=light] .btn-secondary.disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}}@media print{html .btn-success,html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=light] .btn-success{color:#fff;background-color:#198754;border-color:#198754}html .btn-success:hover,html[data-netbox-color-mode=dark] .btn-success:hover,html[data-netbox-color-mode=light] .btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+html .btn-success,html .btn-success:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=dark] .btn-success:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-success,html[data-netbox-color-mode=light] .btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+html .btn-success,.btn-check:active+html .btn-success,html .btn-success:active,html .btn-success.active,.show>html .btn-success.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-success,.btn-check:active+html[data-netbox-color-mode=dark] .btn-success,html[data-netbox-color-mode=dark] .btn-success:active,html[data-netbox-color-mode=dark] .btn-success.active,.show>html[data-netbox-color-mode=dark] .btn-success.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-success,.btn-check:active+html[data-netbox-color-mode=light] .btn-success,html[data-netbox-color-mode=light] .btn-success:active,html[data-netbox-color-mode=light] .btn-success.active,.show>html[data-netbox-color-mode=light] .btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+html .btn-success:focus,.btn-check:active+html .btn-success:focus,html .btn-success:active:focus,html .btn-success.active:focus,.show>html .btn-success.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-success:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-success:focus,html[data-netbox-color-mode=dark] .btn-success:active:focus,html[data-netbox-color-mode=dark] .btn-success.active:focus,.show>html[data-netbox-color-mode=dark] .btn-success.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-success:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-success:focus,html[data-netbox-color-mode=light] .btn-success:active:focus,html[data-netbox-color-mode=light] .btn-success.active:focus,.show>html[data-netbox-color-mode=light] .btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}html .btn-success:disabled,html .btn-success.disabled,html[data-netbox-color-mode=dark] .btn-success:disabled,html[data-netbox-color-mode=dark] .btn-success.disabled,html[data-netbox-color-mode=light] .btn-success:disabled,html[data-netbox-color-mode=light] .btn-success.disabled{color:#fff;background-color:#198754;border-color:#198754}}@media print{html .btn-info,html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=light] .btn-info{color:#000;background-color:#54d6f0;border-color:#54d6f0}html .btn-info:hover,html[data-netbox-color-mode=dark] .btn-info:hover,html[data-netbox-color-mode=light] .btn-info:hover{color:#000;background-color:#6edcf2;border-color:#65daf2}.btn-check:focus+html .btn-info,html .btn-info:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=dark] .btn-info:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-info,html[data-netbox-color-mode=light] .btn-info:focus{color:#000;background-color:#6edcf2;border-color:#65daf2;box-shadow:0 0 0 .25rem #47b6cc80}.btn-check:checked+html .btn-info,.btn-check:active+html .btn-info,html .btn-info:active,html .btn-info.active,.show>html .btn-info.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-info,.btn-check:active+html[data-netbox-color-mode=dark] .btn-info,html[data-netbox-color-mode=dark] .btn-info:active,html[data-netbox-color-mode=dark] .btn-info.active,.show>html[data-netbox-color-mode=dark] .btn-info.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-info,.btn-check:active+html[data-netbox-color-mode=light] .btn-info,html[data-netbox-color-mode=light] .btn-info:active,html[data-netbox-color-mode=light] .btn-info.active,.show>html[data-netbox-color-mode=light] .btn-info.dropdown-toggle{color:#000;background-color:#76def3;border-color:#65daf2}.btn-check:checked+html .btn-info:focus,.btn-check:active+html .btn-info:focus,html .btn-info:active:focus,html .btn-info.active:focus,.show>html .btn-info.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-info:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-info:focus,html[data-netbox-color-mode=dark] .btn-info:active:focus,html[data-netbox-color-mode=dark] .btn-info.active:focus,.show>html[data-netbox-color-mode=dark] .btn-info.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-info:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-info:focus,html[data-netbox-color-mode=light] .btn-info:active:focus,html[data-netbox-color-mode=light] .btn-info.active:focus,.show>html[data-netbox-color-mode=light] .btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #47b6cc80}html .btn-info:disabled,html .btn-info.disabled,html[data-netbox-color-mode=dark] .btn-info:disabled,html[data-netbox-color-mode=dark] .btn-info.disabled,html[data-netbox-color-mode=light] .btn-info:disabled,html[data-netbox-color-mode=light] .btn-info.disabled{color:#000;background-color:#54d6f0;border-color:#54d6f0}}@media print{html .btn-warning,html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=light] .btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}html .btn-warning:hover,html[data-netbox-color-mode=dark] .btn-warning:hover,html[data-netbox-color-mode=light] .btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+html .btn-warning,html .btn-warning:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=dark] .btn-warning:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-warning,html[data-netbox-color-mode=light] .btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+html .btn-warning,.btn-check:active+html .btn-warning,html .btn-warning:active,html .btn-warning.active,.show>html .btn-warning.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-warning,.btn-check:active+html[data-netbox-color-mode=dark] .btn-warning,html[data-netbox-color-mode=dark] .btn-warning:active,html[data-netbox-color-mode=dark] .btn-warning.active,.show>html[data-netbox-color-mode=dark] .btn-warning.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-warning,.btn-check:active+html[data-netbox-color-mode=light] .btn-warning,html[data-netbox-color-mode=light] .btn-warning:active,html[data-netbox-color-mode=light] .btn-warning.active,.show>html[data-netbox-color-mode=light] .btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+html .btn-warning:focus,.btn-check:active+html .btn-warning:focus,html .btn-warning:active:focus,html .btn-warning.active:focus,.show>html .btn-warning.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-warning:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-warning:focus,html[data-netbox-color-mode=dark] .btn-warning:active:focus,html[data-netbox-color-mode=dark] .btn-warning.active:focus,.show>html[data-netbox-color-mode=dark] .btn-warning.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-warning:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-warning:focus,html[data-netbox-color-mode=light] .btn-warning:active:focus,html[data-netbox-color-mode=light] .btn-warning.active:focus,.show>html[data-netbox-color-mode=light] .btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}html .btn-warning:disabled,html .btn-warning.disabled,html[data-netbox-color-mode=dark] .btn-warning:disabled,html[data-netbox-color-mode=dark] .btn-warning.disabled,html[data-netbox-color-mode=light] .btn-warning:disabled,html[data-netbox-color-mode=light] .btn-warning.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}}@media print{html .btn-danger,html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=light] .btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}html .btn-danger:hover,html[data-netbox-color-mode=dark] .btn-danger:hover,html[data-netbox-color-mode=light] .btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+html .btn-danger,html .btn-danger:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=dark] .btn-danger:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-danger,html[data-netbox-color-mode=light] .btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+html .btn-danger,.btn-check:active+html .btn-danger,html .btn-danger:active,html .btn-danger.active,.show>html .btn-danger.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-danger,.btn-check:active+html[data-netbox-color-mode=dark] .btn-danger,html[data-netbox-color-mode=dark] .btn-danger:active,html[data-netbox-color-mode=dark] .btn-danger.active,.show>html[data-netbox-color-mode=dark] .btn-danger.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-danger,.btn-check:active+html[data-netbox-color-mode=light] .btn-danger,html[data-netbox-color-mode=light] .btn-danger:active,html[data-netbox-color-mode=light] .btn-danger.active,.show>html[data-netbox-color-mode=light] .btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+html .btn-danger:focus,.btn-check:active+html .btn-danger:focus,html .btn-danger:active:focus,html .btn-danger.active:focus,.show>html .btn-danger.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-danger:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-danger:focus,html[data-netbox-color-mode=dark] .btn-danger:active:focus,html[data-netbox-color-mode=dark] .btn-danger.active:focus,.show>html[data-netbox-color-mode=dark] .btn-danger.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-danger:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-danger:focus,html[data-netbox-color-mode=light] .btn-danger:active:focus,html[data-netbox-color-mode=light] .btn-danger.active:focus,.show>html[data-netbox-color-mode=light] .btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}html .btn-danger:disabled,html .btn-danger.disabled,html[data-netbox-color-mode=dark] .btn-danger:disabled,html[data-netbox-color-mode=dark] .btn-danger.disabled,html[data-netbox-color-mode=light] .btn-danger:disabled,html[data-netbox-color-mode=light] .btn-danger.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}}@media print{html .btn-light,html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=light] .btn-light{color:#000;background-color:#e9ecef;border-color:#e9ecef}html .btn-light:hover,html[data-netbox-color-mode=dark] .btn-light:hover,html[data-netbox-color-mode=light] .btn-light:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}.btn-check:focus+html .btn-light,html .btn-light:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=dark] .btn-light:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-light,html[data-netbox-color-mode=light] .btn-light:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}.btn-check:checked+html .btn-light,.btn-check:active+html .btn-light,html .btn-light:active,html .btn-light.active,.show>html .btn-light.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-light,.btn-check:active+html[data-netbox-color-mode=dark] .btn-light,html[data-netbox-color-mode=dark] .btn-light:active,html[data-netbox-color-mode=dark] .btn-light.active,.show>html[data-netbox-color-mode=dark] .btn-light.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-light,.btn-check:active+html[data-netbox-color-mode=light] .btn-light,html[data-netbox-color-mode=light] .btn-light:active,html[data-netbox-color-mode=light] .btn-light.active,.show>html[data-netbox-color-mode=light] .btn-light.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}.btn-check:checked+html .btn-light:focus,.btn-check:active+html .btn-light:focus,html .btn-light:active:focus,html .btn-light.active:focus,.show>html .btn-light.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-light:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-light:focus,html[data-netbox-color-mode=dark] .btn-light:active:focus,html[data-netbox-color-mode=dark] .btn-light.active:focus,.show>html[data-netbox-color-mode=dark] .btn-light.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-light:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-light:focus,html[data-netbox-color-mode=light] .btn-light:active:focus,html[data-netbox-color-mode=light] .btn-light.active:focus,.show>html[data-netbox-color-mode=light] .btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}html .btn-light:disabled,html .btn-light.disabled,html[data-netbox-color-mode=dark] .btn-light:disabled,html[data-netbox-color-mode=dark] .btn-light.disabled,html[data-netbox-color-mode=light] .btn-light:disabled,html[data-netbox-color-mode=light] .btn-light.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}}@media print{html .btn-dark,html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=light] .btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}html .btn-dark:hover,html[data-netbox-color-mode=dark] .btn-dark:hover,html[data-netbox-color-mode=light] .btn-dark:hover{color:#fff;background-color:#2c3136;border-color:#2a2e33}.btn-check:focus+html .btn-dark,html .btn-dark:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=dark] .btn-dark:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-dark,html[data-netbox-color-mode=light] .btn-dark:focus{color:#fff;background-color:#2c3136;border-color:#2a2e33;box-shadow:0 0 0 .25rem #52585d80}.btn-check:checked+html .btn-dark,.btn-check:active+html .btn-dark,html .btn-dark:active,html .btn-dark.active,.show>html .btn-dark.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-dark,.btn-check:active+html[data-netbox-color-mode=dark] .btn-dark,html[data-netbox-color-mode=dark] .btn-dark:active,html[data-netbox-color-mode=dark] .btn-dark.active,.show>html[data-netbox-color-mode=dark] .btn-dark.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-dark,.btn-check:active+html[data-netbox-color-mode=light] .btn-dark,html[data-netbox-color-mode=light] .btn-dark:active,html[data-netbox-color-mode=light] .btn-dark.active,.show>html[data-netbox-color-mode=light] .btn-dark.dropdown-toggle{color:#fff;background-color:#2a2e33;border-color:#272c30}.btn-check:checked+html .btn-dark:focus,.btn-check:active+html .btn-dark:focus,html .btn-dark:active:focus,html .btn-dark.active:focus,.show>html .btn-dark.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-dark:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-dark:focus,html[data-netbox-color-mode=dark] .btn-dark:active:focus,html[data-netbox-color-mode=dark] .btn-dark.active:focus,.show>html[data-netbox-color-mode=dark] .btn-dark.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-dark:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-dark:focus,html[data-netbox-color-mode=light] .btn-dark:active:focus,html[data-netbox-color-mode=light] .btn-dark.active:focus,.show>html[data-netbox-color-mode=light] .btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52585d80}html .btn-dark:disabled,html .btn-dark.disabled,html[data-netbox-color-mode=dark] .btn-dark:disabled,html[data-netbox-color-mode=dark] .btn-dark.disabled,html[data-netbox-color-mode=light] .btn-dark:disabled,html[data-netbox-color-mode=light] .btn-dark.disabled{color:#fff;background-color:#343a40;border-color:#343a40}}@media print{html .btn-blue,html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=light] .btn-blue{color:#fff;background-color:#0d6efd;border-color:#0d6efd}html .btn-blue:hover,html[data-netbox-color-mode=dark] .btn-blue:hover,html[data-netbox-color-mode=light] .btn-blue:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+html .btn-blue,html .btn-blue:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=dark] .btn-blue:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-blue,html[data-netbox-color-mode=light] .btn-blue:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem #3184fd80}.btn-check:checked+html .btn-blue,.btn-check:active+html .btn-blue,html .btn-blue:active,html .btn-blue.active,.show>html .btn-blue.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue,html[data-netbox-color-mode=dark] .btn-blue:active,html[data-netbox-color-mode=dark] .btn-blue.active,.show>html[data-netbox-color-mode=dark] .btn-blue.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue,html[data-netbox-color-mode=light] .btn-blue:active,html[data-netbox-color-mode=light] .btn-blue.active,.show>html[data-netbox-color-mode=light] .btn-blue.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:checked+html .btn-blue:focus,.btn-check:active+html .btn-blue:focus,html .btn-blue:active:focus,html .btn-blue.active:focus,.show>html .btn-blue.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-blue:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-blue:focus,html[data-netbox-color-mode=dark] .btn-blue:active:focus,html[data-netbox-color-mode=dark] .btn-blue.active:focus,.show>html[data-netbox-color-mode=dark] .btn-blue.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-blue:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-blue:focus,html[data-netbox-color-mode=light] .btn-blue:active:focus,html[data-netbox-color-mode=light] .btn-blue.active:focus,.show>html[data-netbox-color-mode=light] .btn-blue.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3184fd80}html .btn-blue:disabled,html .btn-blue.disabled,html[data-netbox-color-mode=dark] .btn-blue:disabled,html[data-netbox-color-mode=dark] .btn-blue.disabled,html[data-netbox-color-mode=light] .btn-blue:disabled,html[data-netbox-color-mode=light] .btn-blue.disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}}@media print{html .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=light] .btn-indigo{color:#fff;background-color:#6610f2;border-color:#6610f2}html .btn-indigo:hover,html[data-netbox-color-mode=dark] .btn-indigo:hover,html[data-netbox-color-mode=light] .btn-indigo:hover{color:#fff;background-color:#570ece;border-color:#520dc2}.btn-check:focus+html .btn-indigo,html .btn-indigo:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-indigo,html[data-netbox-color-mode=light] .btn-indigo:focus{color:#fff;background-color:#570ece;border-color:#520dc2;box-shadow:0 0 0 .25rem #7d34f480}.btn-check:checked+html .btn-indigo,.btn-check:active+html .btn-indigo,html .btn-indigo:active,html .btn-indigo.active,.show>html .btn-indigo.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo,html[data-netbox-color-mode=dark] .btn-indigo:active,html[data-netbox-color-mode=dark] .btn-indigo.active,.show>html[data-netbox-color-mode=dark] .btn-indigo.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo,html[data-netbox-color-mode=light] .btn-indigo:active,html[data-netbox-color-mode=light] .btn-indigo.active,.show>html[data-netbox-color-mode=light] .btn-indigo.dropdown-toggle{color:#fff;background-color:#520dc2;border-color:#4d0cb6}.btn-check:checked+html .btn-indigo:focus,.btn-check:active+html .btn-indigo:focus,html .btn-indigo:active:focus,html .btn-indigo.active:focus,.show>html .btn-indigo.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-indigo:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-indigo:focus,html[data-netbox-color-mode=dark] .btn-indigo:active:focus,html[data-netbox-color-mode=dark] .btn-indigo.active:focus,.show>html[data-netbox-color-mode=dark] .btn-indigo.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-indigo:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-indigo:focus,html[data-netbox-color-mode=light] .btn-indigo:active:focus,html[data-netbox-color-mode=light] .btn-indigo.active:focus,.show>html[data-netbox-color-mode=light] .btn-indigo.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #7d34f480}html .btn-indigo:disabled,html .btn-indigo.disabled,html[data-netbox-color-mode=dark] .btn-indigo:disabled,html[data-netbox-color-mode=dark] .btn-indigo.disabled,html[data-netbox-color-mode=light] .btn-indigo:disabled,html[data-netbox-color-mode=light] .btn-indigo.disabled{color:#fff;background-color:#6610f2;border-color:#6610f2}}@media print{html .btn-purple,html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=light] .btn-purple{color:#fff;background-color:#6f42c1;border-color:#6f42c1}html .btn-purple:hover,html[data-netbox-color-mode=dark] .btn-purple:hover,html[data-netbox-color-mode=light] .btn-purple:hover{color:#fff;background-color:#5e38a4;border-color:#59359a}.btn-check:focus+html .btn-purple,html .btn-purple:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=dark] .btn-purple:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-purple,html[data-netbox-color-mode=light] .btn-purple:focus{color:#fff;background-color:#5e38a4;border-color:#59359a;box-shadow:0 0 0 .25rem #855eca80}.btn-check:checked+html .btn-purple,.btn-check:active+html .btn-purple,html .btn-purple:active,html .btn-purple.active,.show>html .btn-purple.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple,html[data-netbox-color-mode=dark] .btn-purple:active,html[data-netbox-color-mode=dark] .btn-purple.active,.show>html[data-netbox-color-mode=dark] .btn-purple.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple,html[data-netbox-color-mode=light] .btn-purple:active,html[data-netbox-color-mode=light] .btn-purple.active,.show>html[data-netbox-color-mode=light] .btn-purple.dropdown-toggle{color:#fff;background-color:#59359a;border-color:#533291}.btn-check:checked+html .btn-purple:focus,.btn-check:active+html .btn-purple:focus,html .btn-purple:active:focus,html .btn-purple.active:focus,.show>html .btn-purple.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-purple:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-purple:focus,html[data-netbox-color-mode=dark] .btn-purple:active:focus,html[data-netbox-color-mode=dark] .btn-purple.active:focus,.show>html[data-netbox-color-mode=dark] .btn-purple.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-purple:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-purple:focus,html[data-netbox-color-mode=light] .btn-purple:active:focus,html[data-netbox-color-mode=light] .btn-purple.active:focus,.show>html[data-netbox-color-mode=light] .btn-purple.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #855eca80}html .btn-purple:disabled,html .btn-purple.disabled,html[data-netbox-color-mode=dark] .btn-purple:disabled,html[data-netbox-color-mode=dark] .btn-purple.disabled,html[data-netbox-color-mode=light] .btn-purple:disabled,html[data-netbox-color-mode=light] .btn-purple.disabled{color:#fff;background-color:#6f42c1;border-color:#6f42c1}}@media print{html .btn-pink,html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=light] .btn-pink{color:#fff;background-color:#d63384;border-color:#d63384}html .btn-pink:hover,html[data-netbox-color-mode=dark] .btn-pink:hover,html[data-netbox-color-mode=light] .btn-pink:hover{color:#fff;background-color:#b62b70;border-color:#ab296a}.btn-check:focus+html .btn-pink,html .btn-pink:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=dark] .btn-pink:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-pink,html[data-netbox-color-mode=light] .btn-pink:focus{color:#fff;background-color:#b62b70;border-color:#ab296a;box-shadow:0 0 0 .25rem #dc529680}.btn-check:checked+html .btn-pink,.btn-check:active+html .btn-pink,html .btn-pink:active,html .btn-pink.active,.show>html .btn-pink.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink,html[data-netbox-color-mode=dark] .btn-pink:active,html[data-netbox-color-mode=dark] .btn-pink.active,.show>html[data-netbox-color-mode=dark] .btn-pink.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink,html[data-netbox-color-mode=light] .btn-pink:active,html[data-netbox-color-mode=light] .btn-pink.active,.show>html[data-netbox-color-mode=light] .btn-pink.dropdown-toggle{color:#fff;background-color:#ab296a;border-color:#a12663}.btn-check:checked+html .btn-pink:focus,.btn-check:active+html .btn-pink:focus,html .btn-pink:active:focus,html .btn-pink.active:focus,.show>html .btn-pink.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-pink:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-pink:focus,html[data-netbox-color-mode=dark] .btn-pink:active:focus,html[data-netbox-color-mode=dark] .btn-pink.active:focus,.show>html[data-netbox-color-mode=dark] .btn-pink.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-pink:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-pink:focus,html[data-netbox-color-mode=light] .btn-pink:active:focus,html[data-netbox-color-mode=light] .btn-pink.active:focus,.show>html[data-netbox-color-mode=light] .btn-pink.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #dc529680}html .btn-pink:disabled,html .btn-pink.disabled,html[data-netbox-color-mode=dark] .btn-pink:disabled,html[data-netbox-color-mode=dark] .btn-pink.disabled,html[data-netbox-color-mode=light] .btn-pink:disabled,html[data-netbox-color-mode=light] .btn-pink.disabled{color:#fff;background-color:#d63384;border-color:#d63384}}@media print{html .btn-red,html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=light] .btn-red{color:#fff;background-color:#dc3545;border-color:#dc3545}html .btn-red:hover,html[data-netbox-color-mode=dark] .btn-red:hover,html[data-netbox-color-mode=light] .btn-red:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+html .btn-red,html .btn-red:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=dark] .btn-red:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-red,html[data-netbox-color-mode=light] .btn-red:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+html .btn-red,.btn-check:active+html .btn-red,html .btn-red:active,html .btn-red.active,.show>html .btn-red.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red,html[data-netbox-color-mode=dark] .btn-red:active,html[data-netbox-color-mode=dark] .btn-red.active,.show>html[data-netbox-color-mode=dark] .btn-red.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red,.btn-check:active+html[data-netbox-color-mode=light] .btn-red,html[data-netbox-color-mode=light] .btn-red:active,html[data-netbox-color-mode=light] .btn-red.active,.show>html[data-netbox-color-mode=light] .btn-red.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+html .btn-red:focus,.btn-check:active+html .btn-red:focus,html .btn-red:active:focus,html .btn-red.active:focus,.show>html .btn-red.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-red:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-red:focus,html[data-netbox-color-mode=dark] .btn-red:active:focus,html[data-netbox-color-mode=dark] .btn-red.active:focus,.show>html[data-netbox-color-mode=dark] .btn-red.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-red:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-red:focus,html[data-netbox-color-mode=light] .btn-red:active:focus,html[data-netbox-color-mode=light] .btn-red.active:focus,.show>html[data-netbox-color-mode=light] .btn-red.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}html .btn-red:disabled,html .btn-red.disabled,html[data-netbox-color-mode=dark] .btn-red:disabled,html[data-netbox-color-mode=dark] .btn-red.disabled,html[data-netbox-color-mode=light] .btn-red:disabled,html[data-netbox-color-mode=light] .btn-red.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}}@media print{html .btn-orange,html[data-netbox-color-mode=dark] .btn-orange,html[data-netbox-color-mode=light] .btn-orange{color:#000;background-color:#fd7e14;border-color:#fd7e14}html .btn-orange:hover,html[data-netbox-color-mode=dark] .btn-orange:hover,html[data-netbox-color-mode=light] .btn-orange:hover{color:#000;background-color:#fd9137;border-color:#fd8b2c}.btn-check:focus+html .btn-orange,html .btn-orange:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-orange,html[data-netbox-color-mode=dark] .btn-orange:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-orange,html[data-netbox-color-mode=light] .btn-orange:focus{color:#000;background-color:#fd9137;border-color:#fd8b2c;box-shadow:0 0 0 .25rem #d76b1180}.btn-check:checked+html .btn-orange,.btn-check:active+html .btn-orange,html .btn-orange:active,html .btn-orange.active,.show>html .btn-orange.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-orange,.btn-check:active+html[data-netbox-color-mode=dark] .btn-orange,html[data-netbox-color-mode=dark] .btn-orange:active,html[data-netbox-color-mode=dark] .btn-orange.active,.show>html[data-netbox-color-mode=dark] .btn-orange.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-orange,.btn-check:active+html[data-netbox-color-mode=light] .btn-orange,html[data-netbox-color-mode=light] .btn-orange:active,html[data-netbox-color-mode=light] .btn-orange.active,.show>html[data-netbox-color-mode=light] .btn-orange.dropdown-toggle{color:#000;background-color:#fd9843;border-color:#fd8b2c}.btn-check:checked+html .btn-orange:focus,.btn-check:active+html .btn-orange:focus,html .btn-orange:active:focus,html .btn-orange.active:focus,.show>html .btn-orange.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-orange:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-orange:focus,html[data-netbox-color-mode=dark] .btn-orange:active:focus,html[data-netbox-color-mode=dark] .btn-orange.active:focus,.show>html[data-netbox-color-mode=dark] .btn-orange.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-orange:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-orange:focus,html[data-netbox-color-mode=light] .btn-orange:active:focus,html[data-netbox-color-mode=light] .btn-orange.active:focus,.show>html[data-netbox-color-mode=light] .btn-orange.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d76b1180}html .btn-orange:disabled,html .btn-orange.disabled,html[data-netbox-color-mode=dark] .btn-orange:disabled,html[data-netbox-color-mode=dark] .btn-orange.disabled,html[data-netbox-color-mode=light] .btn-orange:disabled,html[data-netbox-color-mode=light] .btn-orange.disabled{color:#000;background-color:#fd7e14;border-color:#fd7e14}}@media print{html .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=light] .btn-yellow{color:#000;background-color:#ffc107;border-color:#ffc107}html .btn-yellow:hover,html[data-netbox-color-mode=dark] .btn-yellow:hover,html[data-netbox-color-mode=light] .btn-yellow:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+html .btn-yellow,html .btn-yellow:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-yellow,html[data-netbox-color-mode=light] .btn-yellow:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem #d9a40680}.btn-check:checked+html .btn-yellow,.btn-check:active+html .btn-yellow,html .btn-yellow:active,html .btn-yellow.active,.show>html .btn-yellow.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow,html[data-netbox-color-mode=dark] .btn-yellow:active,html[data-netbox-color-mode=dark] .btn-yellow.active,.show>html[data-netbox-color-mode=dark] .btn-yellow.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow,html[data-netbox-color-mode=light] .btn-yellow:active,html[data-netbox-color-mode=light] .btn-yellow.active,.show>html[data-netbox-color-mode=light] .btn-yellow.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+html .btn-yellow:focus,.btn-check:active+html .btn-yellow:focus,html .btn-yellow:active:focus,html .btn-yellow.active:focus,.show>html .btn-yellow.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-yellow:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-yellow:focus,html[data-netbox-color-mode=dark] .btn-yellow:active:focus,html[data-netbox-color-mode=dark] .btn-yellow.active:focus,.show>html[data-netbox-color-mode=dark] .btn-yellow.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-yellow:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-yellow:focus,html[data-netbox-color-mode=light] .btn-yellow:active:focus,html[data-netbox-color-mode=light] .btn-yellow.active:focus,.show>html[data-netbox-color-mode=light] .btn-yellow.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9a40680}html .btn-yellow:disabled,html .btn-yellow.disabled,html[data-netbox-color-mode=dark] .btn-yellow:disabled,html[data-netbox-color-mode=dark] .btn-yellow.disabled,html[data-netbox-color-mode=light] .btn-yellow:disabled,html[data-netbox-color-mode=light] .btn-yellow.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}}@media print{html .btn-green,html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=light] .btn-green{color:#fff;background-color:#198754;border-color:#198754}html .btn-green:hover,html[data-netbox-color-mode=dark] .btn-green:hover,html[data-netbox-color-mode=light] .btn-green:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+html .btn-green,html .btn-green:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=dark] .btn-green:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-green,html[data-netbox-color-mode=light] .btn-green:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem #3c996e80}.btn-check:checked+html .btn-green,.btn-check:active+html .btn-green,html .btn-green:active,html .btn-green.active,.show>html .btn-green.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green,html[data-netbox-color-mode=dark] .btn-green:active,html[data-netbox-color-mode=dark] .btn-green.active,.show>html[data-netbox-color-mode=dark] .btn-green.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green,.btn-check:active+html[data-netbox-color-mode=light] .btn-green,html[data-netbox-color-mode=light] .btn-green:active,html[data-netbox-color-mode=light] .btn-green.active,.show>html[data-netbox-color-mode=light] .btn-green.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+html .btn-green:focus,.btn-check:active+html .btn-green:focus,html .btn-green:active:focus,html .btn-green.active:focus,.show>html .btn-green.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-green:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-green:focus,html[data-netbox-color-mode=dark] .btn-green:active:focus,html[data-netbox-color-mode=dark] .btn-green.active:focus,.show>html[data-netbox-color-mode=dark] .btn-green.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-green:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-green:focus,html[data-netbox-color-mode=light] .btn-green:active:focus,html[data-netbox-color-mode=light] .btn-green.active:focus,.show>html[data-netbox-color-mode=light] .btn-green.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #3c996e80}html .btn-green:disabled,html .btn-green.disabled,html[data-netbox-color-mode=dark] .btn-green:disabled,html[data-netbox-color-mode=dark] .btn-green.disabled,html[data-netbox-color-mode=light] .btn-green:disabled,html[data-netbox-color-mode=light] .btn-green.disabled{color:#fff;background-color:#198754;border-color:#198754}}@media print{html .btn-teal,html[data-netbox-color-mode=dark] .btn-teal,html[data-netbox-color-mode=light] .btn-teal{color:#000;background-color:#20c997;border-color:#20c997}html .btn-teal:hover,html[data-netbox-color-mode=dark] .btn-teal:hover,html[data-netbox-color-mode=light] .btn-teal:hover{color:#000;background-color:#41d1a7;border-color:#36cea1}.btn-check:focus+html .btn-teal,html .btn-teal:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-teal,html[data-netbox-color-mode=dark] .btn-teal:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-teal,html[data-netbox-color-mode=light] .btn-teal:focus{color:#000;background-color:#41d1a7;border-color:#36cea1;box-shadow:0 0 0 .25rem #1bab8080}.btn-check:checked+html .btn-teal,.btn-check:active+html .btn-teal,html .btn-teal:active,html .btn-teal.active,.show>html .btn-teal.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-teal,.btn-check:active+html[data-netbox-color-mode=dark] .btn-teal,html[data-netbox-color-mode=dark] .btn-teal:active,html[data-netbox-color-mode=dark] .btn-teal.active,.show>html[data-netbox-color-mode=dark] .btn-teal.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-teal,.btn-check:active+html[data-netbox-color-mode=light] .btn-teal,html[data-netbox-color-mode=light] .btn-teal:active,html[data-netbox-color-mode=light] .btn-teal.active,.show>html[data-netbox-color-mode=light] .btn-teal.dropdown-toggle{color:#000;background-color:#4dd4ac;border-color:#36cea1}.btn-check:checked+html .btn-teal:focus,.btn-check:active+html .btn-teal:focus,html .btn-teal:active:focus,html .btn-teal.active:focus,.show>html .btn-teal.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-teal:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-teal:focus,html[data-netbox-color-mode=dark] .btn-teal:active:focus,html[data-netbox-color-mode=dark] .btn-teal.active:focus,.show>html[data-netbox-color-mode=dark] .btn-teal.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-teal:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-teal:focus,html[data-netbox-color-mode=light] .btn-teal:active:focus,html[data-netbox-color-mode=light] .btn-teal.active:focus,.show>html[data-netbox-color-mode=light] .btn-teal.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #1bab8080}html .btn-teal:disabled,html .btn-teal.disabled,html[data-netbox-color-mode=dark] .btn-teal:disabled,html[data-netbox-color-mode=dark] .btn-teal.disabled,html[data-netbox-color-mode=light] .btn-teal:disabled,html[data-netbox-color-mode=light] .btn-teal.disabled{color:#000;background-color:#20c997;border-color:#20c997}}@media print{html .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=light] .btn-cyan{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}html .btn-cyan:hover,html[data-netbox-color-mode=dark] .btn-cyan:hover,html[data-netbox-color-mode=light] .btn-cyan:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+html .btn-cyan,html .btn-cyan:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-cyan,html[data-netbox-color-mode=light] .btn-cyan:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem #0baccc80}.btn-check:checked+html .btn-cyan,.btn-check:active+html .btn-cyan,html .btn-cyan:active,html .btn-cyan.active,.show>html .btn-cyan.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan,html[data-netbox-color-mode=dark] .btn-cyan:active,html[data-netbox-color-mode=dark] .btn-cyan.active,.show>html[data-netbox-color-mode=dark] .btn-cyan.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan,html[data-netbox-color-mode=light] .btn-cyan:active,html[data-netbox-color-mode=light] .btn-cyan.active,.show>html[data-netbox-color-mode=light] .btn-cyan.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+html .btn-cyan:focus,.btn-check:active+html .btn-cyan:focus,html .btn-cyan:active:focus,html .btn-cyan.active:focus,.show>html .btn-cyan.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-cyan:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-cyan:focus,html[data-netbox-color-mode=dark] .btn-cyan:active:focus,html[data-netbox-color-mode=dark] .btn-cyan.active:focus,.show>html[data-netbox-color-mode=dark] .btn-cyan.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-cyan:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-cyan:focus,html[data-netbox-color-mode=light] .btn-cyan:active:focus,html[data-netbox-color-mode=light] .btn-cyan.active:focus,.show>html[data-netbox-color-mode=light] .btn-cyan.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #0baccc80}html .btn-cyan:disabled,html .btn-cyan.disabled,html[data-netbox-color-mode=dark] .btn-cyan:disabled,html[data-netbox-color-mode=dark] .btn-cyan.disabled,html[data-netbox-color-mode=light] .btn-cyan:disabled,html[data-netbox-color-mode=light] .btn-cyan.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}}@media print{html .btn-gray,html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=light] .btn-gray{color:#000;background-color:#adb5bd;border-color:#adb5bd}html .btn-gray:hover,html[data-netbox-color-mode=dark] .btn-gray:hover,html[data-netbox-color-mode=light] .btn-gray:hover{color:#000;background-color:#b9c0c7;border-color:#b5bcc4}.btn-check:focus+html .btn-gray,html .btn-gray:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=dark] .btn-gray:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-gray,html[data-netbox-color-mode=light] .btn-gray:focus{color:#000;background-color:#b9c0c7;border-color:#b5bcc4;box-shadow:0 0 0 .25rem #939aa180}.btn-check:checked+html .btn-gray,.btn-check:active+html .btn-gray,html .btn-gray:active,html .btn-gray.active,.show>html .btn-gray.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray,html[data-netbox-color-mode=dark] .btn-gray:active,html[data-netbox-color-mode=dark] .btn-gray.active,.show>html[data-netbox-color-mode=dark] .btn-gray.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray,html[data-netbox-color-mode=light] .btn-gray:active,html[data-netbox-color-mode=light] .btn-gray.active,.show>html[data-netbox-color-mode=light] .btn-gray.dropdown-toggle{color:#000;background-color:#bdc4ca;border-color:#b5bcc4}.btn-check:checked+html .btn-gray:focus,.btn-check:active+html .btn-gray:focus,html .btn-gray:active:focus,html .btn-gray.active:focus,.show>html .btn-gray.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-gray:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-gray:focus,html[data-netbox-color-mode=dark] .btn-gray:active:focus,html[data-netbox-color-mode=dark] .btn-gray.active:focus,.show>html[data-netbox-color-mode=dark] .btn-gray.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-gray:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-gray:focus,html[data-netbox-color-mode=light] .btn-gray:active:focus,html[data-netbox-color-mode=light] .btn-gray.active:focus,.show>html[data-netbox-color-mode=light] .btn-gray.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #939aa180}html .btn-gray:disabled,html .btn-gray.disabled,html[data-netbox-color-mode=dark] .btn-gray:disabled,html[data-netbox-color-mode=dark] .btn-gray.disabled,html[data-netbox-color-mode=light] .btn-gray:disabled,html[data-netbox-color-mode=light] .btn-gray.disabled{color:#000;background-color:#adb5bd;border-color:#adb5bd}}@media print{html .btn-black,html[data-netbox-color-mode=dark] .btn-black,html[data-netbox-color-mode=light] .btn-black{color:#fff;background-color:#000;border-color:#000}html .btn-black:hover,html[data-netbox-color-mode=dark] .btn-black:hover,html[data-netbox-color-mode=light] .btn-black:hover{color:#fff;background-color:#000;border-color:#000}.btn-check:focus+html .btn-black,html .btn-black:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-black,html[data-netbox-color-mode=dark] .btn-black:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-black,html[data-netbox-color-mode=light] .btn-black:focus{color:#fff;background-color:#000;border-color:#000;box-shadow:0 0 0 .25rem #26262680}.btn-check:checked+html .btn-black,.btn-check:active+html .btn-black,html .btn-black:active,html .btn-black.active,.show>html .btn-black.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-black,.btn-check:active+html[data-netbox-color-mode=dark] .btn-black,html[data-netbox-color-mode=dark] .btn-black:active,html[data-netbox-color-mode=dark] .btn-black.active,.show>html[data-netbox-color-mode=dark] .btn-black.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-black,.btn-check:active+html[data-netbox-color-mode=light] .btn-black,html[data-netbox-color-mode=light] .btn-black:active,html[data-netbox-color-mode=light] .btn-black.active,.show>html[data-netbox-color-mode=light] .btn-black.dropdown-toggle{color:#fff;background-color:#000;border-color:#000}.btn-check:checked+html .btn-black:focus,.btn-check:active+html .btn-black:focus,html .btn-black:active:focus,html .btn-black.active:focus,.show>html .btn-black.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-black:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-black:focus,html[data-netbox-color-mode=dark] .btn-black:active:focus,html[data-netbox-color-mode=dark] .btn-black.active:focus,.show>html[data-netbox-color-mode=dark] .btn-black.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-black:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-black:focus,html[data-netbox-color-mode=light] .btn-black:active:focus,html[data-netbox-color-mode=light] .btn-black.active:focus,.show>html[data-netbox-color-mode=light] .btn-black.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #26262680}html .btn-black:disabled,html .btn-black.disabled,html[data-netbox-color-mode=dark] .btn-black:disabled,html[data-netbox-color-mode=dark] .btn-black.disabled,html[data-netbox-color-mode=light] .btn-black:disabled,html[data-netbox-color-mode=light] .btn-black.disabled{color:#fff;background-color:#000;border-color:#000}}@media print{html .btn-white,html[data-netbox-color-mode=dark] .btn-white,html[data-netbox-color-mode=light] .btn-white{color:#000;background-color:#fff;border-color:#fff}html .btn-white:hover,html[data-netbox-color-mode=dark] .btn-white:hover,html[data-netbox-color-mode=light] .btn-white:hover{color:#000;background-color:#fff;border-color:#fff}.btn-check:focus+html .btn-white,html .btn-white:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-white,html[data-netbox-color-mode=dark] .btn-white:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-white,html[data-netbox-color-mode=light] .btn-white:focus{color:#000;background-color:#fff;border-color:#fff;box-shadow:0 0 0 .25rem #d9d9d980}.btn-check:checked+html .btn-white,.btn-check:active+html .btn-white,html .btn-white:active,html .btn-white.active,.show>html .btn-white.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-white,.btn-check:active+html[data-netbox-color-mode=dark] .btn-white,html[data-netbox-color-mode=dark] .btn-white:active,html[data-netbox-color-mode=dark] .btn-white.active,.show>html[data-netbox-color-mode=dark] .btn-white.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] .btn-white,.btn-check:active+html[data-netbox-color-mode=light] .btn-white,html[data-netbox-color-mode=light] .btn-white:active,html[data-netbox-color-mode=light] .btn-white.active,.show>html[data-netbox-color-mode=light] .btn-white.dropdown-toggle{color:#000;background-color:#fff;border-color:#fff}.btn-check:checked+html .btn-white:focus,.btn-check:active+html .btn-white:focus,html .btn-white:active:focus,html .btn-white.active:focus,.show>html .btn-white.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-white:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-white:focus,html[data-netbox-color-mode=dark] .btn-white:active:focus,html[data-netbox-color-mode=dark] .btn-white.active:focus,.show>html[data-netbox-color-mode=dark] .btn-white.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-white:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-white:focus,html[data-netbox-color-mode=light] .btn-white:active:focus,html[data-netbox-color-mode=light] .btn-white.active:focus,.show>html[data-netbox-color-mode=light] .btn-white.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d9d9d980}html .btn-white:disabled,html .btn-white.disabled,html[data-netbox-color-mode=dark] .btn-white:disabled,html[data-netbox-color-mode=dark] .btn-white.disabled,html[data-netbox-color-mode=light] .btn-white:disabled,html[data-netbox-color-mode=light] .btn-white.disabled{color:#000;background-color:#fff;border-color:#fff}}@media print{html .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=light] .btn-outline-primary{color:#337ab7;border-color:#337ab7}html .btn-outline-primary:hover,html[data-netbox-color-mode=dark] .btn-outline-primary:hover,html[data-netbox-color-mode=light] .btn-outline-primary:hover{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-check:focus+html .btn-outline-primary,html .btn-outline-primary:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-primary,html[data-netbox-color-mode=light] .btn-outline-primary:focus{box-shadow:0 0 0 .25rem #337ab780}.btn-check:checked+html .btn-outline-primary,.btn-check:active+html .btn-outline-primary,html .btn-outline-primary:active,html .btn-outline-primary.active,html .btn-outline-primary.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-primary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-primary,html[data-netbox-color-mode=dark] .btn-outline-primary:active,html[data-netbox-color-mode=dark] .btn-outline-primary.active,html[data-netbox-color-mode=dark] .btn-outline-primary.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-primary,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-primary,html[data-netbox-color-mode=light] .btn-outline-primary:active,html[data-netbox-color-mode=light] .btn-outline-primary.active,html[data-netbox-color-mode=light] .btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#337ab7;border-color:#337ab7}.btn-check:checked+html .btn-outline-primary:focus,.btn-check:active+html .btn-outline-primary:focus,html .btn-outline-primary:active:focus,html .btn-outline-primary.active:focus,html .btn-outline-primary.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-primary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-primary:focus,html[data-netbox-color-mode=dark] .btn-outline-primary:active:focus,html[data-netbox-color-mode=dark] .btn-outline-primary.active:focus,html[data-netbox-color-mode=dark] .btn-outline-primary.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-primary:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-primary:focus,html[data-netbox-color-mode=light] .btn-outline-primary:active:focus,html[data-netbox-color-mode=light] .btn-outline-primary.active:focus,html[data-netbox-color-mode=light] .btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #337ab780}html .btn-outline-primary:disabled,html .btn-outline-primary.disabled,html[data-netbox-color-mode=dark] .btn-outline-primary:disabled,html[data-netbox-color-mode=dark] .btn-outline-primary.disabled,html[data-netbox-color-mode=light] .btn-outline-primary:disabled,html[data-netbox-color-mode=light] .btn-outline-primary.disabled{color:#337ab7;background-color:transparent}}@media print{html .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=light] .btn-outline-secondary{color:#6c757d;border-color:#6c757d}html .btn-outline-secondary:hover,html[data-netbox-color-mode=dark] .btn-outline-secondary:hover,html[data-netbox-color-mode=light] .btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+html .btn-outline-secondary,html .btn-outline-secondary:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-secondary,html[data-netbox-color-mode=light] .btn-outline-secondary:focus{box-shadow:0 0 0 .25rem #6c757d80}.btn-check:checked+html .btn-outline-secondary,.btn-check:active+html .btn-outline-secondary,html .btn-outline-secondary:active,html .btn-outline-secondary.active,html .btn-outline-secondary.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-secondary,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-secondary,html[data-netbox-color-mode=dark] .btn-outline-secondary:active,html[data-netbox-color-mode=dark] .btn-outline-secondary.active,html[data-netbox-color-mode=dark] .btn-outline-secondary.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-secondary,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-secondary,html[data-netbox-color-mode=light] .btn-outline-secondary:active,html[data-netbox-color-mode=light] .btn-outline-secondary.active,html[data-netbox-color-mode=light] .btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:checked+html .btn-outline-secondary:focus,.btn-check:active+html .btn-outline-secondary:focus,html .btn-outline-secondary:active:focus,html .btn-outline-secondary.active:focus,html .btn-outline-secondary.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-secondary:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary:active:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary.active:focus,html[data-netbox-color-mode=dark] .btn-outline-secondary.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-secondary:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-secondary:focus,html[data-netbox-color-mode=light] .btn-outline-secondary:active:focus,html[data-netbox-color-mode=light] .btn-outline-secondary.active:focus,html[data-netbox-color-mode=light] .btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6c757d80}html .btn-outline-secondary:disabled,html .btn-outline-secondary.disabled,html[data-netbox-color-mode=dark] .btn-outline-secondary:disabled,html[data-netbox-color-mode=dark] .btn-outline-secondary.disabled,html[data-netbox-color-mode=light] .btn-outline-secondary:disabled,html[data-netbox-color-mode=light] .btn-outline-secondary.disabled{color:#6c757d;background-color:transparent}}@media print{html .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=light] .btn-outline-success{color:#198754;border-color:#198754}html .btn-outline-success:hover,html[data-netbox-color-mode=dark] .btn-outline-success:hover,html[data-netbox-color-mode=light] .btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+html .btn-outline-success,html .btn-outline-success:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-success,html[data-netbox-color-mode=light] .btn-outline-success:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+html .btn-outline-success,.btn-check:active+html .btn-outline-success,html .btn-outline-success:active,html .btn-outline-success.active,html .btn-outline-success.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-success,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-success,html[data-netbox-color-mode=dark] .btn-outline-success:active,html[data-netbox-color-mode=dark] .btn-outline-success.active,html[data-netbox-color-mode=dark] .btn-outline-success.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-success,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-success,html[data-netbox-color-mode=light] .btn-outline-success:active,html[data-netbox-color-mode=light] .btn-outline-success.active,html[data-netbox-color-mode=light] .btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+html .btn-outline-success:focus,.btn-check:active+html .btn-outline-success:focus,html .btn-outline-success:active:focus,html .btn-outline-success.active:focus,html .btn-outline-success.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-success:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-success:focus,html[data-netbox-color-mode=dark] .btn-outline-success:active:focus,html[data-netbox-color-mode=dark] .btn-outline-success.active:focus,html[data-netbox-color-mode=dark] .btn-outline-success.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-success:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-success:focus,html[data-netbox-color-mode=light] .btn-outline-success:active:focus,html[data-netbox-color-mode=light] .btn-outline-success.active:focus,html[data-netbox-color-mode=light] .btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}html .btn-outline-success:disabled,html .btn-outline-success.disabled,html[data-netbox-color-mode=dark] .btn-outline-success:disabled,html[data-netbox-color-mode=dark] .btn-outline-success.disabled,html[data-netbox-color-mode=light] .btn-outline-success:disabled,html[data-netbox-color-mode=light] .btn-outline-success.disabled{color:#198754;background-color:transparent}}@media print{html .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=light] .btn-outline-info{color:#54d6f0;border-color:#54d6f0}html .btn-outline-info:hover,html[data-netbox-color-mode=dark] .btn-outline-info:hover,html[data-netbox-color-mode=light] .btn-outline-info:hover{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-check:focus+html .btn-outline-info,html .btn-outline-info:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-info,html[data-netbox-color-mode=light] .btn-outline-info:focus{box-shadow:0 0 0 .25rem #54d6f080}.btn-check:checked+html .btn-outline-info,.btn-check:active+html .btn-outline-info,html .btn-outline-info:active,html .btn-outline-info.active,html .btn-outline-info.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-info,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-info,html[data-netbox-color-mode=dark] .btn-outline-info:active,html[data-netbox-color-mode=dark] .btn-outline-info.active,html[data-netbox-color-mode=dark] .btn-outline-info.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-info,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-info,html[data-netbox-color-mode=light] .btn-outline-info:active,html[data-netbox-color-mode=light] .btn-outline-info.active,html[data-netbox-color-mode=light] .btn-outline-info.dropdown-toggle.show{color:#000;background-color:#54d6f0;border-color:#54d6f0}.btn-check:checked+html .btn-outline-info:focus,.btn-check:active+html .btn-outline-info:focus,html .btn-outline-info:active:focus,html .btn-outline-info.active:focus,html .btn-outline-info.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-info:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-info:focus,html[data-netbox-color-mode=dark] .btn-outline-info:active:focus,html[data-netbox-color-mode=dark] .btn-outline-info.active:focus,html[data-netbox-color-mode=dark] .btn-outline-info.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-info:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-info:focus,html[data-netbox-color-mode=light] .btn-outline-info:active:focus,html[data-netbox-color-mode=light] .btn-outline-info.active:focus,html[data-netbox-color-mode=light] .btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #54d6f080}html .btn-outline-info:disabled,html .btn-outline-info.disabled,html[data-netbox-color-mode=dark] .btn-outline-info:disabled,html[data-netbox-color-mode=dark] .btn-outline-info.disabled,html[data-netbox-color-mode=light] .btn-outline-info:disabled,html[data-netbox-color-mode=light] .btn-outline-info.disabled{color:#54d6f0;background-color:transparent}}@media print{html .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=light] .btn-outline-warning{color:#ffc107;border-color:#ffc107}html .btn-outline-warning:hover,html[data-netbox-color-mode=dark] .btn-outline-warning:hover,html[data-netbox-color-mode=light] .btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+html .btn-outline-warning,html .btn-outline-warning:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-warning,html[data-netbox-color-mode=light] .btn-outline-warning:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+html .btn-outline-warning,.btn-check:active+html .btn-outline-warning,html .btn-outline-warning:active,html .btn-outline-warning.active,html .btn-outline-warning.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-warning,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-warning,html[data-netbox-color-mode=dark] .btn-outline-warning:active,html[data-netbox-color-mode=dark] .btn-outline-warning.active,html[data-netbox-color-mode=dark] .btn-outline-warning.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-warning,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-warning,html[data-netbox-color-mode=light] .btn-outline-warning:active,html[data-netbox-color-mode=light] .btn-outline-warning.active,html[data-netbox-color-mode=light] .btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+html .btn-outline-warning:focus,.btn-check:active+html .btn-outline-warning:focus,html .btn-outline-warning:active:focus,html .btn-outline-warning.active:focus,html .btn-outline-warning.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-warning:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-warning:focus,html[data-netbox-color-mode=dark] .btn-outline-warning:active:focus,html[data-netbox-color-mode=dark] .btn-outline-warning.active:focus,html[data-netbox-color-mode=dark] .btn-outline-warning.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-warning:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-warning:focus,html[data-netbox-color-mode=light] .btn-outline-warning:active:focus,html[data-netbox-color-mode=light] .btn-outline-warning.active:focus,html[data-netbox-color-mode=light] .btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}html .btn-outline-warning:disabled,html .btn-outline-warning.disabled,html[data-netbox-color-mode=dark] .btn-outline-warning:disabled,html[data-netbox-color-mode=dark] .btn-outline-warning.disabled,html[data-netbox-color-mode=light] .btn-outline-warning:disabled,html[data-netbox-color-mode=light] .btn-outline-warning.disabled{color:#ffc107;background-color:transparent}}@media print{html .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=light] .btn-outline-danger{color:#dc3545;border-color:#dc3545}html .btn-outline-danger:hover,html[data-netbox-color-mode=dark] .btn-outline-danger:hover,html[data-netbox-color-mode=light] .btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+html .btn-outline-danger,html .btn-outline-danger:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-danger,html[data-netbox-color-mode=light] .btn-outline-danger:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+html .btn-outline-danger,.btn-check:active+html .btn-outline-danger,html .btn-outline-danger:active,html .btn-outline-danger.active,html .btn-outline-danger.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-danger,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-danger,html[data-netbox-color-mode=dark] .btn-outline-danger:active,html[data-netbox-color-mode=dark] .btn-outline-danger.active,html[data-netbox-color-mode=dark] .btn-outline-danger.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-danger,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-danger,html[data-netbox-color-mode=light] .btn-outline-danger:active,html[data-netbox-color-mode=light] .btn-outline-danger.active,html[data-netbox-color-mode=light] .btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+html .btn-outline-danger:focus,.btn-check:active+html .btn-outline-danger:focus,html .btn-outline-danger:active:focus,html .btn-outline-danger.active:focus,html .btn-outline-danger.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-danger:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-danger:focus,html[data-netbox-color-mode=dark] .btn-outline-danger:active:focus,html[data-netbox-color-mode=dark] .btn-outline-danger.active:focus,html[data-netbox-color-mode=dark] .btn-outline-danger.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-danger:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-danger:focus,html[data-netbox-color-mode=light] .btn-outline-danger:active:focus,html[data-netbox-color-mode=light] .btn-outline-danger.active:focus,html[data-netbox-color-mode=light] .btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}html .btn-outline-danger:disabled,html .btn-outline-danger.disabled,html[data-netbox-color-mode=dark] .btn-outline-danger:disabled,html[data-netbox-color-mode=dark] .btn-outline-danger.disabled,html[data-netbox-color-mode=light] .btn-outline-danger:disabled,html[data-netbox-color-mode=light] .btn-outline-danger.disabled{color:#dc3545;background-color:transparent}}@media print{html .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=light] .btn-outline-light{color:#e9ecef;border-color:#e9ecef}html .btn-outline-light:hover,html[data-netbox-color-mode=dark] .btn-outline-light:hover,html[data-netbox-color-mode=light] .btn-outline-light:hover{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:focus+html .btn-outline-light,html .btn-outline-light:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-light,html[data-netbox-color-mode=light] .btn-outline-light:focus{box-shadow:0 0 0 .25rem #e9ecef80}.btn-check:checked+html .btn-outline-light,.btn-check:active+html .btn-outline-light,html .btn-outline-light:active,html .btn-outline-light.active,html .btn-outline-light.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-light,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-light,html[data-netbox-color-mode=dark] .btn-outline-light:active,html[data-netbox-color-mode=dark] .btn-outline-light.active,html[data-netbox-color-mode=dark] .btn-outline-light.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-light,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-light,html[data-netbox-color-mode=light] .btn-outline-light:active,html[data-netbox-color-mode=light] .btn-outline-light.active,html[data-netbox-color-mode=light] .btn-outline-light.dropdown-toggle.show{color:#000;background-color:#e9ecef;border-color:#e9ecef}.btn-check:checked+html .btn-outline-light:focus,.btn-check:active+html .btn-outline-light:focus,html .btn-outline-light:active:focus,html .btn-outline-light.active:focus,html .btn-outline-light.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-light:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-light:focus,html[data-netbox-color-mode=dark] .btn-outline-light:active:focus,html[data-netbox-color-mode=dark] .btn-outline-light.active:focus,html[data-netbox-color-mode=dark] .btn-outline-light.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-light:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-light:focus,html[data-netbox-color-mode=light] .btn-outline-light:active:focus,html[data-netbox-color-mode=light] .btn-outline-light.active:focus,html[data-netbox-color-mode=light] .btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #e9ecef80}html .btn-outline-light:disabled,html .btn-outline-light.disabled,html[data-netbox-color-mode=dark] .btn-outline-light:disabled,html[data-netbox-color-mode=dark] .btn-outline-light.disabled,html[data-netbox-color-mode=light] .btn-outline-light:disabled,html[data-netbox-color-mode=light] .btn-outline-light.disabled{color:#e9ecef;background-color:transparent}}@media print{html .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=light] .btn-outline-dark{color:#343a40;border-color:#343a40}html .btn-outline-dark:hover,html[data-netbox-color-mode=dark] .btn-outline-dark:hover,html[data-netbox-color-mode=light] .btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:focus+html .btn-outline-dark,html .btn-outline-dark:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-dark,html[data-netbox-color-mode=light] .btn-outline-dark:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-check:checked+html .btn-outline-dark,.btn-check:active+html .btn-outline-dark,html .btn-outline-dark:active,html .btn-outline-dark.active,html .btn-outline-dark.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-dark,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-dark,html[data-netbox-color-mode=dark] .btn-outline-dark:active,html[data-netbox-color-mode=dark] .btn-outline-dark.active,html[data-netbox-color-mode=dark] .btn-outline-dark.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-dark,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-dark,html[data-netbox-color-mode=light] .btn-outline-dark:active,html[data-netbox-color-mode=light] .btn-outline-dark.active,html[data-netbox-color-mode=light] .btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:checked+html .btn-outline-dark:focus,.btn-check:active+html .btn-outline-dark:focus,html .btn-outline-dark:active:focus,html .btn-outline-dark.active:focus,html .btn-outline-dark.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-dark:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-dark:focus,html[data-netbox-color-mode=dark] .btn-outline-dark:active:focus,html[data-netbox-color-mode=dark] .btn-outline-dark.active:focus,html[data-netbox-color-mode=dark] .btn-outline-dark.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-dark:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-dark:focus,html[data-netbox-color-mode=light] .btn-outline-dark:active:focus,html[data-netbox-color-mode=light] .btn-outline-dark.active:focus,html[data-netbox-color-mode=light] .btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #343a4080}html .btn-outline-dark:disabled,html .btn-outline-dark.disabled,html[data-netbox-color-mode=dark] .btn-outline-dark:disabled,html[data-netbox-color-mode=dark] .btn-outline-dark.disabled,html[data-netbox-color-mode=light] .btn-outline-dark:disabled,html[data-netbox-color-mode=light] .btn-outline-dark.disabled{color:#343a40;background-color:transparent}}@media print{html .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=light] .btn-outline-blue{color:#0d6efd;border-color:#0d6efd}html .btn-outline-blue:hover,html[data-netbox-color-mode=dark] .btn-outline-blue:hover,html[data-netbox-color-mode=light] .btn-outline-blue:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+html .btn-outline-blue,html .btn-outline-blue:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-blue,html[data-netbox-color-mode=light] .btn-outline-blue:focus{box-shadow:0 0 0 .25rem #0d6efd80}.btn-check:checked+html .btn-outline-blue,.btn-check:active+html .btn-outline-blue,html .btn-outline-blue:active,html .btn-outline-blue.active,html .btn-outline-blue.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue,html[data-netbox-color-mode=dark] .btn-outline-blue:active,html[data-netbox-color-mode=dark] .btn-outline-blue.active,html[data-netbox-color-mode=dark] .btn-outline-blue.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue,html[data-netbox-color-mode=light] .btn-outline-blue:active,html[data-netbox-color-mode=light] .btn-outline-blue.active,html[data-netbox-color-mode=light] .btn-outline-blue.dropdown-toggle.show{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:checked+html .btn-outline-blue:focus,.btn-check:active+html .btn-outline-blue:focus,html .btn-outline-blue:active:focus,html .btn-outline-blue.active:focus,html .btn-outline-blue.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-blue:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-blue:focus,html[data-netbox-color-mode=dark] .btn-outline-blue:active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue.active:focus,html[data-netbox-color-mode=dark] .btn-outline-blue.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-blue:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-blue:focus,html[data-netbox-color-mode=light] .btn-outline-blue:active:focus,html[data-netbox-color-mode=light] .btn-outline-blue.active:focus,html[data-netbox-color-mode=light] .btn-outline-blue.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0d6efd80}html .btn-outline-blue:disabled,html .btn-outline-blue.disabled,html[data-netbox-color-mode=dark] .btn-outline-blue:disabled,html[data-netbox-color-mode=dark] .btn-outline-blue.disabled,html[data-netbox-color-mode=light] .btn-outline-blue:disabled,html[data-netbox-color-mode=light] .btn-outline-blue.disabled{color:#0d6efd;background-color:transparent}}@media print{html .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=light] .btn-outline-indigo{color:#6610f2;border-color:#6610f2}html .btn-outline-indigo:hover,html[data-netbox-color-mode=dark] .btn-outline-indigo:hover,html[data-netbox-color-mode=light] .btn-outline-indigo:hover{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:focus+html .btn-outline-indigo,html .btn-outline-indigo:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-indigo,html[data-netbox-color-mode=light] .btn-outline-indigo:focus{box-shadow:0 0 0 .25rem #6610f280}.btn-check:checked+html .btn-outline-indigo,.btn-check:active+html .btn-outline-indigo,html .btn-outline-indigo:active,html .btn-outline-indigo.active,html .btn-outline-indigo.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo,html[data-netbox-color-mode=dark] .btn-outline-indigo:active,html[data-netbox-color-mode=dark] .btn-outline-indigo.active,html[data-netbox-color-mode=dark] .btn-outline-indigo.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo,html[data-netbox-color-mode=light] .btn-outline-indigo:active,html[data-netbox-color-mode=light] .btn-outline-indigo.active,html[data-netbox-color-mode=light] .btn-outline-indigo.dropdown-toggle.show{color:#fff;background-color:#6610f2;border-color:#6610f2}.btn-check:checked+html .btn-outline-indigo:focus,.btn-check:active+html .btn-outline-indigo:focus,html .btn-outline-indigo:active:focus,html .btn-outline-indigo.active:focus,html .btn-outline-indigo.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-indigo:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo:active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo.active:focus,html[data-netbox-color-mode=dark] .btn-outline-indigo.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-indigo:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-indigo:focus,html[data-netbox-color-mode=light] .btn-outline-indigo:active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo.active:focus,html[data-netbox-color-mode=light] .btn-outline-indigo.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6610f280}html .btn-outline-indigo:disabled,html .btn-outline-indigo.disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo:disabled,html[data-netbox-color-mode=dark] .btn-outline-indigo.disabled,html[data-netbox-color-mode=light] .btn-outline-indigo:disabled,html[data-netbox-color-mode=light] .btn-outline-indigo.disabled{color:#6610f2;background-color:transparent}}@media print{html .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=light] .btn-outline-purple{color:#6f42c1;border-color:#6f42c1}html .btn-outline-purple:hover,html[data-netbox-color-mode=dark] .btn-outline-purple:hover,html[data-netbox-color-mode=light] .btn-outline-purple:hover{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:focus+html .btn-outline-purple,html .btn-outline-purple:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-purple,html[data-netbox-color-mode=light] .btn-outline-purple:focus{box-shadow:0 0 0 .25rem #6f42c180}.btn-check:checked+html .btn-outline-purple,.btn-check:active+html .btn-outline-purple,html .btn-outline-purple:active,html .btn-outline-purple.active,html .btn-outline-purple.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple,html[data-netbox-color-mode=dark] .btn-outline-purple:active,html[data-netbox-color-mode=dark] .btn-outline-purple.active,html[data-netbox-color-mode=dark] .btn-outline-purple.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple,html[data-netbox-color-mode=light] .btn-outline-purple:active,html[data-netbox-color-mode=light] .btn-outline-purple.active,html[data-netbox-color-mode=light] .btn-outline-purple.dropdown-toggle.show{color:#fff;background-color:#6f42c1;border-color:#6f42c1}.btn-check:checked+html .btn-outline-purple:focus,.btn-check:active+html .btn-outline-purple:focus,html .btn-outline-purple:active:focus,html .btn-outline-purple.active:focus,html .btn-outline-purple.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-purple:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-purple:focus,html[data-netbox-color-mode=dark] .btn-outline-purple:active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple.active:focus,html[data-netbox-color-mode=dark] .btn-outline-purple.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-purple:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-purple:focus,html[data-netbox-color-mode=light] .btn-outline-purple:active:focus,html[data-netbox-color-mode=light] .btn-outline-purple.active:focus,html[data-netbox-color-mode=light] .btn-outline-purple.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #6f42c180}html .btn-outline-purple:disabled,html .btn-outline-purple.disabled,html[data-netbox-color-mode=dark] .btn-outline-purple:disabled,html[data-netbox-color-mode=dark] .btn-outline-purple.disabled,html[data-netbox-color-mode=light] .btn-outline-purple:disabled,html[data-netbox-color-mode=light] .btn-outline-purple.disabled{color:#6f42c1;background-color:transparent}}@media print{html .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=light] .btn-outline-pink{color:#d63384;border-color:#d63384}html .btn-outline-pink:hover,html[data-netbox-color-mode=dark] .btn-outline-pink:hover,html[data-netbox-color-mode=light] .btn-outline-pink:hover{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:focus+html .btn-outline-pink,html .btn-outline-pink:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-pink,html[data-netbox-color-mode=light] .btn-outline-pink:focus{box-shadow:0 0 0 .25rem #d6338480}.btn-check:checked+html .btn-outline-pink,.btn-check:active+html .btn-outline-pink,html .btn-outline-pink:active,html .btn-outline-pink.active,html .btn-outline-pink.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink,html[data-netbox-color-mode=dark] .btn-outline-pink:active,html[data-netbox-color-mode=dark] .btn-outline-pink.active,html[data-netbox-color-mode=dark] .btn-outline-pink.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink,html[data-netbox-color-mode=light] .btn-outline-pink:active,html[data-netbox-color-mode=light] .btn-outline-pink.active,html[data-netbox-color-mode=light] .btn-outline-pink.dropdown-toggle.show{color:#fff;background-color:#d63384;border-color:#d63384}.btn-check:checked+html .btn-outline-pink:focus,.btn-check:active+html .btn-outline-pink:focus,html .btn-outline-pink:active:focus,html .btn-outline-pink.active:focus,html .btn-outline-pink.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-pink:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-pink:focus,html[data-netbox-color-mode=dark] .btn-outline-pink:active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink.active:focus,html[data-netbox-color-mode=dark] .btn-outline-pink.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-pink:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-pink:focus,html[data-netbox-color-mode=light] .btn-outline-pink:active:focus,html[data-netbox-color-mode=light] .btn-outline-pink.active:focus,html[data-netbox-color-mode=light] .btn-outline-pink.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d6338480}html .btn-outline-pink:disabled,html .btn-outline-pink.disabled,html[data-netbox-color-mode=dark] .btn-outline-pink:disabled,html[data-netbox-color-mode=dark] .btn-outline-pink.disabled,html[data-netbox-color-mode=light] .btn-outline-pink:disabled,html[data-netbox-color-mode=light] .btn-outline-pink.disabled{color:#d63384;background-color:transparent}}@media print{html .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=light] .btn-outline-red{color:#dc3545;border-color:#dc3545}html .btn-outline-red:hover,html[data-netbox-color-mode=dark] .btn-outline-red:hover,html[data-netbox-color-mode=light] .btn-outline-red:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+html .btn-outline-red,html .btn-outline-red:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-red,html[data-netbox-color-mode=light] .btn-outline-red:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+html .btn-outline-red,.btn-check:active+html .btn-outline-red,html .btn-outline-red:active,html .btn-outline-red.active,html .btn-outline-red.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red,html[data-netbox-color-mode=dark] .btn-outline-red:active,html[data-netbox-color-mode=dark] .btn-outline-red.active,html[data-netbox-color-mode=dark] .btn-outline-red.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red,html[data-netbox-color-mode=light] .btn-outline-red:active,html[data-netbox-color-mode=light] .btn-outline-red.active,html[data-netbox-color-mode=light] .btn-outline-red.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+html .btn-outline-red:focus,.btn-check:active+html .btn-outline-red:focus,html .btn-outline-red:active:focus,html .btn-outline-red.active:focus,html .btn-outline-red.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-red:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-red:focus,html[data-netbox-color-mode=dark] .btn-outline-red:active:focus,html[data-netbox-color-mode=dark] .btn-outline-red.active:focus,html[data-netbox-color-mode=dark] .btn-outline-red.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-red:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-red:focus,html[data-netbox-color-mode=light] .btn-outline-red:active:focus,html[data-netbox-color-mode=light] .btn-outline-red.active:focus,html[data-netbox-color-mode=light] .btn-outline-red.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}html .btn-outline-red:disabled,html .btn-outline-red.disabled,html[data-netbox-color-mode=dark] .btn-outline-red:disabled,html[data-netbox-color-mode=dark] .btn-outline-red.disabled,html[data-netbox-color-mode=light] .btn-outline-red:disabled,html[data-netbox-color-mode=light] .btn-outline-red.disabled{color:#dc3545;background-color:transparent}}@media print{html .btn-outline-orange,html[data-netbox-color-mode=dark] .btn-outline-orange,html[data-netbox-color-mode=light] .btn-outline-orange{color:#fd7e14;border-color:#fd7e14}html .btn-outline-orange:hover,html[data-netbox-color-mode=dark] .btn-outline-orange:hover,html[data-netbox-color-mode=light] .btn-outline-orange:hover{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-check:focus+html .btn-outline-orange,html .btn-outline-orange:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-orange,html[data-netbox-color-mode=dark] .btn-outline-orange:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-orange,html[data-netbox-color-mode=light] .btn-outline-orange:focus{box-shadow:0 0 0 .25rem #fd7e1480}.btn-check:checked+html .btn-outline-orange,.btn-check:active+html .btn-outline-orange,html .btn-outline-orange:active,html .btn-outline-orange.active,html .btn-outline-orange.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-orange,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-orange,html[data-netbox-color-mode=dark] .btn-outline-orange:active,html[data-netbox-color-mode=dark] .btn-outline-orange.active,html[data-netbox-color-mode=dark] .btn-outline-orange.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-orange,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-orange,html[data-netbox-color-mode=light] .btn-outline-orange:active,html[data-netbox-color-mode=light] .btn-outline-orange.active,html[data-netbox-color-mode=light] .btn-outline-orange.dropdown-toggle.show{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-check:checked+html .btn-outline-orange:focus,.btn-check:active+html .btn-outline-orange:focus,html .btn-outline-orange:active:focus,html .btn-outline-orange.active:focus,html .btn-outline-orange.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-orange:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-orange:focus,html[data-netbox-color-mode=dark] .btn-outline-orange:active:focus,html[data-netbox-color-mode=dark] .btn-outline-orange.active:focus,html[data-netbox-color-mode=dark] .btn-outline-orange.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-orange:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-orange:focus,html[data-netbox-color-mode=light] .btn-outline-orange:active:focus,html[data-netbox-color-mode=light] .btn-outline-orange.active:focus,html[data-netbox-color-mode=light] .btn-outline-orange.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #fd7e1480}html .btn-outline-orange:disabled,html .btn-outline-orange.disabled,html[data-netbox-color-mode=dark] .btn-outline-orange:disabled,html[data-netbox-color-mode=dark] .btn-outline-orange.disabled,html[data-netbox-color-mode=light] .btn-outline-orange:disabled,html[data-netbox-color-mode=light] .btn-outline-orange.disabled{color:#fd7e14;background-color:transparent}}@media print{html .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=light] .btn-outline-yellow{color:#ffc107;border-color:#ffc107}html .btn-outline-yellow:hover,html[data-netbox-color-mode=dark] .btn-outline-yellow:hover,html[data-netbox-color-mode=light] .btn-outline-yellow:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+html .btn-outline-yellow,html .btn-outline-yellow:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-yellow,html[data-netbox-color-mode=light] .btn-outline-yellow:focus{box-shadow:0 0 0 .25rem #ffc10780}.btn-check:checked+html .btn-outline-yellow,.btn-check:active+html .btn-outline-yellow,html .btn-outline-yellow:active,html .btn-outline-yellow.active,html .btn-outline-yellow.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow,html[data-netbox-color-mode=dark] .btn-outline-yellow:active,html[data-netbox-color-mode=dark] .btn-outline-yellow.active,html[data-netbox-color-mode=dark] .btn-outline-yellow.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow,html[data-netbox-color-mode=light] .btn-outline-yellow:active,html[data-netbox-color-mode=light] .btn-outline-yellow.active,html[data-netbox-color-mode=light] .btn-outline-yellow.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+html .btn-outline-yellow:focus,.btn-check:active+html .btn-outline-yellow:focus,html .btn-outline-yellow:active:focus,html .btn-outline-yellow.active:focus,html .btn-outline-yellow.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-yellow:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow:active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow.active:focus,html[data-netbox-color-mode=dark] .btn-outline-yellow.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-yellow:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-yellow:focus,html[data-netbox-color-mode=light] .btn-outline-yellow:active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow.active:focus,html[data-netbox-color-mode=light] .btn-outline-yellow.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffc10780}html .btn-outline-yellow:disabled,html .btn-outline-yellow.disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow:disabled,html[data-netbox-color-mode=dark] .btn-outline-yellow.disabled,html[data-netbox-color-mode=light] .btn-outline-yellow:disabled,html[data-netbox-color-mode=light] .btn-outline-yellow.disabled{color:#ffc107;background-color:transparent}}@media print{html .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=light] .btn-outline-green{color:#198754;border-color:#198754}html .btn-outline-green:hover,html[data-netbox-color-mode=dark] .btn-outline-green:hover,html[data-netbox-color-mode=light] .btn-outline-green:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+html .btn-outline-green,html .btn-outline-green:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-green,html[data-netbox-color-mode=light] .btn-outline-green:focus{box-shadow:0 0 0 .25rem #19875480}.btn-check:checked+html .btn-outline-green,.btn-check:active+html .btn-outline-green,html .btn-outline-green:active,html .btn-outline-green.active,html .btn-outline-green.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green,html[data-netbox-color-mode=dark] .btn-outline-green:active,html[data-netbox-color-mode=dark] .btn-outline-green.active,html[data-netbox-color-mode=dark] .btn-outline-green.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green,html[data-netbox-color-mode=light] .btn-outline-green:active,html[data-netbox-color-mode=light] .btn-outline-green.active,html[data-netbox-color-mode=light] .btn-outline-green.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+html .btn-outline-green:focus,.btn-check:active+html .btn-outline-green:focus,html .btn-outline-green:active:focus,html .btn-outline-green.active:focus,html .btn-outline-green.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-green:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-green:focus,html[data-netbox-color-mode=dark] .btn-outline-green:active:focus,html[data-netbox-color-mode=dark] .btn-outline-green.active:focus,html[data-netbox-color-mode=dark] .btn-outline-green.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-green:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-green:focus,html[data-netbox-color-mode=light] .btn-outline-green:active:focus,html[data-netbox-color-mode=light] .btn-outline-green.active:focus,html[data-netbox-color-mode=light] .btn-outline-green.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #19875480}html .btn-outline-green:disabled,html .btn-outline-green.disabled,html[data-netbox-color-mode=dark] .btn-outline-green:disabled,html[data-netbox-color-mode=dark] .btn-outline-green.disabled,html[data-netbox-color-mode=light] .btn-outline-green:disabled,html[data-netbox-color-mode=light] .btn-outline-green.disabled{color:#198754;background-color:transparent}}@media print{html .btn-outline-teal,html[data-netbox-color-mode=dark] .btn-outline-teal,html[data-netbox-color-mode=light] .btn-outline-teal{color:#20c997;border-color:#20c997}html .btn-outline-teal:hover,html[data-netbox-color-mode=dark] .btn-outline-teal:hover,html[data-netbox-color-mode=light] .btn-outline-teal:hover{color:#000;background-color:#20c997;border-color:#20c997}.btn-check:focus+html .btn-outline-teal,html .btn-outline-teal:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-teal,html[data-netbox-color-mode=dark] .btn-outline-teal:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-teal,html[data-netbox-color-mode=light] .btn-outline-teal:focus{box-shadow:0 0 0 .25rem #20c99780}.btn-check:checked+html .btn-outline-teal,.btn-check:active+html .btn-outline-teal,html .btn-outline-teal:active,html .btn-outline-teal.active,html .btn-outline-teal.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-teal,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-teal,html[data-netbox-color-mode=dark] .btn-outline-teal:active,html[data-netbox-color-mode=dark] .btn-outline-teal.active,html[data-netbox-color-mode=dark] .btn-outline-teal.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-teal,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-teal,html[data-netbox-color-mode=light] .btn-outline-teal:active,html[data-netbox-color-mode=light] .btn-outline-teal.active,html[data-netbox-color-mode=light] .btn-outline-teal.dropdown-toggle.show{color:#000;background-color:#20c997;border-color:#20c997}.btn-check:checked+html .btn-outline-teal:focus,.btn-check:active+html .btn-outline-teal:focus,html .btn-outline-teal:active:focus,html .btn-outline-teal.active:focus,html .btn-outline-teal.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-teal:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-teal:focus,html[data-netbox-color-mode=dark] .btn-outline-teal:active:focus,html[data-netbox-color-mode=dark] .btn-outline-teal.active:focus,html[data-netbox-color-mode=dark] .btn-outline-teal.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-teal:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-teal:focus,html[data-netbox-color-mode=light] .btn-outline-teal:active:focus,html[data-netbox-color-mode=light] .btn-outline-teal.active:focus,html[data-netbox-color-mode=light] .btn-outline-teal.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #20c99780}html .btn-outline-teal:disabled,html .btn-outline-teal.disabled,html[data-netbox-color-mode=dark] .btn-outline-teal:disabled,html[data-netbox-color-mode=dark] .btn-outline-teal.disabled,html[data-netbox-color-mode=light] .btn-outline-teal:disabled,html[data-netbox-color-mode=light] .btn-outline-teal.disabled{color:#20c997;background-color:transparent}}@media print{html .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=light] .btn-outline-cyan{color:#0dcaf0;border-color:#0dcaf0}html .btn-outline-cyan:hover,html[data-netbox-color-mode=dark] .btn-outline-cyan:hover,html[data-netbox-color-mode=light] .btn-outline-cyan:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+html .btn-outline-cyan,html .btn-outline-cyan:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-cyan,html[data-netbox-color-mode=light] .btn-outline-cyan:focus{box-shadow:0 0 0 .25rem #0dcaf080}.btn-check:checked+html .btn-outline-cyan,.btn-check:active+html .btn-outline-cyan,html .btn-outline-cyan:active,html .btn-outline-cyan.active,html .btn-outline-cyan.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan,html[data-netbox-color-mode=dark] .btn-outline-cyan:active,html[data-netbox-color-mode=dark] .btn-outline-cyan.active,html[data-netbox-color-mode=dark] .btn-outline-cyan.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan,html[data-netbox-color-mode=light] .btn-outline-cyan:active,html[data-netbox-color-mode=light] .btn-outline-cyan.active,html[data-netbox-color-mode=light] .btn-outline-cyan.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+html .btn-outline-cyan:focus,.btn-check:active+html .btn-outline-cyan:focus,html .btn-outline-cyan:active:focus,html .btn-outline-cyan.active:focus,html .btn-outline-cyan.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-cyan:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan:active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan.active:focus,html[data-netbox-color-mode=dark] .btn-outline-cyan.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-cyan:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-cyan:focus,html[data-netbox-color-mode=light] .btn-outline-cyan:active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan.active:focus,html[data-netbox-color-mode=light] .btn-outline-cyan.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #0dcaf080}html .btn-outline-cyan:disabled,html .btn-outline-cyan.disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan:disabled,html[data-netbox-color-mode=dark] .btn-outline-cyan.disabled,html[data-netbox-color-mode=light] .btn-outline-cyan:disabled,html[data-netbox-color-mode=light] .btn-outline-cyan.disabled{color:#0dcaf0;background-color:transparent}}@media print{html .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=light] .btn-outline-gray{color:#adb5bd;border-color:#adb5bd}html .btn-outline-gray:hover,html[data-netbox-color-mode=dark] .btn-outline-gray:hover,html[data-netbox-color-mode=light] .btn-outline-gray:hover{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:focus+html .btn-outline-gray,html .btn-outline-gray:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-gray,html[data-netbox-color-mode=light] .btn-outline-gray:focus{box-shadow:0 0 0 .25rem #adb5bd80}.btn-check:checked+html .btn-outline-gray,.btn-check:active+html .btn-outline-gray,html .btn-outline-gray:active,html .btn-outline-gray.active,html .btn-outline-gray.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray,html[data-netbox-color-mode=dark] .btn-outline-gray:active,html[data-netbox-color-mode=dark] .btn-outline-gray.active,html[data-netbox-color-mode=dark] .btn-outline-gray.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray,html[data-netbox-color-mode=light] .btn-outline-gray:active,html[data-netbox-color-mode=light] .btn-outline-gray.active,html[data-netbox-color-mode=light] .btn-outline-gray.dropdown-toggle.show{color:#000;background-color:#adb5bd;border-color:#adb5bd}.btn-check:checked+html .btn-outline-gray:focus,.btn-check:active+html .btn-outline-gray:focus,html .btn-outline-gray:active:focus,html .btn-outline-gray.active:focus,html .btn-outline-gray.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-gray:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-gray:focus,html[data-netbox-color-mode=dark] .btn-outline-gray:active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray.active:focus,html[data-netbox-color-mode=dark] .btn-outline-gray.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-gray:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-gray:focus,html[data-netbox-color-mode=light] .btn-outline-gray:active:focus,html[data-netbox-color-mode=light] .btn-outline-gray.active:focus,html[data-netbox-color-mode=light] .btn-outline-gray.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #adb5bd80}html .btn-outline-gray:disabled,html .btn-outline-gray.disabled,html[data-netbox-color-mode=dark] .btn-outline-gray:disabled,html[data-netbox-color-mode=dark] .btn-outline-gray.disabled,html[data-netbox-color-mode=light] .btn-outline-gray:disabled,html[data-netbox-color-mode=light] .btn-outline-gray.disabled{color:#adb5bd;background-color:transparent}}@media print{html .btn-outline-black,html[data-netbox-color-mode=dark] .btn-outline-black,html[data-netbox-color-mode=light] .btn-outline-black{color:#000;border-color:#000}html .btn-outline-black:hover,html[data-netbox-color-mode=dark] .btn-outline-black:hover,html[data-netbox-color-mode=light] .btn-outline-black:hover{color:#fff;background-color:#000;border-color:#000}.btn-check:focus+html .btn-outline-black,html .btn-outline-black:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-black,html[data-netbox-color-mode=dark] .btn-outline-black:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-black,html[data-netbox-color-mode=light] .btn-outline-black:focus{box-shadow:0 0 0 .25rem #00000080}.btn-check:checked+html .btn-outline-black,.btn-check:active+html .btn-outline-black,html .btn-outline-black:active,html .btn-outline-black.active,html .btn-outline-black.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-black,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-black,html[data-netbox-color-mode=dark] .btn-outline-black:active,html[data-netbox-color-mode=dark] .btn-outline-black.active,html[data-netbox-color-mode=dark] .btn-outline-black.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-black,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-black,html[data-netbox-color-mode=light] .btn-outline-black:active,html[data-netbox-color-mode=light] .btn-outline-black.active,html[data-netbox-color-mode=light] .btn-outline-black.dropdown-toggle.show{color:#fff;background-color:#000;border-color:#000}.btn-check:checked+html .btn-outline-black:focus,.btn-check:active+html .btn-outline-black:focus,html .btn-outline-black:active:focus,html .btn-outline-black.active:focus,html .btn-outline-black.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-black:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-black:focus,html[data-netbox-color-mode=dark] .btn-outline-black:active:focus,html[data-netbox-color-mode=dark] .btn-outline-black.active:focus,html[data-netbox-color-mode=dark] .btn-outline-black.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-black:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-black:focus,html[data-netbox-color-mode=light] .btn-outline-black:active:focus,html[data-netbox-color-mode=light] .btn-outline-black.active:focus,html[data-netbox-color-mode=light] .btn-outline-black.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #00000080}html .btn-outline-black:disabled,html .btn-outline-black.disabled,html[data-netbox-color-mode=dark] .btn-outline-black:disabled,html[data-netbox-color-mode=dark] .btn-outline-black.disabled,html[data-netbox-color-mode=light] .btn-outline-black:disabled,html[data-netbox-color-mode=light] .btn-outline-black.disabled{color:#000;background-color:transparent}}@media print{html .btn-outline-white,html[data-netbox-color-mode=dark] .btn-outline-white,html[data-netbox-color-mode=light] .btn-outline-white{color:#fff;border-color:#fff}html .btn-outline-white:hover,html[data-netbox-color-mode=dark] .btn-outline-white:hover,html[data-netbox-color-mode=light] .btn-outline-white:hover{color:#000;background-color:#fff;border-color:#fff}.btn-check:focus+html .btn-outline-white,html .btn-outline-white:focus,.btn-check:focus+html[data-netbox-color-mode=dark] .btn-outline-white,html[data-netbox-color-mode=dark] .btn-outline-white:focus,.btn-check:focus+html[data-netbox-color-mode=light] .btn-outline-white,html[data-netbox-color-mode=light] .btn-outline-white:focus{box-shadow:0 0 0 .25rem #ffffff80}.btn-check:checked+html .btn-outline-white,.btn-check:active+html .btn-outline-white,html .btn-outline-white:active,html .btn-outline-white.active,html .btn-outline-white.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-white,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-white,html[data-netbox-color-mode=dark] .btn-outline-white:active,html[data-netbox-color-mode=dark] .btn-outline-white.active,html[data-netbox-color-mode=dark] .btn-outline-white.dropdown-toggle.show,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-white,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-white,html[data-netbox-color-mode=light] .btn-outline-white:active,html[data-netbox-color-mode=light] .btn-outline-white.active,html[data-netbox-color-mode=light] .btn-outline-white.dropdown-toggle.show{color:#000;background-color:#fff;border-color:#fff}.btn-check:checked+html .btn-outline-white:focus,.btn-check:active+html .btn-outline-white:focus,html .btn-outline-white:active:focus,html .btn-outline-white.active:focus,html .btn-outline-white.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=dark] .btn-outline-white:focus,.btn-check:active+html[data-netbox-color-mode=dark] .btn-outline-white:focus,html[data-netbox-color-mode=dark] .btn-outline-white:active:focus,html[data-netbox-color-mode=dark] .btn-outline-white.active:focus,html[data-netbox-color-mode=dark] .btn-outline-white.dropdown-toggle.show:focus,.btn-check:checked+html[data-netbox-color-mode=light] .btn-outline-white:focus,.btn-check:active+html[data-netbox-color-mode=light] .btn-outline-white:focus,html[data-netbox-color-mode=light] .btn-outline-white:active:focus,html[data-netbox-color-mode=light] .btn-outline-white.active:focus,html[data-netbox-color-mode=light] .btn-outline-white.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #ffffff80}html .btn-outline-white:disabled,html .btn-outline-white.disabled,html[data-netbox-color-mode=dark] .btn-outline-white:disabled,html[data-netbox-color-mode=dark] .btn-outline-white.disabled,html[data-netbox-color-mode=light] .btn-outline-white:disabled,html[data-netbox-color-mode=light] .btn-outline-white.disabled{color:#fff;background-color:transparent}}@media print{html .btn-link,html[data-netbox-color-mode=dark] .btn-link,html[data-netbox-color-mode=light] .btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}html .btn-link:hover,html[data-netbox-color-mode=dark] .btn-link:hover,html[data-netbox-color-mode=light] .btn-link:hover{color:#0a58ca}html .btn-link:disabled,html .btn-link.disabled,html[data-netbox-color-mode=dark] .btn-link:disabled,html[data-netbox-color-mode=dark] .btn-link.disabled,html[data-netbox-color-mode=light] .btn-link:disabled,html[data-netbox-color-mode=light] .btn-link.disabled{color:#6c757d}}@media print{html .btn-lg,html .btn-group-lg>.btn,html[data-netbox-color-mode=dark] .btn-lg,html[data-netbox-color-mode=light] .btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.75rem}}@media print{html .btn-sm,html .btn-group-sm>.btn,html[data-netbox-color-mode=dark] .btn-sm,html[data-netbox-color-mode=light] .btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}}@media print{html .fade,html[data-netbox-color-mode=dark] .fade,html[data-netbox-color-mode=light] .fade{transition:opacity .15s linear}}@media print and (prefers-reduced-motion: reduce){html .fade,html[data-netbox-color-mode=dark] .fade,html[data-netbox-color-mode=light] .fade{transition:none}}@media print{html .fade:not(.show),html[data-netbox-color-mode=dark] .fade:not(.show),html[data-netbox-color-mode=light] .fade:not(.show){opacity:0}}@media print{html .collapse:not(.show),html[data-netbox-color-mode=dark] .collapse:not(.show),html[data-netbox-color-mode=light] .collapse:not(.show){display:none}}@media print{html .collapsing,html[data-netbox-color-mode=dark] .collapsing,html[data-netbox-color-mode=light] .collapsing{height:0;overflow:hidden;transition:height .35s ease}}@media print and (prefers-reduced-motion: reduce){html .collapsing,html[data-netbox-color-mode=dark] .collapsing,html[data-netbox-color-mode=light] .collapsing{transition:none}}@media print{html .dropup,html .dropend,html .dropdown,html .dropstart,html[data-netbox-color-mode=dark] .dropup,html[data-netbox-color-mode=dark] .dropend,html[data-netbox-color-mode=dark] .dropdown,html[data-netbox-color-mode=dark] .dropstart,html[data-netbox-color-mode=light] .dropup,html[data-netbox-color-mode=light] .dropend,html[data-netbox-color-mode=light] .dropdown,html[data-netbox-color-mode=light] .dropstart{position:relative}}@media print{html .dropdown-toggle,html[data-netbox-color-mode=dark] .dropdown-toggle,html[data-netbox-color-mode=light] .dropdown-toggle{white-space:nowrap}html .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}html .dropdown-toggle:empty:after,html[data-netbox-color-mode=dark] .dropdown-toggle:empty:after,html[data-netbox-color-mode=light] .dropdown-toggle:empty:after{margin-left:0}}@media print{html .dropdown-menu,html[data-netbox-color-mode=dark] .dropdown-menu,html[data-netbox-color-mode=light] .dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.375rem}html .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}}@media print{html .dropdown-menu-start,html[data-netbox-color-mode=dark] .dropdown-menu-start,html[data-netbox-color-mode=light] .dropdown-menu-start{--bs-position: start}html .dropdown-menu-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-start[data-bs-popper]{right:auto;left:0}}@media print{html .dropdown-menu-end,html[data-netbox-color-mode=dark] .dropdown-menu-end,html[data-netbox-color-mode=light] .dropdown-menu-end{--bs-position: end}html .dropdown-menu-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 576px){html .dropdown-menu-sm-start,html[data-netbox-color-mode=dark] .dropdown-menu-sm-start,html[data-netbox-color-mode=light] .dropdown-menu-sm-start{--bs-position: start}html .dropdown-menu-sm-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-sm-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-sm-end,html[data-netbox-color-mode=dark] .dropdown-menu-sm-end,html[data-netbox-color-mode=light] .dropdown-menu-sm-end{--bs-position: end}html .dropdown-menu-sm-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-sm-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 768px){html .dropdown-menu-md-start,html[data-netbox-color-mode=dark] .dropdown-menu-md-start,html[data-netbox-color-mode=light] .dropdown-menu-md-start{--bs-position: start}html .dropdown-menu-md-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-md-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-md-end,html[data-netbox-color-mode=dark] .dropdown-menu-md-end,html[data-netbox-color-mode=light] .dropdown-menu-md-end{--bs-position: end}html .dropdown-menu-md-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-md-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 992px){html .dropdown-menu-lg-start,html[data-netbox-color-mode=dark] .dropdown-menu-lg-start,html[data-netbox-color-mode=light] .dropdown-menu-lg-start{--bs-position: start}html .dropdown-menu-lg-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-lg-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-lg-end,html[data-netbox-color-mode=dark] .dropdown-menu-lg-end,html[data-netbox-color-mode=light] .dropdown-menu-lg-end{--bs-position: end}html .dropdown-menu-lg-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-lg-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 1200px){html .dropdown-menu-xl-start,html[data-netbox-color-mode=dark] .dropdown-menu-xl-start,html[data-netbox-color-mode=light] .dropdown-menu-xl-start{--bs-position: start}html .dropdown-menu-xl-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-xl-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-xl-end,html[data-netbox-color-mode=dark] .dropdown-menu-xl-end,html[data-netbox-color-mode=light] .dropdown-menu-xl-end{--bs-position: end}html .dropdown-menu-xl-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-xl-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media print and (min-width: 1400px){html .dropdown-menu-xxl-start,html[data-netbox-color-mode=dark] .dropdown-menu-xxl-start,html[data-netbox-color-mode=light] .dropdown-menu-xxl-start{--bs-position: start}html .dropdown-menu-xxl-start[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-xxl-start[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}html .dropdown-menu-xxl-end,html[data-netbox-color-mode=dark] .dropdown-menu-xxl-end,html[data-netbox-color-mode=light] .dropdown-menu-xxl-end{--bs-position: end}html .dropdown-menu-xxl-end[data-bs-popper],html[data-netbox-color-mode=dark] .dropdown-menu-xxl-end[data-bs-popper],html[data-netbox-color-mode=light] .dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}@media print{html .dropup .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=dark] .dropup .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=light] .dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}html .dropup .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropup .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}html .dropup .dropdown-toggle:empty:after,html[data-netbox-color-mode=dark] .dropup .dropdown-toggle:empty:after,html[data-netbox-color-mode=light] .dropup .dropdown-toggle:empty:after{margin-left:0}}@media print{html .dropend .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=dark] .dropend .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=light] .dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}html .dropend .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}html .dropend .dropdown-toggle:empty:after,html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:empty:after,html[data-netbox-color-mode=light] .dropend .dropdown-toggle:empty:after{margin-left:0}html .dropend .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropend .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropend .dropdown-toggle:after{vertical-align:0}}@media print{html .dropstart .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=dark] .dropstart .dropdown-menu[data-bs-popper],html[data-netbox-color-mode=light] .dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}html .dropstart .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}html .dropstart .dropdown-toggle:after,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:after,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:after{display:none}html .dropstart .dropdown-toggle:before,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:before,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}html .dropstart .dropdown-toggle:empty:after,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:empty:after,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:empty:after{margin-left:0}html .dropstart .dropdown-toggle:before,html[data-netbox-color-mode=dark] .dropstart .dropdown-toggle:before,html[data-netbox-color-mode=light] .dropstart .dropdown-toggle:before{vertical-align:0}}@media print{html .dropdown-divider,html[data-netbox-color-mode=dark] .dropdown-divider,html[data-netbox-color-mode=light] .dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}}@media print{html .dropdown-item,html[data-netbox-color-mode=dark] .dropdown-item,html[data-netbox-color-mode=light] .dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}html .dropdown-item:hover,html .dropdown-item:focus,html[data-netbox-color-mode=dark] .dropdown-item:hover,html[data-netbox-color-mode=dark] .dropdown-item:focus,html[data-netbox-color-mode=light] .dropdown-item:hover,html[data-netbox-color-mode=light] .dropdown-item:focus{color:#1e2125;background-color:#e9ecef}html .dropdown-item.active,html .dropdown-item:active,html[data-netbox-color-mode=dark] .dropdown-item.active,html[data-netbox-color-mode=dark] .dropdown-item:active,html[data-netbox-color-mode=light] .dropdown-item.active,html[data-netbox-color-mode=light] .dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}html .dropdown-item.disabled,html .dropdown-item:disabled,html[data-netbox-color-mode=dark] .dropdown-item.disabled,html[data-netbox-color-mode=dark] .dropdown-item:disabled,html[data-netbox-color-mode=light] .dropdown-item.disabled,html[data-netbox-color-mode=light] .dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}}@media print{html .dropdown-menu.show,html[data-netbox-color-mode=dark] .dropdown-menu.show,html[data-netbox-color-mode=light] .dropdown-menu.show{display:block}}@media print{html .dropdown-header,html[data-netbox-color-mode=dark] .dropdown-header,html[data-netbox-color-mode=light] .dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}}@media print{html .dropdown-item-text,html[data-netbox-color-mode=dark] .dropdown-item-text,html[data-netbox-color-mode=light] .dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}}@media print{html .dropdown-menu-dark,html[data-netbox-color-mode=dark] .dropdown-menu-dark,html[data-netbox-color-mode=light] .dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#00000026}html .dropdown-menu-dark .dropdown-item,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item{color:#dee2e6}html .dropdown-menu-dark .dropdown-item:hover,html .dropdown-menu-dark .dropdown-item:focus,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:hover,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:focus,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item:hover,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:#ffffff26}html .dropdown-menu-dark .dropdown-item.active,html .dropdown-menu-dark .dropdown-item:active,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item.active,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:active,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item.active,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}html .dropdown-menu-dark .dropdown-item.disabled,html .dropdown-menu-dark .dropdown-item:disabled,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item.disabled,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item:disabled,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item.disabled,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}html .dropdown-menu-dark .dropdown-divider,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-divider,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-divider{border-color:#00000026}html .dropdown-menu-dark .dropdown-item-text,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-item-text,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-item-text{color:#dee2e6}html .dropdown-menu-dark .dropdown-header,html[data-netbox-color-mode=dark] .dropdown-menu-dark .dropdown-header,html[data-netbox-color-mode=light] .dropdown-menu-dark .dropdown-header{color:#adb5bd}}@media print{html .btn-group,html .btn-group-vertical,html[data-netbox-color-mode=dark] .btn-group,html[data-netbox-color-mode=dark] .btn-group-vertical,html[data-netbox-color-mode=light] .btn-group,html[data-netbox-color-mode=light] .btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}html .btn-group>.btn,html .btn-group-vertical>.btn,html[data-netbox-color-mode=dark] .btn-group>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn,html[data-netbox-color-mode=light] .btn-group>.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn{position:relative;flex:1 1 auto}html .btn-group>.btn-check:checked+.btn,html .btn-group>.btn-check:focus+.btn,html .btn-group>.btn:hover,html .btn-group>.btn:focus,html .btn-group>.btn:active,html .btn-group>.btn.active,html .btn-group-vertical>.btn-check:checked+.btn,html .btn-group-vertical>.btn-check:focus+.btn,html .btn-group-vertical>.btn:hover,html .btn-group-vertical>.btn:focus,html .btn-group-vertical>.btn:active,html .btn-group-vertical>.btn.active,html[data-netbox-color-mode=dark] .btn-group>.btn-check:checked+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn-check:focus+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn:hover,html[data-netbox-color-mode=dark] .btn-group>.btn:focus,html[data-netbox-color-mode=dark] .btn-group>.btn:active,html[data-netbox-color-mode=dark] .btn-group>.btn.active,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-check:checked+.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-check:focus+.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:hover,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:focus,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:active,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn.active,html[data-netbox-color-mode=light] .btn-group>.btn-check:checked+.btn,html[data-netbox-color-mode=light] .btn-group>.btn-check:focus+.btn,html[data-netbox-color-mode=light] .btn-group>.btn:hover,html[data-netbox-color-mode=light] .btn-group>.btn:focus,html[data-netbox-color-mode=light] .btn-group>.btn:active,html[data-netbox-color-mode=light] .btn-group>.btn.active,html[data-netbox-color-mode=light] .btn-group-vertical>.btn-check:checked+.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn-check:focus+.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn:hover,html[data-netbox-color-mode=light] .btn-group-vertical>.btn:focus,html[data-netbox-color-mode=light] .btn-group-vertical>.btn:active,html[data-netbox-color-mode=light] .btn-group-vertical>.btn.active{z-index:1}}@media print{html .btn-toolbar,html[data-netbox-color-mode=dark] .btn-toolbar,html[data-netbox-color-mode=light] .btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}html .btn-toolbar .input-group,html[data-netbox-color-mode=dark] .btn-toolbar .input-group,html[data-netbox-color-mode=light] .btn-toolbar .input-group{width:auto}}@media print{html .btn-group>.btn:not(:first-child),html .btn-group>.btn-group:not(:first-child),html[data-netbox-color-mode=dark] .btn-group>.btn:not(:first-child),html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:first-child),html[data-netbox-color-mode=light] .btn-group>.btn:not(:first-child),html[data-netbox-color-mode=light] .btn-group>.btn-group:not(:first-child){margin-left:-1px}html .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html .btn-group>.btn-group:not(:last-child)>.btn,html[data-netbox-color-mode=dark] .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:last-child)>.btn,html[data-netbox-color-mode=light] .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=light] .btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}html .btn-group>.btn:nth-child(n+3),html .btn-group>:not(.btn-check)+.btn,html .btn-group>.btn-group:not(:first-child)>.btn,html[data-netbox-color-mode=dark] .btn-group>.btn:nth-child(n+3),html[data-netbox-color-mode=dark] .btn-group>:not(.btn-check)+.btn,html[data-netbox-color-mode=dark] .btn-group>.btn-group:not(:first-child)>.btn,html[data-netbox-color-mode=light] .btn-group>.btn:nth-child(n+3),html[data-netbox-color-mode=light] .btn-group>:not(.btn-check)+.btn,html[data-netbox-color-mode=light] .btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}}@media print{html .dropdown-toggle-split,html[data-netbox-color-mode=dark] .dropdown-toggle-split,html[data-netbox-color-mode=light] .dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}html .dropdown-toggle-split:after,.dropup html .dropdown-toggle-split:after,.dropend html .dropdown-toggle-split:after,html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,.dropup html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,.dropend html[data-netbox-color-mode=dark] .dropdown-toggle-split:after,html[data-netbox-color-mode=light] .dropdown-toggle-split:after,.dropup html[data-netbox-color-mode=light] .dropdown-toggle-split:after,.dropend html[data-netbox-color-mode=light] .dropdown-toggle-split:after{margin-left:0}.dropstart html .dropdown-toggle-split:before,.dropstart html[data-netbox-color-mode=dark] .dropdown-toggle-split:before,.dropstart html[data-netbox-color-mode=light] .dropdown-toggle-split:before{margin-right:0}}@media print{html .btn-sm+.dropdown-toggle-split,html .btn-group-sm>.btn+.dropdown-toggle-split,html[data-netbox-color-mode=dark] .btn-sm+.dropdown-toggle-split,html[data-netbox-color-mode=light] .btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}}@media print{html .btn-lg+.dropdown-toggle-split,html .btn-group-lg>.btn+.dropdown-toggle-split,html[data-netbox-color-mode=dark] .btn-lg+.dropdown-toggle-split,html[data-netbox-color-mode=light] .btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}}@media print{html .btn-group-vertical,html[data-netbox-color-mode=dark] .btn-group-vertical,html[data-netbox-color-mode=light] .btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}html .btn-group-vertical>.btn,html .btn-group-vertical>.btn-group,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group,html[data-netbox-color-mode=light] .btn-group-vertical>.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn-group{width:100%}html .btn-group-vertical>.btn:not(:first-child),html .btn-group-vertical>.btn-group:not(:first-child),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:not(:first-child),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:first-child),html[data-netbox-color-mode=light] .btn-group-vertical>.btn:not(:first-child),html[data-netbox-color-mode=light] .btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}html .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),html .btn-group-vertical>.btn-group:not(:last-child)>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:last-child)>.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),html[data-netbox-color-mode=light] .btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}html .btn-group-vertical>.btn~.btn,html .btn-group-vertical>.btn-group:not(:first-child)>.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn~.btn,html[data-netbox-color-mode=dark] .btn-group-vertical>.btn-group:not(:first-child)>.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn~.btn,html[data-netbox-color-mode=light] .btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}}@media print{html .nav,html[data-netbox-color-mode=dark] .nav,html[data-netbox-color-mode=light] .nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}}@media print{html .nav-link,html[data-netbox-color-mode=dark] .nav-link,html[data-netbox-color-mode=light] .nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .nav-link,html[data-netbox-color-mode=dark] .nav-link,html[data-netbox-color-mode=light] .nav-link{transition:none}}@media print{html .nav-link:hover,html .nav-link:focus,html[data-netbox-color-mode=dark] .nav-link:hover,html[data-netbox-color-mode=dark] .nav-link:focus,html[data-netbox-color-mode=light] .nav-link:hover,html[data-netbox-color-mode=light] .nav-link:focus{color:#0a58ca}}@media print{html .nav-link.disabled,html[data-netbox-color-mode=dark] .nav-link.disabled,html[data-netbox-color-mode=light] .nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}}@media print{html .nav-tabs,html[data-netbox-color-mode=dark] .nav-tabs,html[data-netbox-color-mode=light] .nav-tabs{border-bottom:1px solid #dee2e6}html .nav-tabs .nav-link,html[data-netbox-color-mode=dark] .nav-tabs .nav-link,html[data-netbox-color-mode=light] .nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:.375rem;border-top-right-radius:.375rem}html .nav-tabs .nav-link:hover,html .nav-tabs .nav-link:focus,html[data-netbox-color-mode=dark] .nav-tabs .nav-link:hover,html[data-netbox-color-mode=dark] .nav-tabs .nav-link:focus,html[data-netbox-color-mode=light] .nav-tabs .nav-link:hover,html[data-netbox-color-mode=light] .nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}html .nav-tabs .nav-link.disabled,html[data-netbox-color-mode=dark] .nav-tabs .nav-link.disabled,html[data-netbox-color-mode=light] .nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}html .nav-tabs .nav-link.active,html .nav-tabs .nav-item.show .nav-link,html[data-netbox-color-mode=dark] .nav-tabs .nav-link.active,html[data-netbox-color-mode=dark] .nav-tabs .nav-item.show .nav-link,html[data-netbox-color-mode=light] .nav-tabs .nav-link.active,html[data-netbox-color-mode=light] .nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}html .nav-tabs .dropdown-menu,html[data-netbox-color-mode=dark] .nav-tabs .dropdown-menu,html[data-netbox-color-mode=light] .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}}@media print{html .nav-pills .nav-link,html[data-netbox-color-mode=dark] .nav-pills .nav-link,html[data-netbox-color-mode=light] .nav-pills .nav-link{background:none;border:0;border-radius:.375rem}html .nav-pills .nav-link.active,html .nav-pills .show>.nav-link,html[data-netbox-color-mode=dark] .nav-pills .nav-link.active,html[data-netbox-color-mode=dark] .nav-pills .show>.nav-link,html[data-netbox-color-mode=light] .nav-pills .nav-link.active,html[data-netbox-color-mode=light] .nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}}@media print{html .nav-fill>.nav-link,html .nav-fill .nav-item,html[data-netbox-color-mode=dark] .nav-fill>.nav-link,html[data-netbox-color-mode=dark] .nav-fill .nav-item,html[data-netbox-color-mode=light] .nav-fill>.nav-link,html[data-netbox-color-mode=light] .nav-fill .nav-item{flex:1 1 auto;text-align:center}}@media print{html .nav-justified>.nav-link,html .nav-justified .nav-item,html[data-netbox-color-mode=dark] .nav-justified>.nav-link,html[data-netbox-color-mode=dark] .nav-justified .nav-item,html[data-netbox-color-mode=light] .nav-justified>.nav-link,html[data-netbox-color-mode=light] .nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}}@media print{html .nav-fill .nav-item .nav-link,html .nav-justified .nav-item .nav-link,html[data-netbox-color-mode=dark] .nav-fill .nav-item .nav-link,html[data-netbox-color-mode=dark] .nav-justified .nav-item .nav-link,html[data-netbox-color-mode=light] .nav-fill .nav-item .nav-link,html[data-netbox-color-mode=light] .nav-justified .nav-item .nav-link{width:100%}}@media print{html .tab-content>.tab-pane,html[data-netbox-color-mode=dark] .tab-content>.tab-pane,html[data-netbox-color-mode=light] .tab-content>.tab-pane{display:none}html .tab-content>.active,html[data-netbox-color-mode=dark] .tab-content>.active,html[data-netbox-color-mode=light] .tab-content>.active{display:block}}@media print{html .navbar,html[data-netbox-color-mode=dark] .navbar,html[data-netbox-color-mode=light] .navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}html[data-netbox-color-mode=dark] .navbar>.container-xxl,html[data-netbox-color-mode=light] .navbar>.container-xxl,html[data-netbox-color-mode=dark] .navbar>.container-xl,html[data-netbox-color-mode=light] .navbar>.container-xl,html[data-netbox-color-mode=dark] .navbar>.container-lg,html[data-netbox-color-mode=light] .navbar>.container-lg,html[data-netbox-color-mode=dark] .navbar>.container-md,html[data-netbox-color-mode=light] .navbar>.container-md,html[data-netbox-color-mode=dark] .navbar>.container-sm,html[data-netbox-color-mode=light] .navbar>.container-sm,html .navbar>.container,html .navbar>.container-fluid,html .navbar>.container-sm,html .navbar>.container-md,html .navbar>.container-lg,html .navbar>.container-xl,html .navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}}@media print{html .navbar-brand,html[data-netbox-color-mode=dark] .navbar-brand,html[data-netbox-color-mode=light] .navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}}@media print{html .navbar-nav,html[data-netbox-color-mode=dark] .navbar-nav,html[data-netbox-color-mode=light] .navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}html .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-nav .nav-link{padding-right:0;padding-left:0}html .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-nav .dropdown-menu{position:static}}@media print{html .navbar-text,html[data-netbox-color-mode=dark] .navbar-text,html[data-netbox-color-mode=light] .navbar-text{padding-top:.5rem;padding-bottom:.5rem}}@media print{html .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-collapse,html[data-netbox-color-mode=light] .navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}}@media print{html .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-toggler,html[data-netbox-color-mode=light] .navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.375rem;transition:box-shadow .15s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-toggler,html[data-netbox-color-mode=light] .navbar-toggler{transition:none}}@media print{html .navbar-toggler:hover,html[data-netbox-color-mode=dark] .navbar-toggler:hover,html[data-netbox-color-mode=light] .navbar-toggler:hover{text-decoration:none}}@media print{html .navbar-toggler:focus,html[data-netbox-color-mode=dark] .navbar-toggler:focus,html[data-netbox-color-mode=light] .navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}}@media print{html .navbar-toggler-icon,html[data-netbox-color-mode=dark] .navbar-toggler-icon,html[data-netbox-color-mode=light] .navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}}@media print{html .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}}@media print and (min-width: 576px){html .navbar-expand-sm,html[data-netbox-color-mode=dark] .navbar-expand-sm,html[data-netbox-color-mode=light] .navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-sm .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-nav{flex-direction:row}html .navbar-expand-sm .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-sm .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-sm .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-nav-scroll{overflow:visible}html .navbar-expand-sm .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-sm .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-sm .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-sm .navbar-toggler{display:none}}@media print and (min-width: 768px){html .navbar-expand-md,html[data-netbox-color-mode=dark] .navbar-expand-md,html[data-netbox-color-mode=light] .navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-md .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-nav{flex-direction:row}html .navbar-expand-md .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-md .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-md .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-nav-scroll{overflow:visible}html .navbar-expand-md .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-md .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-md .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-md .navbar-toggler{display:none}}@media print and (min-width: 992px){html .navbar-expand-lg,html[data-netbox-color-mode=dark] .navbar-expand-lg,html[data-netbox-color-mode=light] .navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-lg .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-nav{flex-direction:row}html .navbar-expand-lg .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-lg .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-lg .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-nav-scroll{overflow:visible}html .navbar-expand-lg .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-lg .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-lg .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-lg .navbar-toggler{display:none}}@media print and (min-width: 1200px){html .navbar-expand-xl,html[data-netbox-color-mode=dark] .navbar-expand-xl,html[data-netbox-color-mode=light] .navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-xl .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-nav{flex-direction:row}html .navbar-expand-xl .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-xl .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-xl .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-nav-scroll{overflow:visible}html .navbar-expand-xl .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-xl .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-xl .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-xl .navbar-toggler{display:none}}@media print and (min-width: 1400px){html .navbar-expand-xxl,html[data-netbox-color-mode=dark] .navbar-expand-xxl,html[data-netbox-color-mode=light] .navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand-xxl .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-nav{flex-direction:row}html .navbar-expand-xxl .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand-xxl .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand-xxl .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-nav-scroll{overflow:visible}html .navbar-expand-xxl .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand-xxl .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand-xxl .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand-xxl .navbar-toggler{display:none}}@media print{html .navbar-expand,html[data-netbox-color-mode=dark] .navbar-expand,html[data-netbox-color-mode=light] .navbar-expand{flex-wrap:nowrap;justify-content:flex-start}html .navbar-expand .navbar-nav,html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav,html[data-netbox-color-mode=light] .navbar-expand .navbar-nav{flex-direction:row}html .navbar-expand .navbar-nav .dropdown-menu,html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav .dropdown-menu,html[data-netbox-color-mode=light] .navbar-expand .navbar-nav .dropdown-menu{position:absolute}html .navbar-expand .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}html .navbar-expand .navbar-nav-scroll,html[data-netbox-color-mode=dark] .navbar-expand .navbar-nav-scroll,html[data-netbox-color-mode=light] .navbar-expand .navbar-nav-scroll{overflow:visible}html .navbar-expand .navbar-collapse,html[data-netbox-color-mode=dark] .navbar-expand .navbar-collapse,html[data-netbox-color-mode=light] .navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}html .navbar-expand .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-expand .navbar-toggler,html[data-netbox-color-mode=light] .navbar-expand .navbar-toggler{display:none}}@media print{html .navbar-light .navbar-brand,html[data-netbox-color-mode=dark] .navbar-light .navbar-brand,html[data-netbox-color-mode=light] .navbar-light .navbar-brand{color:#000000e6}html .navbar-light .navbar-brand:hover,html .navbar-light .navbar-brand:focus,html[data-netbox-color-mode=dark] .navbar-light .navbar-brand:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-brand:focus,html[data-netbox-color-mode=light] .navbar-light .navbar-brand:hover,html[data-netbox-color-mode=light] .navbar-light .navbar-brand:focus{color:#000000e6}html .navbar-light .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link{color:#0000008c}html .navbar-light .navbar-nav .nav-link:hover,html .navbar-light .navbar-nav .nav-link:focus,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link:focus,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link:hover,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link:focus{color:#000000b3}html .navbar-light .navbar-nav .nav-link.disabled,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link.disabled,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}html .navbar-light .navbar-nav .show>.nav-link,html .navbar-light .navbar-nav .nav-link.active,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .show>.nav-link,html[data-netbox-color-mode=dark] .navbar-light .navbar-nav .nav-link.active,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .show>.nav-link,html[data-netbox-color-mode=light] .navbar-light .navbar-nav .nav-link.active{color:#000000e6}html .navbar-light .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-light .navbar-toggler,html[data-netbox-color-mode=light] .navbar-light .navbar-toggler{color:#0000008c;border-color:#0000001a}html .navbar-light .navbar-toggler-icon,html[data-netbox-color-mode=dark] .navbar-light .navbar-toggler-icon,html[data-netbox-color-mode=light] .navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html .navbar-light .navbar-text,html[data-netbox-color-mode=dark] .navbar-light .navbar-text,html[data-netbox-color-mode=light] .navbar-light .navbar-text{color:#0000008c}html .navbar-light .navbar-text a,html .navbar-light .navbar-text a:hover,html .navbar-light .navbar-text a:focus,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a:hover,html[data-netbox-color-mode=dark] .navbar-light .navbar-text a:focus,html[data-netbox-color-mode=light] .navbar-light .navbar-text a,html[data-netbox-color-mode=light] .navbar-light .navbar-text a:hover,html[data-netbox-color-mode=light] .navbar-light .navbar-text a:focus{color:#000000e6}}@media print{html .navbar-dark .navbar-brand,html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand,html[data-netbox-color-mode=light] .navbar-dark .navbar-brand{color:#fff}html .navbar-dark .navbar-brand:hover,html .navbar-dark .navbar-brand:focus,html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-brand:focus,html[data-netbox-color-mode=light] .navbar-dark .navbar-brand:hover,html[data-netbox-color-mode=light] .navbar-dark .navbar-brand:focus{color:#fff}html .navbar-dark .navbar-nav .nav-link,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link{color:#ffffff8c}html .navbar-dark .navbar-nav .nav-link:hover,html .navbar-dark .navbar-nav .nav-link:focus,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link:focus,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link:hover,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link:focus{color:#ffffffbf}html .navbar-dark .navbar-nav .nav-link.disabled,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link.disabled,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}html .navbar-dark .navbar-nav .show>.nav-link,html .navbar-dark .navbar-nav .nav-link.active,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .show>.nav-link,html[data-netbox-color-mode=dark] .navbar-dark .navbar-nav .nav-link.active,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .show>.nav-link,html[data-netbox-color-mode=light] .navbar-dark .navbar-nav .nav-link.active{color:#fff}html .navbar-dark .navbar-toggler,html[data-netbox-color-mode=dark] .navbar-dark .navbar-toggler,html[data-netbox-color-mode=light] .navbar-dark .navbar-toggler{color:#ffffff8c;border-color:#ffffff1a}html .navbar-dark .navbar-toggler-icon,html[data-netbox-color-mode=dark] .navbar-dark .navbar-toggler-icon,html[data-netbox-color-mode=light] .navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html .navbar-dark .navbar-text,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text,html[data-netbox-color-mode=light] .navbar-dark .navbar-text{color:#ffffff8c}html .navbar-dark .navbar-text a,html .navbar-dark .navbar-text a:hover,html .navbar-dark .navbar-text a:focus,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a:hover,html[data-netbox-color-mode=dark] .navbar-dark .navbar-text a:focus,html[data-netbox-color-mode=light] .navbar-dark .navbar-text a,html[data-netbox-color-mode=light] .navbar-dark .navbar-text a:hover,html[data-netbox-color-mode=light] .navbar-dark .navbar-text a:focus{color:#fff}}@media print{html .card,html[data-netbox-color-mode=dark] .card,html[data-netbox-color-mode=light] .card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.375rem}html .card>hr,html[data-netbox-color-mode=dark] .card>hr,html[data-netbox-color-mode=light] .card>hr{margin-right:0;margin-left:0}html .card>.list-group,html[data-netbox-color-mode=dark] .card>.list-group,html[data-netbox-color-mode=light] .card>.list-group{border-top:inherit;border-bottom:inherit}html .card>.list-group:first-child,html[data-netbox-color-mode=dark] .card>.list-group:first-child,html[data-netbox-color-mode=light] .card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html .card>.list-group:last-child,html[data-netbox-color-mode=dark] .card>.list-group:last-child,html[data-netbox-color-mode=light] .card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html .card>.card-header+.list-group,html .card>.list-group+.card-footer,html[data-netbox-color-mode=dark] .card>.card-header+.list-group,html[data-netbox-color-mode=dark] .card>.list-group+.card-footer,html[data-netbox-color-mode=light] .card>.card-header+.list-group,html[data-netbox-color-mode=light] .card>.list-group+.card-footer{border-top:0}}@media print{html .card-body,html[data-netbox-color-mode=dark] .card-body,html[data-netbox-color-mode=light] .card-body{flex:1 1 auto;padding:1rem}}@media print{html .card-title,html[data-netbox-color-mode=dark] .card-title,html[data-netbox-color-mode=light] .card-title{margin-bottom:.5rem}}@media print{html .card-subtitle,html[data-netbox-color-mode=dark] .card-subtitle,html[data-netbox-color-mode=light] .card-subtitle{margin-top:-.25rem;margin-bottom:0}}@media print{html .card-text:last-child,html[data-netbox-color-mode=dark] .card-text:last-child,html[data-netbox-color-mode=light] .card-text:last-child{margin-bottom:0}}@media print{html .card-link:hover,html[data-netbox-color-mode=dark] .card-link:hover,html[data-netbox-color-mode=light] .card-link:hover{text-decoration:none}html .card-link+.card-link,html[data-netbox-color-mode=dark] .card-link+.card-link,html[data-netbox-color-mode=light] .card-link+.card-link{margin-left:1rem}}@media print{html .card-header,html[data-netbox-color-mode=dark] .card-header,html[data-netbox-color-mode=light] .card-header{padding:.5rem 1rem;margin-bottom:0;color:#343a40;background-color:"unset";border-bottom:1px solid rgba(0,0,0,.125)}html .card-header:first-child,html[data-netbox-color-mode=dark] .card-header:first-child,html[data-netbox-color-mode=light] .card-header:first-child{border-radius:calc(.375rem - 1px) calc(.375rem - 1px) 0 0}}@media print{html .card-footer,html[data-netbox-color-mode=dark] .card-footer,html[data-netbox-color-mode=light] .card-footer{padding:.5rem 1rem;color:#343a40;background-color:"unset";border-top:1px solid rgba(0,0,0,.125)}html .card-footer:last-child,html[data-netbox-color-mode=dark] .card-footer:last-child,html[data-netbox-color-mode=light] .card-footer:last-child{border-radius:0 0 calc(.375rem - 1px) calc(.375rem - 1px)}}@media print{html .card-header-tabs,html[data-netbox-color-mode=dark] .card-header-tabs,html[data-netbox-color-mode=light] .card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}}@media print{html .card-header-pills,html[data-netbox-color-mode=dark] .card-header-pills,html[data-netbox-color-mode=light] .card-header-pills{margin-right:-.5rem;margin-left:-.5rem}}@media print{html .card-img-overlay,html[data-netbox-color-mode=dark] .card-img-overlay,html[data-netbox-color-mode=light] .card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.375rem - 1px)}}@media print{html .card-img,html .card-img-top,html .card-img-bottom,html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-top,html[data-netbox-color-mode=dark] .card-img-bottom,html[data-netbox-color-mode=light] .card-img,html[data-netbox-color-mode=light] .card-img-top,html[data-netbox-color-mode=light] .card-img-bottom{width:100%}}@media print{html .card-img,html .card-img-top,html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-top,html[data-netbox-color-mode=light] .card-img,html[data-netbox-color-mode=light] .card-img-top{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}}@media print{html .card-img,html .card-img-bottom,html[data-netbox-color-mode=dark] .card-img,html[data-netbox-color-mode=dark] .card-img-bottom,html[data-netbox-color-mode=light] .card-img,html[data-netbox-color-mode=light] .card-img-bottom{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}}@media print{html .card-group>.card,html[data-netbox-color-mode=dark] .card-group>.card,html[data-netbox-color-mode=light] .card-group>.card{margin-bottom:.75rem}}@media print and (min-width: 576px){html .card-group,html[data-netbox-color-mode=dark] .card-group,html[data-netbox-color-mode=light] .card-group{display:flex;flex-flow:row wrap}html .card-group>.card,html[data-netbox-color-mode=dark] .card-group>.card,html[data-netbox-color-mode=light] .card-group>.card{flex:1 0 0%;margin-bottom:0}html .card-group>.card+.card,html[data-netbox-color-mode=dark] .card-group>.card+.card,html[data-netbox-color-mode=light] .card-group>.card+.card{margin-left:0;border-left:0}html .card-group>.card:not(:last-child),html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child),html[data-netbox-color-mode=light] .card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html .card-group>.card:not(:last-child) .card-img-top,html .card-group>.card:not(:last-child) .card-header,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-img-top,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-header,html[data-netbox-color-mode=light] .card-group>.card:not(:last-child) .card-img-top,html[data-netbox-color-mode=light] .card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}html .card-group>.card:not(:last-child) .card-img-bottom,html .card-group>.card:not(:last-child) .card-footer,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-img-bottom,html[data-netbox-color-mode=dark] .card-group>.card:not(:last-child) .card-footer,html[data-netbox-color-mode=light] .card-group>.card:not(:last-child) .card-img-bottom,html[data-netbox-color-mode=light] .card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}html .card-group>.card:not(:first-child),html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child),html[data-netbox-color-mode=light] .card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}html .card-group>.card:not(:first-child) .card-img-top,html .card-group>.card:not(:first-child) .card-header,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-img-top,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-header,html[data-netbox-color-mode=light] .card-group>.card:not(:first-child) .card-img-top,html[data-netbox-color-mode=light] .card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}html .card-group>.card:not(:first-child) .card-img-bottom,html .card-group>.card:not(:first-child) .card-footer,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-img-bottom,html[data-netbox-color-mode=dark] .card-group>.card:not(:first-child) .card-footer,html[data-netbox-color-mode=light] .card-group>.card:not(:first-child) .card-img-bottom,html[data-netbox-color-mode=light] .card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}@media print{html .accordion-button,html[data-netbox-color-mode=dark] .accordion-button,html[data-netbox-color-mode=light] .accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}}@media print and (prefers-reduced-motion: reduce){html .accordion-button,html[data-netbox-color-mode=dark] .accordion-button,html[data-netbox-color-mode=light] .accordion-button{transition:none}}@media print{html .accordion-button:not(.collapsed),html[data-netbox-color-mode=dark] .accordion-button:not(.collapsed),html[data-netbox-color-mode=light] .accordion-button:not(.collapsed){color:#343a40;background-color:#cfe2ff;box-shadow:inset 0 -1px #dee2e6}html .accordion-button:not(.collapsed):after,html[data-netbox-color-mode=dark] .accordion-button:not(.collapsed):after,html[data-netbox-color-mode=light] .accordion-button:not(.collapsed):after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}}@media print{html .accordion-button:after,html[data-netbox-color-mode=dark] .accordion-button:after,html[data-netbox-color-mode=light] .accordion-button:after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .accordion-button:after,html[data-netbox-color-mode=dark] .accordion-button:after,html[data-netbox-color-mode=light] .accordion-button:after{transition:none}}@media print{html .accordion-button:hover,html[data-netbox-color-mode=dark] .accordion-button:hover,html[data-netbox-color-mode=light] .accordion-button:hover{z-index:2}}@media print{html .accordion-button:focus,html[data-netbox-color-mode=dark] .accordion-button:focus,html[data-netbox-color-mode=light] .accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .accordion-header,html[data-netbox-color-mode=dark] .accordion-header,html[data-netbox-color-mode=light] .accordion-header{margin-bottom:0}}@media print{html .accordion-item,html[data-netbox-color-mode=dark] .accordion-item,html[data-netbox-color-mode=light] .accordion-item{background-color:transparent;border:1px solid #dee2e6}html .accordion-item:first-of-type,html[data-netbox-color-mode=dark] .accordion-item:first-of-type,html[data-netbox-color-mode=light] .accordion-item:first-of-type{border-top-left-radius:.375rem;border-top-right-radius:.375rem}html .accordion-item:first-of-type .accordion-button,html[data-netbox-color-mode=dark] .accordion-item:first-of-type .accordion-button,html[data-netbox-color-mode=light] .accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html .accordion-item:not(:first-of-type),html[data-netbox-color-mode=dark] .accordion-item:not(:first-of-type),html[data-netbox-color-mode=light] .accordion-item:not(:first-of-type){border-top:0}html .accordion-item:last-of-type,html[data-netbox-color-mode=dark] .accordion-item:last-of-type,html[data-netbox-color-mode=light] .accordion-item:last-of-type{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html .accordion-item:last-of-type .accordion-button.collapsed,html[data-netbox-color-mode=dark] .accordion-item:last-of-type .accordion-button.collapsed,html[data-netbox-color-mode=light] .accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.375rem - 1px);border-bottom-left-radius:calc(.375rem - 1px)}html .accordion-item:last-of-type .accordion-collapse,html[data-netbox-color-mode=dark] .accordion-item:last-of-type .accordion-collapse,html[data-netbox-color-mode=light] .accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}}@media print{html .accordion-body,html[data-netbox-color-mode=dark] .accordion-body,html[data-netbox-color-mode=light] .accordion-body{padding:1rem 1.25rem}}@media print{html .accordion-flush .accordion-collapse,html[data-netbox-color-mode=dark] .accordion-flush .accordion-collapse,html[data-netbox-color-mode=light] .accordion-flush .accordion-collapse{border-width:0}html .accordion-flush .accordion-item,html[data-netbox-color-mode=dark] .accordion-flush .accordion-item,html[data-netbox-color-mode=light] .accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}html .accordion-flush .accordion-item:first-child,html[data-netbox-color-mode=dark] .accordion-flush .accordion-item:first-child,html[data-netbox-color-mode=light] .accordion-flush .accordion-item:first-child{border-top:0}html .accordion-flush .accordion-item:last-child,html[data-netbox-color-mode=dark] .accordion-flush .accordion-item:last-child,html[data-netbox-color-mode=light] .accordion-flush .accordion-item:last-child{border-bottom:0}html .accordion-flush .accordion-item .accordion-button,html[data-netbox-color-mode=dark] .accordion-flush .accordion-item .accordion-button,html[data-netbox-color-mode=light] .accordion-flush .accordion-item .accordion-button{border-radius:0}}@media print{html .breadcrumb,html[data-netbox-color-mode=dark] .breadcrumb,html[data-netbox-color-mode=light] .breadcrumb{display:flex;flex-wrap:wrap;padding:0;margin-bottom:1rem;list-style:none}}@media print{html .breadcrumb-item+.breadcrumb-item,html[data-netbox-color-mode=dark] .breadcrumb-item+.breadcrumb-item,html[data-netbox-color-mode=light] .breadcrumb-item+.breadcrumb-item{padding-left:.5rem}html .breadcrumb-item+.breadcrumb-item:before,html[data-netbox-color-mode=dark] .breadcrumb-item+.breadcrumb-item:before,html[data-netbox-color-mode=light] .breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='currentColor'/%3E%3C/svg%3E"))}html .breadcrumb-item.active,html[data-netbox-color-mode=dark] .breadcrumb-item.active,html[data-netbox-color-mode=light] .breadcrumb-item.active{color:#6c757d}}@media print{html .pagination,html[data-netbox-color-mode=dark] .pagination,html[data-netbox-color-mode=light] .pagination{display:flex;padding-left:0;list-style:none}}@media print{html .page-link,html[data-netbox-color-mode=dark] .page-link,html[data-netbox-color-mode=light] .page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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 print and (prefers-reduced-motion: reduce){html .page-link,html[data-netbox-color-mode=dark] .page-link,html[data-netbox-color-mode=light] .page-link{transition:none}}@media print{html .page-link:hover,html[data-netbox-color-mode=dark] .page-link:hover,html[data-netbox-color-mode=light] .page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}}@media print{html .page-link:focus,html[data-netbox-color-mode=dark] .page-link:focus,html[data-netbox-color-mode=light] .page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .page-item:not(:first-child) .page-link,html[data-netbox-color-mode=dark] .page-item:not(:first-child) .page-link,html[data-netbox-color-mode=light] .page-item:not(:first-child) .page-link{margin-left:-1px}html .page-item.active .page-link,html[data-netbox-color-mode=dark] .page-item.active .page-link,html[data-netbox-color-mode=light] .page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}html .page-item.disabled .page-link,html[data-netbox-color-mode=dark] .page-item.disabled .page-link,html[data-netbox-color-mode=light] .page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}}@media print{html .page-link,html[data-netbox-color-mode=dark] .page-link,html[data-netbox-color-mode=light] .page-link{padding:.375rem .75rem}}@media print{html .page-item:first-child .page-link,html[data-netbox-color-mode=dark] .page-item:first-child .page-link,html[data-netbox-color-mode=light] .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}html .page-item:last-child .page-link,html[data-netbox-color-mode=dark] .page-item:last-child .page-link,html[data-netbox-color-mode=light] .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}}@media print{html .pagination-lg .page-link,html[data-netbox-color-mode=dark] .pagination-lg .page-link,html[data-netbox-color-mode=light] .pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}html .pagination-lg .page-item:first-child .page-link,html[data-netbox-color-mode=dark] .pagination-lg .page-item:first-child .page-link,html[data-netbox-color-mode=light] .pagination-lg .page-item:first-child .page-link{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}html .pagination-lg .page-item:last-child .page-link,html[data-netbox-color-mode=dark] .pagination-lg .page-item:last-child .page-link,html[data-netbox-color-mode=light] .pagination-lg .page-item:last-child .page-link{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}}@media print{html .pagination-sm .page-link,html[data-netbox-color-mode=dark] .pagination-sm .page-link,html[data-netbox-color-mode=light] .pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}html .pagination-sm .page-item:first-child .page-link,html[data-netbox-color-mode=dark] .pagination-sm .page-item:first-child .page-link,html[data-netbox-color-mode=light] .pagination-sm .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}html .pagination-sm .page-item:last-child .page-link,html[data-netbox-color-mode=dark] .pagination-sm .page-item:last-child .page-link,html[data-netbox-color-mode=light] .pagination-sm .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}}@media print{html .badge,html[data-netbox-color-mode=dark] .badge,html[data-netbox-color-mode=light] .badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.375rem}html .badge:empty,html[data-netbox-color-mode=dark] .badge:empty,html[data-netbox-color-mode=light] .badge:empty{display:none}}@media print{html .btn .badge,html[data-netbox-color-mode=dark] .btn .badge,html[data-netbox-color-mode=light] .btn .badge{position:relative;top:-1px}}@media print{html .alert,html[data-netbox-color-mode=dark] .alert,html[data-netbox-color-mode=light] .alert{position:relative;padding:1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.375rem}}@media print{html .alert-heading,html[data-netbox-color-mode=dark] .alert-heading,html[data-netbox-color-mode=light] .alert-heading{color:inherit}}@media print{html .alert-link,html[data-netbox-color-mode=dark] .alert-link,html[data-netbox-color-mode=light] .alert-link{font-weight:700}}@media print{html .alert-dismissible,html[data-netbox-color-mode=dark] .alert-dismissible,html[data-netbox-color-mode=light] .alert-dismissible{padding-right:3rem}html .alert-dismissible .btn-close,html[data-netbox-color-mode=dark] .alert-dismissible .btn-close,html[data-netbox-color-mode=light] .alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}}@media print{html .alert-primary,html[data-netbox-color-mode=dark] .alert-primary,html[data-netbox-color-mode=light] .alert-primary{color:#1f496e;background-color:#d6e4f1;border-color:#c2d7e9}html .alert-primary .alert-link,html[data-netbox-color-mode=dark] .alert-primary .alert-link,html[data-netbox-color-mode=light] .alert-primary .alert-link{color:#193a58}}@media print{html .alert-secondary,html[data-netbox-color-mode=dark] .alert-secondary,html[data-netbox-color-mode=light] .alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}html .alert-secondary .alert-link,html[data-netbox-color-mode=dark] .alert-secondary .alert-link,html[data-netbox-color-mode=light] .alert-secondary .alert-link{color:#34383c}}@media print{html .alert-success,html[data-netbox-color-mode=dark] .alert-success,html[data-netbox-color-mode=light] .alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}html .alert-success .alert-link,html[data-netbox-color-mode=dark] .alert-success .alert-link,html[data-netbox-color-mode=light] .alert-success .alert-link{color:#0c4128}}@media print{html .alert-info,html[data-netbox-color-mode=dark] .alert-info,html[data-netbox-color-mode=light] .alert-info{color:#225660;background-color:#ddf7fc;border-color:#ccf3fb}html .alert-info .alert-link,html[data-netbox-color-mode=dark] .alert-info .alert-link,html[data-netbox-color-mode=light] .alert-info .alert-link{color:#1b454d}}@media print{html .alert-warning,html[data-netbox-color-mode=dark] .alert-warning,html[data-netbox-color-mode=light] .alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}html .alert-warning .alert-link,html[data-netbox-color-mode=dark] .alert-warning .alert-link,html[data-netbox-color-mode=light] .alert-warning .alert-link{color:#523e02}}@media print{html .alert-danger,html[data-netbox-color-mode=dark] .alert-danger,html[data-netbox-color-mode=light] .alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}html .alert-danger .alert-link,html[data-netbox-color-mode=dark] .alert-danger .alert-link,html[data-netbox-color-mode=light] .alert-danger .alert-link{color:#6a1a21}}@media print{html .alert-light,html[data-netbox-color-mode=dark] .alert-light,html[data-netbox-color-mode=light] .alert-light{color:#5d5e60;background-color:#fbfbfc;border-color:#f8f9fa}html .alert-light .alert-link,html[data-netbox-color-mode=dark] .alert-light .alert-link,html[data-netbox-color-mode=light] .alert-light .alert-link{color:#4a4b4d}}@media print{html .alert-dark,html[data-netbox-color-mode=dark] .alert-dark,html[data-netbox-color-mode=light] .alert-dark{color:#1f2326;background-color:#d6d8d9;border-color:#c2c4c6}html .alert-dark .alert-link,html[data-netbox-color-mode=dark] .alert-dark .alert-link,html[data-netbox-color-mode=light] .alert-dark .alert-link{color:#191c1e}}@media print{html .alert-blue,html[data-netbox-color-mode=dark] .alert-blue,html[data-netbox-color-mode=light] .alert-blue{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}html .alert-blue .alert-link,html[data-netbox-color-mode=dark] .alert-blue .alert-link,html[data-netbox-color-mode=light] .alert-blue .alert-link{color:#06357a}}@media print{html .alert-indigo,html[data-netbox-color-mode=dark] .alert-indigo,html[data-netbox-color-mode=light] .alert-indigo{color:#3d0a91;background-color:#e0cffc;border-color:#d1b7fb}html .alert-indigo .alert-link,html[data-netbox-color-mode=dark] .alert-indigo .alert-link,html[data-netbox-color-mode=light] .alert-indigo .alert-link{color:#310874}}@media print{html .alert-purple,html[data-netbox-color-mode=dark] .alert-purple,html[data-netbox-color-mode=light] .alert-purple{color:#432874;background-color:#e2d9f3;border-color:#d4c6ec}html .alert-purple .alert-link,html[data-netbox-color-mode=dark] .alert-purple .alert-link,html[data-netbox-color-mode=light] .alert-purple .alert-link{color:#36205d}}@media print{html .alert-pink,html[data-netbox-color-mode=dark] .alert-pink,html[data-netbox-color-mode=light] .alert-pink{color:#801f4f;background-color:#f7d6e6;border-color:#f3c2da}html .alert-pink .alert-link,html[data-netbox-color-mode=dark] .alert-pink .alert-link,html[data-netbox-color-mode=light] .alert-pink .alert-link{color:#66193f}}@media print{html .alert-red,html[data-netbox-color-mode=dark] .alert-red,html[data-netbox-color-mode=light] .alert-red{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}html .alert-red .alert-link,html[data-netbox-color-mode=dark] .alert-red .alert-link,html[data-netbox-color-mode=light] .alert-red .alert-link{color:#6a1a21}}@media print{html .alert-orange,html[data-netbox-color-mode=dark] .alert-orange,html[data-netbox-color-mode=light] .alert-orange{color:#984c0c;background-color:#ffe5d0;border-color:#fed8b9}html .alert-orange .alert-link,html[data-netbox-color-mode=dark] .alert-orange .alert-link,html[data-netbox-color-mode=light] .alert-orange .alert-link{color:#7a3d0a}}@media print{html .alert-yellow,html[data-netbox-color-mode=dark] .alert-yellow,html[data-netbox-color-mode=light] .alert-yellow{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}html .alert-yellow .alert-link,html[data-netbox-color-mode=dark] .alert-yellow .alert-link,html[data-netbox-color-mode=light] .alert-yellow .alert-link{color:#523e02}}@media print{html .alert-green,html[data-netbox-color-mode=dark] .alert-green,html[data-netbox-color-mode=light] .alert-green{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}html .alert-green .alert-link,html[data-netbox-color-mode=dark] .alert-green .alert-link,html[data-netbox-color-mode=light] .alert-green .alert-link{color:#0c4128}}@media print{html .alert-teal,html[data-netbox-color-mode=dark] .alert-teal,html[data-netbox-color-mode=light] .alert-teal{color:#13795b;background-color:#d2f4ea;border-color:#bcefe0}html .alert-teal .alert-link,html[data-netbox-color-mode=dark] .alert-teal .alert-link,html[data-netbox-color-mode=light] .alert-teal .alert-link{color:#0f6149}}@media print{html .alert-cyan,html[data-netbox-color-mode=dark] .alert-cyan,html[data-netbox-color-mode=light] .alert-cyan{color:#055160;background-color:#cff4fc;border-color:#b6effb}html .alert-cyan .alert-link,html[data-netbox-color-mode=dark] .alert-cyan .alert-link,html[data-netbox-color-mode=light] .alert-cyan .alert-link{color:#04414d}}@media print{html .alert-gray,html[data-netbox-color-mode=dark] .alert-gray,html[data-netbox-color-mode=light] .alert-gray{color:#686d71;background-color:#eff0f2;border-color:#e6e9eb}html .alert-gray .alert-link,html[data-netbox-color-mode=dark] .alert-gray .alert-link,html[data-netbox-color-mode=light] .alert-gray .alert-link{color:#53575a}}@media print{html .alert-black,html[data-netbox-color-mode=dark] .alert-black,html[data-netbox-color-mode=light] .alert-black{color:#000;background-color:#ccc;border-color:#b3b3b3}html .alert-black .alert-link,html[data-netbox-color-mode=dark] .alert-black .alert-link,html[data-netbox-color-mode=light] .alert-black .alert-link{color:#000}}@media print{html .alert-white,html[data-netbox-color-mode=dark] .alert-white,html[data-netbox-color-mode=light] .alert-white{color:#666;background-color:#fff;border-color:#fff}html .alert-white .alert-link,html[data-netbox-color-mode=dark] .alert-white .alert-link,html[data-netbox-color-mode=light] .alert-white .alert-link{color:#525252}}@media print{@keyframes progress-bar-stripes{0%{background-position-x:1rem}}}@media print{html .progress,html[data-netbox-color-mode=dark] .progress,html[data-netbox-color-mode=light] .progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.375rem}}@media print{html .progress-bar,html[data-netbox-color-mode=dark] .progress-bar,html[data-netbox-color-mode=light] .progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}}@media print and (prefers-reduced-motion: reduce){html .progress-bar,html[data-netbox-color-mode=dark] .progress-bar,html[data-netbox-color-mode=light] .progress-bar{transition:none}}@media print{html .progress-bar-striped,html[data-netbox-color-mode=dark] .progress-bar-striped,html[data-netbox-color-mode=light] .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:1rem 1rem}}@media print{html .progress-bar-animated,html[data-netbox-color-mode=dark] .progress-bar-animated,html[data-netbox-color-mode=light] .progress-bar-animated{animation:1s linear infinite progress-bar-stripes}}@media print and (prefers-reduced-motion: reduce){html .progress-bar-animated,html[data-netbox-color-mode=dark] .progress-bar-animated,html[data-netbox-color-mode=light] .progress-bar-animated{animation:none}}@media print{html .list-group,html[data-netbox-color-mode=dark] .list-group,html[data-netbox-color-mode=light] .list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.375rem}}@media print{html .list-group-numbered,html[data-netbox-color-mode=dark] .list-group-numbered,html[data-netbox-color-mode=light] .list-group-numbered{list-style-type:none;counter-reset:section}html .list-group-numbered>li:before,html[data-netbox-color-mode=dark] .list-group-numbered>li:before,html[data-netbox-color-mode=light] .list-group-numbered>li:before{content:counters(section,".") ". ";counter-increment:section}}@media print{html .list-group-item-action,html[data-netbox-color-mode=dark] .list-group-item-action,html[data-netbox-color-mode=light] .list-group-item-action{width:100%;color:#495057;text-align:inherit}html .list-group-item-action:hover,html .list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}html .list-group-item-action:active,html[data-netbox-color-mode=dark] .list-group-item-action:active,html[data-netbox-color-mode=light] .list-group-item-action:active{color:#212529;background-color:#e9ecef}}@media print{html .list-group-item,html[data-netbox-color-mode=dark] .list-group-item,html[data-netbox-color-mode=light] .list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#495057;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}html .list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}html .list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}html .list-group-item.disabled,html .list-group-item:disabled,html[data-netbox-color-mode=dark] .list-group-item.disabled,html[data-netbox-color-mode=dark] .list-group-item:disabled,html[data-netbox-color-mode=light] .list-group-item.disabled,html[data-netbox-color-mode=light] .list-group-item:disabled{color:#adb5bd;pointer-events:none;background-color:#fff}html .list-group-item.active,html[data-netbox-color-mode=dark] .list-group-item.active,html[data-netbox-color-mode=light] .list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}html .list-group-item+html .list-group-item,html .list-group-item+html[data-netbox-color-mode=dark] .list-group-item,html .list-group-item+html[data-netbox-color-mode=light] .list-group-item,html[data-netbox-color-mode=dark] .list-group-item+html .list-group-item,html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item,html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=light] .list-group-item,html[data-netbox-color-mode=light] .list-group-item+html .list-group-item,html[data-netbox-color-mode=light] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item,html[data-netbox-color-mode=light] .list-group-item+html[data-netbox-color-mode=light] .list-group-item{border-top-width:0}html .list-group-item+html .list-group-item.active,html .list-group-item+html[data-netbox-color-mode=dark] .list-group-item.active,html .list-group-item+html[data-netbox-color-mode=light] .list-group-item.active,html[data-netbox-color-mode=dark] .list-group-item+html .list-group-item.active,html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item.active,html[data-netbox-color-mode=dark] .list-group-item+html[data-netbox-color-mode=light] .list-group-item.active,html[data-netbox-color-mode=light] .list-group-item+html .list-group-item.active,html[data-netbox-color-mode=light] .list-group-item+html[data-netbox-color-mode=dark] .list-group-item.active,html[data-netbox-color-mode=light] .list-group-item+html[data-netbox-color-mode=light] .list-group-item.active{margin-top:-1px;border-top-width:1px}}@media print{html .list-group-horizontal,html[data-netbox-color-mode=dark] .list-group-horizontal,html[data-netbox-color-mode=light] .list-group-horizontal{flex-direction:row}html .list-group-horizontal>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item.active{margin-top:0}html .list-group-horizontal>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 576px){html .list-group-horizontal-sm,html[data-netbox-color-mode=dark] .list-group-horizontal-sm,html[data-netbox-color-mode=light] .list-group-horizontal-sm{flex-direction:row}html .list-group-horizontal-sm>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-sm>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-sm>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item.active{margin-top:0}html .list-group-horizontal-sm>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-sm>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-sm>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 768px){html .list-group-horizontal-md,html[data-netbox-color-mode=dark] .list-group-horizontal-md,html[data-netbox-color-mode=light] .list-group-horizontal-md{flex-direction:row}html .list-group-horizontal-md>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-md>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-md>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item.active{margin-top:0}html .list-group-horizontal-md>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-md>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-md>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 992px){html .list-group-horizontal-lg,html[data-netbox-color-mode=dark] .list-group-horizontal-lg,html[data-netbox-color-mode=light] .list-group-horizontal-lg{flex-direction:row}html .list-group-horizontal-lg>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-lg>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-lg>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item.active{margin-top:0}html .list-group-horizontal-lg>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-lg>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-lg>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 1200px){html .list-group-horizontal-xl,html[data-netbox-color-mode=dark] .list-group-horizontal-xl,html[data-netbox-color-mode=light] .list-group-horizontal-xl{flex-direction:row}html .list-group-horizontal-xl>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-xl>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-xl>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item.active{margin-top:0}html .list-group-horizontal-xl>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-xl>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-xl>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print and (min-width: 1400px){html .list-group-horizontal-xxl,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl,html[data-netbox-color-mode=light] .list-group-horizontal-xxl{flex-direction:row}html .list-group-horizontal-xxl>.list-group-item:first-child,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item:first-child,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.375rem;border-top-right-radius:0}html .list-group-horizontal-xxl>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.375rem;border-bottom-left-radius:0}html .list-group-horizontal-xxl>.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item.active{margin-top:0}html .list-group-horizontal-xxl>.list-group-item+.list-group-item,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item+.list-group-item,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}html .list-group-horizontal-xxl>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=dark] .list-group-horizontal-xxl>.list-group-item+.list-group-item.active,html[data-netbox-color-mode=light] .list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media print{html .list-group-flush,html[data-netbox-color-mode=dark] .list-group-flush,html[data-netbox-color-mode=light] .list-group-flush{border-radius:0}html .list-group-flush>.list-group-item,html[data-netbox-color-mode=dark] .list-group-flush>.list-group-item,html[data-netbox-color-mode=light] .list-group-flush>.list-group-item{border-width:0 0 1px}html .list-group-flush>.list-group-item:last-child,html[data-netbox-color-mode=dark] .list-group-flush>.list-group-item:last-child,html[data-netbox-color-mode=light] .list-group-flush>.list-group-item:last-child{border-bottom-width:0}}@media print{html .list-group-item-primary,html[data-netbox-color-mode=dark] .list-group-item-primary,html[data-netbox-color-mode=light] .list-group-item-primary{color:#1f496e;background-color:#d6e4f1}html .list-group-item-primary.list-group-item-action:hover,html .list-group-item-primary.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-primary.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-primary.list-group-item-action:focus{color:#1f496e;background-color:#c1cdd9}html .list-group-item-primary.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-primary.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1f496e;border-color:#1f496e}}@media print{html .list-group-item-secondary,html[data-netbox-color-mode=dark] .list-group-item-secondary,html[data-netbox-color-mode=light] .list-group-item-secondary{color:#41464b;background-color:#e2e3e5}html .list-group-item-secondary.list-group-item-action:hover,html .list-group-item-secondary.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-secondary.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-secondary.list-group-item-action:focus{color:#41464b;background-color:#cbccce}html .list-group-item-secondary.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-secondary.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}}@media print{html .list-group-item-success,html[data-netbox-color-mode=dark] .list-group-item-success,html[data-netbox-color-mode=light] .list-group-item-success{color:#0f5132;background-color:#d1e7dd}html .list-group-item-success.list-group-item-action:hover,html .list-group-item-success.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-success.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-success.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}html .list-group-item-success.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-success.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}}@media print{html .list-group-item-info,html[data-netbox-color-mode=dark] .list-group-item-info,html[data-netbox-color-mode=light] .list-group-item-info{color:#225660;background-color:#ddf7fc}html .list-group-item-info.list-group-item-action:hover,html .list-group-item-info.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-info.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-info.list-group-item-action:focus{color:#225660;background-color:#c7dee3}html .list-group-item-info.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-info.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-info.list-group-item-action.active{color:#fff;background-color:#225660;border-color:#225660}}@media print{html .list-group-item-warning,html[data-netbox-color-mode=dark] .list-group-item-warning,html[data-netbox-color-mode=light] .list-group-item-warning{color:#664d03;background-color:#fff3cd}html .list-group-item-warning.list-group-item-action:hover,html .list-group-item-warning.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-warning.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-warning.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}html .list-group-item-warning.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-warning.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}}@media print{html .list-group-item-danger,html[data-netbox-color-mode=dark] .list-group-item-danger,html[data-netbox-color-mode=light] .list-group-item-danger{color:#842029;background-color:#f8d7da}html .list-group-item-danger.list-group-item-action:hover,html .list-group-item-danger.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-danger.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-danger.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}html .list-group-item-danger.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-danger.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}}@media print{html .list-group-item-light,html[data-netbox-color-mode=dark] .list-group-item-light,html[data-netbox-color-mode=light] .list-group-item-light{color:#5d5e60;background-color:#fbfbfc}html .list-group-item-light.list-group-item-action:hover,html .list-group-item-light.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-light.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-light.list-group-item-action:focus{color:#5d5e60;background-color:#e2e2e3}html .list-group-item-light.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-light.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-light.list-group-item-action.active{color:#fff;background-color:#5d5e60;border-color:#5d5e60}}@media print{html .list-group-item-dark,html[data-netbox-color-mode=dark] .list-group-item-dark,html[data-netbox-color-mode=light] .list-group-item-dark{color:#1f2326;background-color:#d6d8d9}html .list-group-item-dark.list-group-item-action:hover,html .list-group-item-dark.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-dark.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-dark.list-group-item-action:focus{color:#1f2326;background-color:#c1c2c3}html .list-group-item-dark.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-dark.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1f2326;border-color:#1f2326}}@media print{html .list-group-item-blue,html[data-netbox-color-mode=dark] .list-group-item-blue,html[data-netbox-color-mode=light] .list-group-item-blue{color:#084298;background-color:#cfe2ff}html .list-group-item-blue.list-group-item-action:hover,html .list-group-item-blue.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-blue.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-blue.list-group-item-action:focus{color:#084298;background-color:#bacbe6}html .list-group-item-blue.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-blue.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-blue.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}}@media print{html .list-group-item-indigo,html[data-netbox-color-mode=dark] .list-group-item-indigo,html[data-netbox-color-mode=light] .list-group-item-indigo{color:#3d0a91;background-color:#e0cffc}html .list-group-item-indigo.list-group-item-action:hover,html .list-group-item-indigo.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-indigo.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-indigo.list-group-item-action:focus{color:#3d0a91;background-color:#cabae3}html .list-group-item-indigo.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-indigo.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-indigo.list-group-item-action.active{color:#fff;background-color:#3d0a91;border-color:#3d0a91}}@media print{html .list-group-item-purple,html[data-netbox-color-mode=dark] .list-group-item-purple,html[data-netbox-color-mode=light] .list-group-item-purple{color:#432874;background-color:#e2d9f3}html .list-group-item-purple.list-group-item-action:hover,html .list-group-item-purple.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-purple.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-purple.list-group-item-action:focus{color:#432874;background-color:#cbc3db}html .list-group-item-purple.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-purple.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-purple.list-group-item-action.active{color:#fff;background-color:#432874;border-color:#432874}}@media print{html .list-group-item-pink,html[data-netbox-color-mode=dark] .list-group-item-pink,html[data-netbox-color-mode=light] .list-group-item-pink{color:#801f4f;background-color:#f7d6e6}html .list-group-item-pink.list-group-item-action:hover,html .list-group-item-pink.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-pink.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-pink.list-group-item-action:focus{color:#801f4f;background-color:#dec1cf}html .list-group-item-pink.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-pink.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-pink.list-group-item-action.active{color:#fff;background-color:#801f4f;border-color:#801f4f}}@media print{html .list-group-item-red,html[data-netbox-color-mode=dark] .list-group-item-red,html[data-netbox-color-mode=light] .list-group-item-red{color:#842029;background-color:#f8d7da}html .list-group-item-red.list-group-item-action:hover,html .list-group-item-red.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-red.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-red.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}html .list-group-item-red.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-red.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-red.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}}@media print{html .list-group-item-orange,html[data-netbox-color-mode=dark] .list-group-item-orange,html[data-netbox-color-mode=light] .list-group-item-orange{color:#984c0c;background-color:#ffe5d0}html .list-group-item-orange.list-group-item-action:hover,html .list-group-item-orange.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-orange.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-orange.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-orange.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-orange.list-group-item-action:focus{color:#984c0c;background-color:#e6cebb}html .list-group-item-orange.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-orange.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-orange.list-group-item-action.active{color:#fff;background-color:#984c0c;border-color:#984c0c}}@media print{html .list-group-item-yellow,html[data-netbox-color-mode=dark] .list-group-item-yellow,html[data-netbox-color-mode=light] .list-group-item-yellow{color:#664d03;background-color:#fff3cd}html .list-group-item-yellow.list-group-item-action:hover,html .list-group-item-yellow.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-yellow.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-yellow.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}html .list-group-item-yellow.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-yellow.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-yellow.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}}@media print{html .list-group-item-green,html[data-netbox-color-mode=dark] .list-group-item-green,html[data-netbox-color-mode=light] .list-group-item-green{color:#0f5132;background-color:#d1e7dd}html .list-group-item-green.list-group-item-action:hover,html .list-group-item-green.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-green.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-green.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}html .list-group-item-green.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-green.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-green.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}}@media print{html .list-group-item-teal,html[data-netbox-color-mode=dark] .list-group-item-teal,html[data-netbox-color-mode=light] .list-group-item-teal{color:#13795b;background-color:#d2f4ea}html .list-group-item-teal.list-group-item-action:hover,html .list-group-item-teal.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-teal.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-teal.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-teal.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-teal.list-group-item-action:focus{color:#13795b;background-color:#bddcd3}html .list-group-item-teal.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-teal.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-teal.list-group-item-action.active{color:#fff;background-color:#13795b;border-color:#13795b}}@media print{html .list-group-item-cyan,html[data-netbox-color-mode=dark] .list-group-item-cyan,html[data-netbox-color-mode=light] .list-group-item-cyan{color:#055160;background-color:#cff4fc}html .list-group-item-cyan.list-group-item-action:hover,html .list-group-item-cyan.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-cyan.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-cyan.list-group-item-action:focus{color:#055160;background-color:#badce3}html .list-group-item-cyan.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-cyan.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-cyan.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}}@media print{html .list-group-item-gray,html[data-netbox-color-mode=dark] .list-group-item-gray,html[data-netbox-color-mode=light] .list-group-item-gray{color:#686d71;background-color:#eff0f2}html .list-group-item-gray.list-group-item-action:hover,html .list-group-item-gray.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-gray.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-gray.list-group-item-action:focus{color:#686d71;background-color:#d7d8da}html .list-group-item-gray.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-gray.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-gray.list-group-item-action.active{color:#fff;background-color:#686d71;border-color:#686d71}}@media print{html .list-group-item-black,html[data-netbox-color-mode=dark] .list-group-item-black,html[data-netbox-color-mode=light] .list-group-item-black{color:#000;background-color:#ccc}html .list-group-item-black.list-group-item-action:hover,html .list-group-item-black.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-black.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-black.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-black.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-black.list-group-item-action:focus{color:#000;background-color:#b8b8b8}html .list-group-item-black.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-black.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-black.list-group-item-action.active{color:#fff;background-color:#000;border-color:#000}}@media print{html .list-group-item-white,html[data-netbox-color-mode=dark] .list-group-item-white,html[data-netbox-color-mode=light] .list-group-item-white{color:#666;background-color:#fff}html .list-group-item-white.list-group-item-action:hover,html .list-group-item-white.list-group-item-action:focus,html[data-netbox-color-mode=dark] .list-group-item-white.list-group-item-action:hover,html[data-netbox-color-mode=dark] .list-group-item-white.list-group-item-action:focus,html[data-netbox-color-mode=light] .list-group-item-white.list-group-item-action:hover,html[data-netbox-color-mode=light] .list-group-item-white.list-group-item-action:focus{color:#666;background-color:#e6e6e6}html .list-group-item-white.list-group-item-action.active,html[data-netbox-color-mode=dark] .list-group-item-white.list-group-item-action.active,html[data-netbox-color-mode=light] .list-group-item-white.list-group-item-action.active{color:#fff;background-color:#666;border-color:#666}}@media print{html .btn-close,html[data-netbox-color-mode=dark] .btn-close,html[data-netbox-color-mode=light] .btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}html .btn-close:hover,html[data-netbox-color-mode=dark] .btn-close:hover,html[data-netbox-color-mode=light] .btn-close:hover{color:#000;text-decoration:none;opacity:.75}html .btn-close:focus,html[data-netbox-color-mode=dark] .btn-close:focus,html[data-netbox-color-mode=light] .btn-close:focus{outline:0;box-shadow:0 0 0 .25rem #0d6efd40;opacity:1}html .btn-close:disabled,html .btn-close.disabled,html[data-netbox-color-mode=dark] .btn-close:disabled,html[data-netbox-color-mode=dark] .btn-close.disabled,html[data-netbox-color-mode=light] .btn-close:disabled,html[data-netbox-color-mode=light] .btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}}@media print{html .btn-close-white,html[data-netbox-color-mode=dark] .btn-close-white,html[data-netbox-color-mode=light] .btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}}@media print{html .toast,html[data-netbox-color-mode=dark] .toast,html[data-netbox-color-mode=light] .toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:#ffffffd9;background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem #00000026;border-radius:.375rem}html .toast:not(.showing):not(.show),html[data-netbox-color-mode=dark] .toast:not(.showing):not(.show),html[data-netbox-color-mode=light] .toast:not(.showing):not(.show){opacity:0}html .toast.hide,html[data-netbox-color-mode=dark] .toast.hide,html[data-netbox-color-mode=light] .toast.hide{display:none}}@media print{html .toast-container,html[data-netbox-color-mode=dark] .toast-container,html[data-netbox-color-mode=light] .toast-container{width:max-content;max-width:100%;pointer-events:none}html .toast-container>:not(:last-child),html[data-netbox-color-mode=dark] .toast-container>:not(:last-child),html[data-netbox-color-mode=light] .toast-container>:not(:last-child){margin-bottom:.75rem}}@media print{html .toast-header,html[data-netbox-color-mode=dark] .toast-header,html[data-netbox-color-mode=light] .toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:#ffffffd9;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}html .toast-header .btn-close,html[data-netbox-color-mode=dark] .toast-header .btn-close,html[data-netbox-color-mode=light] .toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}}@media print{html .toast-body,html[data-netbox-color-mode=dark] .toast-body,html[data-netbox-color-mode=light] .toast-body{padding:.75rem;word-wrap:break-word}}@media print{html .modal,html[data-netbox-color-mode=dark] .modal,html[data-netbox-color-mode=light] .modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}}@media print{html .modal-dialog,html[data-netbox-color-mode=dark] .modal-dialog,html[data-netbox-color-mode=light] .modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade html .modal-dialog,.modal.fade html[data-netbox-color-mode=dark] .modal-dialog,.modal.fade html[data-netbox-color-mode=light] .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}}@media print and (prefers-reduced-motion: reduce){.modal.fade html .modal-dialog,.modal.fade html[data-netbox-color-mode=dark] .modal-dialog,.modal.fade html[data-netbox-color-mode=light] .modal-dialog{transition:none}}@media print{.modal.show html .modal-dialog,.modal.show html[data-netbox-color-mode=dark] .modal-dialog,.modal.show html[data-netbox-color-mode=light] .modal-dialog{transform:none}}@media print{.modal.modal-static html .modal-dialog,.modal.modal-static html[data-netbox-color-mode=dark] .modal-dialog,.modal.modal-static html[data-netbox-color-mode=light] .modal-dialog{transform:scale(1.02)}}@media print{html .modal-dialog-scrollable,html[data-netbox-color-mode=dark] .modal-dialog-scrollable,html[data-netbox-color-mode=light] .modal-dialog-scrollable{height:calc(100% - 1rem)}html .modal-dialog-scrollable .modal-content,html[data-netbox-color-mode=dark] .modal-dialog-scrollable .modal-content,html[data-netbox-color-mode=light] .modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}html .modal-dialog-scrollable .modal-body,html[data-netbox-color-mode=dark] .modal-dialog-scrollable .modal-body,html[data-netbox-color-mode=light] .modal-dialog-scrollable .modal-body{overflow-y:auto}}@media print{html .modal-dialog-centered,html[data-netbox-color-mode=dark] .modal-dialog-centered,html[data-netbox-color-mode=light] .modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}}@media print{html .modal-content,html[data-netbox-color-mode=dark] .modal-content,html[data-netbox-color-mode=light] .modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.75rem;outline:0}}@media print{html .modal-backdrop,html[data-netbox-color-mode=dark] .modal-backdrop,html[data-netbox-color-mode=light] .modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}html .modal-backdrop.fade,html[data-netbox-color-mode=dark] .modal-backdrop.fade,html[data-netbox-color-mode=light] .modal-backdrop.fade{opacity:0}html .modal-backdrop.show,html[data-netbox-color-mode=dark] .modal-backdrop.show,html[data-netbox-color-mode=light] .modal-backdrop.show{opacity:.5}}@media print{html .modal-header,html[data-netbox-color-mode=dark] .modal-header,html[data-netbox-color-mode=light] .modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}html .modal-header .btn-close,html[data-netbox-color-mode=dark] .modal-header .btn-close,html[data-netbox-color-mode=light] .modal-header .btn-close{padding:.5rem;margin:-.5rem -.5rem -.5rem auto}}@media print{html .modal-title,html[data-netbox-color-mode=dark] .modal-title,html[data-netbox-color-mode=light] .modal-title{margin-bottom:0;line-height:1.5}}@media print{html .modal-body,html[data-netbox-color-mode=dark] .modal-body,html[data-netbox-color-mode=light] .modal-body{position:relative;flex:1 1 auto;padding:1rem}}@media print{html .modal-footer,html[data-netbox-color-mode=dark] .modal-footer,html[data-netbox-color-mode=light] .modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.75rem - 1px);border-bottom-left-radius:calc(.75rem - 1px)}html .modal-footer>*,html[data-netbox-color-mode=dark] .modal-footer>*,html[data-netbox-color-mode=light] .modal-footer>*{margin:.25rem}}@media print and (min-width: 576px){html .modal-dialog,html[data-netbox-color-mode=dark] .modal-dialog,html[data-netbox-color-mode=light] .modal-dialog{max-width:500px;margin:1.75rem auto}html .modal-dialog-scrollable,html[data-netbox-color-mode=dark] .modal-dialog-scrollable,html[data-netbox-color-mode=light] .modal-dialog-scrollable{height:calc(100% - 3.5rem)}html .modal-dialog-centered,html[data-netbox-color-mode=dark] .modal-dialog-centered,html[data-netbox-color-mode=light] .modal-dialog-centered{min-height:calc(100% - 3.5rem)}html .modal-sm,html[data-netbox-color-mode=dark] .modal-sm,html[data-netbox-color-mode=light] .modal-sm{max-width:300px}}@media print and (min-width: 992px){html .modal-lg,html .modal-xl,html[data-netbox-color-mode=dark] .modal-lg,html[data-netbox-color-mode=dark] .modal-xl,html[data-netbox-color-mode=light] .modal-lg,html[data-netbox-color-mode=light] .modal-xl{max-width:800px}}@media print and (min-width: 1200px){html .modal-xl,html[data-netbox-color-mode=dark] .modal-xl,html[data-netbox-color-mode=light] .modal-xl{max-width:1140px}}@media print{html .modal-fullscreen,html[data-netbox-color-mode=dark] .modal-fullscreen,html[data-netbox-color-mode=light] .modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen .modal-header{border-radius:0}html .modal-fullscreen .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen .modal-body{overflow-y:auto}html .modal-fullscreen .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen .modal-footer{border-radius:0}}@media print and (max-width: 575.98px){html .modal-fullscreen-sm-down,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-sm-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-sm-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down .modal-header{border-radius:0}html .modal-fullscreen-sm-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down .modal-body{overflow-y:auto}html .modal-fullscreen-sm-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-sm-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media print and (max-width: 767.98px){html .modal-fullscreen-md-down,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down,html[data-netbox-color-mode=light] .modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-md-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-md-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-md-down .modal-header{border-radius:0}html .modal-fullscreen-md-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-md-down .modal-body{overflow-y:auto}html .modal-fullscreen-md-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-md-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-md-down .modal-footer{border-radius:0}}@media print and (max-width: 991.98px){html .modal-fullscreen-lg-down,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-lg-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-lg-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down .modal-header{border-radius:0}html .modal-fullscreen-lg-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down .modal-body{overflow-y:auto}html .modal-fullscreen-lg-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-lg-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media print and (max-width: 1199.98px){html .modal-fullscreen-xl-down,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-xl-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-xl-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down .modal-header{border-radius:0}html .modal-fullscreen-xl-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down .modal-body{overflow-y:auto}html .modal-fullscreen-xl-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-xl-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media print and (max-width: 1399.98px){html .modal-fullscreen-xxl-down,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}html .modal-fullscreen-xxl-down .modal-content,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-content,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}html .modal-fullscreen-xxl-down .modal-header,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-header,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down .modal-header{border-radius:0}html .modal-fullscreen-xxl-down .modal-body,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-body,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down .modal-body{overflow-y:auto}html .modal-fullscreen-xxl-down .modal-footer,html[data-netbox-color-mode=dark] .modal-fullscreen-xxl-down .modal-footer,html[data-netbox-color-mode=light] .modal-fullscreen-xxl-down .modal-footer{border-radius:0}}@media print{html .tooltip,html[data-netbox-color-mode=dark] .tooltip,html[data-netbox-color-mode=light] .tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}html .tooltip.show,html[data-netbox-color-mode=dark] .tooltip.show,html[data-netbox-color-mode=light] .tooltip.show{opacity:.9}html .tooltip .tooltip-arrow,html[data-netbox-color-mode=dark] .tooltip .tooltip-arrow,html[data-netbox-color-mode=light] .tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}html .tooltip .tooltip-arrow:before,html[data-netbox-color-mode=dark] .tooltip .tooltip-arrow:before,html[data-netbox-color-mode=light] .tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}}@media print{html .bs-tooltip-top,html .bs-tooltip-auto[data-popper-placement^=top],html[data-netbox-color-mode=dark] .bs-tooltip-top,html[data-netbox-color-mode=light] .bs-tooltip-top{padding:.4rem 0}html .bs-tooltip-top .tooltip-arrow,html .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-top .tooltip-arrow,html[data-netbox-color-mode=light] .bs-tooltip-top .tooltip-arrow{bottom:0}html .bs-tooltip-top .tooltip-arrow:before,html .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-top .tooltip-arrow:before,html[data-netbox-color-mode=light] .bs-tooltip-top .tooltip-arrow:before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}}@media print{html .bs-tooltip-end,html .bs-tooltip-auto[data-popper-placement^=right],html[data-netbox-color-mode=dark] .bs-tooltip-end,html[data-netbox-color-mode=light] .bs-tooltip-end{padding:0 .4rem}html .bs-tooltip-end .tooltip-arrow,html .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-end .tooltip-arrow,html[data-netbox-color-mode=light] .bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}html .bs-tooltip-end .tooltip-arrow:before,html .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-end .tooltip-arrow:before,html[data-netbox-color-mode=light] .bs-tooltip-end .tooltip-arrow:before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}}@media print{html .bs-tooltip-bottom,html .bs-tooltip-auto[data-popper-placement^=bottom],html[data-netbox-color-mode=dark] .bs-tooltip-bottom,html[data-netbox-color-mode=light] .bs-tooltip-bottom{padding:.4rem 0}html .bs-tooltip-bottom .tooltip-arrow,html .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-bottom .tooltip-arrow,html[data-netbox-color-mode=light] .bs-tooltip-bottom .tooltip-arrow{top:0}html .bs-tooltip-bottom .tooltip-arrow:before,html .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-bottom .tooltip-arrow:before,html[data-netbox-color-mode=light] .bs-tooltip-bottom .tooltip-arrow:before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}}@media print{html .bs-tooltip-start,html .bs-tooltip-auto[data-popper-placement^=left],html[data-netbox-color-mode=dark] .bs-tooltip-start,html[data-netbox-color-mode=light] .bs-tooltip-start{padding:0 .4rem}html .bs-tooltip-start .tooltip-arrow,html .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,html[data-netbox-color-mode=dark] .bs-tooltip-start .tooltip-arrow,html[data-netbox-color-mode=light] .bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}html .bs-tooltip-start .tooltip-arrow:before,html .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,html[data-netbox-color-mode=dark] .bs-tooltip-start .tooltip-arrow:before,html[data-netbox-color-mode=light] .bs-tooltip-start .tooltip-arrow:before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}}@media print{html .tooltip-inner,html[data-netbox-color-mode=dark] .tooltip-inner,html[data-netbox-color-mode=light] .tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.375rem}}@media print{html .popover,html[data-netbox-color-mode=dark] .popover,html[data-netbox-color-mode=light] .popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.75rem}html .popover .popover-arrow,html[data-netbox-color-mode=dark] .popover .popover-arrow,html[data-netbox-color-mode=light] .popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}html .popover .popover-arrow:before,html .popover .popover-arrow:after,html[data-netbox-color-mode=dark] .popover .popover-arrow:before,html[data-netbox-color-mode=dark] .popover .popover-arrow:after,html[data-netbox-color-mode=light] .popover .popover-arrow:before,html[data-netbox-color-mode=light] .popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}}@media print{html .bs-popover-top>.popover-arrow,html .bs-popover-auto[data-popper-placement^=top]>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow,html[data-netbox-color-mode=light] .bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}html .bs-popover-top>.popover-arrow:before,html .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow:before,html[data-netbox-color-mode=light] .bs-popover-top>.popover-arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}html .bs-popover-top>.popover-arrow:after,html .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-top>.popover-arrow:after,html[data-netbox-color-mode=light] .bs-popover-top>.popover-arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}}@media print{html .bs-popover-end>.popover-arrow,html .bs-popover-auto[data-popper-placement^=right]>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow,html[data-netbox-color-mode=light] .bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}html .bs-popover-end>.popover-arrow:before,html .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow:before,html[data-netbox-color-mode=light] .bs-popover-end>.popover-arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}html .bs-popover-end>.popover-arrow:after,html .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-end>.popover-arrow:after,html[data-netbox-color-mode=light] .bs-popover-end>.popover-arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}}@media print{html .bs-popover-bottom>.popover-arrow,html .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow,html[data-netbox-color-mode=light] .bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}html .bs-popover-bottom>.popover-arrow:before,html .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow:before,html[data-netbox-color-mode=light] .bs-popover-bottom>.popover-arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}html .bs-popover-bottom>.popover-arrow:after,html .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-bottom>.popover-arrow:after,html[data-netbox-color-mode=light] .bs-popover-bottom>.popover-arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}html .bs-popover-bottom .popover-header:before,html .bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,html[data-netbox-color-mode=dark] .bs-popover-bottom .popover-header:before,html[data-netbox-color-mode=light] .bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}}@media print{html .bs-popover-start>.popover-arrow,html .bs-popover-auto[data-popper-placement^=left]>.popover-arrow,html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow,html[data-netbox-color-mode=light] .bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}html .bs-popover-start>.popover-arrow:before,html .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow:before,html[data-netbox-color-mode=light] .bs-popover-start>.popover-arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}html .bs-popover-start>.popover-arrow:after,html .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,html[data-netbox-color-mode=dark] .bs-popover-start>.popover-arrow:after,html[data-netbox-color-mode=light] .bs-popover-start>.popover-arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}}@media print{html .popover-header,html[data-netbox-color-mode=dark] .popover-header,html[data-netbox-color-mode=light] .popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.75rem - 1px);border-top-right-radius:calc(.75rem - 1px)}html .popover-header:empty,html[data-netbox-color-mode=dark] .popover-header:empty,html[data-netbox-color-mode=light] .popover-header:empty{display:none}}@media print{html .popover-body,html[data-netbox-color-mode=dark] .popover-body,html[data-netbox-color-mode=light] .popover-body{padding:1rem;color:#212529}}@media print{html .carousel,html[data-netbox-color-mode=dark] .carousel,html[data-netbox-color-mode=light] .carousel{position:relative}}@media print{html .carousel.pointer-event,html[data-netbox-color-mode=dark] .carousel.pointer-event,html[data-netbox-color-mode=light] .carousel.pointer-event{touch-action:pan-y}}@media print{html .carousel-inner,html[data-netbox-color-mode=dark] .carousel-inner,html[data-netbox-color-mode=light] .carousel-inner{position:relative;width:100%;overflow:hidden}html .carousel-inner:after,html[data-netbox-color-mode=dark] .carousel-inner:after,html[data-netbox-color-mode=light] .carousel-inner:after{display:block;clear:both;content:""}}@media print{html .carousel-item,html[data-netbox-color-mode=dark] .carousel-item,html[data-netbox-color-mode=light] .carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .carousel-item,html[data-netbox-color-mode=dark] .carousel-item,html[data-netbox-color-mode=light] .carousel-item{transition:none}}@media print{html .carousel-item.active,html .carousel-item-next,html .carousel-item-prev,html[data-netbox-color-mode=dark] .carousel-item.active,html[data-netbox-color-mode=dark] .carousel-item-next,html[data-netbox-color-mode=dark] .carousel-item-prev,html[data-netbox-color-mode=light] .carousel-item.active,html[data-netbox-color-mode=light] .carousel-item-next,html[data-netbox-color-mode=light] .carousel-item-prev{display:block}}@media print{html .carousel-item-next:not(.carousel-item-start),html .active.carousel-item-end,html[data-netbox-color-mode=dark] .carousel-item-next:not(.carousel-item-start),html[data-netbox-color-mode=dark] .active.carousel-item-end,html[data-netbox-color-mode=light] .carousel-item-next:not(.carousel-item-start),html[data-netbox-color-mode=light] .active.carousel-item-end{transform:translate(100%)}}@media print{html .carousel-item-prev:not(.carousel-item-end),html .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-item-prev:not(.carousel-item-end),html[data-netbox-color-mode=dark] .active.carousel-item-start,html[data-netbox-color-mode=light] .carousel-item-prev:not(.carousel-item-end),html[data-netbox-color-mode=light] .active.carousel-item-start{transform:translate(-100%)}}@media print{html .carousel-fade .carousel-item,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item,html[data-netbox-color-mode=light] .carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}html .carousel-fade .carousel-item.active,html .carousel-fade .carousel-item-next.carousel-item-start,html .carousel-fade .carousel-item-prev.carousel-item-end,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item.active,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item-next.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .carousel-item-prev.carousel-item-end,html[data-netbox-color-mode=light] .carousel-fade .carousel-item.active,html[data-netbox-color-mode=light] .carousel-fade .carousel-item-next.carousel-item-start,html[data-netbox-color-mode=light] .carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}html .carousel-fade .active.carousel-item-start,html .carousel-fade .active.carousel-item-end,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-end,html[data-netbox-color-mode=light] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=light] .carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}}@media print and (prefers-reduced-motion: reduce){html .carousel-fade .active.carousel-item-start,html .carousel-fade .active.carousel-item-end,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=dark] .carousel-fade .active.carousel-item-end,html[data-netbox-color-mode=light] .carousel-fade .active.carousel-item-start,html[data-netbox-color-mode=light] .carousel-fade .active.carousel-item-end{transition:none}}@media print{html .carousel-control-prev,html .carousel-control-next,html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-next,html[data-netbox-color-mode=light] .carousel-control-prev,html[data-netbox-color-mode=light] .carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}}@media print and (prefers-reduced-motion: reduce){html .carousel-control-prev,html .carousel-control-next,html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-next,html[data-netbox-color-mode=light] .carousel-control-prev,html[data-netbox-color-mode=light] .carousel-control-next{transition:none}}@media print{html .carousel-control-prev:hover,html .carousel-control-prev:focus,html .carousel-control-next:hover,html .carousel-control-next:focus,html[data-netbox-color-mode=dark] .carousel-control-prev:hover,html[data-netbox-color-mode=dark] .carousel-control-prev:focus,html[data-netbox-color-mode=dark] .carousel-control-next:hover,html[data-netbox-color-mode=dark] .carousel-control-next:focus,html[data-netbox-color-mode=light] .carousel-control-prev:hover,html[data-netbox-color-mode=light] .carousel-control-prev:focus,html[data-netbox-color-mode=light] .carousel-control-next:hover,html[data-netbox-color-mode=light] .carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}}@media print{html .carousel-control-prev,html[data-netbox-color-mode=dark] .carousel-control-prev,html[data-netbox-color-mode=light] .carousel-control-prev{left:0}}@media print{html .carousel-control-next,html[data-netbox-color-mode=dark] .carousel-control-next,html[data-netbox-color-mode=light] .carousel-control-next{right:0}}@media print{html .carousel-control-prev-icon,html .carousel-control-next-icon,html[data-netbox-color-mode=dark] .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-control-next-icon,html[data-netbox-color-mode=light] .carousel-control-prev-icon,html[data-netbox-color-mode=light] .carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}}@media print{html .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-control-prev-icon,html[data-netbox-color-mode=light] .carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}}@media print{html .carousel-control-next-icon,html[data-netbox-color-mode=dark] .carousel-control-next-icon,html[data-netbox-color-mode=light] .carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}}@media print{html .carousel-indicators,html[data-netbox-color-mode=dark] .carousel-indicators,html[data-netbox-color-mode=light] .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%;list-style:none}html .carousel-indicators [data-bs-target],html[data-netbox-color-mode=dark] .carousel-indicators [data-bs-target],html[data-netbox-color-mode=light] .carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}}@media print and (prefers-reduced-motion: reduce){html .carousel-indicators [data-bs-target],html[data-netbox-color-mode=dark] .carousel-indicators [data-bs-target],html[data-netbox-color-mode=light] .carousel-indicators [data-bs-target]{transition:none}}@media print{html .carousel-indicators .active,html[data-netbox-color-mode=dark] .carousel-indicators .active,html[data-netbox-color-mode=light] .carousel-indicators .active{opacity:1}}@media print{html .carousel-caption,html[data-netbox-color-mode=dark] .carousel-caption,html[data-netbox-color-mode=light] .carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}}@media print{html .carousel-dark .carousel-control-prev-icon,html .carousel-dark .carousel-control-next-icon,html[data-netbox-color-mode=dark] .carousel-dark .carousel-control-prev-icon,html[data-netbox-color-mode=dark] .carousel-dark .carousel-control-next-icon,html[data-netbox-color-mode=light] .carousel-dark .carousel-control-prev-icon,html[data-netbox-color-mode=light] .carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}html .carousel-dark .carousel-indicators [data-bs-target],html[data-netbox-color-mode=dark] .carousel-dark .carousel-indicators [data-bs-target],html[data-netbox-color-mode=light] .carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}html .carousel-dark .carousel-caption,html[data-netbox-color-mode=dark] .carousel-dark .carousel-caption,html[data-netbox-color-mode=light] .carousel-dark .carousel-caption{color:#000}}@media print{@keyframes spinner-border{to{transform:rotate(360deg)}}}@media print{html .spinner-border,html[data-netbox-color-mode=dark] .spinner-border,html[data-netbox-color-mode=light] .spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}}@media print{html .spinner-border-sm,html[data-netbox-color-mode=dark] .spinner-border-sm,html[data-netbox-color-mode=light] .spinner-border-sm{width:1rem;height:1rem;border-width:.2em}}@media print{@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}}@media print{html .spinner-grow,html[data-netbox-color-mode=dark] .spinner-grow,html[data-netbox-color-mode=light] .spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}}@media print{html .spinner-grow-sm,html[data-netbox-color-mode=dark] .spinner-grow-sm,html[data-netbox-color-mode=light] .spinner-grow-sm{width:1rem;height:1rem}}@media print and (prefers-reduced-motion: reduce){html .spinner-border,html .spinner-grow,html[data-netbox-color-mode=dark] .spinner-border,html[data-netbox-color-mode=dark] .spinner-grow,html[data-netbox-color-mode=light] .spinner-border,html[data-netbox-color-mode=light] .spinner-grow{animation-duration:1.5s}}@media print{html .clearfix:after,html[data-netbox-color-mode=dark] .clearfix:after,html[data-netbox-color-mode=light] .clearfix:after{display:block;clear:both;content:""}}@media print{html .link-primary,html[data-netbox-color-mode=dark] .link-primary,html[data-netbox-color-mode=light] .link-primary{color:#337ab7}html .link-primary:hover,html .link-primary:focus,html[data-netbox-color-mode=dark] .link-primary:hover,html[data-netbox-color-mode=dark] .link-primary:focus,html[data-netbox-color-mode=light] .link-primary:hover,html[data-netbox-color-mode=light] .link-primary:focus{color:#296292}}@media print{html .link-secondary,html[data-netbox-color-mode=dark] .link-secondary,html[data-netbox-color-mode=light] .link-secondary{color:#6c757d}html .link-secondary:hover,html .link-secondary:focus,html[data-netbox-color-mode=dark] .link-secondary:hover,html[data-netbox-color-mode=dark] .link-secondary:focus,html[data-netbox-color-mode=light] .link-secondary:hover,html[data-netbox-color-mode=light] .link-secondary:focus{color:#565e64}}@media print{html .link-success,html[data-netbox-color-mode=dark] .link-success,html[data-netbox-color-mode=light] .link-success{color:#198754}html .link-success:hover,html .link-success:focus,html[data-netbox-color-mode=dark] .link-success:hover,html[data-netbox-color-mode=dark] .link-success:focus,html[data-netbox-color-mode=light] .link-success:hover,html[data-netbox-color-mode=light] .link-success:focus{color:#146c43}}@media print{html .link-info,html[data-netbox-color-mode=dark] .link-info,html[data-netbox-color-mode=light] .link-info{color:#54d6f0}html .link-info:hover,html .link-info:focus,html[data-netbox-color-mode=dark] .link-info:hover,html[data-netbox-color-mode=dark] .link-info:focus,html[data-netbox-color-mode=light] .link-info:hover,html[data-netbox-color-mode=light] .link-info:focus{color:#76def3}}@media print{html .link-warning,html[data-netbox-color-mode=dark] .link-warning,html[data-netbox-color-mode=light] .link-warning{color:#ffc107}html .link-warning:hover,html .link-warning:focus,html[data-netbox-color-mode=dark] .link-warning:hover,html[data-netbox-color-mode=dark] .link-warning:focus,html[data-netbox-color-mode=light] .link-warning:hover,html[data-netbox-color-mode=light] .link-warning:focus{color:#ffcd39}}@media print{html .link-danger,html[data-netbox-color-mode=dark] .link-danger,html[data-netbox-color-mode=light] .link-danger{color:#dc3545}html .link-danger:hover,html .link-danger:focus,html[data-netbox-color-mode=dark] .link-danger:hover,html[data-netbox-color-mode=dark] .link-danger:focus,html[data-netbox-color-mode=light] .link-danger:hover,html[data-netbox-color-mode=light] .link-danger:focus{color:#b02a37}}@media print{html .link-light,html[data-netbox-color-mode=dark] .link-light,html[data-netbox-color-mode=light] .link-light{color:#e9ecef}html .link-light:hover,html .link-light:focus,html[data-netbox-color-mode=dark] .link-light:hover,html[data-netbox-color-mode=dark] .link-light:focus,html[data-netbox-color-mode=light] .link-light:hover,html[data-netbox-color-mode=light] .link-light:focus{color:#edf0f2}}@media print{html .link-dark,html[data-netbox-color-mode=dark] .link-dark,html[data-netbox-color-mode=light] .link-dark{color:#343a40}html .link-dark:hover,html .link-dark:focus,html[data-netbox-color-mode=dark] .link-dark:hover,html[data-netbox-color-mode=dark] .link-dark:focus,html[data-netbox-color-mode=light] .link-dark:hover,html[data-netbox-color-mode=light] .link-dark:focus{color:#2a2e33}}@media print{html .link-blue,html[data-netbox-color-mode=dark] .link-blue,html[data-netbox-color-mode=light] .link-blue{color:#0d6efd}html .link-blue:hover,html .link-blue:focus,html[data-netbox-color-mode=dark] .link-blue:hover,html[data-netbox-color-mode=dark] .link-blue:focus,html[data-netbox-color-mode=light] .link-blue:hover,html[data-netbox-color-mode=light] .link-blue:focus{color:#0a58ca}}@media print{html .link-indigo,html[data-netbox-color-mode=dark] .link-indigo,html[data-netbox-color-mode=light] .link-indigo{color:#6610f2}html .link-indigo:hover,html .link-indigo:focus,html[data-netbox-color-mode=dark] .link-indigo:hover,html[data-netbox-color-mode=dark] .link-indigo:focus,html[data-netbox-color-mode=light] .link-indigo:hover,html[data-netbox-color-mode=light] .link-indigo:focus{color:#520dc2}}@media print{html .link-purple,html[data-netbox-color-mode=dark] .link-purple,html[data-netbox-color-mode=light] .link-purple{color:#6f42c1}html .link-purple:hover,html .link-purple:focus,html[data-netbox-color-mode=dark] .link-purple:hover,html[data-netbox-color-mode=dark] .link-purple:focus,html[data-netbox-color-mode=light] .link-purple:hover,html[data-netbox-color-mode=light] .link-purple:focus{color:#59359a}}@media print{html .link-pink,html[data-netbox-color-mode=dark] .link-pink,html[data-netbox-color-mode=light] .link-pink{color:#d63384}html .link-pink:hover,html .link-pink:focus,html[data-netbox-color-mode=dark] .link-pink:hover,html[data-netbox-color-mode=dark] .link-pink:focus,html[data-netbox-color-mode=light] .link-pink:hover,html[data-netbox-color-mode=light] .link-pink:focus{color:#ab296a}}@media print{html .link-red,html[data-netbox-color-mode=dark] .link-red,html[data-netbox-color-mode=light] .link-red{color:#dc3545}html .link-red:hover,html .link-red:focus,html[data-netbox-color-mode=dark] .link-red:hover,html[data-netbox-color-mode=dark] .link-red:focus,html[data-netbox-color-mode=light] .link-red:hover,html[data-netbox-color-mode=light] .link-red:focus{color:#b02a37}}@media print{html .link-orange,html[data-netbox-color-mode=dark] .link-orange,html[data-netbox-color-mode=light] .link-orange{color:#fd7e14}html .link-orange:hover,html .link-orange:focus,html[data-netbox-color-mode=dark] .link-orange:hover,html[data-netbox-color-mode=dark] .link-orange:focus,html[data-netbox-color-mode=light] .link-orange:hover,html[data-netbox-color-mode=light] .link-orange:focus{color:#fd9843}}@media print{html .link-yellow,html[data-netbox-color-mode=dark] .link-yellow,html[data-netbox-color-mode=light] .link-yellow{color:#ffc107}html .link-yellow:hover,html .link-yellow:focus,html[data-netbox-color-mode=dark] .link-yellow:hover,html[data-netbox-color-mode=dark] .link-yellow:focus,html[data-netbox-color-mode=light] .link-yellow:hover,html[data-netbox-color-mode=light] .link-yellow:focus{color:#ffcd39}}@media print{html .link-green,html[data-netbox-color-mode=dark] .link-green,html[data-netbox-color-mode=light] .link-green{color:#198754}html .link-green:hover,html .link-green:focus,html[data-netbox-color-mode=dark] .link-green:hover,html[data-netbox-color-mode=dark] .link-green:focus,html[data-netbox-color-mode=light] .link-green:hover,html[data-netbox-color-mode=light] .link-green:focus{color:#146c43}}@media print{html .link-teal,html[data-netbox-color-mode=dark] .link-teal,html[data-netbox-color-mode=light] .link-teal{color:#20c997}html .link-teal:hover,html .link-teal:focus,html[data-netbox-color-mode=dark] .link-teal:hover,html[data-netbox-color-mode=dark] .link-teal:focus,html[data-netbox-color-mode=light] .link-teal:hover,html[data-netbox-color-mode=light] .link-teal:focus{color:#4dd4ac}}@media print{html .link-cyan,html[data-netbox-color-mode=dark] .link-cyan,html[data-netbox-color-mode=light] .link-cyan{color:#0dcaf0}html .link-cyan:hover,html .link-cyan:focus,html[data-netbox-color-mode=dark] .link-cyan:hover,html[data-netbox-color-mode=dark] .link-cyan:focus,html[data-netbox-color-mode=light] .link-cyan:hover,html[data-netbox-color-mode=light] .link-cyan:focus{color:#3dd5f3}}@media print{html .link-gray,html[data-netbox-color-mode=dark] .link-gray,html[data-netbox-color-mode=light] .link-gray{color:#adb5bd}html .link-gray:hover,html .link-gray:focus,html[data-netbox-color-mode=dark] .link-gray:hover,html[data-netbox-color-mode=dark] .link-gray:focus,html[data-netbox-color-mode=light] .link-gray:hover,html[data-netbox-color-mode=light] .link-gray:focus{color:#bdc4ca}}@media print{html .link-black,html[data-netbox-color-mode=dark] .link-black,html[data-netbox-color-mode=light] .link-black{color:#000}html .link-black:hover,html .link-black:focus,html[data-netbox-color-mode=dark] .link-black:hover,html[data-netbox-color-mode=dark] .link-black:focus,html[data-netbox-color-mode=light] .link-black:hover,html[data-netbox-color-mode=light] .link-black:focus{color:#000}}@media print{html .link-white,html[data-netbox-color-mode=dark] .link-white,html[data-netbox-color-mode=light] .link-white{color:#fff}html .link-white:hover,html .link-white:focus,html[data-netbox-color-mode=dark] .link-white:hover,html[data-netbox-color-mode=dark] .link-white:focus,html[data-netbox-color-mode=light] .link-white:hover,html[data-netbox-color-mode=light] .link-white:focus{color:#fff}}@media print{html .ratio,html[data-netbox-color-mode=dark] .ratio,html[data-netbox-color-mode=light] .ratio{position:relative;width:100%}html .ratio:before,html[data-netbox-color-mode=dark] .ratio:before,html[data-netbox-color-mode=light] .ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}html .ratio>*,html[data-netbox-color-mode=dark] .ratio>*,html[data-netbox-color-mode=light] .ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}}@media print{html .ratio-1x1,html[data-netbox-color-mode=dark] .ratio-1x1,html[data-netbox-color-mode=light] .ratio-1x1{--bs-aspect-ratio: 100%}}@media print{html .ratio-4x3,html[data-netbox-color-mode=dark] .ratio-4x3,html[data-netbox-color-mode=light] .ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}}@media print{html .ratio-16x9,html[data-netbox-color-mode=dark] .ratio-16x9,html[data-netbox-color-mode=light] .ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}}@media print{html .ratio-21x9,html[data-netbox-color-mode=dark] .ratio-21x9,html[data-netbox-color-mode=light] .ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}}@media print{html .fixed-top,html[data-netbox-color-mode=dark] .fixed-top,html[data-netbox-color-mode=light] .fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}}@media print{html .fixed-bottom,html[data-netbox-color-mode=dark] .fixed-bottom,html[data-netbox-color-mode=light] .fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}}@media print{html .sticky-top,html[data-netbox-color-mode=dark] .sticky-top,html[data-netbox-color-mode=light] .sticky-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 576px){html .sticky-sm-top,html[data-netbox-color-mode=dark] .sticky-sm-top,html[data-netbox-color-mode=light] .sticky-sm-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 768px){html .sticky-md-top,html[data-netbox-color-mode=dark] .sticky-md-top,html[data-netbox-color-mode=light] .sticky-md-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 992px){html .sticky-lg-top,html[data-netbox-color-mode=dark] .sticky-lg-top,html[data-netbox-color-mode=light] .sticky-lg-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 1200px){html .sticky-xl-top,html[data-netbox-color-mode=dark] .sticky-xl-top,html[data-netbox-color-mode=light] .sticky-xl-top{position:sticky;top:0;z-index:1020}}@media print and (min-width: 1400px){html .sticky-xxl-top,html[data-netbox-color-mode=dark] .sticky-xxl-top,html[data-netbox-color-mode=light] .sticky-xxl-top{position:sticky;top:0;z-index:1020}}@media print{html .visually-hidden,html .visually-hidden-focusable:not(:focus):not(:focus-within),html[data-netbox-color-mode=dark] .visually-hidden,html[data-netbox-color-mode=dark] .visually-hidden-focusable:not(:focus):not(:focus-within),html[data-netbox-color-mode=light] .visually-hidden,html[data-netbox-color-mode=light] .visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;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}}@media print{html .stretched-link:after,html[data-netbox-color-mode=dark] .stretched-link:after,html[data-netbox-color-mode=light] .stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}}@media print{html .text-truncate,html[data-netbox-color-mode=dark] .text-truncate,html[data-netbox-color-mode=light] .text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media print{html .align-baseline,html[data-netbox-color-mode=dark] .align-baseline,html[data-netbox-color-mode=light] .align-baseline{vertical-align:baseline!important}}@media print{html .align-top,html[data-netbox-color-mode=dark] .align-top,html[data-netbox-color-mode=light] .align-top{vertical-align:top!important}}@media print{html .align-middle,html[data-netbox-color-mode=dark] .align-middle,html[data-netbox-color-mode=light] .align-middle{vertical-align:middle!important}}@media print{html .align-bottom,html[data-netbox-color-mode=dark] .align-bottom,html[data-netbox-color-mode=light] .align-bottom{vertical-align:bottom!important}}@media print{html .align-text-bottom,html[data-netbox-color-mode=dark] .align-text-bottom,html[data-netbox-color-mode=light] .align-text-bottom{vertical-align:text-bottom!important}}@media print{html .align-text-top,html[data-netbox-color-mode=dark] .align-text-top,html[data-netbox-color-mode=light] .align-text-top{vertical-align:text-top!important}}@media print{html .float-start,html[data-netbox-color-mode=dark] .float-start,html[data-netbox-color-mode=light] .float-start{float:left!important}}@media print{html .float-end,html[data-netbox-color-mode=dark] .float-end,html[data-netbox-color-mode=light] .float-end{float:right!important}}@media print{html .float-none,html[data-netbox-color-mode=dark] .float-none,html[data-netbox-color-mode=light] .float-none{float:none!important}}@media print{html .overflow-auto,html[data-netbox-color-mode=dark] .overflow-auto,html[data-netbox-color-mode=light] .overflow-auto{overflow:auto!important}}@media print{html .overflow-hidden,html[data-netbox-color-mode=dark] .overflow-hidden,html[data-netbox-color-mode=light] .overflow-hidden{overflow:hidden!important}}@media print{html .overflow-visible,html[data-netbox-color-mode=dark] .overflow-visible,html[data-netbox-color-mode=light] .overflow-visible{overflow:visible!important}}@media print{html .overflow-scroll,html[data-netbox-color-mode=dark] .overflow-scroll,html[data-netbox-color-mode=light] .overflow-scroll{overflow:scroll!important}}@media print{html .d-inline,html[data-netbox-color-mode=dark] .d-inline,html[data-netbox-color-mode=light] .d-inline{display:inline!important}}@media print{html .d-inline-block,html[data-netbox-color-mode=dark] .d-inline-block,html[data-netbox-color-mode=light] .d-inline-block{display:inline-block!important}}@media print{html .d-block,html[data-netbox-color-mode=dark] .d-block,html[data-netbox-color-mode=light] .d-block{display:block!important}}@media print{html .d-grid,html[data-netbox-color-mode=dark] .d-grid,html[data-netbox-color-mode=light] .d-grid{display:grid!important}}@media print{html .d-table,html[data-netbox-color-mode=dark] .d-table,html[data-netbox-color-mode=light] .d-table{display:table!important}}@media print{html .d-table-row,html[data-netbox-color-mode=dark] .d-table-row,html[data-netbox-color-mode=light] .d-table-row{display:table-row!important}}@media print{html .d-table-cell,html[data-netbox-color-mode=dark] .d-table-cell,html[data-netbox-color-mode=light] .d-table-cell{display:table-cell!important}}@media print{html .d-flex,html[data-netbox-color-mode=dark] .d-flex,html[data-netbox-color-mode=light] .d-flex{display:flex!important}}@media print{html .d-inline-flex,html[data-netbox-color-mode=dark] .d-inline-flex,html[data-netbox-color-mode=light] .d-inline-flex{display:inline-flex!important}}@media print{html .d-none,html[data-netbox-color-mode=dark] .d-none,html[data-netbox-color-mode=light] .d-none{display:none!important}}@media print{html .shadow,html[data-netbox-color-mode=dark] .shadow,html[data-netbox-color-mode=light] .shadow{box-shadow:0 .5rem 1rem #00000026!important}}@media print{html .shadow-sm,html[data-netbox-color-mode=dark] .shadow-sm,html[data-netbox-color-mode=light] .shadow-sm{box-shadow:0 .125rem .25rem #00000013!important}}@media print{html .shadow-lg,html[data-netbox-color-mode=dark] .shadow-lg,html[data-netbox-color-mode=light] .shadow-lg{box-shadow:0 1rem 3rem #0000002d!important}}@media print{html .shadow-none,html[data-netbox-color-mode=dark] .shadow-none,html[data-netbox-color-mode=light] .shadow-none{box-shadow:none!important}}@media print{html .position-static,html[data-netbox-color-mode=dark] .position-static,html[data-netbox-color-mode=light] .position-static{position:static!important}}@media print{html .position-relative,html[data-netbox-color-mode=dark] .position-relative,html[data-netbox-color-mode=light] .position-relative{position:relative!important}}@media print{html .position-absolute,html[data-netbox-color-mode=dark] .position-absolute,html[data-netbox-color-mode=light] .position-absolute{position:absolute!important}}@media print{html .position-fixed,html[data-netbox-color-mode=dark] .position-fixed,html[data-netbox-color-mode=light] .position-fixed{position:fixed!important}}@media print{html .position-sticky,html[data-netbox-color-mode=dark] .position-sticky,html[data-netbox-color-mode=light] .position-sticky{position:sticky!important}}@media print{html .top-0,html[data-netbox-color-mode=dark] .top-0,html[data-netbox-color-mode=light] .top-0{top:0!important}}@media print{html .top-50,html[data-netbox-color-mode=dark] .top-50,html[data-netbox-color-mode=light] .top-50{top:50%!important}}@media print{html .top-100,html[data-netbox-color-mode=dark] .top-100,html[data-netbox-color-mode=light] .top-100{top:100%!important}}@media print{html .bottom-0,html[data-netbox-color-mode=dark] .bottom-0,html[data-netbox-color-mode=light] .bottom-0{bottom:0!important}}@media print{html .bottom-50,html[data-netbox-color-mode=dark] .bottom-50,html[data-netbox-color-mode=light] .bottom-50{bottom:50%!important}}@media print{html .bottom-100,html[data-netbox-color-mode=dark] .bottom-100,html[data-netbox-color-mode=light] .bottom-100{bottom:100%!important}}@media print{html .start-0,html[data-netbox-color-mode=dark] .start-0,html[data-netbox-color-mode=light] .start-0{left:0!important}}@media print{html .start-50,html[data-netbox-color-mode=dark] .start-50,html[data-netbox-color-mode=light] .start-50{left:50%!important}}@media print{html .start-100,html[data-netbox-color-mode=dark] .start-100,html[data-netbox-color-mode=light] .start-100{left:100%!important}}@media print{html .end-0,html[data-netbox-color-mode=dark] .end-0,html[data-netbox-color-mode=light] .end-0{right:0!important}}@media print{html .end-50,html[data-netbox-color-mode=dark] .end-50,html[data-netbox-color-mode=light] .end-50{right:50%!important}}@media print{html .end-100,html[data-netbox-color-mode=dark] .end-100,html[data-netbox-color-mode=light] .end-100{right:100%!important}}@media print{html .translate-middle,html[data-netbox-color-mode=dark] .translate-middle,html[data-netbox-color-mode=light] .translate-middle{transform:translate(-50%,-50%)!important}}@media print{html .translate-middle-x,html[data-netbox-color-mode=dark] .translate-middle-x,html[data-netbox-color-mode=light] .translate-middle-x{transform:translate(-50%)!important}}@media print{html .translate-middle-y,html[data-netbox-color-mode=dark] .translate-middle-y,html[data-netbox-color-mode=light] .translate-middle-y{transform:translateY(-50%)!important}}@media print{html .border,html[data-netbox-color-mode=dark] .border,html[data-netbox-color-mode=light] .border{border:1px solid #dee2e6!important}}@media print{html .border-0,html[data-netbox-color-mode=dark] .border-0,html[data-netbox-color-mode=light] .border-0{border:0!important}}@media print{html .border-top,html[data-netbox-color-mode=dark] .border-top,html[data-netbox-color-mode=light] .border-top{border-top:1px solid #dee2e6!important}}@media print{html .border-top-0,html[data-netbox-color-mode=dark] .border-top-0,html[data-netbox-color-mode=light] .border-top-0{border-top:0!important}}@media print{html .border-end,html[data-netbox-color-mode=dark] .border-end,html[data-netbox-color-mode=light] .border-end{border-right:1px solid #dee2e6!important}}@media print{html .border-end-0,html[data-netbox-color-mode=dark] .border-end-0,html[data-netbox-color-mode=light] .border-end-0{border-right:0!important}}@media print{html .border-bottom,html[data-netbox-color-mode=dark] .border-bottom,html[data-netbox-color-mode=light] .border-bottom{border-bottom:1px solid #dee2e6!important}}@media print{html .border-bottom-0,html[data-netbox-color-mode=dark] .border-bottom-0,html[data-netbox-color-mode=light] .border-bottom-0{border-bottom:0!important}}@media print{html .border-start,html[data-netbox-color-mode=dark] .border-start,html[data-netbox-color-mode=light] .border-start{border-left:1px solid #dee2e6!important}}@media print{html .border-start-0,html[data-netbox-color-mode=dark] .border-start-0,html[data-netbox-color-mode=light] .border-start-0{border-left:0!important}}@media print{html .border-primary,html[data-netbox-color-mode=dark] .border-primary,html[data-netbox-color-mode=light] .border-primary{border-color:#337ab7!important}}@media print{html .border-secondary,html[data-netbox-color-mode=dark] .border-secondary,html[data-netbox-color-mode=light] .border-secondary{border-color:#6c757d!important}}@media print{html .border-success,html[data-netbox-color-mode=dark] .border-success,html[data-netbox-color-mode=light] .border-success{border-color:#198754!important}}@media print{html .border-info,html[data-netbox-color-mode=dark] .border-info,html[data-netbox-color-mode=light] .border-info{border-color:#54d6f0!important}}@media print{html .border-warning,html[data-netbox-color-mode=dark] .border-warning,html[data-netbox-color-mode=light] .border-warning{border-color:#ffc107!important}}@media print{html .border-danger,html[data-netbox-color-mode=dark] .border-danger,html[data-netbox-color-mode=light] .border-danger{border-color:#dc3545!important}}@media print{html .border-light,html[data-netbox-color-mode=dark] .border-light,html[data-netbox-color-mode=light] .border-light{border-color:#e9ecef!important}}@media print{html .border-dark,html[data-netbox-color-mode=dark] .border-dark,html[data-netbox-color-mode=light] .border-dark{border-color:#343a40!important}}@media print{html .border-blue,html[data-netbox-color-mode=dark] .border-blue,html[data-netbox-color-mode=light] .border-blue{border-color:#0d6efd!important}}@media print{html .border-indigo,html[data-netbox-color-mode=dark] .border-indigo,html[data-netbox-color-mode=light] .border-indigo{border-color:#6610f2!important}}@media print{html .border-purple,html[data-netbox-color-mode=dark] .border-purple,html[data-netbox-color-mode=light] .border-purple{border-color:#6f42c1!important}}@media print{html .border-pink,html[data-netbox-color-mode=dark] .border-pink,html[data-netbox-color-mode=light] .border-pink{border-color:#d63384!important}}@media print{html .border-red,html[data-netbox-color-mode=dark] .border-red,html[data-netbox-color-mode=light] .border-red{border-color:#dc3545!important}}@media print{html .border-orange,html[data-netbox-color-mode=dark] .border-orange,html[data-netbox-color-mode=light] .border-orange{border-color:#fd7e14!important}}@media print{html .border-yellow,html[data-netbox-color-mode=dark] .border-yellow,html[data-netbox-color-mode=light] .border-yellow{border-color:#ffc107!important}}@media print{html .border-green,html[data-netbox-color-mode=dark] .border-green,html[data-netbox-color-mode=light] .border-green{border-color:#198754!important}}@media print{html .border-teal,html[data-netbox-color-mode=dark] .border-teal,html[data-netbox-color-mode=light] .border-teal{border-color:#20c997!important}}@media print{html .border-cyan,html[data-netbox-color-mode=dark] .border-cyan,html[data-netbox-color-mode=light] .border-cyan{border-color:#0dcaf0!important}}@media print{html .border-gray,html[data-netbox-color-mode=dark] .border-gray,html[data-netbox-color-mode=light] .border-gray{border-color:#adb5bd!important}}@media print{html .border-black,html[data-netbox-color-mode=dark] .border-black,html[data-netbox-color-mode=light] .border-black{border-color:#000!important}}@media print{html .border-white,html[data-netbox-color-mode=dark] .border-white,html[data-netbox-color-mode=light] .border-white{border-color:#fff!important}}@media print{html .border-1,html[data-netbox-color-mode=dark] .border-1,html[data-netbox-color-mode=light] .border-1{border-width:1px!important}}@media print{html .border-2,html[data-netbox-color-mode=dark] .border-2,html[data-netbox-color-mode=light] .border-2{border-width:2px!important}}@media print{html .border-3,html[data-netbox-color-mode=dark] .border-3,html[data-netbox-color-mode=light] .border-3{border-width:3px!important}}@media print{html .border-4,html[data-netbox-color-mode=dark] .border-4,html[data-netbox-color-mode=light] .border-4{border-width:4px!important}}@media print{html .border-5,html[data-netbox-color-mode=dark] .border-5,html[data-netbox-color-mode=light] .border-5{border-width:5px!important}}@media print{html .w-25,html[data-netbox-color-mode=dark] .w-25,html[data-netbox-color-mode=light] .w-25{width:25%!important}}@media print{html .w-50,html[data-netbox-color-mode=dark] .w-50,html[data-netbox-color-mode=light] .w-50{width:50%!important}}@media print{html .w-75,html[data-netbox-color-mode=dark] .w-75,html[data-netbox-color-mode=light] .w-75{width:75%!important}}@media print{html .w-100,html[data-netbox-color-mode=dark] .w-100,html[data-netbox-color-mode=light] .w-100{width:100%!important}}@media print{html .w-auto,html[data-netbox-color-mode=dark] .w-auto,html[data-netbox-color-mode=light] .w-auto{width:auto!important}}@media print{html .mw-100,html[data-netbox-color-mode=dark] .mw-100,html[data-netbox-color-mode=light] .mw-100{max-width:100%!important}}@media print{html .vw-100,html[data-netbox-color-mode=dark] .vw-100,html[data-netbox-color-mode=light] .vw-100{width:100vw!important}}@media print{html .min-vw-100,html[data-netbox-color-mode=dark] .min-vw-100,html[data-netbox-color-mode=light] .min-vw-100{min-width:100vw!important}}@media print{html .h-25,html[data-netbox-color-mode=dark] .h-25,html[data-netbox-color-mode=light] .h-25{height:25%!important}}@media print{html .h-50,html[data-netbox-color-mode=dark] .h-50,html[data-netbox-color-mode=light] .h-50{height:50%!important}}@media print{html .h-75,html[data-netbox-color-mode=dark] .h-75,html[data-netbox-color-mode=light] .h-75{height:75%!important}}@media print{html .h-100,html[data-netbox-color-mode=dark] .h-100,html[data-netbox-color-mode=light] .h-100{height:100%!important}}@media print{html .h-auto,html[data-netbox-color-mode=dark] .h-auto,html[data-netbox-color-mode=light] .h-auto{height:auto!important}}@media print{html .mh-100,html[data-netbox-color-mode=dark] .mh-100,html[data-netbox-color-mode=light] .mh-100{max-height:100%!important}}@media print{html .vh-100,html[data-netbox-color-mode=dark] .vh-100,html[data-netbox-color-mode=light] .vh-100{height:100vh!important}}@media print{html .min-vh-100,html[data-netbox-color-mode=dark] .min-vh-100,html[data-netbox-color-mode=light] .min-vh-100{min-height:100vh!important}}@media print{html .flex-fill,html[data-netbox-color-mode=dark] .flex-fill,html[data-netbox-color-mode=light] .flex-fill{flex:1 1 auto!important}}@media print{html .flex-row,html[data-netbox-color-mode=dark] .flex-row,html[data-netbox-color-mode=light] .flex-row{flex-direction:row!important}}@media print{html .flex-column,html[data-netbox-color-mode=dark] .flex-column,html[data-netbox-color-mode=light] .flex-column{flex-direction:column!important}}@media print{html .flex-row-reverse,html[data-netbox-color-mode=dark] .flex-row-reverse,html[data-netbox-color-mode=light] .flex-row-reverse{flex-direction:row-reverse!important}}@media print{html .flex-column-reverse,html[data-netbox-color-mode=dark] .flex-column-reverse,html[data-netbox-color-mode=light] .flex-column-reverse{flex-direction:column-reverse!important}}@media print{html .flex-grow-0,html[data-netbox-color-mode=dark] .flex-grow-0,html[data-netbox-color-mode=light] .flex-grow-0{flex-grow:0!important}}@media print{html .flex-grow-1,html[data-netbox-color-mode=dark] .flex-grow-1,html[data-netbox-color-mode=light] .flex-grow-1{flex-grow:1!important}}@media print{html .flex-shrink-0,html[data-netbox-color-mode=dark] .flex-shrink-0,html[data-netbox-color-mode=light] .flex-shrink-0{flex-shrink:0!important}}@media print{html .flex-shrink-1,html[data-netbox-color-mode=dark] .flex-shrink-1,html[data-netbox-color-mode=light] .flex-shrink-1{flex-shrink:1!important}}@media print{html .flex-wrap,html[data-netbox-color-mode=dark] .flex-wrap,html[data-netbox-color-mode=light] .flex-wrap{flex-wrap:wrap!important}}@media print{html .flex-nowrap,html[data-netbox-color-mode=dark] .flex-nowrap,html[data-netbox-color-mode=light] .flex-nowrap{flex-wrap:nowrap!important}}@media print{html .flex-wrap-reverse,html[data-netbox-color-mode=dark] .flex-wrap-reverse,html[data-netbox-color-mode=light] .flex-wrap-reverse{flex-wrap:wrap-reverse!important}}@media print{html .gap-0,html[data-netbox-color-mode=dark] .gap-0,html[data-netbox-color-mode=light] .gap-0{gap:0!important}}@media print{html .gap-1,html[data-netbox-color-mode=dark] .gap-1,html[data-netbox-color-mode=light] .gap-1{gap:.25rem!important}}@media print{html .gap-2,html[data-netbox-color-mode=dark] .gap-2,html[data-netbox-color-mode=light] .gap-2{gap:.5rem!important}}@media print{html .gap-3,html[data-netbox-color-mode=dark] .gap-3,html[data-netbox-color-mode=light] .gap-3{gap:1rem!important}}@media print{html .gap-4,html[data-netbox-color-mode=dark] .gap-4,html[data-netbox-color-mode=light] .gap-4{gap:1.5rem!important}}@media print{html .gap-5,html[data-netbox-color-mode=dark] .gap-5,html[data-netbox-color-mode=light] .gap-5{gap:3rem!important}}@media print{html .justify-content-start,html[data-netbox-color-mode=dark] .justify-content-start,html[data-netbox-color-mode=light] .justify-content-start{justify-content:flex-start!important}}@media print{html .justify-content-end,html[data-netbox-color-mode=dark] .justify-content-end,html[data-netbox-color-mode=light] .justify-content-end{justify-content:flex-end!important}}@media print{html .justify-content-center,html[data-netbox-color-mode=dark] .justify-content-center,html[data-netbox-color-mode=light] .justify-content-center{justify-content:center!important}}@media print{html .justify-content-between,html[data-netbox-color-mode=dark] .justify-content-between,html[data-netbox-color-mode=light] .justify-content-between{justify-content:space-between!important}}@media print{html .justify-content-around,html[data-netbox-color-mode=dark] .justify-content-around,html[data-netbox-color-mode=light] .justify-content-around{justify-content:space-around!important}}@media print{html .justify-content-evenly,html[data-netbox-color-mode=dark] .justify-content-evenly,html[data-netbox-color-mode=light] .justify-content-evenly{justify-content:space-evenly!important}}@media print{html .align-items-start,html[data-netbox-color-mode=dark] .align-items-start,html[data-netbox-color-mode=light] .align-items-start{align-items:flex-start!important}}@media print{html .align-items-end,html[data-netbox-color-mode=dark] .align-items-end,html[data-netbox-color-mode=light] .align-items-end{align-items:flex-end!important}}@media print{html .align-items-center,html[data-netbox-color-mode=dark] .align-items-center,html[data-netbox-color-mode=light] .align-items-center{align-items:center!important}}@media print{html .align-items-baseline,html[data-netbox-color-mode=dark] .align-items-baseline,html[data-netbox-color-mode=light] .align-items-baseline{align-items:baseline!important}}@media print{html .align-items-stretch,html[data-netbox-color-mode=dark] .align-items-stretch,html[data-netbox-color-mode=light] .align-items-stretch{align-items:stretch!important}}@media print{html .align-content-start,html[data-netbox-color-mode=dark] .align-content-start,html[data-netbox-color-mode=light] .align-content-start{align-content:flex-start!important}}@media print{html .align-content-end,html[data-netbox-color-mode=dark] .align-content-end,html[data-netbox-color-mode=light] .align-content-end{align-content:flex-end!important}}@media print{html .align-content-center,html[data-netbox-color-mode=dark] .align-content-center,html[data-netbox-color-mode=light] .align-content-center{align-content:center!important}}@media print{html .align-content-between,html[data-netbox-color-mode=dark] .align-content-between,html[data-netbox-color-mode=light] .align-content-between{align-content:space-between!important}}@media print{html .align-content-around,html[data-netbox-color-mode=dark] .align-content-around,html[data-netbox-color-mode=light] .align-content-around{align-content:space-around!important}}@media print{html .align-content-stretch,html[data-netbox-color-mode=dark] .align-content-stretch,html[data-netbox-color-mode=light] .align-content-stretch{align-content:stretch!important}}@media print{html .align-self-auto,html[data-netbox-color-mode=dark] .align-self-auto,html[data-netbox-color-mode=light] .align-self-auto{align-self:auto!important}}@media print{html .align-self-start,html[data-netbox-color-mode=dark] .align-self-start,html[data-netbox-color-mode=light] .align-self-start{align-self:flex-start!important}}@media print{html .align-self-end,html[data-netbox-color-mode=dark] .align-self-end,html[data-netbox-color-mode=light] .align-self-end{align-self:flex-end!important}}@media print{html .align-self-center,html[data-netbox-color-mode=dark] .align-self-center,html[data-netbox-color-mode=light] .align-self-center{align-self:center!important}}@media print{html .align-self-baseline,html[data-netbox-color-mode=dark] .align-self-baseline,html[data-netbox-color-mode=light] .align-self-baseline{align-self:baseline!important}}@media print{html .align-self-stretch,html[data-netbox-color-mode=dark] .align-self-stretch,html[data-netbox-color-mode=light] .align-self-stretch{align-self:stretch!important}}@media print{html .order-first,html[data-netbox-color-mode=dark] .order-first,html[data-netbox-color-mode=light] .order-first{order:-1!important}}@media print{html .order-0,html[data-netbox-color-mode=dark] .order-0,html[data-netbox-color-mode=light] .order-0{order:0!important}}@media print{html .order-1,html[data-netbox-color-mode=dark] .order-1,html[data-netbox-color-mode=light] .order-1{order:1!important}}@media print{html .order-2,html[data-netbox-color-mode=dark] .order-2,html[data-netbox-color-mode=light] .order-2{order:2!important}}@media print{html .order-3,html[data-netbox-color-mode=dark] .order-3,html[data-netbox-color-mode=light] .order-3{order:3!important}}@media print{html .order-4,html[data-netbox-color-mode=dark] .order-4,html[data-netbox-color-mode=light] .order-4{order:4!important}}@media print{html .order-5,html[data-netbox-color-mode=dark] .order-5,html[data-netbox-color-mode=light] .order-5{order:5!important}}@media print{html .order-last,html[data-netbox-color-mode=dark] .order-last,html[data-netbox-color-mode=light] .order-last{order:6!important}}@media print{html .m-0,html[data-netbox-color-mode=dark] .m-0,html[data-netbox-color-mode=light] .m-0{margin:0!important}}@media print{html .m-1,html[data-netbox-color-mode=dark] .m-1,html[data-netbox-color-mode=light] .m-1{margin:.25rem!important}}@media print{html .m-2,html[data-netbox-color-mode=dark] .m-2,html[data-netbox-color-mode=light] .m-2{margin:.5rem!important}}@media print{html .m-3,html[data-netbox-color-mode=dark] .m-3,html[data-netbox-color-mode=light] .m-3{margin:1rem!important}}@media print{html .m-4,html[data-netbox-color-mode=dark] .m-4,html[data-netbox-color-mode=light] .m-4{margin:1.5rem!important}}@media print{html .m-5,html[data-netbox-color-mode=dark] .m-5,html[data-netbox-color-mode=light] .m-5{margin:3rem!important}}@media print{html .m-auto,html[data-netbox-color-mode=dark] .m-auto,html[data-netbox-color-mode=light] .m-auto{margin:auto!important}}@media print{html .mx-0,html[data-netbox-color-mode=dark] .mx-0,html[data-netbox-color-mode=light] .mx-0{margin-right:0!important;margin-left:0!important}}@media print{html .mx-1,html[data-netbox-color-mode=dark] .mx-1,html[data-netbox-color-mode=light] .mx-1{margin-right:.25rem!important;margin-left:.25rem!important}}@media print{html .mx-2,html[data-netbox-color-mode=dark] .mx-2,html[data-netbox-color-mode=light] .mx-2{margin-right:.5rem!important;margin-left:.5rem!important}}@media print{html .mx-3,html[data-netbox-color-mode=dark] .mx-3,html[data-netbox-color-mode=light] .mx-3{margin-right:1rem!important;margin-left:1rem!important}}@media print{html .mx-4,html[data-netbox-color-mode=dark] .mx-4,html[data-netbox-color-mode=light] .mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}}@media print{html .mx-5,html[data-netbox-color-mode=dark] .mx-5,html[data-netbox-color-mode=light] .mx-5{margin-right:3rem!important;margin-left:3rem!important}}@media print{html .mx-auto,html[data-netbox-color-mode=dark] .mx-auto,html[data-netbox-color-mode=light] .mx-auto{margin-right:auto!important;margin-left:auto!important}}@media print{html .my-0,html[data-netbox-color-mode=dark] .my-0,html[data-netbox-color-mode=light] .my-0{margin-top:0!important;margin-bottom:0!important}}@media print{html .my-1,html[data-netbox-color-mode=dark] .my-1,html[data-netbox-color-mode=light] .my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}}@media print{html .my-2,html[data-netbox-color-mode=dark] .my-2,html[data-netbox-color-mode=light] .my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}}@media print{html .my-3,html[data-netbox-color-mode=dark] .my-3,html[data-netbox-color-mode=light] .my-3{margin-top:1rem!important;margin-bottom:1rem!important}}@media print{html .my-4,html[data-netbox-color-mode=dark] .my-4,html[data-netbox-color-mode=light] .my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}}@media print{html .my-5,html[data-netbox-color-mode=dark] .my-5,html[data-netbox-color-mode=light] .my-5{margin-top:3rem!important;margin-bottom:3rem!important}}@media print{html .my-auto,html[data-netbox-color-mode=dark] .my-auto,html[data-netbox-color-mode=light] .my-auto{margin-top:auto!important;margin-bottom:auto!important}}@media print{html .mt-0,html[data-netbox-color-mode=dark] .mt-0,html[data-netbox-color-mode=light] .mt-0{margin-top:0!important}}@media print{html .mt-1,html[data-netbox-color-mode=dark] .mt-1,html[data-netbox-color-mode=light] .mt-1{margin-top:.25rem!important}}@media print{html .mt-2,html[data-netbox-color-mode=dark] .mt-2,html[data-netbox-color-mode=light] .mt-2{margin-top:.5rem!important}}@media print{html .mt-3,html[data-netbox-color-mode=dark] .mt-3,html[data-netbox-color-mode=light] .mt-3{margin-top:1rem!important}}@media print{html .mt-4,html[data-netbox-color-mode=dark] .mt-4,html[data-netbox-color-mode=light] .mt-4{margin-top:1.5rem!important}}@media print{html .mt-5,html[data-netbox-color-mode=dark] .mt-5,html[data-netbox-color-mode=light] .mt-5{margin-top:3rem!important}}@media print{html .mt-auto,html[data-netbox-color-mode=dark] .mt-auto,html[data-netbox-color-mode=light] .mt-auto{margin-top:auto!important}}@media print{html .me-0,html[data-netbox-color-mode=dark] .me-0,html[data-netbox-color-mode=light] .me-0{margin-right:0!important}}@media print{html .me-1,html[data-netbox-color-mode=dark] .me-1,html[data-netbox-color-mode=light] .me-1{margin-right:.25rem!important}}@media print{html .me-2,html[data-netbox-color-mode=dark] .me-2,html[data-netbox-color-mode=light] .me-2{margin-right:.5rem!important}}@media print{html .me-3,html[data-netbox-color-mode=dark] .me-3,html[data-netbox-color-mode=light] .me-3{margin-right:1rem!important}}@media print{html .me-4,html[data-netbox-color-mode=dark] .me-4,html[data-netbox-color-mode=light] .me-4{margin-right:1.5rem!important}}@media print{html .me-5,html[data-netbox-color-mode=dark] .me-5,html[data-netbox-color-mode=light] .me-5{margin-right:3rem!important}}@media print{html .me-auto,html[data-netbox-color-mode=dark] .me-auto,html[data-netbox-color-mode=light] .me-auto{margin-right:auto!important}}@media print{html .mb-0,html[data-netbox-color-mode=dark] .mb-0,html[data-netbox-color-mode=light] .mb-0{margin-bottom:0!important}}@media print{html .mb-1,html[data-netbox-color-mode=dark] .mb-1,html[data-netbox-color-mode=light] .mb-1{margin-bottom:.25rem!important}}@media print{html .mb-2,html[data-netbox-color-mode=dark] .mb-2,html[data-netbox-color-mode=light] .mb-2{margin-bottom:.5rem!important}}@media print{html .mb-3,html[data-netbox-color-mode=dark] .mb-3,html[data-netbox-color-mode=light] .mb-3{margin-bottom:1rem!important}}@media print{html .mb-4,html[data-netbox-color-mode=dark] .mb-4,html[data-netbox-color-mode=light] .mb-4{margin-bottom:1.5rem!important}}@media print{html .mb-5,html[data-netbox-color-mode=dark] .mb-5,html[data-netbox-color-mode=light] .mb-5{margin-bottom:3rem!important}}@media print{html .mb-auto,html[data-netbox-color-mode=dark] .mb-auto,html[data-netbox-color-mode=light] .mb-auto{margin-bottom:auto!important}}@media print{html .ms-0,html[data-netbox-color-mode=dark] .ms-0,html[data-netbox-color-mode=light] .ms-0{margin-left:0!important}}@media print{html .ms-1,html[data-netbox-color-mode=dark] .ms-1,html[data-netbox-color-mode=light] .ms-1{margin-left:.25rem!important}}@media print{html .ms-2,html[data-netbox-color-mode=dark] .ms-2,html[data-netbox-color-mode=light] .ms-2{margin-left:.5rem!important}}@media print{html .ms-3,html[data-netbox-color-mode=dark] .ms-3,html[data-netbox-color-mode=light] .ms-3{margin-left:1rem!important}}@media print{html .ms-4,html[data-netbox-color-mode=dark] .ms-4,html[data-netbox-color-mode=light] .ms-4{margin-left:1.5rem!important}}@media print{html .ms-5,html[data-netbox-color-mode=dark] .ms-5,html[data-netbox-color-mode=light] .ms-5{margin-left:3rem!important}}@media print{html .ms-auto,html[data-netbox-color-mode=dark] .ms-auto,html[data-netbox-color-mode=light] .ms-auto{margin-left:auto!important}}@media print{html .p-0,html[data-netbox-color-mode=dark] .p-0,html[data-netbox-color-mode=light] .p-0{padding:0!important}}@media print{html .p-1,html[data-netbox-color-mode=dark] .p-1,html[data-netbox-color-mode=light] .p-1{padding:.25rem!important}}@media print{html .p-2,html[data-netbox-color-mode=dark] .p-2,html[data-netbox-color-mode=light] .p-2{padding:.5rem!important}}@media print{html .p-3,html[data-netbox-color-mode=dark] .p-3,html[data-netbox-color-mode=light] .p-3{padding:1rem!important}}@media print{html .p-4,html[data-netbox-color-mode=dark] .p-4,html[data-netbox-color-mode=light] .p-4{padding:1.5rem!important}}@media print{html .p-5,html[data-netbox-color-mode=dark] .p-5,html[data-netbox-color-mode=light] .p-5{padding:3rem!important}}@media print{html .px-0,html[data-netbox-color-mode=dark] .px-0,html[data-netbox-color-mode=light] .px-0{padding-right:0!important;padding-left:0!important}}@media print{html .px-1,html[data-netbox-color-mode=dark] .px-1,html[data-netbox-color-mode=light] .px-1{padding-right:.25rem!important;padding-left:.25rem!important}}@media print{html .px-2,html[data-netbox-color-mode=dark] .px-2,html[data-netbox-color-mode=light] .px-2{padding-right:.5rem!important;padding-left:.5rem!important}}@media print{html .px-3,html[data-netbox-color-mode=dark] .px-3,html[data-netbox-color-mode=light] .px-3{padding-right:1rem!important;padding-left:1rem!important}}@media print{html .px-4,html[data-netbox-color-mode=dark] .px-4,html[data-netbox-color-mode=light] .px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}}@media print{html .px-5,html[data-netbox-color-mode=dark] .px-5,html[data-netbox-color-mode=light] .px-5{padding-right:3rem!important;padding-left:3rem!important}}@media print{html .py-0,html[data-netbox-color-mode=dark] .py-0,html[data-netbox-color-mode=light] .py-0{padding-top:0!important;padding-bottom:0!important}}@media print{html .py-1,html[data-netbox-color-mode=dark] .py-1,html[data-netbox-color-mode=light] .py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}}@media print{html .py-2,html[data-netbox-color-mode=dark] .py-2,html[data-netbox-color-mode=light] .py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}}@media print{html .py-3,html[data-netbox-color-mode=dark] .py-3,html[data-netbox-color-mode=light] .py-3{padding-top:1rem!important;padding-bottom:1rem!important}}@media print{html .py-4,html[data-netbox-color-mode=dark] .py-4,html[data-netbox-color-mode=light] .py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}}@media print{html .py-5,html[data-netbox-color-mode=dark] .py-5,html[data-netbox-color-mode=light] .py-5{padding-top:3rem!important;padding-bottom:3rem!important}}@media print{html .pt-0,html[data-netbox-color-mode=dark] .pt-0,html[data-netbox-color-mode=light] .pt-0{padding-top:0!important}}@media print{html .pt-1,html[data-netbox-color-mode=dark] .pt-1,html[data-netbox-color-mode=light] .pt-1{padding-top:.25rem!important}}@media print{html .pt-2,html[data-netbox-color-mode=dark] .pt-2,html[data-netbox-color-mode=light] .pt-2{padding-top:.5rem!important}}@media print{html .pt-3,html[data-netbox-color-mode=dark] .pt-3,html[data-netbox-color-mode=light] .pt-3{padding-top:1rem!important}}@media print{html .pt-4,html[data-netbox-color-mode=dark] .pt-4,html[data-netbox-color-mode=light] .pt-4{padding-top:1.5rem!important}}@media print{html .pt-5,html[data-netbox-color-mode=dark] .pt-5,html[data-netbox-color-mode=light] .pt-5{padding-top:3rem!important}}@media print{html .pe-0,html[data-netbox-color-mode=dark] .pe-0,html[data-netbox-color-mode=light] .pe-0{padding-right:0!important}}@media print{html .pe-1,html[data-netbox-color-mode=dark] .pe-1,html[data-netbox-color-mode=light] .pe-1{padding-right:.25rem!important}}@media print{html .pe-2,html[data-netbox-color-mode=dark] .pe-2,html[data-netbox-color-mode=light] .pe-2{padding-right:.5rem!important}}@media print{html .pe-3,html[data-netbox-color-mode=dark] .pe-3,html[data-netbox-color-mode=light] .pe-3{padding-right:1rem!important}}@media print{html .pe-4,html[data-netbox-color-mode=dark] .pe-4,html[data-netbox-color-mode=light] .pe-4{padding-right:1.5rem!important}}@media print{html .pe-5,html[data-netbox-color-mode=dark] .pe-5,html[data-netbox-color-mode=light] .pe-5{padding-right:3rem!important}}@media print{html .pb-0,html[data-netbox-color-mode=dark] .pb-0,html[data-netbox-color-mode=light] .pb-0{padding-bottom:0!important}}@media print{html .pb-1,html[data-netbox-color-mode=dark] .pb-1,html[data-netbox-color-mode=light] .pb-1{padding-bottom:.25rem!important}}@media print{html .pb-2,html[data-netbox-color-mode=dark] .pb-2,html[data-netbox-color-mode=light] .pb-2{padding-bottom:.5rem!important}}@media print{html .pb-3,html[data-netbox-color-mode=dark] .pb-3,html[data-netbox-color-mode=light] .pb-3{padding-bottom:1rem!important}}@media print{html .pb-4,html[data-netbox-color-mode=dark] .pb-4,html[data-netbox-color-mode=light] .pb-4{padding-bottom:1.5rem!important}}@media print{html .pb-5,html[data-netbox-color-mode=dark] .pb-5,html[data-netbox-color-mode=light] .pb-5{padding-bottom:3rem!important}}@media print{html .ps-0,html[data-netbox-color-mode=dark] .ps-0,html[data-netbox-color-mode=light] .ps-0{padding-left:0!important}}@media print{html .ps-1,html[data-netbox-color-mode=dark] .ps-1,html[data-netbox-color-mode=light] .ps-1{padding-left:.25rem!important}}@media print{html .ps-2,html[data-netbox-color-mode=dark] .ps-2,html[data-netbox-color-mode=light] .ps-2{padding-left:.5rem!important}}@media print{html .ps-3,html[data-netbox-color-mode=dark] .ps-3,html[data-netbox-color-mode=light] .ps-3{padding-left:1rem!important}}@media print{html .ps-4,html[data-netbox-color-mode=dark] .ps-4,html[data-netbox-color-mode=light] .ps-4{padding-left:1.5rem!important}}@media print{html .ps-5,html[data-netbox-color-mode=dark] .ps-5,html[data-netbox-color-mode=light] .ps-5{padding-left:3rem!important}}@media print{html .font-monospace,html[data-netbox-color-mode=dark] .font-monospace,html[data-netbox-color-mode=light] .font-monospace{font-family:var(--bs-font-monospace)!important}}@media print{html .fs-1,html[data-netbox-color-mode=dark] .fs-1,html[data-netbox-color-mode=light] .fs-1{font-size:calc(1.375rem + 1.5vw)!important}}@media print{html .fs-2,html[data-netbox-color-mode=dark] .fs-2,html[data-netbox-color-mode=light] .fs-2{font-size:calc(1.325rem + .9vw)!important}}@media print{html .fs-3,html[data-netbox-color-mode=dark] .fs-3,html[data-netbox-color-mode=light] .fs-3{font-size:calc(1.3rem + .6vw)!important}}@media print{html .fs-4,html[data-netbox-color-mode=dark] .fs-4,html[data-netbox-color-mode=light] .fs-4{font-size:calc(1.275rem + .3vw)!important}}@media print{html .fs-5,html[data-netbox-color-mode=dark] .fs-5,html[data-netbox-color-mode=light] .fs-5{font-size:1.25rem!important}}@media print{html .fs-6,html[data-netbox-color-mode=dark] .fs-6,html[data-netbox-color-mode=light] .fs-6{font-size:1rem!important}}@media print{html .fst-italic,html[data-netbox-color-mode=dark] .fst-italic,html[data-netbox-color-mode=light] .fst-italic{font-style:italic!important}}@media print{html .fst-normal,html[data-netbox-color-mode=dark] .fst-normal,html[data-netbox-color-mode=light] .fst-normal{font-style:normal!important}}@media print{html .fw-light,html[data-netbox-color-mode=dark] .fw-light,html[data-netbox-color-mode=light] .fw-light{font-weight:300!important}}@media print{html .fw-lighter,html[data-netbox-color-mode=dark] .fw-lighter,html[data-netbox-color-mode=light] .fw-lighter{font-weight:200!important}}@media print{html .fw-normal,html[data-netbox-color-mode=dark] .fw-normal,html[data-netbox-color-mode=light] .fw-normal{font-weight:400!important}}@media print{html .fw-bold,html[data-netbox-color-mode=dark] .fw-bold,html[data-netbox-color-mode=light] .fw-bold{font-weight:700!important}}@media print{html .fw-bolder,html[data-netbox-color-mode=dark] .fw-bolder,html[data-netbox-color-mode=light] .fw-bolder{font-weight:800!important}}@media print{html .lh-1,html[data-netbox-color-mode=dark] .lh-1,html[data-netbox-color-mode=light] .lh-1{line-height:1!important}}@media print{html .lh-sm,html[data-netbox-color-mode=dark] .lh-sm,html[data-netbox-color-mode=light] .lh-sm{line-height:1.25!important}}@media print{html .lh-base,html[data-netbox-color-mode=dark] .lh-base,html[data-netbox-color-mode=light] .lh-base{line-height:1.5!important}}@media print{html .lh-lg,html[data-netbox-color-mode=dark] .lh-lg,html[data-netbox-color-mode=light] .lh-lg{line-height:1.75!important}}@media print{html .text-start,html[data-netbox-color-mode=dark] .text-start,html[data-netbox-color-mode=light] .text-start{text-align:left!important}}@media print{html .text-end,html[data-netbox-color-mode=dark] .text-end,html[data-netbox-color-mode=light] .text-end{text-align:right!important}}@media print{html .text-center,html[data-netbox-color-mode=dark] .text-center,html[data-netbox-color-mode=light] .text-center{text-align:center!important}}@media print{html .text-decoration-none,html[data-netbox-color-mode=dark] .text-decoration-none,html[data-netbox-color-mode=light] .text-decoration-none{text-decoration:none!important}}@media print{html .text-decoration-underline,html[data-netbox-color-mode=dark] .text-decoration-underline,html[data-netbox-color-mode=light] .text-decoration-underline{text-decoration:underline!important}}@media print{html .text-decoration-line-through,html[data-netbox-color-mode=dark] .text-decoration-line-through,html[data-netbox-color-mode=light] .text-decoration-line-through{text-decoration:line-through!important}}@media print{html .text-lowercase,html[data-netbox-color-mode=dark] .text-lowercase,html[data-netbox-color-mode=light] .text-lowercase{text-transform:lowercase!important}}@media print{html .text-uppercase,html[data-netbox-color-mode=dark] .text-uppercase,html[data-netbox-color-mode=light] .text-uppercase{text-transform:uppercase!important}}@media print{html .text-capitalize,html[data-netbox-color-mode=dark] .text-capitalize,html[data-netbox-color-mode=light] .text-capitalize{text-transform:capitalize!important}}@media print{html .text-wrap,html[data-netbox-color-mode=dark] .text-wrap,html[data-netbox-color-mode=light] .text-wrap{white-space:normal!important}}@media print{html .text-nowrap,html[data-netbox-color-mode=dark] .text-nowrap,html[data-netbox-color-mode=light] .text-nowrap{white-space:nowrap!important}}@media print{html .text-break,html[data-netbox-color-mode=dark] .text-break,html[data-netbox-color-mode=light] .text-break{word-wrap:break-word!important;word-break:break-word!important}}@media print{html .text-primary,html[data-netbox-color-mode=dark] .text-primary,html[data-netbox-color-mode=light] .text-primary{color:#337ab7!important}}@media print{html .text-secondary,html[data-netbox-color-mode=dark] .text-secondary,html[data-netbox-color-mode=light] .text-secondary{color:#6c757d!important}}@media print{html .text-success,html[data-netbox-color-mode=dark] .text-success,html[data-netbox-color-mode=light] .text-success{color:#198754!important}}@media print{html .text-info,html[data-netbox-color-mode=dark] .text-info,html[data-netbox-color-mode=light] .text-info{color:#54d6f0!important}}@media print{html .text-warning,html[data-netbox-color-mode=dark] .text-warning,html[data-netbox-color-mode=light] .text-warning{color:#ffc107!important}}@media print{html .text-danger,html[data-netbox-color-mode=dark] .text-danger,html[data-netbox-color-mode=light] .text-danger{color:#dc3545!important}}@media print{html .text-light,html[data-netbox-color-mode=dark] .text-light,html[data-netbox-color-mode=light] .text-light{color:#e9ecef!important}}@media print{html .text-dark,html[data-netbox-color-mode=dark] .text-dark,html[data-netbox-color-mode=light] .text-dark{color:#343a40!important}}@media print{html .text-blue,html[data-netbox-color-mode=dark] .text-blue,html[data-netbox-color-mode=light] .text-blue{color:#0d6efd!important}}@media print{html .text-indigo,html[data-netbox-color-mode=dark] .text-indigo,html[data-netbox-color-mode=light] .text-indigo{color:#6610f2!important}}@media print{html .text-purple,html[data-netbox-color-mode=dark] .text-purple,html[data-netbox-color-mode=light] .text-purple{color:#6f42c1!important}}@media print{html .text-pink,html[data-netbox-color-mode=dark] .text-pink,html[data-netbox-color-mode=light] .text-pink{color:#d63384!important}}@media print{html .text-red,html[data-netbox-color-mode=dark] .text-red,html[data-netbox-color-mode=light] .text-red{color:#dc3545!important}}@media print{html .text-orange,html[data-netbox-color-mode=dark] .text-orange,html[data-netbox-color-mode=light] .text-orange{color:#fd7e14!important}}@media print{html .text-yellow,html[data-netbox-color-mode=dark] .text-yellow,html[data-netbox-color-mode=light] .text-yellow{color:#ffc107!important}}@media print{html .text-green,html[data-netbox-color-mode=dark] .text-green,html[data-netbox-color-mode=light] .text-green{color:#198754!important}}@media print{html .text-teal,html[data-netbox-color-mode=dark] .text-teal,html[data-netbox-color-mode=light] .text-teal{color:#20c997!important}}@media print{html .text-cyan,html[data-netbox-color-mode=dark] .text-cyan,html[data-netbox-color-mode=light] .text-cyan{color:#0dcaf0!important}}@media print{html .text-gray,html[data-netbox-color-mode=dark] .text-gray,html[data-netbox-color-mode=light] .text-gray{color:#adb5bd!important}}@media print{html .text-black,html[data-netbox-color-mode=dark] .text-black,html[data-netbox-color-mode=light] .text-black{color:#000!important}}@media print{html .text-white,html[data-netbox-color-mode=dark] .text-white,html[data-netbox-color-mode=light] .text-white{color:#fff!important}}@media print{html .text-body,html[data-netbox-color-mode=dark] .text-body,html[data-netbox-color-mode=light] .text-body{color:#212529!important}}@media print{html .text-muted,html[data-netbox-color-mode=dark] .text-muted,html[data-netbox-color-mode=light] .text-muted{color:#6c757d!important}}@media print{html .text-black-50,html[data-netbox-color-mode=dark] .text-black-50,html[data-netbox-color-mode=light] .text-black-50{color:#00000080!important}}@media print{html .text-white-50,html[data-netbox-color-mode=dark] .text-white-50,html[data-netbox-color-mode=light] .text-white-50{color:#ffffff80!important}}@media print{html .text-reset,html[data-netbox-color-mode=dark] .text-reset,html[data-netbox-color-mode=light] .text-reset{color:inherit!important}}@media print{html .bg-primary,html[data-netbox-color-mode=dark] .bg-primary,html[data-netbox-color-mode=light] .bg-primary{background-color:#337ab7!important}}@media print{html .bg-secondary,html[data-netbox-color-mode=dark] .bg-secondary,html[data-netbox-color-mode=light] .bg-secondary{background-color:#6c757d!important}}@media print{html .bg-success,html[data-netbox-color-mode=dark] .bg-success,html[data-netbox-color-mode=light] .bg-success{background-color:#198754!important}}@media print{html .bg-info,html[data-netbox-color-mode=dark] .bg-info,html[data-netbox-color-mode=light] .bg-info{background-color:#54d6f0!important}}@media print{html .bg-warning,html[data-netbox-color-mode=dark] .bg-warning,html[data-netbox-color-mode=light] .bg-warning{background-color:#ffc107!important}}@media print{html .bg-danger,html[data-netbox-color-mode=dark] .bg-danger,html[data-netbox-color-mode=light] .bg-danger{background-color:#dc3545!important}}@media print{html .bg-light,html[data-netbox-color-mode=dark] .bg-light,html[data-netbox-color-mode=light] .bg-light{background-color:#e9ecef!important}}@media print{html .bg-dark,html[data-netbox-color-mode=dark] .bg-dark,html[data-netbox-color-mode=light] .bg-dark{background-color:#343a40!important}}@media print{html .bg-blue,html[data-netbox-color-mode=dark] .bg-blue,html[data-netbox-color-mode=light] .bg-blue{background-color:#0d6efd!important}}@media print{html .bg-indigo,html[data-netbox-color-mode=dark] .bg-indigo,html[data-netbox-color-mode=light] .bg-indigo{background-color:#6610f2!important}}@media print{html .bg-purple,html[data-netbox-color-mode=dark] .bg-purple,html[data-netbox-color-mode=light] .bg-purple{background-color:#6f42c1!important}}@media print{html .bg-pink,html[data-netbox-color-mode=dark] .bg-pink,html[data-netbox-color-mode=light] .bg-pink{background-color:#d63384!important}}@media print{html .bg-red,html[data-netbox-color-mode=dark] .bg-red,html[data-netbox-color-mode=light] .bg-red{background-color:#dc3545!important}}@media print{html .bg-orange,html[data-netbox-color-mode=dark] .bg-orange,html[data-netbox-color-mode=light] .bg-orange{background-color:#fd7e14!important}}@media print{html .bg-yellow,html[data-netbox-color-mode=dark] .bg-yellow,html[data-netbox-color-mode=light] .bg-yellow{background-color:#ffc107!important}}@media print{html .bg-green,html[data-netbox-color-mode=dark] .bg-green,html[data-netbox-color-mode=light] .bg-green{background-color:#198754!important}}@media print{html .bg-teal,html[data-netbox-color-mode=dark] .bg-teal,html[data-netbox-color-mode=light] .bg-teal{background-color:#20c997!important}}@media print{html .bg-cyan,html[data-netbox-color-mode=dark] .bg-cyan,html[data-netbox-color-mode=light] .bg-cyan{background-color:#0dcaf0!important}}@media print{html .bg-gray,html[data-netbox-color-mode=dark] .bg-gray,html[data-netbox-color-mode=light] .bg-gray{background-color:#adb5bd!important}}@media print{html .bg-black,html[data-netbox-color-mode=dark] .bg-black,html[data-netbox-color-mode=light] .bg-black{background-color:#000!important}}@media print{html .bg-white,html[data-netbox-color-mode=dark] .bg-white,html[data-netbox-color-mode=light] .bg-white{background-color:#fff!important}}@media print{html .bg-body,html[data-netbox-color-mode=dark] .bg-body,html[data-netbox-color-mode=light] .bg-body{background-color:#fff!important}}@media print{html .bg-transparent,html[data-netbox-color-mode=dark] .bg-transparent,html[data-netbox-color-mode=light] .bg-transparent{background-color:transparent!important}}@media print{html .bg-gradient,html[data-netbox-color-mode=dark] .bg-gradient,html[data-netbox-color-mode=light] .bg-gradient{background-image:var(--bs-gradient)!important}}@media print{html .user-select-all,html[data-netbox-color-mode=dark] .user-select-all,html[data-netbox-color-mode=light] .user-select-all{user-select:all!important}}@media print{html .user-select-auto,html[data-netbox-color-mode=dark] .user-select-auto,html[data-netbox-color-mode=light] .user-select-auto{user-select:auto!important}}@media print{html .user-select-none,html[data-netbox-color-mode=dark] .user-select-none,html[data-netbox-color-mode=light] .user-select-none{user-select:none!important}}@media print{html .pe-none,html[data-netbox-color-mode=dark] .pe-none,html[data-netbox-color-mode=light] .pe-none{pointer-events:none!important}}@media print{html .pe-auto,html[data-netbox-color-mode=dark] .pe-auto,html[data-netbox-color-mode=light] .pe-auto{pointer-events:auto!important}}@media print{html .rounded,html[data-netbox-color-mode=dark] .rounded,html[data-netbox-color-mode=light] .rounded{border-radius:.375rem!important}}@media print{html .rounded-0,html[data-netbox-color-mode=dark] .rounded-0,html[data-netbox-color-mode=light] .rounded-0{border-radius:0!important}}@media print{html .rounded-1,html[data-netbox-color-mode=dark] .rounded-1,html[data-netbox-color-mode=light] .rounded-1{border-radius:.375rem!important}}@media print{html .rounded-2,html[data-netbox-color-mode=dark] .rounded-2,html[data-netbox-color-mode=light] .rounded-2{border-radius:.375rem!important}}@media print{html .rounded-3,html[data-netbox-color-mode=dark] .rounded-3,html[data-netbox-color-mode=light] .rounded-3{border-radius:.75rem!important}}@media print{html .rounded-circle,html[data-netbox-color-mode=dark] .rounded-circle,html[data-netbox-color-mode=light] .rounded-circle{border-radius:50%!important}}@media print{html .rounded-pill,html[data-netbox-color-mode=dark] .rounded-pill,html[data-netbox-color-mode=light] .rounded-pill{border-radius:50rem!important}}@media print{html .rounded-top,html[data-netbox-color-mode=dark] .rounded-top,html[data-netbox-color-mode=light] .rounded-top{border-top-left-radius:.375rem!important;border-top-right-radius:.375rem!important}}@media print{html .rounded-end,html[data-netbox-color-mode=dark] .rounded-end,html[data-netbox-color-mode=light] .rounded-end{border-top-right-radius:.375rem!important;border-bottom-right-radius:.375rem!important}}@media print{html .rounded-bottom,html[data-netbox-color-mode=dark] .rounded-bottom,html[data-netbox-color-mode=light] .rounded-bottom{border-bottom-right-radius:.375rem!important;border-bottom-left-radius:.375rem!important}}@media print{html .rounded-start,html[data-netbox-color-mode=dark] .rounded-start,html[data-netbox-color-mode=light] .rounded-start{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}}@media print{html .visible,html[data-netbox-color-mode=dark] .visible,html[data-netbox-color-mode=light] .visible{visibility:visible!important}}@media print{html .invisible,html[data-netbox-color-mode=dark] .invisible,html[data-netbox-color-mode=light] .invisible{visibility:hidden!important}}@media print and (min-width: 576px){html .float-sm-start,html[data-netbox-color-mode=dark] .float-sm-start,html[data-netbox-color-mode=light] .float-sm-start{float:left!important}html .float-sm-end,html[data-netbox-color-mode=dark] .float-sm-end,html[data-netbox-color-mode=light] .float-sm-end{float:right!important}html .float-sm-none,html[data-netbox-color-mode=dark] .float-sm-none,html[data-netbox-color-mode=light] .float-sm-none{float:none!important}html .d-sm-inline,html[data-netbox-color-mode=dark] .d-sm-inline,html[data-netbox-color-mode=light] .d-sm-inline{display:inline!important}html .d-sm-inline-block,html[data-netbox-color-mode=dark] .d-sm-inline-block,html[data-netbox-color-mode=light] .d-sm-inline-block{display:inline-block!important}html .d-sm-block,html[data-netbox-color-mode=dark] .d-sm-block,html[data-netbox-color-mode=light] .d-sm-block{display:block!important}html .d-sm-grid,html[data-netbox-color-mode=dark] .d-sm-grid,html[data-netbox-color-mode=light] .d-sm-grid{display:grid!important}html .d-sm-table,html[data-netbox-color-mode=dark] .d-sm-table,html[data-netbox-color-mode=light] .d-sm-table{display:table!important}html .d-sm-table-row,html[data-netbox-color-mode=dark] .d-sm-table-row,html[data-netbox-color-mode=light] .d-sm-table-row{display:table-row!important}html .d-sm-table-cell,html[data-netbox-color-mode=dark] .d-sm-table-cell,html[data-netbox-color-mode=light] .d-sm-table-cell{display:table-cell!important}html .d-sm-flex,html[data-netbox-color-mode=dark] .d-sm-flex,html[data-netbox-color-mode=light] .d-sm-flex{display:flex!important}html .d-sm-inline-flex,html[data-netbox-color-mode=dark] .d-sm-inline-flex,html[data-netbox-color-mode=light] .d-sm-inline-flex{display:inline-flex!important}html .d-sm-none,html[data-netbox-color-mode=dark] .d-sm-none,html[data-netbox-color-mode=light] .d-sm-none{display:none!important}html .flex-sm-fill,html[data-netbox-color-mode=dark] .flex-sm-fill,html[data-netbox-color-mode=light] .flex-sm-fill{flex:1 1 auto!important}html .flex-sm-row,html[data-netbox-color-mode=dark] .flex-sm-row,html[data-netbox-color-mode=light] .flex-sm-row{flex-direction:row!important}html .flex-sm-column,html[data-netbox-color-mode=dark] .flex-sm-column,html[data-netbox-color-mode=light] .flex-sm-column{flex-direction:column!important}html .flex-sm-row-reverse,html[data-netbox-color-mode=dark] .flex-sm-row-reverse,html[data-netbox-color-mode=light] .flex-sm-row-reverse{flex-direction:row-reverse!important}html .flex-sm-column-reverse,html[data-netbox-color-mode=dark] .flex-sm-column-reverse,html[data-netbox-color-mode=light] .flex-sm-column-reverse{flex-direction:column-reverse!important}html .flex-sm-grow-0,html[data-netbox-color-mode=dark] .flex-sm-grow-0,html[data-netbox-color-mode=light] .flex-sm-grow-0{flex-grow:0!important}html .flex-sm-grow-1,html[data-netbox-color-mode=dark] .flex-sm-grow-1,html[data-netbox-color-mode=light] .flex-sm-grow-1{flex-grow:1!important}html .flex-sm-shrink-0,html[data-netbox-color-mode=dark] .flex-sm-shrink-0,html[data-netbox-color-mode=light] .flex-sm-shrink-0{flex-shrink:0!important}html .flex-sm-shrink-1,html[data-netbox-color-mode=dark] .flex-sm-shrink-1,html[data-netbox-color-mode=light] .flex-sm-shrink-1{flex-shrink:1!important}html .flex-sm-wrap,html[data-netbox-color-mode=dark] .flex-sm-wrap,html[data-netbox-color-mode=light] .flex-sm-wrap{flex-wrap:wrap!important}html .flex-sm-nowrap,html[data-netbox-color-mode=dark] .flex-sm-nowrap,html[data-netbox-color-mode=light] .flex-sm-nowrap{flex-wrap:nowrap!important}html .flex-sm-wrap-reverse,html[data-netbox-color-mode=dark] .flex-sm-wrap-reverse,html[data-netbox-color-mode=light] .flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-sm-0,html[data-netbox-color-mode=dark] .gap-sm-0,html[data-netbox-color-mode=light] .gap-sm-0{gap:0!important}html .gap-sm-1,html[data-netbox-color-mode=dark] .gap-sm-1,html[data-netbox-color-mode=light] .gap-sm-1{gap:.25rem!important}html .gap-sm-2,html[data-netbox-color-mode=dark] .gap-sm-2,html[data-netbox-color-mode=light] .gap-sm-2{gap:.5rem!important}html .gap-sm-3,html[data-netbox-color-mode=dark] .gap-sm-3,html[data-netbox-color-mode=light] .gap-sm-3{gap:1rem!important}html .gap-sm-4,html[data-netbox-color-mode=dark] .gap-sm-4,html[data-netbox-color-mode=light] .gap-sm-4{gap:1.5rem!important}html .gap-sm-5,html[data-netbox-color-mode=dark] .gap-sm-5,html[data-netbox-color-mode=light] .gap-sm-5{gap:3rem!important}html .justify-content-sm-start,html[data-netbox-color-mode=dark] .justify-content-sm-start,html[data-netbox-color-mode=light] .justify-content-sm-start{justify-content:flex-start!important}html .justify-content-sm-end,html[data-netbox-color-mode=dark] .justify-content-sm-end,html[data-netbox-color-mode=light] .justify-content-sm-end{justify-content:flex-end!important}html .justify-content-sm-center,html[data-netbox-color-mode=dark] .justify-content-sm-center,html[data-netbox-color-mode=light] .justify-content-sm-center{justify-content:center!important}html .justify-content-sm-between,html[data-netbox-color-mode=dark] .justify-content-sm-between,html[data-netbox-color-mode=light] .justify-content-sm-between{justify-content:space-between!important}html .justify-content-sm-around,html[data-netbox-color-mode=dark] .justify-content-sm-around,html[data-netbox-color-mode=light] .justify-content-sm-around{justify-content:space-around!important}html .justify-content-sm-evenly,html[data-netbox-color-mode=dark] .justify-content-sm-evenly,html[data-netbox-color-mode=light] .justify-content-sm-evenly{justify-content:space-evenly!important}html .align-items-sm-start,html[data-netbox-color-mode=dark] .align-items-sm-start,html[data-netbox-color-mode=light] .align-items-sm-start{align-items:flex-start!important}html .align-items-sm-end,html[data-netbox-color-mode=dark] .align-items-sm-end,html[data-netbox-color-mode=light] .align-items-sm-end{align-items:flex-end!important}html .align-items-sm-center,html[data-netbox-color-mode=dark] .align-items-sm-center,html[data-netbox-color-mode=light] .align-items-sm-center{align-items:center!important}html .align-items-sm-baseline,html[data-netbox-color-mode=dark] .align-items-sm-baseline,html[data-netbox-color-mode=light] .align-items-sm-baseline{align-items:baseline!important}html .align-items-sm-stretch,html[data-netbox-color-mode=dark] .align-items-sm-stretch,html[data-netbox-color-mode=light] .align-items-sm-stretch{align-items:stretch!important}html .align-content-sm-start,html[data-netbox-color-mode=dark] .align-content-sm-start,html[data-netbox-color-mode=light] .align-content-sm-start{align-content:flex-start!important}html .align-content-sm-end,html[data-netbox-color-mode=dark] .align-content-sm-end,html[data-netbox-color-mode=light] .align-content-sm-end{align-content:flex-end!important}html .align-content-sm-center,html[data-netbox-color-mode=dark] .align-content-sm-center,html[data-netbox-color-mode=light] .align-content-sm-center{align-content:center!important}html .align-content-sm-between,html[data-netbox-color-mode=dark] .align-content-sm-between,html[data-netbox-color-mode=light] .align-content-sm-between{align-content:space-between!important}html .align-content-sm-around,html[data-netbox-color-mode=dark] .align-content-sm-around,html[data-netbox-color-mode=light] .align-content-sm-around{align-content:space-around!important}html .align-content-sm-stretch,html[data-netbox-color-mode=dark] .align-content-sm-stretch,html[data-netbox-color-mode=light] .align-content-sm-stretch{align-content:stretch!important}html .align-self-sm-auto,html[data-netbox-color-mode=dark] .align-self-sm-auto,html[data-netbox-color-mode=light] .align-self-sm-auto{align-self:auto!important}html .align-self-sm-start,html[data-netbox-color-mode=dark] .align-self-sm-start,html[data-netbox-color-mode=light] .align-self-sm-start{align-self:flex-start!important}html .align-self-sm-end,html[data-netbox-color-mode=dark] .align-self-sm-end,html[data-netbox-color-mode=light] .align-self-sm-end{align-self:flex-end!important}html .align-self-sm-center,html[data-netbox-color-mode=dark] .align-self-sm-center,html[data-netbox-color-mode=light] .align-self-sm-center{align-self:center!important}html .align-self-sm-baseline,html[data-netbox-color-mode=dark] .align-self-sm-baseline,html[data-netbox-color-mode=light] .align-self-sm-baseline{align-self:baseline!important}html .align-self-sm-stretch,html[data-netbox-color-mode=dark] .align-self-sm-stretch,html[data-netbox-color-mode=light] .align-self-sm-stretch{align-self:stretch!important}html .order-sm-first,html[data-netbox-color-mode=dark] .order-sm-first,html[data-netbox-color-mode=light] .order-sm-first{order:-1!important}html .order-sm-0,html[data-netbox-color-mode=dark] .order-sm-0,html[data-netbox-color-mode=light] .order-sm-0{order:0!important}html .order-sm-1,html[data-netbox-color-mode=dark] .order-sm-1,html[data-netbox-color-mode=light] .order-sm-1{order:1!important}html .order-sm-2,html[data-netbox-color-mode=dark] .order-sm-2,html[data-netbox-color-mode=light] .order-sm-2{order:2!important}html .order-sm-3,html[data-netbox-color-mode=dark] .order-sm-3,html[data-netbox-color-mode=light] .order-sm-3{order:3!important}html .order-sm-4,html[data-netbox-color-mode=dark] .order-sm-4,html[data-netbox-color-mode=light] .order-sm-4{order:4!important}html .order-sm-5,html[data-netbox-color-mode=dark] .order-sm-5,html[data-netbox-color-mode=light] .order-sm-5{order:5!important}html .order-sm-last,html[data-netbox-color-mode=dark] .order-sm-last,html[data-netbox-color-mode=light] .order-sm-last{order:6!important}html .m-sm-0,html[data-netbox-color-mode=dark] .m-sm-0,html[data-netbox-color-mode=light] .m-sm-0{margin:0!important}html .m-sm-1,html[data-netbox-color-mode=dark] .m-sm-1,html[data-netbox-color-mode=light] .m-sm-1{margin:.25rem!important}html .m-sm-2,html[data-netbox-color-mode=dark] .m-sm-2,html[data-netbox-color-mode=light] .m-sm-2{margin:.5rem!important}html .m-sm-3,html[data-netbox-color-mode=dark] .m-sm-3,html[data-netbox-color-mode=light] .m-sm-3{margin:1rem!important}html .m-sm-4,html[data-netbox-color-mode=dark] .m-sm-4,html[data-netbox-color-mode=light] .m-sm-4{margin:1.5rem!important}html .m-sm-5,html[data-netbox-color-mode=dark] .m-sm-5,html[data-netbox-color-mode=light] .m-sm-5{margin:3rem!important}html .m-sm-auto,html[data-netbox-color-mode=dark] .m-sm-auto,html[data-netbox-color-mode=light] .m-sm-auto{margin:auto!important}html .mx-sm-0,html[data-netbox-color-mode=dark] .mx-sm-0,html[data-netbox-color-mode=light] .mx-sm-0{margin-right:0!important;margin-left:0!important}html .mx-sm-1,html[data-netbox-color-mode=dark] .mx-sm-1,html[data-netbox-color-mode=light] .mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-sm-2,html[data-netbox-color-mode=dark] .mx-sm-2,html[data-netbox-color-mode=light] .mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-sm-3,html[data-netbox-color-mode=dark] .mx-sm-3,html[data-netbox-color-mode=light] .mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-sm-4,html[data-netbox-color-mode=dark] .mx-sm-4,html[data-netbox-color-mode=light] .mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-sm-5,html[data-netbox-color-mode=dark] .mx-sm-5,html[data-netbox-color-mode=light] .mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-sm-auto,html[data-netbox-color-mode=dark] .mx-sm-auto,html[data-netbox-color-mode=light] .mx-sm-auto{margin-right:auto!important;margin-left:auto!important}html .my-sm-0,html[data-netbox-color-mode=dark] .my-sm-0,html[data-netbox-color-mode=light] .my-sm-0{margin-top:0!important;margin-bottom:0!important}html .my-sm-1,html[data-netbox-color-mode=dark] .my-sm-1,html[data-netbox-color-mode=light] .my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-sm-2,html[data-netbox-color-mode=dark] .my-sm-2,html[data-netbox-color-mode=light] .my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-sm-3,html[data-netbox-color-mode=dark] .my-sm-3,html[data-netbox-color-mode=light] .my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-sm-4,html[data-netbox-color-mode=dark] .my-sm-4,html[data-netbox-color-mode=light] .my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-sm-5,html[data-netbox-color-mode=dark] .my-sm-5,html[data-netbox-color-mode=light] .my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-sm-auto,html[data-netbox-color-mode=dark] .my-sm-auto,html[data-netbox-color-mode=light] .my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-sm-0,html[data-netbox-color-mode=dark] .mt-sm-0,html[data-netbox-color-mode=light] .mt-sm-0{margin-top:0!important}html .mt-sm-1,html[data-netbox-color-mode=dark] .mt-sm-1,html[data-netbox-color-mode=light] .mt-sm-1{margin-top:.25rem!important}html .mt-sm-2,html[data-netbox-color-mode=dark] .mt-sm-2,html[data-netbox-color-mode=light] .mt-sm-2{margin-top:.5rem!important}html .mt-sm-3,html[data-netbox-color-mode=dark] .mt-sm-3,html[data-netbox-color-mode=light] .mt-sm-3{margin-top:1rem!important}html .mt-sm-4,html[data-netbox-color-mode=dark] .mt-sm-4,html[data-netbox-color-mode=light] .mt-sm-4{margin-top:1.5rem!important}html .mt-sm-5,html[data-netbox-color-mode=dark] .mt-sm-5,html[data-netbox-color-mode=light] .mt-sm-5{margin-top:3rem!important}html .mt-sm-auto,html[data-netbox-color-mode=dark] .mt-sm-auto,html[data-netbox-color-mode=light] .mt-sm-auto{margin-top:auto!important}html .me-sm-0,html[data-netbox-color-mode=dark] .me-sm-0,html[data-netbox-color-mode=light] .me-sm-0{margin-right:0!important}html .me-sm-1,html[data-netbox-color-mode=dark] .me-sm-1,html[data-netbox-color-mode=light] .me-sm-1{margin-right:.25rem!important}html .me-sm-2,html[data-netbox-color-mode=dark] .me-sm-2,html[data-netbox-color-mode=light] .me-sm-2{margin-right:.5rem!important}html .me-sm-3,html[data-netbox-color-mode=dark] .me-sm-3,html[data-netbox-color-mode=light] .me-sm-3{margin-right:1rem!important}html .me-sm-4,html[data-netbox-color-mode=dark] .me-sm-4,html[data-netbox-color-mode=light] .me-sm-4{margin-right:1.5rem!important}html .me-sm-5,html[data-netbox-color-mode=dark] .me-sm-5,html[data-netbox-color-mode=light] .me-sm-5{margin-right:3rem!important}html .me-sm-auto,html[data-netbox-color-mode=dark] .me-sm-auto,html[data-netbox-color-mode=light] .me-sm-auto{margin-right:auto!important}html .mb-sm-0,html[data-netbox-color-mode=dark] .mb-sm-0,html[data-netbox-color-mode=light] .mb-sm-0{margin-bottom:0!important}html .mb-sm-1,html[data-netbox-color-mode=dark] .mb-sm-1,html[data-netbox-color-mode=light] .mb-sm-1{margin-bottom:.25rem!important}html .mb-sm-2,html[data-netbox-color-mode=dark] .mb-sm-2,html[data-netbox-color-mode=light] .mb-sm-2{margin-bottom:.5rem!important}html .mb-sm-3,html[data-netbox-color-mode=dark] .mb-sm-3,html[data-netbox-color-mode=light] .mb-sm-3{margin-bottom:1rem!important}html .mb-sm-4,html[data-netbox-color-mode=dark] .mb-sm-4,html[data-netbox-color-mode=light] .mb-sm-4{margin-bottom:1.5rem!important}html .mb-sm-5,html[data-netbox-color-mode=dark] .mb-sm-5,html[data-netbox-color-mode=light] .mb-sm-5{margin-bottom:3rem!important}html .mb-sm-auto,html[data-netbox-color-mode=dark] .mb-sm-auto,html[data-netbox-color-mode=light] .mb-sm-auto{margin-bottom:auto!important}html .ms-sm-0,html[data-netbox-color-mode=dark] .ms-sm-0,html[data-netbox-color-mode=light] .ms-sm-0{margin-left:0!important}html .ms-sm-1,html[data-netbox-color-mode=dark] .ms-sm-1,html[data-netbox-color-mode=light] .ms-sm-1{margin-left:.25rem!important}html .ms-sm-2,html[data-netbox-color-mode=dark] .ms-sm-2,html[data-netbox-color-mode=light] .ms-sm-2{margin-left:.5rem!important}html .ms-sm-3,html[data-netbox-color-mode=dark] .ms-sm-3,html[data-netbox-color-mode=light] .ms-sm-3{margin-left:1rem!important}html .ms-sm-4,html[data-netbox-color-mode=dark] .ms-sm-4,html[data-netbox-color-mode=light] .ms-sm-4{margin-left:1.5rem!important}html .ms-sm-5,html[data-netbox-color-mode=dark] .ms-sm-5,html[data-netbox-color-mode=light] .ms-sm-5{margin-left:3rem!important}html .ms-sm-auto,html[data-netbox-color-mode=dark] .ms-sm-auto,html[data-netbox-color-mode=light] .ms-sm-auto{margin-left:auto!important}html .p-sm-0,html[data-netbox-color-mode=dark] .p-sm-0,html[data-netbox-color-mode=light] .p-sm-0{padding:0!important}html .p-sm-1,html[data-netbox-color-mode=dark] .p-sm-1,html[data-netbox-color-mode=light] .p-sm-1{padding:.25rem!important}html .p-sm-2,html[data-netbox-color-mode=dark] .p-sm-2,html[data-netbox-color-mode=light] .p-sm-2{padding:.5rem!important}html .p-sm-3,html[data-netbox-color-mode=dark] .p-sm-3,html[data-netbox-color-mode=light] .p-sm-3{padding:1rem!important}html .p-sm-4,html[data-netbox-color-mode=dark] .p-sm-4,html[data-netbox-color-mode=light] .p-sm-4{padding:1.5rem!important}html .p-sm-5,html[data-netbox-color-mode=dark] .p-sm-5,html[data-netbox-color-mode=light] .p-sm-5{padding:3rem!important}html .px-sm-0,html[data-netbox-color-mode=dark] .px-sm-0,html[data-netbox-color-mode=light] .px-sm-0{padding-right:0!important;padding-left:0!important}html .px-sm-1,html[data-netbox-color-mode=dark] .px-sm-1,html[data-netbox-color-mode=light] .px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-sm-2,html[data-netbox-color-mode=dark] .px-sm-2,html[data-netbox-color-mode=light] .px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-sm-3,html[data-netbox-color-mode=dark] .px-sm-3,html[data-netbox-color-mode=light] .px-sm-3{padding-right:1rem!important;padding-left:1rem!important}html .px-sm-4,html[data-netbox-color-mode=dark] .px-sm-4,html[data-netbox-color-mode=light] .px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-sm-5,html[data-netbox-color-mode=dark] .px-sm-5,html[data-netbox-color-mode=light] .px-sm-5{padding-right:3rem!important;padding-left:3rem!important}html .py-sm-0,html[data-netbox-color-mode=dark] .py-sm-0,html[data-netbox-color-mode=light] .py-sm-0{padding-top:0!important;padding-bottom:0!important}html .py-sm-1,html[data-netbox-color-mode=dark] .py-sm-1,html[data-netbox-color-mode=light] .py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-sm-2,html[data-netbox-color-mode=dark] .py-sm-2,html[data-netbox-color-mode=light] .py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-sm-3,html[data-netbox-color-mode=dark] .py-sm-3,html[data-netbox-color-mode=light] .py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-sm-4,html[data-netbox-color-mode=dark] .py-sm-4,html[data-netbox-color-mode=light] .py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-sm-5,html[data-netbox-color-mode=dark] .py-sm-5,html[data-netbox-color-mode=light] .py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-sm-0,html[data-netbox-color-mode=dark] .pt-sm-0,html[data-netbox-color-mode=light] .pt-sm-0{padding-top:0!important}html .pt-sm-1,html[data-netbox-color-mode=dark] .pt-sm-1,html[data-netbox-color-mode=light] .pt-sm-1{padding-top:.25rem!important}html .pt-sm-2,html[data-netbox-color-mode=dark] .pt-sm-2,html[data-netbox-color-mode=light] .pt-sm-2{padding-top:.5rem!important}html .pt-sm-3,html[data-netbox-color-mode=dark] .pt-sm-3,html[data-netbox-color-mode=light] .pt-sm-3{padding-top:1rem!important}html .pt-sm-4,html[data-netbox-color-mode=dark] .pt-sm-4,html[data-netbox-color-mode=light] .pt-sm-4{padding-top:1.5rem!important}html .pt-sm-5,html[data-netbox-color-mode=dark] .pt-sm-5,html[data-netbox-color-mode=light] .pt-sm-5{padding-top:3rem!important}html .pe-sm-0,html[data-netbox-color-mode=dark] .pe-sm-0,html[data-netbox-color-mode=light] .pe-sm-0{padding-right:0!important}html .pe-sm-1,html[data-netbox-color-mode=dark] .pe-sm-1,html[data-netbox-color-mode=light] .pe-sm-1{padding-right:.25rem!important}html .pe-sm-2,html[data-netbox-color-mode=dark] .pe-sm-2,html[data-netbox-color-mode=light] .pe-sm-2{padding-right:.5rem!important}html .pe-sm-3,html[data-netbox-color-mode=dark] .pe-sm-3,html[data-netbox-color-mode=light] .pe-sm-3{padding-right:1rem!important}html .pe-sm-4,html[data-netbox-color-mode=dark] .pe-sm-4,html[data-netbox-color-mode=light] .pe-sm-4{padding-right:1.5rem!important}html .pe-sm-5,html[data-netbox-color-mode=dark] .pe-sm-5,html[data-netbox-color-mode=light] .pe-sm-5{padding-right:3rem!important}html .pb-sm-0,html[data-netbox-color-mode=dark] .pb-sm-0,html[data-netbox-color-mode=light] .pb-sm-0{padding-bottom:0!important}html .pb-sm-1,html[data-netbox-color-mode=dark] .pb-sm-1,html[data-netbox-color-mode=light] .pb-sm-1{padding-bottom:.25rem!important}html .pb-sm-2,html[data-netbox-color-mode=dark] .pb-sm-2,html[data-netbox-color-mode=light] .pb-sm-2{padding-bottom:.5rem!important}html .pb-sm-3,html[data-netbox-color-mode=dark] .pb-sm-3,html[data-netbox-color-mode=light] .pb-sm-3{padding-bottom:1rem!important}html .pb-sm-4,html[data-netbox-color-mode=dark] .pb-sm-4,html[data-netbox-color-mode=light] .pb-sm-4{padding-bottom:1.5rem!important}html .pb-sm-5,html[data-netbox-color-mode=dark] .pb-sm-5,html[data-netbox-color-mode=light] .pb-sm-5{padding-bottom:3rem!important}html .ps-sm-0,html[data-netbox-color-mode=dark] .ps-sm-0,html[data-netbox-color-mode=light] .ps-sm-0{padding-left:0!important}html .ps-sm-1,html[data-netbox-color-mode=dark] .ps-sm-1,html[data-netbox-color-mode=light] .ps-sm-1{padding-left:.25rem!important}html .ps-sm-2,html[data-netbox-color-mode=dark] .ps-sm-2,html[data-netbox-color-mode=light] .ps-sm-2{padding-left:.5rem!important}html .ps-sm-3,html[data-netbox-color-mode=dark] .ps-sm-3,html[data-netbox-color-mode=light] .ps-sm-3{padding-left:1rem!important}html .ps-sm-4,html[data-netbox-color-mode=dark] .ps-sm-4,html[data-netbox-color-mode=light] .ps-sm-4{padding-left:1.5rem!important}html .ps-sm-5,html[data-netbox-color-mode=dark] .ps-sm-5,html[data-netbox-color-mode=light] .ps-sm-5{padding-left:3rem!important}html .text-sm-start,html[data-netbox-color-mode=dark] .text-sm-start,html[data-netbox-color-mode=light] .text-sm-start{text-align:left!important}html .text-sm-end,html[data-netbox-color-mode=dark] .text-sm-end,html[data-netbox-color-mode=light] .text-sm-end{text-align:right!important}html .text-sm-center,html[data-netbox-color-mode=dark] .text-sm-center,html[data-netbox-color-mode=light] .text-sm-center{text-align:center!important}}@media print and (min-width: 768px){html .float-md-start,html[data-netbox-color-mode=dark] .float-md-start,html[data-netbox-color-mode=light] .float-md-start{float:left!important}html .float-md-end,html[data-netbox-color-mode=dark] .float-md-end,html[data-netbox-color-mode=light] .float-md-end{float:right!important}html .float-md-none,html[data-netbox-color-mode=dark] .float-md-none,html[data-netbox-color-mode=light] .float-md-none{float:none!important}html .d-md-inline,html[data-netbox-color-mode=dark] .d-md-inline,html[data-netbox-color-mode=light] .d-md-inline{display:inline!important}html .d-md-inline-block,html[data-netbox-color-mode=dark] .d-md-inline-block,html[data-netbox-color-mode=light] .d-md-inline-block{display:inline-block!important}html .d-md-block,html[data-netbox-color-mode=dark] .d-md-block,html[data-netbox-color-mode=light] .d-md-block{display:block!important}html .d-md-grid,html[data-netbox-color-mode=dark] .d-md-grid,html[data-netbox-color-mode=light] .d-md-grid{display:grid!important}html .d-md-table,html[data-netbox-color-mode=dark] .d-md-table,html[data-netbox-color-mode=light] .d-md-table{display:table!important}html .d-md-table-row,html[data-netbox-color-mode=dark] .d-md-table-row,html[data-netbox-color-mode=light] .d-md-table-row{display:table-row!important}html .d-md-table-cell,html[data-netbox-color-mode=dark] .d-md-table-cell,html[data-netbox-color-mode=light] .d-md-table-cell{display:table-cell!important}html .d-md-flex,html[data-netbox-color-mode=dark] .d-md-flex,html[data-netbox-color-mode=light] .d-md-flex{display:flex!important}html .d-md-inline-flex,html[data-netbox-color-mode=dark] .d-md-inline-flex,html[data-netbox-color-mode=light] .d-md-inline-flex{display:inline-flex!important}html .d-md-none,html[data-netbox-color-mode=dark] .d-md-none,html[data-netbox-color-mode=light] .d-md-none{display:none!important}html .flex-md-fill,html[data-netbox-color-mode=dark] .flex-md-fill,html[data-netbox-color-mode=light] .flex-md-fill{flex:1 1 auto!important}html .flex-md-row,html[data-netbox-color-mode=dark] .flex-md-row,html[data-netbox-color-mode=light] .flex-md-row{flex-direction:row!important}html .flex-md-column,html[data-netbox-color-mode=dark] .flex-md-column,html[data-netbox-color-mode=light] .flex-md-column{flex-direction:column!important}html .flex-md-row-reverse,html[data-netbox-color-mode=dark] .flex-md-row-reverse,html[data-netbox-color-mode=light] .flex-md-row-reverse{flex-direction:row-reverse!important}html .flex-md-column-reverse,html[data-netbox-color-mode=dark] .flex-md-column-reverse,html[data-netbox-color-mode=light] .flex-md-column-reverse{flex-direction:column-reverse!important}html .flex-md-grow-0,html[data-netbox-color-mode=dark] .flex-md-grow-0,html[data-netbox-color-mode=light] .flex-md-grow-0{flex-grow:0!important}html .flex-md-grow-1,html[data-netbox-color-mode=dark] .flex-md-grow-1,html[data-netbox-color-mode=light] .flex-md-grow-1{flex-grow:1!important}html .flex-md-shrink-0,html[data-netbox-color-mode=dark] .flex-md-shrink-0,html[data-netbox-color-mode=light] .flex-md-shrink-0{flex-shrink:0!important}html .flex-md-shrink-1,html[data-netbox-color-mode=dark] .flex-md-shrink-1,html[data-netbox-color-mode=light] .flex-md-shrink-1{flex-shrink:1!important}html .flex-md-wrap,html[data-netbox-color-mode=dark] .flex-md-wrap,html[data-netbox-color-mode=light] .flex-md-wrap{flex-wrap:wrap!important}html .flex-md-nowrap,html[data-netbox-color-mode=dark] .flex-md-nowrap,html[data-netbox-color-mode=light] .flex-md-nowrap{flex-wrap:nowrap!important}html .flex-md-wrap-reverse,html[data-netbox-color-mode=dark] .flex-md-wrap-reverse,html[data-netbox-color-mode=light] .flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-md-0,html[data-netbox-color-mode=dark] .gap-md-0,html[data-netbox-color-mode=light] .gap-md-0{gap:0!important}html .gap-md-1,html[data-netbox-color-mode=dark] .gap-md-1,html[data-netbox-color-mode=light] .gap-md-1{gap:.25rem!important}html .gap-md-2,html[data-netbox-color-mode=dark] .gap-md-2,html[data-netbox-color-mode=light] .gap-md-2{gap:.5rem!important}html .gap-md-3,html[data-netbox-color-mode=dark] .gap-md-3,html[data-netbox-color-mode=light] .gap-md-3{gap:1rem!important}html .gap-md-4,html[data-netbox-color-mode=dark] .gap-md-4,html[data-netbox-color-mode=light] .gap-md-4{gap:1.5rem!important}html .gap-md-5,html[data-netbox-color-mode=dark] .gap-md-5,html[data-netbox-color-mode=light] .gap-md-5{gap:3rem!important}html .justify-content-md-start,html[data-netbox-color-mode=dark] .justify-content-md-start,html[data-netbox-color-mode=light] .justify-content-md-start{justify-content:flex-start!important}html .justify-content-md-end,html[data-netbox-color-mode=dark] .justify-content-md-end,html[data-netbox-color-mode=light] .justify-content-md-end{justify-content:flex-end!important}html .justify-content-md-center,html[data-netbox-color-mode=dark] .justify-content-md-center,html[data-netbox-color-mode=light] .justify-content-md-center{justify-content:center!important}html .justify-content-md-between,html[data-netbox-color-mode=dark] .justify-content-md-between,html[data-netbox-color-mode=light] .justify-content-md-between{justify-content:space-between!important}html .justify-content-md-around,html[data-netbox-color-mode=dark] .justify-content-md-around,html[data-netbox-color-mode=light] .justify-content-md-around{justify-content:space-around!important}html .justify-content-md-evenly,html[data-netbox-color-mode=dark] .justify-content-md-evenly,html[data-netbox-color-mode=light] .justify-content-md-evenly{justify-content:space-evenly!important}html .align-items-md-start,html[data-netbox-color-mode=dark] .align-items-md-start,html[data-netbox-color-mode=light] .align-items-md-start{align-items:flex-start!important}html .align-items-md-end,html[data-netbox-color-mode=dark] .align-items-md-end,html[data-netbox-color-mode=light] .align-items-md-end{align-items:flex-end!important}html .align-items-md-center,html[data-netbox-color-mode=dark] .align-items-md-center,html[data-netbox-color-mode=light] .align-items-md-center{align-items:center!important}html .align-items-md-baseline,html[data-netbox-color-mode=dark] .align-items-md-baseline,html[data-netbox-color-mode=light] .align-items-md-baseline{align-items:baseline!important}html .align-items-md-stretch,html[data-netbox-color-mode=dark] .align-items-md-stretch,html[data-netbox-color-mode=light] .align-items-md-stretch{align-items:stretch!important}html .align-content-md-start,html[data-netbox-color-mode=dark] .align-content-md-start,html[data-netbox-color-mode=light] .align-content-md-start{align-content:flex-start!important}html .align-content-md-end,html[data-netbox-color-mode=dark] .align-content-md-end,html[data-netbox-color-mode=light] .align-content-md-end{align-content:flex-end!important}html .align-content-md-center,html[data-netbox-color-mode=dark] .align-content-md-center,html[data-netbox-color-mode=light] .align-content-md-center{align-content:center!important}html .align-content-md-between,html[data-netbox-color-mode=dark] .align-content-md-between,html[data-netbox-color-mode=light] .align-content-md-between{align-content:space-between!important}html .align-content-md-around,html[data-netbox-color-mode=dark] .align-content-md-around,html[data-netbox-color-mode=light] .align-content-md-around{align-content:space-around!important}html .align-content-md-stretch,html[data-netbox-color-mode=dark] .align-content-md-stretch,html[data-netbox-color-mode=light] .align-content-md-stretch{align-content:stretch!important}html .align-self-md-auto,html[data-netbox-color-mode=dark] .align-self-md-auto,html[data-netbox-color-mode=light] .align-self-md-auto{align-self:auto!important}html .align-self-md-start,html[data-netbox-color-mode=dark] .align-self-md-start,html[data-netbox-color-mode=light] .align-self-md-start{align-self:flex-start!important}html .align-self-md-end,html[data-netbox-color-mode=dark] .align-self-md-end,html[data-netbox-color-mode=light] .align-self-md-end{align-self:flex-end!important}html .align-self-md-center,html[data-netbox-color-mode=dark] .align-self-md-center,html[data-netbox-color-mode=light] .align-self-md-center{align-self:center!important}html .align-self-md-baseline,html[data-netbox-color-mode=dark] .align-self-md-baseline,html[data-netbox-color-mode=light] .align-self-md-baseline{align-self:baseline!important}html .align-self-md-stretch,html[data-netbox-color-mode=dark] .align-self-md-stretch,html[data-netbox-color-mode=light] .align-self-md-stretch{align-self:stretch!important}html .order-md-first,html[data-netbox-color-mode=dark] .order-md-first,html[data-netbox-color-mode=light] .order-md-first{order:-1!important}html .order-md-0,html[data-netbox-color-mode=dark] .order-md-0,html[data-netbox-color-mode=light] .order-md-0{order:0!important}html .order-md-1,html[data-netbox-color-mode=dark] .order-md-1,html[data-netbox-color-mode=light] .order-md-1{order:1!important}html .order-md-2,html[data-netbox-color-mode=dark] .order-md-2,html[data-netbox-color-mode=light] .order-md-2{order:2!important}html .order-md-3,html[data-netbox-color-mode=dark] .order-md-3,html[data-netbox-color-mode=light] .order-md-3{order:3!important}html .order-md-4,html[data-netbox-color-mode=dark] .order-md-4,html[data-netbox-color-mode=light] .order-md-4{order:4!important}html .order-md-5,html[data-netbox-color-mode=dark] .order-md-5,html[data-netbox-color-mode=light] .order-md-5{order:5!important}html .order-md-last,html[data-netbox-color-mode=dark] .order-md-last,html[data-netbox-color-mode=light] .order-md-last{order:6!important}html .m-md-0,html[data-netbox-color-mode=dark] .m-md-0,html[data-netbox-color-mode=light] .m-md-0{margin:0!important}html .m-md-1,html[data-netbox-color-mode=dark] .m-md-1,html[data-netbox-color-mode=light] .m-md-1{margin:.25rem!important}html .m-md-2,html[data-netbox-color-mode=dark] .m-md-2,html[data-netbox-color-mode=light] .m-md-2{margin:.5rem!important}html .m-md-3,html[data-netbox-color-mode=dark] .m-md-3,html[data-netbox-color-mode=light] .m-md-3{margin:1rem!important}html .m-md-4,html[data-netbox-color-mode=dark] .m-md-4,html[data-netbox-color-mode=light] .m-md-4{margin:1.5rem!important}html .m-md-5,html[data-netbox-color-mode=dark] .m-md-5,html[data-netbox-color-mode=light] .m-md-5{margin:3rem!important}html .m-md-auto,html[data-netbox-color-mode=dark] .m-md-auto,html[data-netbox-color-mode=light] .m-md-auto{margin:auto!important}html .mx-md-0,html[data-netbox-color-mode=dark] .mx-md-0,html[data-netbox-color-mode=light] .mx-md-0{margin-right:0!important;margin-left:0!important}html .mx-md-1,html[data-netbox-color-mode=dark] .mx-md-1,html[data-netbox-color-mode=light] .mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-md-2,html[data-netbox-color-mode=dark] .mx-md-2,html[data-netbox-color-mode=light] .mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-md-3,html[data-netbox-color-mode=dark] .mx-md-3,html[data-netbox-color-mode=light] .mx-md-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-md-4,html[data-netbox-color-mode=dark] .mx-md-4,html[data-netbox-color-mode=light] .mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-md-5,html[data-netbox-color-mode=dark] .mx-md-5,html[data-netbox-color-mode=light] .mx-md-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-md-auto,html[data-netbox-color-mode=dark] .mx-md-auto,html[data-netbox-color-mode=light] .mx-md-auto{margin-right:auto!important;margin-left:auto!important}html .my-md-0,html[data-netbox-color-mode=dark] .my-md-0,html[data-netbox-color-mode=light] .my-md-0{margin-top:0!important;margin-bottom:0!important}html .my-md-1,html[data-netbox-color-mode=dark] .my-md-1,html[data-netbox-color-mode=light] .my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-md-2,html[data-netbox-color-mode=dark] .my-md-2,html[data-netbox-color-mode=light] .my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-md-3,html[data-netbox-color-mode=dark] .my-md-3,html[data-netbox-color-mode=light] .my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-md-4,html[data-netbox-color-mode=dark] .my-md-4,html[data-netbox-color-mode=light] .my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-md-5,html[data-netbox-color-mode=dark] .my-md-5,html[data-netbox-color-mode=light] .my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-md-auto,html[data-netbox-color-mode=dark] .my-md-auto,html[data-netbox-color-mode=light] .my-md-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-md-0,html[data-netbox-color-mode=dark] .mt-md-0,html[data-netbox-color-mode=light] .mt-md-0{margin-top:0!important}html .mt-md-1,html[data-netbox-color-mode=dark] .mt-md-1,html[data-netbox-color-mode=light] .mt-md-1{margin-top:.25rem!important}html .mt-md-2,html[data-netbox-color-mode=dark] .mt-md-2,html[data-netbox-color-mode=light] .mt-md-2{margin-top:.5rem!important}html .mt-md-3,html[data-netbox-color-mode=dark] .mt-md-3,html[data-netbox-color-mode=light] .mt-md-3{margin-top:1rem!important}html .mt-md-4,html[data-netbox-color-mode=dark] .mt-md-4,html[data-netbox-color-mode=light] .mt-md-4{margin-top:1.5rem!important}html .mt-md-5,html[data-netbox-color-mode=dark] .mt-md-5,html[data-netbox-color-mode=light] .mt-md-5{margin-top:3rem!important}html .mt-md-auto,html[data-netbox-color-mode=dark] .mt-md-auto,html[data-netbox-color-mode=light] .mt-md-auto{margin-top:auto!important}html .me-md-0,html[data-netbox-color-mode=dark] .me-md-0,html[data-netbox-color-mode=light] .me-md-0{margin-right:0!important}html .me-md-1,html[data-netbox-color-mode=dark] .me-md-1,html[data-netbox-color-mode=light] .me-md-1{margin-right:.25rem!important}html .me-md-2,html[data-netbox-color-mode=dark] .me-md-2,html[data-netbox-color-mode=light] .me-md-2{margin-right:.5rem!important}html .me-md-3,html[data-netbox-color-mode=dark] .me-md-3,html[data-netbox-color-mode=light] .me-md-3{margin-right:1rem!important}html .me-md-4,html[data-netbox-color-mode=dark] .me-md-4,html[data-netbox-color-mode=light] .me-md-4{margin-right:1.5rem!important}html .me-md-5,html[data-netbox-color-mode=dark] .me-md-5,html[data-netbox-color-mode=light] .me-md-5{margin-right:3rem!important}html .me-md-auto,html[data-netbox-color-mode=dark] .me-md-auto,html[data-netbox-color-mode=light] .me-md-auto{margin-right:auto!important}html .mb-md-0,html[data-netbox-color-mode=dark] .mb-md-0,html[data-netbox-color-mode=light] .mb-md-0{margin-bottom:0!important}html .mb-md-1,html[data-netbox-color-mode=dark] .mb-md-1,html[data-netbox-color-mode=light] .mb-md-1{margin-bottom:.25rem!important}html .mb-md-2,html[data-netbox-color-mode=dark] .mb-md-2,html[data-netbox-color-mode=light] .mb-md-2{margin-bottom:.5rem!important}html .mb-md-3,html[data-netbox-color-mode=dark] .mb-md-3,html[data-netbox-color-mode=light] .mb-md-3{margin-bottom:1rem!important}html .mb-md-4,html[data-netbox-color-mode=dark] .mb-md-4,html[data-netbox-color-mode=light] .mb-md-4{margin-bottom:1.5rem!important}html .mb-md-5,html[data-netbox-color-mode=dark] .mb-md-5,html[data-netbox-color-mode=light] .mb-md-5{margin-bottom:3rem!important}html .mb-md-auto,html[data-netbox-color-mode=dark] .mb-md-auto,html[data-netbox-color-mode=light] .mb-md-auto{margin-bottom:auto!important}html .ms-md-0,html[data-netbox-color-mode=dark] .ms-md-0,html[data-netbox-color-mode=light] .ms-md-0{margin-left:0!important}html .ms-md-1,html[data-netbox-color-mode=dark] .ms-md-1,html[data-netbox-color-mode=light] .ms-md-1{margin-left:.25rem!important}html .ms-md-2,html[data-netbox-color-mode=dark] .ms-md-2,html[data-netbox-color-mode=light] .ms-md-2{margin-left:.5rem!important}html .ms-md-3,html[data-netbox-color-mode=dark] .ms-md-3,html[data-netbox-color-mode=light] .ms-md-3{margin-left:1rem!important}html .ms-md-4,html[data-netbox-color-mode=dark] .ms-md-4,html[data-netbox-color-mode=light] .ms-md-4{margin-left:1.5rem!important}html .ms-md-5,html[data-netbox-color-mode=dark] .ms-md-5,html[data-netbox-color-mode=light] .ms-md-5{margin-left:3rem!important}html .ms-md-auto,html[data-netbox-color-mode=dark] .ms-md-auto,html[data-netbox-color-mode=light] .ms-md-auto{margin-left:auto!important}html .p-md-0,html[data-netbox-color-mode=dark] .p-md-0,html[data-netbox-color-mode=light] .p-md-0{padding:0!important}html .p-md-1,html[data-netbox-color-mode=dark] .p-md-1,html[data-netbox-color-mode=light] .p-md-1{padding:.25rem!important}html .p-md-2,html[data-netbox-color-mode=dark] .p-md-2,html[data-netbox-color-mode=light] .p-md-2{padding:.5rem!important}html .p-md-3,html[data-netbox-color-mode=dark] .p-md-3,html[data-netbox-color-mode=light] .p-md-3{padding:1rem!important}html .p-md-4,html[data-netbox-color-mode=dark] .p-md-4,html[data-netbox-color-mode=light] .p-md-4{padding:1.5rem!important}html .p-md-5,html[data-netbox-color-mode=dark] .p-md-5,html[data-netbox-color-mode=light] .p-md-5{padding:3rem!important}html .px-md-0,html[data-netbox-color-mode=dark] .px-md-0,html[data-netbox-color-mode=light] .px-md-0{padding-right:0!important;padding-left:0!important}html .px-md-1,html[data-netbox-color-mode=dark] .px-md-1,html[data-netbox-color-mode=light] .px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-md-2,html[data-netbox-color-mode=dark] .px-md-2,html[data-netbox-color-mode=light] .px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-md-3,html[data-netbox-color-mode=dark] .px-md-3,html[data-netbox-color-mode=light] .px-md-3{padding-right:1rem!important;padding-left:1rem!important}html .px-md-4,html[data-netbox-color-mode=dark] .px-md-4,html[data-netbox-color-mode=light] .px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-md-5,html[data-netbox-color-mode=dark] .px-md-5,html[data-netbox-color-mode=light] .px-md-5{padding-right:3rem!important;padding-left:3rem!important}html .py-md-0,html[data-netbox-color-mode=dark] .py-md-0,html[data-netbox-color-mode=light] .py-md-0{padding-top:0!important;padding-bottom:0!important}html .py-md-1,html[data-netbox-color-mode=dark] .py-md-1,html[data-netbox-color-mode=light] .py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-md-2,html[data-netbox-color-mode=dark] .py-md-2,html[data-netbox-color-mode=light] .py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-md-3,html[data-netbox-color-mode=dark] .py-md-3,html[data-netbox-color-mode=light] .py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-md-4,html[data-netbox-color-mode=dark] .py-md-4,html[data-netbox-color-mode=light] .py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-md-5,html[data-netbox-color-mode=dark] .py-md-5,html[data-netbox-color-mode=light] .py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-md-0,html[data-netbox-color-mode=dark] .pt-md-0,html[data-netbox-color-mode=light] .pt-md-0{padding-top:0!important}html .pt-md-1,html[data-netbox-color-mode=dark] .pt-md-1,html[data-netbox-color-mode=light] .pt-md-1{padding-top:.25rem!important}html .pt-md-2,html[data-netbox-color-mode=dark] .pt-md-2,html[data-netbox-color-mode=light] .pt-md-2{padding-top:.5rem!important}html .pt-md-3,html[data-netbox-color-mode=dark] .pt-md-3,html[data-netbox-color-mode=light] .pt-md-3{padding-top:1rem!important}html .pt-md-4,html[data-netbox-color-mode=dark] .pt-md-4,html[data-netbox-color-mode=light] .pt-md-4{padding-top:1.5rem!important}html .pt-md-5,html[data-netbox-color-mode=dark] .pt-md-5,html[data-netbox-color-mode=light] .pt-md-5{padding-top:3rem!important}html .pe-md-0,html[data-netbox-color-mode=dark] .pe-md-0,html[data-netbox-color-mode=light] .pe-md-0{padding-right:0!important}html .pe-md-1,html[data-netbox-color-mode=dark] .pe-md-1,html[data-netbox-color-mode=light] .pe-md-1{padding-right:.25rem!important}html .pe-md-2,html[data-netbox-color-mode=dark] .pe-md-2,html[data-netbox-color-mode=light] .pe-md-2{padding-right:.5rem!important}html .pe-md-3,html[data-netbox-color-mode=dark] .pe-md-3,html[data-netbox-color-mode=light] .pe-md-3{padding-right:1rem!important}html .pe-md-4,html[data-netbox-color-mode=dark] .pe-md-4,html[data-netbox-color-mode=light] .pe-md-4{padding-right:1.5rem!important}html .pe-md-5,html[data-netbox-color-mode=dark] .pe-md-5,html[data-netbox-color-mode=light] .pe-md-5{padding-right:3rem!important}html .pb-md-0,html[data-netbox-color-mode=dark] .pb-md-0,html[data-netbox-color-mode=light] .pb-md-0{padding-bottom:0!important}html .pb-md-1,html[data-netbox-color-mode=dark] .pb-md-1,html[data-netbox-color-mode=light] .pb-md-1{padding-bottom:.25rem!important}html .pb-md-2,html[data-netbox-color-mode=dark] .pb-md-2,html[data-netbox-color-mode=light] .pb-md-2{padding-bottom:.5rem!important}html .pb-md-3,html[data-netbox-color-mode=dark] .pb-md-3,html[data-netbox-color-mode=light] .pb-md-3{padding-bottom:1rem!important}html .pb-md-4,html[data-netbox-color-mode=dark] .pb-md-4,html[data-netbox-color-mode=light] .pb-md-4{padding-bottom:1.5rem!important}html .pb-md-5,html[data-netbox-color-mode=dark] .pb-md-5,html[data-netbox-color-mode=light] .pb-md-5{padding-bottom:3rem!important}html .ps-md-0,html[data-netbox-color-mode=dark] .ps-md-0,html[data-netbox-color-mode=light] .ps-md-0{padding-left:0!important}html .ps-md-1,html[data-netbox-color-mode=dark] .ps-md-1,html[data-netbox-color-mode=light] .ps-md-1{padding-left:.25rem!important}html .ps-md-2,html[data-netbox-color-mode=dark] .ps-md-2,html[data-netbox-color-mode=light] .ps-md-2{padding-left:.5rem!important}html .ps-md-3,html[data-netbox-color-mode=dark] .ps-md-3,html[data-netbox-color-mode=light] .ps-md-3{padding-left:1rem!important}html .ps-md-4,html[data-netbox-color-mode=dark] .ps-md-4,html[data-netbox-color-mode=light] .ps-md-4{padding-left:1.5rem!important}html .ps-md-5,html[data-netbox-color-mode=dark] .ps-md-5,html[data-netbox-color-mode=light] .ps-md-5{padding-left:3rem!important}html .text-md-start,html[data-netbox-color-mode=dark] .text-md-start,html[data-netbox-color-mode=light] .text-md-start{text-align:left!important}html .text-md-end,html[data-netbox-color-mode=dark] .text-md-end,html[data-netbox-color-mode=light] .text-md-end{text-align:right!important}html .text-md-center,html[data-netbox-color-mode=dark] .text-md-center,html[data-netbox-color-mode=light] .text-md-center{text-align:center!important}}@media print and (min-width: 992px){html .float-lg-start,html[data-netbox-color-mode=dark] .float-lg-start,html[data-netbox-color-mode=light] .float-lg-start{float:left!important}html .float-lg-end,html[data-netbox-color-mode=dark] .float-lg-end,html[data-netbox-color-mode=light] .float-lg-end{float:right!important}html .float-lg-none,html[data-netbox-color-mode=dark] .float-lg-none,html[data-netbox-color-mode=light] .float-lg-none{float:none!important}html .d-lg-inline,html[data-netbox-color-mode=dark] .d-lg-inline,html[data-netbox-color-mode=light] .d-lg-inline{display:inline!important}html .d-lg-inline-block,html[data-netbox-color-mode=dark] .d-lg-inline-block,html[data-netbox-color-mode=light] .d-lg-inline-block{display:inline-block!important}html .d-lg-block,html[data-netbox-color-mode=dark] .d-lg-block,html[data-netbox-color-mode=light] .d-lg-block{display:block!important}html .d-lg-grid,html[data-netbox-color-mode=dark] .d-lg-grid,html[data-netbox-color-mode=light] .d-lg-grid{display:grid!important}html .d-lg-table,html[data-netbox-color-mode=dark] .d-lg-table,html[data-netbox-color-mode=light] .d-lg-table{display:table!important}html .d-lg-table-row,html[data-netbox-color-mode=dark] .d-lg-table-row,html[data-netbox-color-mode=light] .d-lg-table-row{display:table-row!important}html .d-lg-table-cell,html[data-netbox-color-mode=dark] .d-lg-table-cell,html[data-netbox-color-mode=light] .d-lg-table-cell{display:table-cell!important}html .d-lg-flex,html[data-netbox-color-mode=dark] .d-lg-flex,html[data-netbox-color-mode=light] .d-lg-flex{display:flex!important}html .d-lg-inline-flex,html[data-netbox-color-mode=dark] .d-lg-inline-flex,html[data-netbox-color-mode=light] .d-lg-inline-flex{display:inline-flex!important}html .d-lg-none,html[data-netbox-color-mode=dark] .d-lg-none,html[data-netbox-color-mode=light] .d-lg-none{display:none!important}html .flex-lg-fill,html[data-netbox-color-mode=dark] .flex-lg-fill,html[data-netbox-color-mode=light] .flex-lg-fill{flex:1 1 auto!important}html .flex-lg-row,html[data-netbox-color-mode=dark] .flex-lg-row,html[data-netbox-color-mode=light] .flex-lg-row{flex-direction:row!important}html .flex-lg-column,html[data-netbox-color-mode=dark] .flex-lg-column,html[data-netbox-color-mode=light] .flex-lg-column{flex-direction:column!important}html .flex-lg-row-reverse,html[data-netbox-color-mode=dark] .flex-lg-row-reverse,html[data-netbox-color-mode=light] .flex-lg-row-reverse{flex-direction:row-reverse!important}html .flex-lg-column-reverse,html[data-netbox-color-mode=dark] .flex-lg-column-reverse,html[data-netbox-color-mode=light] .flex-lg-column-reverse{flex-direction:column-reverse!important}html .flex-lg-grow-0,html[data-netbox-color-mode=dark] .flex-lg-grow-0,html[data-netbox-color-mode=light] .flex-lg-grow-0{flex-grow:0!important}html .flex-lg-grow-1,html[data-netbox-color-mode=dark] .flex-lg-grow-1,html[data-netbox-color-mode=light] .flex-lg-grow-1{flex-grow:1!important}html .flex-lg-shrink-0,html[data-netbox-color-mode=dark] .flex-lg-shrink-0,html[data-netbox-color-mode=light] .flex-lg-shrink-0{flex-shrink:0!important}html .flex-lg-shrink-1,html[data-netbox-color-mode=dark] .flex-lg-shrink-1,html[data-netbox-color-mode=light] .flex-lg-shrink-1{flex-shrink:1!important}html .flex-lg-wrap,html[data-netbox-color-mode=dark] .flex-lg-wrap,html[data-netbox-color-mode=light] .flex-lg-wrap{flex-wrap:wrap!important}html .flex-lg-nowrap,html[data-netbox-color-mode=dark] .flex-lg-nowrap,html[data-netbox-color-mode=light] .flex-lg-nowrap{flex-wrap:nowrap!important}html .flex-lg-wrap-reverse,html[data-netbox-color-mode=dark] .flex-lg-wrap-reverse,html[data-netbox-color-mode=light] .flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-lg-0,html[data-netbox-color-mode=dark] .gap-lg-0,html[data-netbox-color-mode=light] .gap-lg-0{gap:0!important}html .gap-lg-1,html[data-netbox-color-mode=dark] .gap-lg-1,html[data-netbox-color-mode=light] .gap-lg-1{gap:.25rem!important}html .gap-lg-2,html[data-netbox-color-mode=dark] .gap-lg-2,html[data-netbox-color-mode=light] .gap-lg-2{gap:.5rem!important}html .gap-lg-3,html[data-netbox-color-mode=dark] .gap-lg-3,html[data-netbox-color-mode=light] .gap-lg-3{gap:1rem!important}html .gap-lg-4,html[data-netbox-color-mode=dark] .gap-lg-4,html[data-netbox-color-mode=light] .gap-lg-4{gap:1.5rem!important}html .gap-lg-5,html[data-netbox-color-mode=dark] .gap-lg-5,html[data-netbox-color-mode=light] .gap-lg-5{gap:3rem!important}html .justify-content-lg-start,html[data-netbox-color-mode=dark] .justify-content-lg-start,html[data-netbox-color-mode=light] .justify-content-lg-start{justify-content:flex-start!important}html .justify-content-lg-end,html[data-netbox-color-mode=dark] .justify-content-lg-end,html[data-netbox-color-mode=light] .justify-content-lg-end{justify-content:flex-end!important}html .justify-content-lg-center,html[data-netbox-color-mode=dark] .justify-content-lg-center,html[data-netbox-color-mode=light] .justify-content-lg-center{justify-content:center!important}html .justify-content-lg-between,html[data-netbox-color-mode=dark] .justify-content-lg-between,html[data-netbox-color-mode=light] .justify-content-lg-between{justify-content:space-between!important}html .justify-content-lg-around,html[data-netbox-color-mode=dark] .justify-content-lg-around,html[data-netbox-color-mode=light] .justify-content-lg-around{justify-content:space-around!important}html .justify-content-lg-evenly,html[data-netbox-color-mode=dark] .justify-content-lg-evenly,html[data-netbox-color-mode=light] .justify-content-lg-evenly{justify-content:space-evenly!important}html .align-items-lg-start,html[data-netbox-color-mode=dark] .align-items-lg-start,html[data-netbox-color-mode=light] .align-items-lg-start{align-items:flex-start!important}html .align-items-lg-end,html[data-netbox-color-mode=dark] .align-items-lg-end,html[data-netbox-color-mode=light] .align-items-lg-end{align-items:flex-end!important}html .align-items-lg-center,html[data-netbox-color-mode=dark] .align-items-lg-center,html[data-netbox-color-mode=light] .align-items-lg-center{align-items:center!important}html .align-items-lg-baseline,html[data-netbox-color-mode=dark] .align-items-lg-baseline,html[data-netbox-color-mode=light] .align-items-lg-baseline{align-items:baseline!important}html .align-items-lg-stretch,html[data-netbox-color-mode=dark] .align-items-lg-stretch,html[data-netbox-color-mode=light] .align-items-lg-stretch{align-items:stretch!important}html .align-content-lg-start,html[data-netbox-color-mode=dark] .align-content-lg-start,html[data-netbox-color-mode=light] .align-content-lg-start{align-content:flex-start!important}html .align-content-lg-end,html[data-netbox-color-mode=dark] .align-content-lg-end,html[data-netbox-color-mode=light] .align-content-lg-end{align-content:flex-end!important}html .align-content-lg-center,html[data-netbox-color-mode=dark] .align-content-lg-center,html[data-netbox-color-mode=light] .align-content-lg-center{align-content:center!important}html .align-content-lg-between,html[data-netbox-color-mode=dark] .align-content-lg-between,html[data-netbox-color-mode=light] .align-content-lg-between{align-content:space-between!important}html .align-content-lg-around,html[data-netbox-color-mode=dark] .align-content-lg-around,html[data-netbox-color-mode=light] .align-content-lg-around{align-content:space-around!important}html .align-content-lg-stretch,html[data-netbox-color-mode=dark] .align-content-lg-stretch,html[data-netbox-color-mode=light] .align-content-lg-stretch{align-content:stretch!important}html .align-self-lg-auto,html[data-netbox-color-mode=dark] .align-self-lg-auto,html[data-netbox-color-mode=light] .align-self-lg-auto{align-self:auto!important}html .align-self-lg-start,html[data-netbox-color-mode=dark] .align-self-lg-start,html[data-netbox-color-mode=light] .align-self-lg-start{align-self:flex-start!important}html .align-self-lg-end,html[data-netbox-color-mode=dark] .align-self-lg-end,html[data-netbox-color-mode=light] .align-self-lg-end{align-self:flex-end!important}html .align-self-lg-center,html[data-netbox-color-mode=dark] .align-self-lg-center,html[data-netbox-color-mode=light] .align-self-lg-center{align-self:center!important}html .align-self-lg-baseline,html[data-netbox-color-mode=dark] .align-self-lg-baseline,html[data-netbox-color-mode=light] .align-self-lg-baseline{align-self:baseline!important}html .align-self-lg-stretch,html[data-netbox-color-mode=dark] .align-self-lg-stretch,html[data-netbox-color-mode=light] .align-self-lg-stretch{align-self:stretch!important}html .order-lg-first,html[data-netbox-color-mode=dark] .order-lg-first,html[data-netbox-color-mode=light] .order-lg-first{order:-1!important}html .order-lg-0,html[data-netbox-color-mode=dark] .order-lg-0,html[data-netbox-color-mode=light] .order-lg-0{order:0!important}html .order-lg-1,html[data-netbox-color-mode=dark] .order-lg-1,html[data-netbox-color-mode=light] .order-lg-1{order:1!important}html .order-lg-2,html[data-netbox-color-mode=dark] .order-lg-2,html[data-netbox-color-mode=light] .order-lg-2{order:2!important}html .order-lg-3,html[data-netbox-color-mode=dark] .order-lg-3,html[data-netbox-color-mode=light] .order-lg-3{order:3!important}html .order-lg-4,html[data-netbox-color-mode=dark] .order-lg-4,html[data-netbox-color-mode=light] .order-lg-4{order:4!important}html .order-lg-5,html[data-netbox-color-mode=dark] .order-lg-5,html[data-netbox-color-mode=light] .order-lg-5{order:5!important}html .order-lg-last,html[data-netbox-color-mode=dark] .order-lg-last,html[data-netbox-color-mode=light] .order-lg-last{order:6!important}html .m-lg-0,html[data-netbox-color-mode=dark] .m-lg-0,html[data-netbox-color-mode=light] .m-lg-0{margin:0!important}html .m-lg-1,html[data-netbox-color-mode=dark] .m-lg-1,html[data-netbox-color-mode=light] .m-lg-1{margin:.25rem!important}html .m-lg-2,html[data-netbox-color-mode=dark] .m-lg-2,html[data-netbox-color-mode=light] .m-lg-2{margin:.5rem!important}html .m-lg-3,html[data-netbox-color-mode=dark] .m-lg-3,html[data-netbox-color-mode=light] .m-lg-3{margin:1rem!important}html .m-lg-4,html[data-netbox-color-mode=dark] .m-lg-4,html[data-netbox-color-mode=light] .m-lg-4{margin:1.5rem!important}html .m-lg-5,html[data-netbox-color-mode=dark] .m-lg-5,html[data-netbox-color-mode=light] .m-lg-5{margin:3rem!important}html .m-lg-auto,html[data-netbox-color-mode=dark] .m-lg-auto,html[data-netbox-color-mode=light] .m-lg-auto{margin:auto!important}html .mx-lg-0,html[data-netbox-color-mode=dark] .mx-lg-0,html[data-netbox-color-mode=light] .mx-lg-0{margin-right:0!important;margin-left:0!important}html .mx-lg-1,html[data-netbox-color-mode=dark] .mx-lg-1,html[data-netbox-color-mode=light] .mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-lg-2,html[data-netbox-color-mode=dark] .mx-lg-2,html[data-netbox-color-mode=light] .mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-lg-3,html[data-netbox-color-mode=dark] .mx-lg-3,html[data-netbox-color-mode=light] .mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-lg-4,html[data-netbox-color-mode=dark] .mx-lg-4,html[data-netbox-color-mode=light] .mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-lg-5,html[data-netbox-color-mode=dark] .mx-lg-5,html[data-netbox-color-mode=light] .mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-lg-auto,html[data-netbox-color-mode=dark] .mx-lg-auto,html[data-netbox-color-mode=light] .mx-lg-auto{margin-right:auto!important;margin-left:auto!important}html .my-lg-0,html[data-netbox-color-mode=dark] .my-lg-0,html[data-netbox-color-mode=light] .my-lg-0{margin-top:0!important;margin-bottom:0!important}html .my-lg-1,html[data-netbox-color-mode=dark] .my-lg-1,html[data-netbox-color-mode=light] .my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-lg-2,html[data-netbox-color-mode=dark] .my-lg-2,html[data-netbox-color-mode=light] .my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-lg-3,html[data-netbox-color-mode=dark] .my-lg-3,html[data-netbox-color-mode=light] .my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-lg-4,html[data-netbox-color-mode=dark] .my-lg-4,html[data-netbox-color-mode=light] .my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-lg-5,html[data-netbox-color-mode=dark] .my-lg-5,html[data-netbox-color-mode=light] .my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-lg-auto,html[data-netbox-color-mode=dark] .my-lg-auto,html[data-netbox-color-mode=light] .my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-lg-0,html[data-netbox-color-mode=dark] .mt-lg-0,html[data-netbox-color-mode=light] .mt-lg-0{margin-top:0!important}html .mt-lg-1,html[data-netbox-color-mode=dark] .mt-lg-1,html[data-netbox-color-mode=light] .mt-lg-1{margin-top:.25rem!important}html .mt-lg-2,html[data-netbox-color-mode=dark] .mt-lg-2,html[data-netbox-color-mode=light] .mt-lg-2{margin-top:.5rem!important}html .mt-lg-3,html[data-netbox-color-mode=dark] .mt-lg-3,html[data-netbox-color-mode=light] .mt-lg-3{margin-top:1rem!important}html .mt-lg-4,html[data-netbox-color-mode=dark] .mt-lg-4,html[data-netbox-color-mode=light] .mt-lg-4{margin-top:1.5rem!important}html .mt-lg-5,html[data-netbox-color-mode=dark] .mt-lg-5,html[data-netbox-color-mode=light] .mt-lg-5{margin-top:3rem!important}html .mt-lg-auto,html[data-netbox-color-mode=dark] .mt-lg-auto,html[data-netbox-color-mode=light] .mt-lg-auto{margin-top:auto!important}html .me-lg-0,html[data-netbox-color-mode=dark] .me-lg-0,html[data-netbox-color-mode=light] .me-lg-0{margin-right:0!important}html .me-lg-1,html[data-netbox-color-mode=dark] .me-lg-1,html[data-netbox-color-mode=light] .me-lg-1{margin-right:.25rem!important}html .me-lg-2,html[data-netbox-color-mode=dark] .me-lg-2,html[data-netbox-color-mode=light] .me-lg-2{margin-right:.5rem!important}html .me-lg-3,html[data-netbox-color-mode=dark] .me-lg-3,html[data-netbox-color-mode=light] .me-lg-3{margin-right:1rem!important}html .me-lg-4,html[data-netbox-color-mode=dark] .me-lg-4,html[data-netbox-color-mode=light] .me-lg-4{margin-right:1.5rem!important}html .me-lg-5,html[data-netbox-color-mode=dark] .me-lg-5,html[data-netbox-color-mode=light] .me-lg-5{margin-right:3rem!important}html .me-lg-auto,html[data-netbox-color-mode=dark] .me-lg-auto,html[data-netbox-color-mode=light] .me-lg-auto{margin-right:auto!important}html .mb-lg-0,html[data-netbox-color-mode=dark] .mb-lg-0,html[data-netbox-color-mode=light] .mb-lg-0{margin-bottom:0!important}html .mb-lg-1,html[data-netbox-color-mode=dark] .mb-lg-1,html[data-netbox-color-mode=light] .mb-lg-1{margin-bottom:.25rem!important}html .mb-lg-2,html[data-netbox-color-mode=dark] .mb-lg-2,html[data-netbox-color-mode=light] .mb-lg-2{margin-bottom:.5rem!important}html .mb-lg-3,html[data-netbox-color-mode=dark] .mb-lg-3,html[data-netbox-color-mode=light] .mb-lg-3{margin-bottom:1rem!important}html .mb-lg-4,html[data-netbox-color-mode=dark] .mb-lg-4,html[data-netbox-color-mode=light] .mb-lg-4{margin-bottom:1.5rem!important}html .mb-lg-5,html[data-netbox-color-mode=dark] .mb-lg-5,html[data-netbox-color-mode=light] .mb-lg-5{margin-bottom:3rem!important}html .mb-lg-auto,html[data-netbox-color-mode=dark] .mb-lg-auto,html[data-netbox-color-mode=light] .mb-lg-auto{margin-bottom:auto!important}html .ms-lg-0,html[data-netbox-color-mode=dark] .ms-lg-0,html[data-netbox-color-mode=light] .ms-lg-0{margin-left:0!important}html .ms-lg-1,html[data-netbox-color-mode=dark] .ms-lg-1,html[data-netbox-color-mode=light] .ms-lg-1{margin-left:.25rem!important}html .ms-lg-2,html[data-netbox-color-mode=dark] .ms-lg-2,html[data-netbox-color-mode=light] .ms-lg-2{margin-left:.5rem!important}html .ms-lg-3,html[data-netbox-color-mode=dark] .ms-lg-3,html[data-netbox-color-mode=light] .ms-lg-3{margin-left:1rem!important}html .ms-lg-4,html[data-netbox-color-mode=dark] .ms-lg-4,html[data-netbox-color-mode=light] .ms-lg-4{margin-left:1.5rem!important}html .ms-lg-5,html[data-netbox-color-mode=dark] .ms-lg-5,html[data-netbox-color-mode=light] .ms-lg-5{margin-left:3rem!important}html .ms-lg-auto,html[data-netbox-color-mode=dark] .ms-lg-auto,html[data-netbox-color-mode=light] .ms-lg-auto{margin-left:auto!important}html .p-lg-0,html[data-netbox-color-mode=dark] .p-lg-0,html[data-netbox-color-mode=light] .p-lg-0{padding:0!important}html .p-lg-1,html[data-netbox-color-mode=dark] .p-lg-1,html[data-netbox-color-mode=light] .p-lg-1{padding:.25rem!important}html .p-lg-2,html[data-netbox-color-mode=dark] .p-lg-2,html[data-netbox-color-mode=light] .p-lg-2{padding:.5rem!important}html .p-lg-3,html[data-netbox-color-mode=dark] .p-lg-3,html[data-netbox-color-mode=light] .p-lg-3{padding:1rem!important}html .p-lg-4,html[data-netbox-color-mode=dark] .p-lg-4,html[data-netbox-color-mode=light] .p-lg-4{padding:1.5rem!important}html .p-lg-5,html[data-netbox-color-mode=dark] .p-lg-5,html[data-netbox-color-mode=light] .p-lg-5{padding:3rem!important}html .px-lg-0,html[data-netbox-color-mode=dark] .px-lg-0,html[data-netbox-color-mode=light] .px-lg-0{padding-right:0!important;padding-left:0!important}html .px-lg-1,html[data-netbox-color-mode=dark] .px-lg-1,html[data-netbox-color-mode=light] .px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-lg-2,html[data-netbox-color-mode=dark] .px-lg-2,html[data-netbox-color-mode=light] .px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-lg-3,html[data-netbox-color-mode=dark] .px-lg-3,html[data-netbox-color-mode=light] .px-lg-3{padding-right:1rem!important;padding-left:1rem!important}html .px-lg-4,html[data-netbox-color-mode=dark] .px-lg-4,html[data-netbox-color-mode=light] .px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-lg-5,html[data-netbox-color-mode=dark] .px-lg-5,html[data-netbox-color-mode=light] .px-lg-5{padding-right:3rem!important;padding-left:3rem!important}html .py-lg-0,html[data-netbox-color-mode=dark] .py-lg-0,html[data-netbox-color-mode=light] .py-lg-0{padding-top:0!important;padding-bottom:0!important}html .py-lg-1,html[data-netbox-color-mode=dark] .py-lg-1,html[data-netbox-color-mode=light] .py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-lg-2,html[data-netbox-color-mode=dark] .py-lg-2,html[data-netbox-color-mode=light] .py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-lg-3,html[data-netbox-color-mode=dark] .py-lg-3,html[data-netbox-color-mode=light] .py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-lg-4,html[data-netbox-color-mode=dark] .py-lg-4,html[data-netbox-color-mode=light] .py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-lg-5,html[data-netbox-color-mode=dark] .py-lg-5,html[data-netbox-color-mode=light] .py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-lg-0,html[data-netbox-color-mode=dark] .pt-lg-0,html[data-netbox-color-mode=light] .pt-lg-0{padding-top:0!important}html .pt-lg-1,html[data-netbox-color-mode=dark] .pt-lg-1,html[data-netbox-color-mode=light] .pt-lg-1{padding-top:.25rem!important}html .pt-lg-2,html[data-netbox-color-mode=dark] .pt-lg-2,html[data-netbox-color-mode=light] .pt-lg-2{padding-top:.5rem!important}html .pt-lg-3,html[data-netbox-color-mode=dark] .pt-lg-3,html[data-netbox-color-mode=light] .pt-lg-3{padding-top:1rem!important}html .pt-lg-4,html[data-netbox-color-mode=dark] .pt-lg-4,html[data-netbox-color-mode=light] .pt-lg-4{padding-top:1.5rem!important}html .pt-lg-5,html[data-netbox-color-mode=dark] .pt-lg-5,html[data-netbox-color-mode=light] .pt-lg-5{padding-top:3rem!important}html .pe-lg-0,html[data-netbox-color-mode=dark] .pe-lg-0,html[data-netbox-color-mode=light] .pe-lg-0{padding-right:0!important}html .pe-lg-1,html[data-netbox-color-mode=dark] .pe-lg-1,html[data-netbox-color-mode=light] .pe-lg-1{padding-right:.25rem!important}html .pe-lg-2,html[data-netbox-color-mode=dark] .pe-lg-2,html[data-netbox-color-mode=light] .pe-lg-2{padding-right:.5rem!important}html .pe-lg-3,html[data-netbox-color-mode=dark] .pe-lg-3,html[data-netbox-color-mode=light] .pe-lg-3{padding-right:1rem!important}html .pe-lg-4,html[data-netbox-color-mode=dark] .pe-lg-4,html[data-netbox-color-mode=light] .pe-lg-4{padding-right:1.5rem!important}html .pe-lg-5,html[data-netbox-color-mode=dark] .pe-lg-5,html[data-netbox-color-mode=light] .pe-lg-5{padding-right:3rem!important}html .pb-lg-0,html[data-netbox-color-mode=dark] .pb-lg-0,html[data-netbox-color-mode=light] .pb-lg-0{padding-bottom:0!important}html .pb-lg-1,html[data-netbox-color-mode=dark] .pb-lg-1,html[data-netbox-color-mode=light] .pb-lg-1{padding-bottom:.25rem!important}html .pb-lg-2,html[data-netbox-color-mode=dark] .pb-lg-2,html[data-netbox-color-mode=light] .pb-lg-2{padding-bottom:.5rem!important}html .pb-lg-3,html[data-netbox-color-mode=dark] .pb-lg-3,html[data-netbox-color-mode=light] .pb-lg-3{padding-bottom:1rem!important}html .pb-lg-4,html[data-netbox-color-mode=dark] .pb-lg-4,html[data-netbox-color-mode=light] .pb-lg-4{padding-bottom:1.5rem!important}html .pb-lg-5,html[data-netbox-color-mode=dark] .pb-lg-5,html[data-netbox-color-mode=light] .pb-lg-5{padding-bottom:3rem!important}html .ps-lg-0,html[data-netbox-color-mode=dark] .ps-lg-0,html[data-netbox-color-mode=light] .ps-lg-0{padding-left:0!important}html .ps-lg-1,html[data-netbox-color-mode=dark] .ps-lg-1,html[data-netbox-color-mode=light] .ps-lg-1{padding-left:.25rem!important}html .ps-lg-2,html[data-netbox-color-mode=dark] .ps-lg-2,html[data-netbox-color-mode=light] .ps-lg-2{padding-left:.5rem!important}html .ps-lg-3,html[data-netbox-color-mode=dark] .ps-lg-3,html[data-netbox-color-mode=light] .ps-lg-3{padding-left:1rem!important}html .ps-lg-4,html[data-netbox-color-mode=dark] .ps-lg-4,html[data-netbox-color-mode=light] .ps-lg-4{padding-left:1.5rem!important}html .ps-lg-5,html[data-netbox-color-mode=dark] .ps-lg-5,html[data-netbox-color-mode=light] .ps-lg-5{padding-left:3rem!important}html .text-lg-start,html[data-netbox-color-mode=dark] .text-lg-start,html[data-netbox-color-mode=light] .text-lg-start{text-align:left!important}html .text-lg-end,html[data-netbox-color-mode=dark] .text-lg-end,html[data-netbox-color-mode=light] .text-lg-end{text-align:right!important}html .text-lg-center,html[data-netbox-color-mode=dark] .text-lg-center,html[data-netbox-color-mode=light] .text-lg-center{text-align:center!important}}@media print and (min-width: 1200px){html .float-xl-start,html[data-netbox-color-mode=dark] .float-xl-start,html[data-netbox-color-mode=light] .float-xl-start{float:left!important}html .float-xl-end,html[data-netbox-color-mode=dark] .float-xl-end,html[data-netbox-color-mode=light] .float-xl-end{float:right!important}html .float-xl-none,html[data-netbox-color-mode=dark] .float-xl-none,html[data-netbox-color-mode=light] .float-xl-none{float:none!important}html .d-xl-inline,html[data-netbox-color-mode=dark] .d-xl-inline,html[data-netbox-color-mode=light] .d-xl-inline{display:inline!important}html .d-xl-inline-block,html[data-netbox-color-mode=dark] .d-xl-inline-block,html[data-netbox-color-mode=light] .d-xl-inline-block{display:inline-block!important}html .d-xl-block,html[data-netbox-color-mode=dark] .d-xl-block,html[data-netbox-color-mode=light] .d-xl-block{display:block!important}html .d-xl-grid,html[data-netbox-color-mode=dark] .d-xl-grid,html[data-netbox-color-mode=light] .d-xl-grid{display:grid!important}html .d-xl-table,html[data-netbox-color-mode=dark] .d-xl-table,html[data-netbox-color-mode=light] .d-xl-table{display:table!important}html .d-xl-table-row,html[data-netbox-color-mode=dark] .d-xl-table-row,html[data-netbox-color-mode=light] .d-xl-table-row{display:table-row!important}html .d-xl-table-cell,html[data-netbox-color-mode=dark] .d-xl-table-cell,html[data-netbox-color-mode=light] .d-xl-table-cell{display:table-cell!important}html .d-xl-flex,html[data-netbox-color-mode=dark] .d-xl-flex,html[data-netbox-color-mode=light] .d-xl-flex{display:flex!important}html .d-xl-inline-flex,html[data-netbox-color-mode=dark] .d-xl-inline-flex,html[data-netbox-color-mode=light] .d-xl-inline-flex{display:inline-flex!important}html .d-xl-none,html[data-netbox-color-mode=dark] .d-xl-none,html[data-netbox-color-mode=light] .d-xl-none{display:none!important}html .flex-xl-fill,html[data-netbox-color-mode=dark] .flex-xl-fill,html[data-netbox-color-mode=light] .flex-xl-fill{flex:1 1 auto!important}html .flex-xl-row,html[data-netbox-color-mode=dark] .flex-xl-row,html[data-netbox-color-mode=light] .flex-xl-row{flex-direction:row!important}html .flex-xl-column,html[data-netbox-color-mode=dark] .flex-xl-column,html[data-netbox-color-mode=light] .flex-xl-column{flex-direction:column!important}html .flex-xl-row-reverse,html[data-netbox-color-mode=dark] .flex-xl-row-reverse,html[data-netbox-color-mode=light] .flex-xl-row-reverse{flex-direction:row-reverse!important}html .flex-xl-column-reverse,html[data-netbox-color-mode=dark] .flex-xl-column-reverse,html[data-netbox-color-mode=light] .flex-xl-column-reverse{flex-direction:column-reverse!important}html .flex-xl-grow-0,html[data-netbox-color-mode=dark] .flex-xl-grow-0,html[data-netbox-color-mode=light] .flex-xl-grow-0{flex-grow:0!important}html .flex-xl-grow-1,html[data-netbox-color-mode=dark] .flex-xl-grow-1,html[data-netbox-color-mode=light] .flex-xl-grow-1{flex-grow:1!important}html .flex-xl-shrink-0,html[data-netbox-color-mode=dark] .flex-xl-shrink-0,html[data-netbox-color-mode=light] .flex-xl-shrink-0{flex-shrink:0!important}html .flex-xl-shrink-1,html[data-netbox-color-mode=dark] .flex-xl-shrink-1,html[data-netbox-color-mode=light] .flex-xl-shrink-1{flex-shrink:1!important}html .flex-xl-wrap,html[data-netbox-color-mode=dark] .flex-xl-wrap,html[data-netbox-color-mode=light] .flex-xl-wrap{flex-wrap:wrap!important}html .flex-xl-nowrap,html[data-netbox-color-mode=dark] .flex-xl-nowrap,html[data-netbox-color-mode=light] .flex-xl-nowrap{flex-wrap:nowrap!important}html .flex-xl-wrap-reverse,html[data-netbox-color-mode=dark] .flex-xl-wrap-reverse,html[data-netbox-color-mode=light] .flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-xl-0,html[data-netbox-color-mode=dark] .gap-xl-0,html[data-netbox-color-mode=light] .gap-xl-0{gap:0!important}html .gap-xl-1,html[data-netbox-color-mode=dark] .gap-xl-1,html[data-netbox-color-mode=light] .gap-xl-1{gap:.25rem!important}html .gap-xl-2,html[data-netbox-color-mode=dark] .gap-xl-2,html[data-netbox-color-mode=light] .gap-xl-2{gap:.5rem!important}html .gap-xl-3,html[data-netbox-color-mode=dark] .gap-xl-3,html[data-netbox-color-mode=light] .gap-xl-3{gap:1rem!important}html .gap-xl-4,html[data-netbox-color-mode=dark] .gap-xl-4,html[data-netbox-color-mode=light] .gap-xl-4{gap:1.5rem!important}html .gap-xl-5,html[data-netbox-color-mode=dark] .gap-xl-5,html[data-netbox-color-mode=light] .gap-xl-5{gap:3rem!important}html .justify-content-xl-start,html[data-netbox-color-mode=dark] .justify-content-xl-start,html[data-netbox-color-mode=light] .justify-content-xl-start{justify-content:flex-start!important}html .justify-content-xl-end,html[data-netbox-color-mode=dark] .justify-content-xl-end,html[data-netbox-color-mode=light] .justify-content-xl-end{justify-content:flex-end!important}html .justify-content-xl-center,html[data-netbox-color-mode=dark] .justify-content-xl-center,html[data-netbox-color-mode=light] .justify-content-xl-center{justify-content:center!important}html .justify-content-xl-between,html[data-netbox-color-mode=dark] .justify-content-xl-between,html[data-netbox-color-mode=light] .justify-content-xl-between{justify-content:space-between!important}html .justify-content-xl-around,html[data-netbox-color-mode=dark] .justify-content-xl-around,html[data-netbox-color-mode=light] .justify-content-xl-around{justify-content:space-around!important}html .justify-content-xl-evenly,html[data-netbox-color-mode=dark] .justify-content-xl-evenly,html[data-netbox-color-mode=light] .justify-content-xl-evenly{justify-content:space-evenly!important}html .align-items-xl-start,html[data-netbox-color-mode=dark] .align-items-xl-start,html[data-netbox-color-mode=light] .align-items-xl-start{align-items:flex-start!important}html .align-items-xl-end,html[data-netbox-color-mode=dark] .align-items-xl-end,html[data-netbox-color-mode=light] .align-items-xl-end{align-items:flex-end!important}html .align-items-xl-center,html[data-netbox-color-mode=dark] .align-items-xl-center,html[data-netbox-color-mode=light] .align-items-xl-center{align-items:center!important}html .align-items-xl-baseline,html[data-netbox-color-mode=dark] .align-items-xl-baseline,html[data-netbox-color-mode=light] .align-items-xl-baseline{align-items:baseline!important}html .align-items-xl-stretch,html[data-netbox-color-mode=dark] .align-items-xl-stretch,html[data-netbox-color-mode=light] .align-items-xl-stretch{align-items:stretch!important}html .align-content-xl-start,html[data-netbox-color-mode=dark] .align-content-xl-start,html[data-netbox-color-mode=light] .align-content-xl-start{align-content:flex-start!important}html .align-content-xl-end,html[data-netbox-color-mode=dark] .align-content-xl-end,html[data-netbox-color-mode=light] .align-content-xl-end{align-content:flex-end!important}html .align-content-xl-center,html[data-netbox-color-mode=dark] .align-content-xl-center,html[data-netbox-color-mode=light] .align-content-xl-center{align-content:center!important}html .align-content-xl-between,html[data-netbox-color-mode=dark] .align-content-xl-between,html[data-netbox-color-mode=light] .align-content-xl-between{align-content:space-between!important}html .align-content-xl-around,html[data-netbox-color-mode=dark] .align-content-xl-around,html[data-netbox-color-mode=light] .align-content-xl-around{align-content:space-around!important}html .align-content-xl-stretch,html[data-netbox-color-mode=dark] .align-content-xl-stretch,html[data-netbox-color-mode=light] .align-content-xl-stretch{align-content:stretch!important}html .align-self-xl-auto,html[data-netbox-color-mode=dark] .align-self-xl-auto,html[data-netbox-color-mode=light] .align-self-xl-auto{align-self:auto!important}html .align-self-xl-start,html[data-netbox-color-mode=dark] .align-self-xl-start,html[data-netbox-color-mode=light] .align-self-xl-start{align-self:flex-start!important}html .align-self-xl-end,html[data-netbox-color-mode=dark] .align-self-xl-end,html[data-netbox-color-mode=light] .align-self-xl-end{align-self:flex-end!important}html .align-self-xl-center,html[data-netbox-color-mode=dark] .align-self-xl-center,html[data-netbox-color-mode=light] .align-self-xl-center{align-self:center!important}html .align-self-xl-baseline,html[data-netbox-color-mode=dark] .align-self-xl-baseline,html[data-netbox-color-mode=light] .align-self-xl-baseline{align-self:baseline!important}html .align-self-xl-stretch,html[data-netbox-color-mode=dark] .align-self-xl-stretch,html[data-netbox-color-mode=light] .align-self-xl-stretch{align-self:stretch!important}html .order-xl-first,html[data-netbox-color-mode=dark] .order-xl-first,html[data-netbox-color-mode=light] .order-xl-first{order:-1!important}html .order-xl-0,html[data-netbox-color-mode=dark] .order-xl-0,html[data-netbox-color-mode=light] .order-xl-0{order:0!important}html .order-xl-1,html[data-netbox-color-mode=dark] .order-xl-1,html[data-netbox-color-mode=light] .order-xl-1{order:1!important}html .order-xl-2,html[data-netbox-color-mode=dark] .order-xl-2,html[data-netbox-color-mode=light] .order-xl-2{order:2!important}html .order-xl-3,html[data-netbox-color-mode=dark] .order-xl-3,html[data-netbox-color-mode=light] .order-xl-3{order:3!important}html .order-xl-4,html[data-netbox-color-mode=dark] .order-xl-4,html[data-netbox-color-mode=light] .order-xl-4{order:4!important}html .order-xl-5,html[data-netbox-color-mode=dark] .order-xl-5,html[data-netbox-color-mode=light] .order-xl-5{order:5!important}html .order-xl-last,html[data-netbox-color-mode=dark] .order-xl-last,html[data-netbox-color-mode=light] .order-xl-last{order:6!important}html .m-xl-0,html[data-netbox-color-mode=dark] .m-xl-0,html[data-netbox-color-mode=light] .m-xl-0{margin:0!important}html .m-xl-1,html[data-netbox-color-mode=dark] .m-xl-1,html[data-netbox-color-mode=light] .m-xl-1{margin:.25rem!important}html .m-xl-2,html[data-netbox-color-mode=dark] .m-xl-2,html[data-netbox-color-mode=light] .m-xl-2{margin:.5rem!important}html .m-xl-3,html[data-netbox-color-mode=dark] .m-xl-3,html[data-netbox-color-mode=light] .m-xl-3{margin:1rem!important}html .m-xl-4,html[data-netbox-color-mode=dark] .m-xl-4,html[data-netbox-color-mode=light] .m-xl-4{margin:1.5rem!important}html .m-xl-5,html[data-netbox-color-mode=dark] .m-xl-5,html[data-netbox-color-mode=light] .m-xl-5{margin:3rem!important}html .m-xl-auto,html[data-netbox-color-mode=dark] .m-xl-auto,html[data-netbox-color-mode=light] .m-xl-auto{margin:auto!important}html .mx-xl-0,html[data-netbox-color-mode=dark] .mx-xl-0,html[data-netbox-color-mode=light] .mx-xl-0{margin-right:0!important;margin-left:0!important}html .mx-xl-1,html[data-netbox-color-mode=dark] .mx-xl-1,html[data-netbox-color-mode=light] .mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-xl-2,html[data-netbox-color-mode=dark] .mx-xl-2,html[data-netbox-color-mode=light] .mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-xl-3,html[data-netbox-color-mode=dark] .mx-xl-3,html[data-netbox-color-mode=light] .mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-xl-4,html[data-netbox-color-mode=dark] .mx-xl-4,html[data-netbox-color-mode=light] .mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-xl-5,html[data-netbox-color-mode=dark] .mx-xl-5,html[data-netbox-color-mode=light] .mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-xl-auto,html[data-netbox-color-mode=dark] .mx-xl-auto,html[data-netbox-color-mode=light] .mx-xl-auto{margin-right:auto!important;margin-left:auto!important}html .my-xl-0,html[data-netbox-color-mode=dark] .my-xl-0,html[data-netbox-color-mode=light] .my-xl-0{margin-top:0!important;margin-bottom:0!important}html .my-xl-1,html[data-netbox-color-mode=dark] .my-xl-1,html[data-netbox-color-mode=light] .my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-xl-2,html[data-netbox-color-mode=dark] .my-xl-2,html[data-netbox-color-mode=light] .my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-xl-3,html[data-netbox-color-mode=dark] .my-xl-3,html[data-netbox-color-mode=light] .my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-xl-4,html[data-netbox-color-mode=dark] .my-xl-4,html[data-netbox-color-mode=light] .my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-xl-5,html[data-netbox-color-mode=dark] .my-xl-5,html[data-netbox-color-mode=light] .my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-xl-auto,html[data-netbox-color-mode=dark] .my-xl-auto,html[data-netbox-color-mode=light] .my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-xl-0,html[data-netbox-color-mode=dark] .mt-xl-0,html[data-netbox-color-mode=light] .mt-xl-0{margin-top:0!important}html .mt-xl-1,html[data-netbox-color-mode=dark] .mt-xl-1,html[data-netbox-color-mode=light] .mt-xl-1{margin-top:.25rem!important}html .mt-xl-2,html[data-netbox-color-mode=dark] .mt-xl-2,html[data-netbox-color-mode=light] .mt-xl-2{margin-top:.5rem!important}html .mt-xl-3,html[data-netbox-color-mode=dark] .mt-xl-3,html[data-netbox-color-mode=light] .mt-xl-3{margin-top:1rem!important}html .mt-xl-4,html[data-netbox-color-mode=dark] .mt-xl-4,html[data-netbox-color-mode=light] .mt-xl-4{margin-top:1.5rem!important}html .mt-xl-5,html[data-netbox-color-mode=dark] .mt-xl-5,html[data-netbox-color-mode=light] .mt-xl-5{margin-top:3rem!important}html .mt-xl-auto,html[data-netbox-color-mode=dark] .mt-xl-auto,html[data-netbox-color-mode=light] .mt-xl-auto{margin-top:auto!important}html .me-xl-0,html[data-netbox-color-mode=dark] .me-xl-0,html[data-netbox-color-mode=light] .me-xl-0{margin-right:0!important}html .me-xl-1,html[data-netbox-color-mode=dark] .me-xl-1,html[data-netbox-color-mode=light] .me-xl-1{margin-right:.25rem!important}html .me-xl-2,html[data-netbox-color-mode=dark] .me-xl-2,html[data-netbox-color-mode=light] .me-xl-2{margin-right:.5rem!important}html .me-xl-3,html[data-netbox-color-mode=dark] .me-xl-3,html[data-netbox-color-mode=light] .me-xl-3{margin-right:1rem!important}html .me-xl-4,html[data-netbox-color-mode=dark] .me-xl-4,html[data-netbox-color-mode=light] .me-xl-4{margin-right:1.5rem!important}html .me-xl-5,html[data-netbox-color-mode=dark] .me-xl-5,html[data-netbox-color-mode=light] .me-xl-5{margin-right:3rem!important}html .me-xl-auto,html[data-netbox-color-mode=dark] .me-xl-auto,html[data-netbox-color-mode=light] .me-xl-auto{margin-right:auto!important}html .mb-xl-0,html[data-netbox-color-mode=dark] .mb-xl-0,html[data-netbox-color-mode=light] .mb-xl-0{margin-bottom:0!important}html .mb-xl-1,html[data-netbox-color-mode=dark] .mb-xl-1,html[data-netbox-color-mode=light] .mb-xl-1{margin-bottom:.25rem!important}html .mb-xl-2,html[data-netbox-color-mode=dark] .mb-xl-2,html[data-netbox-color-mode=light] .mb-xl-2{margin-bottom:.5rem!important}html .mb-xl-3,html[data-netbox-color-mode=dark] .mb-xl-3,html[data-netbox-color-mode=light] .mb-xl-3{margin-bottom:1rem!important}html .mb-xl-4,html[data-netbox-color-mode=dark] .mb-xl-4,html[data-netbox-color-mode=light] .mb-xl-4{margin-bottom:1.5rem!important}html .mb-xl-5,html[data-netbox-color-mode=dark] .mb-xl-5,html[data-netbox-color-mode=light] .mb-xl-5{margin-bottom:3rem!important}html .mb-xl-auto,html[data-netbox-color-mode=dark] .mb-xl-auto,html[data-netbox-color-mode=light] .mb-xl-auto{margin-bottom:auto!important}html .ms-xl-0,html[data-netbox-color-mode=dark] .ms-xl-0,html[data-netbox-color-mode=light] .ms-xl-0{margin-left:0!important}html .ms-xl-1,html[data-netbox-color-mode=dark] .ms-xl-1,html[data-netbox-color-mode=light] .ms-xl-1{margin-left:.25rem!important}html .ms-xl-2,html[data-netbox-color-mode=dark] .ms-xl-2,html[data-netbox-color-mode=light] .ms-xl-2{margin-left:.5rem!important}html .ms-xl-3,html[data-netbox-color-mode=dark] .ms-xl-3,html[data-netbox-color-mode=light] .ms-xl-3{margin-left:1rem!important}html .ms-xl-4,html[data-netbox-color-mode=dark] .ms-xl-4,html[data-netbox-color-mode=light] .ms-xl-4{margin-left:1.5rem!important}html .ms-xl-5,html[data-netbox-color-mode=dark] .ms-xl-5,html[data-netbox-color-mode=light] .ms-xl-5{margin-left:3rem!important}html .ms-xl-auto,html[data-netbox-color-mode=dark] .ms-xl-auto,html[data-netbox-color-mode=light] .ms-xl-auto{margin-left:auto!important}html .p-xl-0,html[data-netbox-color-mode=dark] .p-xl-0,html[data-netbox-color-mode=light] .p-xl-0{padding:0!important}html .p-xl-1,html[data-netbox-color-mode=dark] .p-xl-1,html[data-netbox-color-mode=light] .p-xl-1{padding:.25rem!important}html .p-xl-2,html[data-netbox-color-mode=dark] .p-xl-2,html[data-netbox-color-mode=light] .p-xl-2{padding:.5rem!important}html .p-xl-3,html[data-netbox-color-mode=dark] .p-xl-3,html[data-netbox-color-mode=light] .p-xl-3{padding:1rem!important}html .p-xl-4,html[data-netbox-color-mode=dark] .p-xl-4,html[data-netbox-color-mode=light] .p-xl-4{padding:1.5rem!important}html .p-xl-5,html[data-netbox-color-mode=dark] .p-xl-5,html[data-netbox-color-mode=light] .p-xl-5{padding:3rem!important}html .px-xl-0,html[data-netbox-color-mode=dark] .px-xl-0,html[data-netbox-color-mode=light] .px-xl-0{padding-right:0!important;padding-left:0!important}html .px-xl-1,html[data-netbox-color-mode=dark] .px-xl-1,html[data-netbox-color-mode=light] .px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-xl-2,html[data-netbox-color-mode=dark] .px-xl-2,html[data-netbox-color-mode=light] .px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-xl-3,html[data-netbox-color-mode=dark] .px-xl-3,html[data-netbox-color-mode=light] .px-xl-3{padding-right:1rem!important;padding-left:1rem!important}html .px-xl-4,html[data-netbox-color-mode=dark] .px-xl-4,html[data-netbox-color-mode=light] .px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-xl-5,html[data-netbox-color-mode=dark] .px-xl-5,html[data-netbox-color-mode=light] .px-xl-5{padding-right:3rem!important;padding-left:3rem!important}html .py-xl-0,html[data-netbox-color-mode=dark] .py-xl-0,html[data-netbox-color-mode=light] .py-xl-0{padding-top:0!important;padding-bottom:0!important}html .py-xl-1,html[data-netbox-color-mode=dark] .py-xl-1,html[data-netbox-color-mode=light] .py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-xl-2,html[data-netbox-color-mode=dark] .py-xl-2,html[data-netbox-color-mode=light] .py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-xl-3,html[data-netbox-color-mode=dark] .py-xl-3,html[data-netbox-color-mode=light] .py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-xl-4,html[data-netbox-color-mode=dark] .py-xl-4,html[data-netbox-color-mode=light] .py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-xl-5,html[data-netbox-color-mode=dark] .py-xl-5,html[data-netbox-color-mode=light] .py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-xl-0,html[data-netbox-color-mode=dark] .pt-xl-0,html[data-netbox-color-mode=light] .pt-xl-0{padding-top:0!important}html .pt-xl-1,html[data-netbox-color-mode=dark] .pt-xl-1,html[data-netbox-color-mode=light] .pt-xl-1{padding-top:.25rem!important}html .pt-xl-2,html[data-netbox-color-mode=dark] .pt-xl-2,html[data-netbox-color-mode=light] .pt-xl-2{padding-top:.5rem!important}html .pt-xl-3,html[data-netbox-color-mode=dark] .pt-xl-3,html[data-netbox-color-mode=light] .pt-xl-3{padding-top:1rem!important}html .pt-xl-4,html[data-netbox-color-mode=dark] .pt-xl-4,html[data-netbox-color-mode=light] .pt-xl-4{padding-top:1.5rem!important}html .pt-xl-5,html[data-netbox-color-mode=dark] .pt-xl-5,html[data-netbox-color-mode=light] .pt-xl-5{padding-top:3rem!important}html .pe-xl-0,html[data-netbox-color-mode=dark] .pe-xl-0,html[data-netbox-color-mode=light] .pe-xl-0{padding-right:0!important}html .pe-xl-1,html[data-netbox-color-mode=dark] .pe-xl-1,html[data-netbox-color-mode=light] .pe-xl-1{padding-right:.25rem!important}html .pe-xl-2,html[data-netbox-color-mode=dark] .pe-xl-2,html[data-netbox-color-mode=light] .pe-xl-2{padding-right:.5rem!important}html .pe-xl-3,html[data-netbox-color-mode=dark] .pe-xl-3,html[data-netbox-color-mode=light] .pe-xl-3{padding-right:1rem!important}html .pe-xl-4,html[data-netbox-color-mode=dark] .pe-xl-4,html[data-netbox-color-mode=light] .pe-xl-4{padding-right:1.5rem!important}html .pe-xl-5,html[data-netbox-color-mode=dark] .pe-xl-5,html[data-netbox-color-mode=light] .pe-xl-5{padding-right:3rem!important}html .pb-xl-0,html[data-netbox-color-mode=dark] .pb-xl-0,html[data-netbox-color-mode=light] .pb-xl-0{padding-bottom:0!important}html .pb-xl-1,html[data-netbox-color-mode=dark] .pb-xl-1,html[data-netbox-color-mode=light] .pb-xl-1{padding-bottom:.25rem!important}html .pb-xl-2,html[data-netbox-color-mode=dark] .pb-xl-2,html[data-netbox-color-mode=light] .pb-xl-2{padding-bottom:.5rem!important}html .pb-xl-3,html[data-netbox-color-mode=dark] .pb-xl-3,html[data-netbox-color-mode=light] .pb-xl-3{padding-bottom:1rem!important}html .pb-xl-4,html[data-netbox-color-mode=dark] .pb-xl-4,html[data-netbox-color-mode=light] .pb-xl-4{padding-bottom:1.5rem!important}html .pb-xl-5,html[data-netbox-color-mode=dark] .pb-xl-5,html[data-netbox-color-mode=light] .pb-xl-5{padding-bottom:3rem!important}html .ps-xl-0,html[data-netbox-color-mode=dark] .ps-xl-0,html[data-netbox-color-mode=light] .ps-xl-0{padding-left:0!important}html .ps-xl-1,html[data-netbox-color-mode=dark] .ps-xl-1,html[data-netbox-color-mode=light] .ps-xl-1{padding-left:.25rem!important}html .ps-xl-2,html[data-netbox-color-mode=dark] .ps-xl-2,html[data-netbox-color-mode=light] .ps-xl-2{padding-left:.5rem!important}html .ps-xl-3,html[data-netbox-color-mode=dark] .ps-xl-3,html[data-netbox-color-mode=light] .ps-xl-3{padding-left:1rem!important}html .ps-xl-4,html[data-netbox-color-mode=dark] .ps-xl-4,html[data-netbox-color-mode=light] .ps-xl-4{padding-left:1.5rem!important}html .ps-xl-5,html[data-netbox-color-mode=dark] .ps-xl-5,html[data-netbox-color-mode=light] .ps-xl-5{padding-left:3rem!important}html .text-xl-start,html[data-netbox-color-mode=dark] .text-xl-start,html[data-netbox-color-mode=light] .text-xl-start{text-align:left!important}html .text-xl-end,html[data-netbox-color-mode=dark] .text-xl-end,html[data-netbox-color-mode=light] .text-xl-end{text-align:right!important}html .text-xl-center,html[data-netbox-color-mode=dark] .text-xl-center,html[data-netbox-color-mode=light] .text-xl-center{text-align:center!important}}@media print and (min-width: 1400px){html .float-xxl-start,html[data-netbox-color-mode=dark] .float-xxl-start,html[data-netbox-color-mode=light] .float-xxl-start{float:left!important}html .float-xxl-end,html[data-netbox-color-mode=dark] .float-xxl-end,html[data-netbox-color-mode=light] .float-xxl-end{float:right!important}html .float-xxl-none,html[data-netbox-color-mode=dark] .float-xxl-none,html[data-netbox-color-mode=light] .float-xxl-none{float:none!important}html .d-xxl-inline,html[data-netbox-color-mode=dark] .d-xxl-inline,html[data-netbox-color-mode=light] .d-xxl-inline{display:inline!important}html .d-xxl-inline-block,html[data-netbox-color-mode=dark] .d-xxl-inline-block,html[data-netbox-color-mode=light] .d-xxl-inline-block{display:inline-block!important}html .d-xxl-block,html[data-netbox-color-mode=dark] .d-xxl-block,html[data-netbox-color-mode=light] .d-xxl-block{display:block!important}html .d-xxl-grid,html[data-netbox-color-mode=dark] .d-xxl-grid,html[data-netbox-color-mode=light] .d-xxl-grid{display:grid!important}html .d-xxl-table,html[data-netbox-color-mode=dark] .d-xxl-table,html[data-netbox-color-mode=light] .d-xxl-table{display:table!important}html .d-xxl-table-row,html[data-netbox-color-mode=dark] .d-xxl-table-row,html[data-netbox-color-mode=light] .d-xxl-table-row{display:table-row!important}html .d-xxl-table-cell,html[data-netbox-color-mode=dark] .d-xxl-table-cell,html[data-netbox-color-mode=light] .d-xxl-table-cell{display:table-cell!important}html .d-xxl-flex,html[data-netbox-color-mode=dark] .d-xxl-flex,html[data-netbox-color-mode=light] .d-xxl-flex{display:flex!important}html .d-xxl-inline-flex,html[data-netbox-color-mode=dark] .d-xxl-inline-flex,html[data-netbox-color-mode=light] .d-xxl-inline-flex{display:inline-flex!important}html .d-xxl-none,html[data-netbox-color-mode=dark] .d-xxl-none,html[data-netbox-color-mode=light] .d-xxl-none{display:none!important}html .flex-xxl-fill,html[data-netbox-color-mode=dark] .flex-xxl-fill,html[data-netbox-color-mode=light] .flex-xxl-fill{flex:1 1 auto!important}html .flex-xxl-row,html[data-netbox-color-mode=dark] .flex-xxl-row,html[data-netbox-color-mode=light] .flex-xxl-row{flex-direction:row!important}html .flex-xxl-column,html[data-netbox-color-mode=dark] .flex-xxl-column,html[data-netbox-color-mode=light] .flex-xxl-column{flex-direction:column!important}html .flex-xxl-row-reverse,html[data-netbox-color-mode=dark] .flex-xxl-row-reverse,html[data-netbox-color-mode=light] .flex-xxl-row-reverse{flex-direction:row-reverse!important}html .flex-xxl-column-reverse,html[data-netbox-color-mode=dark] .flex-xxl-column-reverse,html[data-netbox-color-mode=light] .flex-xxl-column-reverse{flex-direction:column-reverse!important}html .flex-xxl-grow-0,html[data-netbox-color-mode=dark] .flex-xxl-grow-0,html[data-netbox-color-mode=light] .flex-xxl-grow-0{flex-grow:0!important}html .flex-xxl-grow-1,html[data-netbox-color-mode=dark] .flex-xxl-grow-1,html[data-netbox-color-mode=light] .flex-xxl-grow-1{flex-grow:1!important}html .flex-xxl-shrink-0,html[data-netbox-color-mode=dark] .flex-xxl-shrink-0,html[data-netbox-color-mode=light] .flex-xxl-shrink-0{flex-shrink:0!important}html .flex-xxl-shrink-1,html[data-netbox-color-mode=dark] .flex-xxl-shrink-1,html[data-netbox-color-mode=light] .flex-xxl-shrink-1{flex-shrink:1!important}html .flex-xxl-wrap,html[data-netbox-color-mode=dark] .flex-xxl-wrap,html[data-netbox-color-mode=light] .flex-xxl-wrap{flex-wrap:wrap!important}html .flex-xxl-nowrap,html[data-netbox-color-mode=dark] .flex-xxl-nowrap,html[data-netbox-color-mode=light] .flex-xxl-nowrap{flex-wrap:nowrap!important}html .flex-xxl-wrap-reverse,html[data-netbox-color-mode=dark] .flex-xxl-wrap-reverse,html[data-netbox-color-mode=light] .flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}html .gap-xxl-0,html[data-netbox-color-mode=dark] .gap-xxl-0,html[data-netbox-color-mode=light] .gap-xxl-0{gap:0!important}html .gap-xxl-1,html[data-netbox-color-mode=dark] .gap-xxl-1,html[data-netbox-color-mode=light] .gap-xxl-1{gap:.25rem!important}html .gap-xxl-2,html[data-netbox-color-mode=dark] .gap-xxl-2,html[data-netbox-color-mode=light] .gap-xxl-2{gap:.5rem!important}html .gap-xxl-3,html[data-netbox-color-mode=dark] .gap-xxl-3,html[data-netbox-color-mode=light] .gap-xxl-3{gap:1rem!important}html .gap-xxl-4,html[data-netbox-color-mode=dark] .gap-xxl-4,html[data-netbox-color-mode=light] .gap-xxl-4{gap:1.5rem!important}html .gap-xxl-5,html[data-netbox-color-mode=dark] .gap-xxl-5,html[data-netbox-color-mode=light] .gap-xxl-5{gap:3rem!important}html .justify-content-xxl-start,html[data-netbox-color-mode=dark] .justify-content-xxl-start,html[data-netbox-color-mode=light] .justify-content-xxl-start{justify-content:flex-start!important}html .justify-content-xxl-end,html[data-netbox-color-mode=dark] .justify-content-xxl-end,html[data-netbox-color-mode=light] .justify-content-xxl-end{justify-content:flex-end!important}html .justify-content-xxl-center,html[data-netbox-color-mode=dark] .justify-content-xxl-center,html[data-netbox-color-mode=light] .justify-content-xxl-center{justify-content:center!important}html .justify-content-xxl-between,html[data-netbox-color-mode=dark] .justify-content-xxl-between,html[data-netbox-color-mode=light] .justify-content-xxl-between{justify-content:space-between!important}html .justify-content-xxl-around,html[data-netbox-color-mode=dark] .justify-content-xxl-around,html[data-netbox-color-mode=light] .justify-content-xxl-around{justify-content:space-around!important}html .justify-content-xxl-evenly,html[data-netbox-color-mode=dark] .justify-content-xxl-evenly,html[data-netbox-color-mode=light] .justify-content-xxl-evenly{justify-content:space-evenly!important}html .align-items-xxl-start,html[data-netbox-color-mode=dark] .align-items-xxl-start,html[data-netbox-color-mode=light] .align-items-xxl-start{align-items:flex-start!important}html .align-items-xxl-end,html[data-netbox-color-mode=dark] .align-items-xxl-end,html[data-netbox-color-mode=light] .align-items-xxl-end{align-items:flex-end!important}html .align-items-xxl-center,html[data-netbox-color-mode=dark] .align-items-xxl-center,html[data-netbox-color-mode=light] .align-items-xxl-center{align-items:center!important}html .align-items-xxl-baseline,html[data-netbox-color-mode=dark] .align-items-xxl-baseline,html[data-netbox-color-mode=light] .align-items-xxl-baseline{align-items:baseline!important}html .align-items-xxl-stretch,html[data-netbox-color-mode=dark] .align-items-xxl-stretch,html[data-netbox-color-mode=light] .align-items-xxl-stretch{align-items:stretch!important}html .align-content-xxl-start,html[data-netbox-color-mode=dark] .align-content-xxl-start,html[data-netbox-color-mode=light] .align-content-xxl-start{align-content:flex-start!important}html .align-content-xxl-end,html[data-netbox-color-mode=dark] .align-content-xxl-end,html[data-netbox-color-mode=light] .align-content-xxl-end{align-content:flex-end!important}html .align-content-xxl-center,html[data-netbox-color-mode=dark] .align-content-xxl-center,html[data-netbox-color-mode=light] .align-content-xxl-center{align-content:center!important}html .align-content-xxl-between,html[data-netbox-color-mode=dark] .align-content-xxl-between,html[data-netbox-color-mode=light] .align-content-xxl-between{align-content:space-between!important}html .align-content-xxl-around,html[data-netbox-color-mode=dark] .align-content-xxl-around,html[data-netbox-color-mode=light] .align-content-xxl-around{align-content:space-around!important}html .align-content-xxl-stretch,html[data-netbox-color-mode=dark] .align-content-xxl-stretch,html[data-netbox-color-mode=light] .align-content-xxl-stretch{align-content:stretch!important}html .align-self-xxl-auto,html[data-netbox-color-mode=dark] .align-self-xxl-auto,html[data-netbox-color-mode=light] .align-self-xxl-auto{align-self:auto!important}html .align-self-xxl-start,html[data-netbox-color-mode=dark] .align-self-xxl-start,html[data-netbox-color-mode=light] .align-self-xxl-start{align-self:flex-start!important}html .align-self-xxl-end,html[data-netbox-color-mode=dark] .align-self-xxl-end,html[data-netbox-color-mode=light] .align-self-xxl-end{align-self:flex-end!important}html .align-self-xxl-center,html[data-netbox-color-mode=dark] .align-self-xxl-center,html[data-netbox-color-mode=light] .align-self-xxl-center{align-self:center!important}html .align-self-xxl-baseline,html[data-netbox-color-mode=dark] .align-self-xxl-baseline,html[data-netbox-color-mode=light] .align-self-xxl-baseline{align-self:baseline!important}html .align-self-xxl-stretch,html[data-netbox-color-mode=dark] .align-self-xxl-stretch,html[data-netbox-color-mode=light] .align-self-xxl-stretch{align-self:stretch!important}html .order-xxl-first,html[data-netbox-color-mode=dark] .order-xxl-first,html[data-netbox-color-mode=light] .order-xxl-first{order:-1!important}html .order-xxl-0,html[data-netbox-color-mode=dark] .order-xxl-0,html[data-netbox-color-mode=light] .order-xxl-0{order:0!important}html .order-xxl-1,html[data-netbox-color-mode=dark] .order-xxl-1,html[data-netbox-color-mode=light] .order-xxl-1{order:1!important}html .order-xxl-2,html[data-netbox-color-mode=dark] .order-xxl-2,html[data-netbox-color-mode=light] .order-xxl-2{order:2!important}html .order-xxl-3,html[data-netbox-color-mode=dark] .order-xxl-3,html[data-netbox-color-mode=light] .order-xxl-3{order:3!important}html .order-xxl-4,html[data-netbox-color-mode=dark] .order-xxl-4,html[data-netbox-color-mode=light] .order-xxl-4{order:4!important}html .order-xxl-5,html[data-netbox-color-mode=dark] .order-xxl-5,html[data-netbox-color-mode=light] .order-xxl-5{order:5!important}html .order-xxl-last,html[data-netbox-color-mode=dark] .order-xxl-last,html[data-netbox-color-mode=light] .order-xxl-last{order:6!important}html .m-xxl-0,html[data-netbox-color-mode=dark] .m-xxl-0,html[data-netbox-color-mode=light] .m-xxl-0{margin:0!important}html .m-xxl-1,html[data-netbox-color-mode=dark] .m-xxl-1,html[data-netbox-color-mode=light] .m-xxl-1{margin:.25rem!important}html .m-xxl-2,html[data-netbox-color-mode=dark] .m-xxl-2,html[data-netbox-color-mode=light] .m-xxl-2{margin:.5rem!important}html .m-xxl-3,html[data-netbox-color-mode=dark] .m-xxl-3,html[data-netbox-color-mode=light] .m-xxl-3{margin:1rem!important}html .m-xxl-4,html[data-netbox-color-mode=dark] .m-xxl-4,html[data-netbox-color-mode=light] .m-xxl-4{margin:1.5rem!important}html .m-xxl-5,html[data-netbox-color-mode=dark] .m-xxl-5,html[data-netbox-color-mode=light] .m-xxl-5{margin:3rem!important}html .m-xxl-auto,html[data-netbox-color-mode=dark] .m-xxl-auto,html[data-netbox-color-mode=light] .m-xxl-auto{margin:auto!important}html .mx-xxl-0,html[data-netbox-color-mode=dark] .mx-xxl-0,html[data-netbox-color-mode=light] .mx-xxl-0{margin-right:0!important;margin-left:0!important}html .mx-xxl-1,html[data-netbox-color-mode=dark] .mx-xxl-1,html[data-netbox-color-mode=light] .mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}html .mx-xxl-2,html[data-netbox-color-mode=dark] .mx-xxl-2,html[data-netbox-color-mode=light] .mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}html .mx-xxl-3,html[data-netbox-color-mode=dark] .mx-xxl-3,html[data-netbox-color-mode=light] .mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}html .mx-xxl-4,html[data-netbox-color-mode=dark] .mx-xxl-4,html[data-netbox-color-mode=light] .mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}html .mx-xxl-5,html[data-netbox-color-mode=dark] .mx-xxl-5,html[data-netbox-color-mode=light] .mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}html .mx-xxl-auto,html[data-netbox-color-mode=dark] .mx-xxl-auto,html[data-netbox-color-mode=light] .mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}html .my-xxl-0,html[data-netbox-color-mode=dark] .my-xxl-0,html[data-netbox-color-mode=light] .my-xxl-0{margin-top:0!important;margin-bottom:0!important}html .my-xxl-1,html[data-netbox-color-mode=dark] .my-xxl-1,html[data-netbox-color-mode=light] .my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}html .my-xxl-2,html[data-netbox-color-mode=dark] .my-xxl-2,html[data-netbox-color-mode=light] .my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}html .my-xxl-3,html[data-netbox-color-mode=dark] .my-xxl-3,html[data-netbox-color-mode=light] .my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}html .my-xxl-4,html[data-netbox-color-mode=dark] .my-xxl-4,html[data-netbox-color-mode=light] .my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}html .my-xxl-5,html[data-netbox-color-mode=dark] .my-xxl-5,html[data-netbox-color-mode=light] .my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}html .my-xxl-auto,html[data-netbox-color-mode=dark] .my-xxl-auto,html[data-netbox-color-mode=light] .my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}html .mt-xxl-0,html[data-netbox-color-mode=dark] .mt-xxl-0,html[data-netbox-color-mode=light] .mt-xxl-0{margin-top:0!important}html .mt-xxl-1,html[data-netbox-color-mode=dark] .mt-xxl-1,html[data-netbox-color-mode=light] .mt-xxl-1{margin-top:.25rem!important}html .mt-xxl-2,html[data-netbox-color-mode=dark] .mt-xxl-2,html[data-netbox-color-mode=light] .mt-xxl-2{margin-top:.5rem!important}html .mt-xxl-3,html[data-netbox-color-mode=dark] .mt-xxl-3,html[data-netbox-color-mode=light] .mt-xxl-3{margin-top:1rem!important}html .mt-xxl-4,html[data-netbox-color-mode=dark] .mt-xxl-4,html[data-netbox-color-mode=light] .mt-xxl-4{margin-top:1.5rem!important}html .mt-xxl-5,html[data-netbox-color-mode=dark] .mt-xxl-5,html[data-netbox-color-mode=light] .mt-xxl-5{margin-top:3rem!important}html .mt-xxl-auto,html[data-netbox-color-mode=dark] .mt-xxl-auto,html[data-netbox-color-mode=light] .mt-xxl-auto{margin-top:auto!important}html .me-xxl-0,html[data-netbox-color-mode=dark] .me-xxl-0,html[data-netbox-color-mode=light] .me-xxl-0{margin-right:0!important}html .me-xxl-1,html[data-netbox-color-mode=dark] .me-xxl-1,html[data-netbox-color-mode=light] .me-xxl-1{margin-right:.25rem!important}html .me-xxl-2,html[data-netbox-color-mode=dark] .me-xxl-2,html[data-netbox-color-mode=light] .me-xxl-2{margin-right:.5rem!important}html .me-xxl-3,html[data-netbox-color-mode=dark] .me-xxl-3,html[data-netbox-color-mode=light] .me-xxl-3{margin-right:1rem!important}html .me-xxl-4,html[data-netbox-color-mode=dark] .me-xxl-4,html[data-netbox-color-mode=light] .me-xxl-4{margin-right:1.5rem!important}html .me-xxl-5,html[data-netbox-color-mode=dark] .me-xxl-5,html[data-netbox-color-mode=light] .me-xxl-5{margin-right:3rem!important}html .me-xxl-auto,html[data-netbox-color-mode=dark] .me-xxl-auto,html[data-netbox-color-mode=light] .me-xxl-auto{margin-right:auto!important}html .mb-xxl-0,html[data-netbox-color-mode=dark] .mb-xxl-0,html[data-netbox-color-mode=light] .mb-xxl-0{margin-bottom:0!important}html .mb-xxl-1,html[data-netbox-color-mode=dark] .mb-xxl-1,html[data-netbox-color-mode=light] .mb-xxl-1{margin-bottom:.25rem!important}html .mb-xxl-2,html[data-netbox-color-mode=dark] .mb-xxl-2,html[data-netbox-color-mode=light] .mb-xxl-2{margin-bottom:.5rem!important}html .mb-xxl-3,html[data-netbox-color-mode=dark] .mb-xxl-3,html[data-netbox-color-mode=light] .mb-xxl-3{margin-bottom:1rem!important}html .mb-xxl-4,html[data-netbox-color-mode=dark] .mb-xxl-4,html[data-netbox-color-mode=light] .mb-xxl-4{margin-bottom:1.5rem!important}html .mb-xxl-5,html[data-netbox-color-mode=dark] .mb-xxl-5,html[data-netbox-color-mode=light] .mb-xxl-5{margin-bottom:3rem!important}html .mb-xxl-auto,html[data-netbox-color-mode=dark] .mb-xxl-auto,html[data-netbox-color-mode=light] .mb-xxl-auto{margin-bottom:auto!important}html .ms-xxl-0,html[data-netbox-color-mode=dark] .ms-xxl-0,html[data-netbox-color-mode=light] .ms-xxl-0{margin-left:0!important}html .ms-xxl-1,html[data-netbox-color-mode=dark] .ms-xxl-1,html[data-netbox-color-mode=light] .ms-xxl-1{margin-left:.25rem!important}html .ms-xxl-2,html[data-netbox-color-mode=dark] .ms-xxl-2,html[data-netbox-color-mode=light] .ms-xxl-2{margin-left:.5rem!important}html .ms-xxl-3,html[data-netbox-color-mode=dark] .ms-xxl-3,html[data-netbox-color-mode=light] .ms-xxl-3{margin-left:1rem!important}html .ms-xxl-4,html[data-netbox-color-mode=dark] .ms-xxl-4,html[data-netbox-color-mode=light] .ms-xxl-4{margin-left:1.5rem!important}html .ms-xxl-5,html[data-netbox-color-mode=dark] .ms-xxl-5,html[data-netbox-color-mode=light] .ms-xxl-5{margin-left:3rem!important}html .ms-xxl-auto,html[data-netbox-color-mode=dark] .ms-xxl-auto,html[data-netbox-color-mode=light] .ms-xxl-auto{margin-left:auto!important}html .p-xxl-0,html[data-netbox-color-mode=dark] .p-xxl-0,html[data-netbox-color-mode=light] .p-xxl-0{padding:0!important}html .p-xxl-1,html[data-netbox-color-mode=dark] .p-xxl-1,html[data-netbox-color-mode=light] .p-xxl-1{padding:.25rem!important}html .p-xxl-2,html[data-netbox-color-mode=dark] .p-xxl-2,html[data-netbox-color-mode=light] .p-xxl-2{padding:.5rem!important}html .p-xxl-3,html[data-netbox-color-mode=dark] .p-xxl-3,html[data-netbox-color-mode=light] .p-xxl-3{padding:1rem!important}html .p-xxl-4,html[data-netbox-color-mode=dark] .p-xxl-4,html[data-netbox-color-mode=light] .p-xxl-4{padding:1.5rem!important}html .p-xxl-5,html[data-netbox-color-mode=dark] .p-xxl-5,html[data-netbox-color-mode=light] .p-xxl-5{padding:3rem!important}html .px-xxl-0,html[data-netbox-color-mode=dark] .px-xxl-0,html[data-netbox-color-mode=light] .px-xxl-0{padding-right:0!important;padding-left:0!important}html .px-xxl-1,html[data-netbox-color-mode=dark] .px-xxl-1,html[data-netbox-color-mode=light] .px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}html .px-xxl-2,html[data-netbox-color-mode=dark] .px-xxl-2,html[data-netbox-color-mode=light] .px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}html .px-xxl-3,html[data-netbox-color-mode=dark] .px-xxl-3,html[data-netbox-color-mode=light] .px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}html .px-xxl-4,html[data-netbox-color-mode=dark] .px-xxl-4,html[data-netbox-color-mode=light] .px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}html .px-xxl-5,html[data-netbox-color-mode=dark] .px-xxl-5,html[data-netbox-color-mode=light] .px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}html .py-xxl-0,html[data-netbox-color-mode=dark] .py-xxl-0,html[data-netbox-color-mode=light] .py-xxl-0{padding-top:0!important;padding-bottom:0!important}html .py-xxl-1,html[data-netbox-color-mode=dark] .py-xxl-1,html[data-netbox-color-mode=light] .py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}html .py-xxl-2,html[data-netbox-color-mode=dark] .py-xxl-2,html[data-netbox-color-mode=light] .py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}html .py-xxl-3,html[data-netbox-color-mode=dark] .py-xxl-3,html[data-netbox-color-mode=light] .py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}html .py-xxl-4,html[data-netbox-color-mode=dark] .py-xxl-4,html[data-netbox-color-mode=light] .py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}html .py-xxl-5,html[data-netbox-color-mode=dark] .py-xxl-5,html[data-netbox-color-mode=light] .py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}html .pt-xxl-0,html[data-netbox-color-mode=dark] .pt-xxl-0,html[data-netbox-color-mode=light] .pt-xxl-0{padding-top:0!important}html .pt-xxl-1,html[data-netbox-color-mode=dark] .pt-xxl-1,html[data-netbox-color-mode=light] .pt-xxl-1{padding-top:.25rem!important}html .pt-xxl-2,html[data-netbox-color-mode=dark] .pt-xxl-2,html[data-netbox-color-mode=light] .pt-xxl-2{padding-top:.5rem!important}html .pt-xxl-3,html[data-netbox-color-mode=dark] .pt-xxl-3,html[data-netbox-color-mode=light] .pt-xxl-3{padding-top:1rem!important}html .pt-xxl-4,html[data-netbox-color-mode=dark] .pt-xxl-4,html[data-netbox-color-mode=light] .pt-xxl-4{padding-top:1.5rem!important}html .pt-xxl-5,html[data-netbox-color-mode=dark] .pt-xxl-5,html[data-netbox-color-mode=light] .pt-xxl-5{padding-top:3rem!important}html .pe-xxl-0,html[data-netbox-color-mode=dark] .pe-xxl-0,html[data-netbox-color-mode=light] .pe-xxl-0{padding-right:0!important}html .pe-xxl-1,html[data-netbox-color-mode=dark] .pe-xxl-1,html[data-netbox-color-mode=light] .pe-xxl-1{padding-right:.25rem!important}html .pe-xxl-2,html[data-netbox-color-mode=dark] .pe-xxl-2,html[data-netbox-color-mode=light] .pe-xxl-2{padding-right:.5rem!important}html .pe-xxl-3,html[data-netbox-color-mode=dark] .pe-xxl-3,html[data-netbox-color-mode=light] .pe-xxl-3{padding-right:1rem!important}html .pe-xxl-4,html[data-netbox-color-mode=dark] .pe-xxl-4,html[data-netbox-color-mode=light] .pe-xxl-4{padding-right:1.5rem!important}html .pe-xxl-5,html[data-netbox-color-mode=dark] .pe-xxl-5,html[data-netbox-color-mode=light] .pe-xxl-5{padding-right:3rem!important}html .pb-xxl-0,html[data-netbox-color-mode=dark] .pb-xxl-0,html[data-netbox-color-mode=light] .pb-xxl-0{padding-bottom:0!important}html .pb-xxl-1,html[data-netbox-color-mode=dark] .pb-xxl-1,html[data-netbox-color-mode=light] .pb-xxl-1{padding-bottom:.25rem!important}html .pb-xxl-2,html[data-netbox-color-mode=dark] .pb-xxl-2,html[data-netbox-color-mode=light] .pb-xxl-2{padding-bottom:.5rem!important}html .pb-xxl-3,html[data-netbox-color-mode=dark] .pb-xxl-3,html[data-netbox-color-mode=light] .pb-xxl-3{padding-bottom:1rem!important}html .pb-xxl-4,html[data-netbox-color-mode=dark] .pb-xxl-4,html[data-netbox-color-mode=light] .pb-xxl-4{padding-bottom:1.5rem!important}html .pb-xxl-5,html[data-netbox-color-mode=dark] .pb-xxl-5,html[data-netbox-color-mode=light] .pb-xxl-5{padding-bottom:3rem!important}html .ps-xxl-0,html[data-netbox-color-mode=dark] .ps-xxl-0,html[data-netbox-color-mode=light] .ps-xxl-0{padding-left:0!important}html .ps-xxl-1,html[data-netbox-color-mode=dark] .ps-xxl-1,html[data-netbox-color-mode=light] .ps-xxl-1{padding-left:.25rem!important}html .ps-xxl-2,html[data-netbox-color-mode=dark] .ps-xxl-2,html[data-netbox-color-mode=light] .ps-xxl-2{padding-left:.5rem!important}html .ps-xxl-3,html[data-netbox-color-mode=dark] .ps-xxl-3,html[data-netbox-color-mode=light] .ps-xxl-3{padding-left:1rem!important}html .ps-xxl-4,html[data-netbox-color-mode=dark] .ps-xxl-4,html[data-netbox-color-mode=light] .ps-xxl-4{padding-left:1.5rem!important}html .ps-xxl-5,html[data-netbox-color-mode=dark] .ps-xxl-5,html[data-netbox-color-mode=light] .ps-xxl-5{padding-left:3rem!important}html .text-xxl-start,html[data-netbox-color-mode=dark] .text-xxl-start,html[data-netbox-color-mode=light] .text-xxl-start{text-align:left!important}html .text-xxl-end,html[data-netbox-color-mode=dark] .text-xxl-end,html[data-netbox-color-mode=light] .text-xxl-end{text-align:right!important}html .text-xxl-center,html[data-netbox-color-mode=dark] .text-xxl-center,html[data-netbox-color-mode=light] .text-xxl-center{text-align:center!important}}@media print and (min-width: 1200px){html .fs-1,html[data-netbox-color-mode=dark] .fs-1,html[data-netbox-color-mode=light] .fs-1{font-size:2.5rem!important}html .fs-2,html[data-netbox-color-mode=dark] .fs-2,html[data-netbox-color-mode=light] .fs-2{font-size:2rem!important}html .fs-3,html[data-netbox-color-mode=dark] .fs-3,html[data-netbox-color-mode=light] .fs-3{font-size:1.75rem!important}html .fs-4,html[data-netbox-color-mode=dark] .fs-4,html[data-netbox-color-mode=light] .fs-4{font-size:1.5rem!important}}@media print{html .d-print-inline,html[data-netbox-color-mode=dark] .d-print-inline,html[data-netbox-color-mode=light] .d-print-inline{display:inline!important}html .d-print-inline-block,html[data-netbox-color-mode=dark] .d-print-inline-block,html[data-netbox-color-mode=light] .d-print-inline-block{display:inline-block!important}html .d-print-block,html[data-netbox-color-mode=dark] .d-print-block,html[data-netbox-color-mode=light] .d-print-block{display:block!important}html .d-print-grid,html[data-netbox-color-mode=dark] .d-print-grid,html[data-netbox-color-mode=light] .d-print-grid{display:grid!important}html .d-print-table,html[data-netbox-color-mode=dark] .d-print-table,html[data-netbox-color-mode=light] .d-print-table{display:table!important}html .d-print-table-row,html[data-netbox-color-mode=dark] .d-print-table-row,html[data-netbox-color-mode=light] .d-print-table-row{display:table-row!important}html .d-print-table-cell,html[data-netbox-color-mode=dark] .d-print-table-cell,html[data-netbox-color-mode=light] .d-print-table-cell{display:table-cell!important}html .d-print-flex,html[data-netbox-color-mode=dark] .d-print-flex,html[data-netbox-color-mode=light] .d-print-flex{display:flex!important}html .d-print-inline-flex,html[data-netbox-color-mode=dark] .d-print-inline-flex,html[data-netbox-color-mode=light] .d-print-inline-flex{display:inline-flex!important}html .d-print-none,html[data-netbox-color-mode=dark] .d-print-none,html[data-netbox-color-mode=light] .d-print-none{display:none!important}}@media print{html :root,html[data-netbox-color-mode=dark] :root,html[data-netbox-color-mode=light] :root{--nbx-select-content-bg: #fff;--nbx-select-option-selected-bg: #dee2e6;--nbx-select-option-hover-bg: #0d6efd;--nbx-select-option-hover-color: #fff;--nbx-select-placeholder-color: #adb5bd;--nbx-select-value-color: #fff}html :root[data-netbox-color-mode=dark],html[data-netbox-color-mode=dark] :root[data-netbox-color-mode=dark],html[data-netbox-color-mode=light] :root[data-netbox-color-mode=dark]{--nbx-select-content-bg: #212529;--nbx-select-option-selected-bg: #adb5bd;--nbx-select-option-hover-bg: #9ec5fe;--nbx-select-option-hover-color: #000;--nbx-select-placeholder-color: #495057;--nbx-select-value-color: #000}}@media print{html .ss-main,html[data-netbox-color-mode=dark] .ss-main,html[data-netbox-color-mode=light] .ss-main{position:relative;display:inline-block;user-select:none;color:#212529;width:100%}html .ss-main .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected,html[data-netbox-color-mode=light] .ss-main .ss-single-selected{display:flex;cursor:pointer;width:100%;height:calc(1.5em + (.75rem + 2px));padding:.75rem;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}html .ss-main .ss-single-selected.ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-single-selected.ss-disabled{background-color:#ced4da;cursor:not-allowed}html .ss-main .ss-single-selected.ss-open-above,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-open-above,html[data-netbox-color-mode=light] .ss-main .ss-single-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}html .ss-main .ss-single-selected.ss-open-below,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected.ss-open-below,html[data-netbox-color-mode=light] .ss-main .ss-single-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}html .ss-main .ss-single-selected .placeholder,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .placeholder{display:flex;flex:1 1 100%;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;width:calc(100% - 30px);line-height:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html .ss-main .ss-single-selected .placeholder *,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder *,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .placeholder *{display:flex;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}html .ss-main .ss-single-selected .placeholder .ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder .ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .placeholder .ss-disabled{color:#6c757d}html .ss-main .ss-single-selected .ss-deselect,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-deselect,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-deselect{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem;font-weight:bold}html .ss-main .ss-single-selected .ss-deselect.ss-hide,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-deselect.ss-hide,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-deselect.ss-hide{display:none}html .ss-main .ss-single-selected .ss-arrow,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-arrow{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;margin:0 .75rem}html .ss-main .ss-single-selected .ss-arrow span,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-arrow span{border:solid #212529;border-width:0 2px 2px 0;display:inline-block;padding:3px;transition:transform .2s,margin .2s}html .ss-main .ss-single-selected .ss-arrow span.arrow-up,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span.arrow-up,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-arrow span.arrow-up{transform:rotate(-135deg);margin:3px 0 0}html .ss-main .ss-single-selected .ss-arrow span.arrow-down,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .ss-arrow span.arrow-down,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .ss-arrow span.arrow-down{transform:rotate(45deg);margin:-3px 0 0}html .ss-main .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected{display:flex;flex-direction:row;cursor:pointer;min-height:calc(1.5em + (.75rem + 2px));width:100%;padding:0 0 0 3px;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;box-sizing:border-box;transition:background-color .2s}html .ss-main .ss-multi-selected.ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-disabled{background-color:#ced4da;cursor:not-allowed}html .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-disabled{color:#212529}html .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-disabled .ss-values .ss-value .ss-value-delete{cursor:not-allowed}html .ss-main .ss-multi-selected.ss-open-above,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-open-above,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-open-above{border-top-left-radius:0;border-top-right-radius:0}html .ss-main .ss-multi-selected.ss-open-below,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected.ss-open-below,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected.ss-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}html .ss-main .ss-multi-selected .ss-values,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values{display:flex;flex-wrap:wrap;justify-content:flex-start;flex:1 1 100%;width:calc(100% - 30px)}html .ss-main .ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-disabled{display:flex;padding:4px 5px;margin:2px 0;line-height:1em;align-items:center;width:100%;color:#6c757d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes scaleOut{0%{transform:scale(1);opacity:1}to{transform:scale(0);opacity:0}}html .ss-main .ss-multi-selected .ss-values .ss-value,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value{display:flex;user-select:none;align-items:center;font-size:12px;padding:3px 5px;margin:3px 5px 3px 0;color:#fff;background-color:#337ab7;border-radius:.375rem;animation-name:scaleIn;animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:both}html .ss-main .ss-multi-selected .ss-values .ss-value.ss-out,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value.ss-out,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value.ss-out{animation-name:scaleOut;animation-duration:.2s;animation-timing-function:ease-out}html .ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value .ss-value-delete{margin:0 0 0 5px;cursor:pointer}html .ss-main .ss-multi-selected .ss-add,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add{display:flex;flex:0 1 3px;margin:9px 12px 0 5px}html .ss-main .ss-multi-selected .ss-add .ss-plus,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add .ss-plus{display:flex;justify-content:center;align-items:center;background:#212529;position:relative;height:10px;width:2px;transition:transform .2s}html .ss-main .ss-multi-selected .ss-add .ss-plus:after,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus:after,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add .ss-plus:after{background:#212529;content:"";position:absolute;height:2px;width:10px;left:-4px;top:4px}html .ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add .ss-plus.ss-cross{transform:rotate(45deg)}}@media print{html .ss-content,html[data-netbox-color-mode=dark] .ss-content,html[data-netbox-color-mode=light] .ss-content{position:absolute;width:100%;margin:-1px 0 0;box-sizing:border-box;border:solid 1px #ced4da;z-index:1010;background-color:#fff;transform-origin:center top;transition:transform .2s,opacity .2s;opacity:0;transform:scaleY(0)}html .ss-content.ss-open,html[data-netbox-color-mode=dark] .ss-content.ss-open,html[data-netbox-color-mode=light] .ss-content.ss-open{display:block;opacity:1;transform:scaleY(1)}html .ss-content .ss-search,html[data-netbox-color-mode=dark] .ss-content .ss-search,html[data-netbox-color-mode=light] .ss-content .ss-search{display:flex;flex-direction:row;padding:.75rem}html .ss-content .ss-search.ss-hide,html[data-netbox-color-mode=dark] .ss-content .ss-search.ss-hide,html[data-netbox-color-mode=light] .ss-content .ss-search.ss-hide{height:0px;opacity:0;padding:0;margin:0}html .ss-content .ss-search.ss-hide input,html[data-netbox-color-mode=dark] .ss-content .ss-search.ss-hide input,html[data-netbox-color-mode=light] .ss-content .ss-search.ss-hide input{height:0px;opacity:0;padding:0;margin:0}html .ss-content .ss-search input,html[data-netbox-color-mode=dark] .ss-content .ss-search input,html[data-netbox-color-mode=light] .ss-content .ss-search input{display:inline-flex;font-size:inherit;line-height:inherit;flex:1 1 auto;width:100%;min-width:0px;height:30px;padding:.75rem;margin:0;border:1px solid #ced4da;border-radius:.375rem;background-color:#fff;outline:0;text-align:left;box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-appearance:textfield}html .ss-content .ss-search input::placeholder,html[data-netbox-color-mode=dark] .ss-content .ss-search input::placeholder,html[data-netbox-color-mode=light] .ss-content .ss-search input::placeholder{color:#adb5bd;vertical-align:middle}html .ss-content .ss-search input:focus,html[data-netbox-color-mode=dark] .ss-content .ss-search input:focus,html[data-netbox-color-mode=light] .ss-content .ss-search input:focus{box-shadow:0 0 5px #337ab7}html .ss-content .ss-search .ss-addable,html[data-netbox-color-mode=dark] .ss-content .ss-search .ss-addable,html[data-netbox-color-mode=light] .ss-content .ss-search .ss-addable{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;font-size:22px;font-weight:bold;flex:0 0 30px;height:30px;margin:0 0 0 8px;border:1px solid #ced4da;border-radius:.375rem;box-sizing:border-box}html .ss-content .ss-addable,html[data-netbox-color-mode=dark] .ss-content .ss-addable,html[data-netbox-color-mode=light] .ss-content .ss-addable{padding-top:0}html .ss-content .ss-list,html[data-netbox-color-mode=dark] .ss-content .ss-list,html[data-netbox-color-mode=light] .ss-content .ss-list{max-height:200px;overflow-x:hidden;overflow-y:auto;text-align:left}html .ss-content .ss-list .ss-optgroup .ss-optgroup-label,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup .ss-optgroup-label,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-optgroup .ss-optgroup-label{padding:6px 10px;font-weight:bold}html .ss-content .ss-list .ss-optgroup .ss-option,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup .ss-option,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-optgroup .ss-option{padding:6px 6px 6px 25px}html .ss-content .ss-list .ss-optgroup-label-selectable,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup-label-selectable,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-optgroup-label-selectable{cursor:pointer}html .ss-content .ss-list .ss-optgroup-label-selectable:hover,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-optgroup-label-selectable:hover,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-optgroup-label-selectable:hover{color:#fff;background-color:#337ab7}html .ss-content .ss-list .ss-option,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option{padding:6px 10px;cursor:pointer;user-select:none}html .ss-content .ss-list .ss-option *,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option *,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option *{display:inline-block}html .ss-content .ss-list .ss-option:hover,html .ss-content .ss-list .ss-option.ss-highlighted,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-highlighted,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option.ss-highlighted{color:#fff;background-color:#337ab7}html .ss-content .ss-list .ss-option.ss-disabled,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-disabled,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option.ss-disabled{cursor:not-allowed;color:#6c757d;background-color:#fff}html .ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option:not(.ss-disabled).ss-option-selected{color:#212529;background-color:#337ab71a}html .ss-content .ss-list .ss-option.ss-hide,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option.ss-hide,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option.ss-hide{display:none}html .ss-content .ss-list .ss-option .ss-search-highlight,html[data-netbox-color-mode=dark] .ss-content .ss-list .ss-option .ss-search-highlight,html[data-netbox-color-mode=light] .ss-content .ss-list .ss-option .ss-search-highlight{background-color:#ffc107}}@media print{html .ss-main,html[data-netbox-color-mode=dark] .ss-main,html[data-netbox-color-mode=light] .ss-main{color:#212529}html .ss-main.is-invalid .ss-single-selected,html .ss-main.is-invalid .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main.is-invalid .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main.is-invalid .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main.is-invalid .ss-single-selected,html[data-netbox-color-mode=light] .ss-main.is-invalid .ss-multi-selected{border-color:#dc3545}html .ss-main.is-valid .ss-single-selected,html .ss-main.is-valid .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main.is-valid .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main.is-valid .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main.is-valid .ss-single-selected,html[data-netbox-color-mode=light] .ss-main.is-valid .ss-multi-selected{border-color:#198754}html .ss-main .ss-single-selected,html .ss-main .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main .ss-single-selected,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected{padding:.375rem .75rem;background-color:#fff;border:1px solid #e9ecef}html .ss-main .ss-single-selected[disabled],html .ss-main .ss-multi-selected[disabled],html[data-netbox-color-mode=dark] .ss-main .ss-single-selected[disabled],html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected[disabled],html[data-netbox-color-mode=light] .ss-main .ss-single-selected[disabled],html[data-netbox-color-mode=light] .ss-main .ss-multi-selected[disabled]{color:#6c757d;background-color:#e9ecef}html .ss-main div.ss-multi-selected .ss-values .ss-disabled,html .ss-main div.ss-single-selected span.placeholder .ss-disabled,html[data-netbox-color-mode=dark] .ss-main div.ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main div.ss-single-selected span.placeholder .ss-disabled,html[data-netbox-color-mode=light] .ss-main div.ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=light] .ss-main div.ss-single-selected span.placeholder .ss-disabled{color:var(--nbx-select-placeholder-color)}html .ss-main .ss-single-selected span.ss-arrow span.arrow-down,html .ss-main .ss-single-selected span.ss-arrow span.arrow-up,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.ss-arrow span.arrow-down,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.ss-arrow span.arrow-up,html[data-netbox-color-mode=light] .ss-main .ss-single-selected span.ss-arrow span.arrow-down,html[data-netbox-color-mode=light] .ss-main .ss-single-selected span.ss-arrow span.arrow-up{border-color:currentColor;color:#6c757d}html .ss-main .ss-single-selected .placeholder .depth,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected .placeholder .depth,html[data-netbox-color-mode=light] .ss-main .ss-single-selected .placeholder .depth{display:none}html .ss-main .ss-single-selected span.placeholder>*,html .ss-main .ss-single-selected span.placeholder,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.placeholder>*,html[data-netbox-color-mode=dark] .ss-main .ss-single-selected span.placeholder,html[data-netbox-color-mode=light] .ss-main .ss-single-selected span.placeholder>*,html[data-netbox-color-mode=light] .ss-main .ss-single-selected span.placeholder{line-height:1.5}html .ss-main .ss-multi-selected,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected{align-items:center;padding-right:.75rem;padding-left:.75rem}html .ss-main .ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-disabled{padding:4px 0}html .ss-main .ss-multi-selected .ss-values .ss-value,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value{color:var(--nbx-select-value-color);border-radius:.375rem}html .ss-main .ss-multi-selected .ss-values .ss-value .depth,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-values .ss-value .depth,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-values .ss-value .depth{display:none}html .ss-main .ss-multi-selected .ss-add,html[data-netbox-color-mode=dark] .ss-main .ss-multi-selected .ss-add,html[data-netbox-color-mode=light] .ss-main .ss-multi-selected .ss-add{margin:0 .75rem}html .ss-main .ss-content,html[data-netbox-color-mode=dark] .ss-main .ss-content,html[data-netbox-color-mode=light] .ss-main .ss-content{background-color:var(--nbx-select-content-bg);border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html .ss-main .ss-content .ss-list .ss-option.ss-option-selected,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-option-selected,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option.ss-option-selected{color:#212529;background-color:var(--nbx-select-option-selected-bg)}html .ss-main .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option:hover,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option:hover{color:var(--nbx-select-option-hover-color);background-color:var(--nbx-select-option-hover-bg)}html .ss-main .ss-content .ss-list .ss-option:last-child,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option:last-child,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option:last-child{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}html .ss-main .ss-content .ss-list .ss-option.ss-disabled,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-disabled,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option.ss-disabled{background-color:unset}html .ss-main .ss-content .ss-list .ss-option.ss-disabled:hover,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option.ss-disabled:hover,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option.ss-disabled:hover{color:#6c757d}html .ss-main .ss-content .ss-list .ss-option .depth,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list .ss-option .depth,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list .ss-option .depth{opacity:.3}html .ss-main .ss-content .ss-list::-webkit-scrollbar,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list::-webkit-scrollbar{right:0;width:4px}html .ss-main .ss-content .ss-list::-webkit-scrollbar:hover,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar:hover,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list::-webkit-scrollbar:hover{opacity:.8}html .ss-main .ss-content .ss-list::-webkit-scrollbar-track,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar-track,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list::-webkit-scrollbar-track{background:transparent}html .ss-main .ss-content .ss-list::-webkit-scrollbar-thumb,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-list::-webkit-scrollbar-thumb,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-list::-webkit-scrollbar-thumb{right:0;width:2px;background-color:var(--nbx-sidebar-scroll)}html .ss-main .ss-content .ss-search,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-search{padding-right:.5rem}html .ss-main .ss-content .ss-search button,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search button,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-search button{margin-left:.75rem}html .ss-main .ss-content .ss-search input[type=search],html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search input[type=search],html[data-netbox-color-mode=light] .ss-main .ss-content .ss-search input[type=search]{color:#212529;background-color:#fff;border:1px solid #e9ecef}html .ss-main .ss-content .ss-search input[type=search]:focus,html[data-netbox-color-mode=dark] .ss-main .ss-content .ss-search input[type=search]:focus,html[data-netbox-color-mode=light] .ss-main .ss-content .ss-search input[type=search]:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}}@media print{html .sidenav,html[data-netbox-color-mode=dark] .sidenav,html[data-netbox-color-mode=light] .sidenav{position:fixed;top:0;bottom:0;left:0;z-index:1050;display:block;width:100%;max-width:3rem;padding-top:0;padding-right:0;padding-left:0;background-color:var(--nbx-sidebar-bg);border-right:1px solid #ced4da;transition:all .1s ease-in-out}}@media print and (max-width: 991.98px){html .sidenav,html[data-netbox-color-mode=dark] .sidenav,html[data-netbox-color-mode=light] .sidenav{transform:translate(-3rem)}html .sidenav+.content-container[class],html[data-netbox-color-mode=dark] .sidenav+.content-container[class],html[data-netbox-color-mode=light] .sidenav+.content-container[class]{margin-left:0}html .sidenav .profile-button-container[class],html[data-netbox-color-mode=dark] .sidenav .profile-button-container[class],html[data-netbox-color-mode=light] .sidenav .profile-button-container[class]{display:block}}@media print{html .sidenav .profile-button-container,html[data-netbox-color-mode=dark] .sidenav .profile-button-container,html[data-netbox-color-mode=light] .sidenav .profile-button-container{display:none;padding:.5rem 1rem}}@media print{html .sidenav+.content-container,html[data-netbox-color-mode=dark] .sidenav+.content-container,html[data-netbox-color-mode=light] .sidenav+.content-container{margin-left:3rem;transition:all .1s ease-in-out}}@media print{html .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] .sidenav .sidenav-brand{margin-right:0;transition:opacity .1s ease-in-out}}@media print{html .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] .sidenav .sidenav-brand-icon{transition:opacity .1s ease-in-out}}@media print{html .sidenav .sidenav-inner,html[data-netbox-color-mode=dark] .sidenav .sidenav-inner,html[data-netbox-color-mode=light] .sidenav .sidenav-inner{padding-right:1.5rem;padding-left:1.5rem}}@media print and (min-width: 768px){html .sidenav .sidenav-inner,html[data-netbox-color-mode=dark] .sidenav .sidenav-inner,html[data-netbox-color-mode=light] .sidenav .sidenav-inner{padding-right:0;padding-left:0}}@media print{html .sidenav .sidenav-brand-img,html .sidenav .sidenav-brand>img,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand-img,html[data-netbox-color-mode=dark] .sidenav .sidenav-brand>img,html[data-netbox-color-mode=light] .sidenav .sidenav-brand-img,html[data-netbox-color-mode=light] .sidenav .sidenav-brand>img{max-width:100%;max-height:calc(16rem - 1rem)}}@media print{html .sidenav .navbar-heading,html[data-netbox-color-mode=dark] .sidenav .navbar-heading,html[data-netbox-color-mode=light] .sidenav .navbar-heading{padding-top:.5rem;padding-bottom:.5rem;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em}}@media print{html .sidenav .sidenav-header,html[data-netbox-color-mode=dark] .sidenav .sidenav-header,html[data-netbox-color-mode=light] .sidenav .sidenav-header{position:relative;display:flex;align-items:center;justify-content:space-between;height:78px;padding:1rem;transition:all .1s ease-in-out}}@media print{html .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] .sidenav .sidenav-toggle,html[data-netbox-color-mode=light] .sidenav .sidenav-toggle{position:absolute;display:inline-block;opacity:0;transition:opacity 10ms ease-in-out;transition-delay:.1s}}@media print{html .sidenav .sidenav-collapse,html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse,html[data-netbox-color-mode=light] .sidenav .sidenav-collapse{display:flex;flex:1;flex-direction:column;align-items:stretch;padding-right:1.5rem;padding-left:1.5rem;margin-right:-1.5rem;margin-left:-1.5rem}}@media print{html .sidenav .sidenav-collapse>*,html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse>*,html[data-netbox-color-mode=light] .sidenav .sidenav-collapse>*{min-width:100%}}@media print and (min-width: 768px){html .sidenav .sidenav-collapse,html[data-netbox-color-mode=dark] .sidenav .sidenav-collapse,html[data-netbox-color-mode=light] .sidenav .sidenav-collapse{margin-right:0;margin-left:0}}@media print{html .sidenav .nav-group-header,html[data-netbox-color-mode=dark] .sidenav .nav-group-header,html[data-netbox-color-mode=light] .sidenav .nav-group-header{padding:.25rem 1rem;margin-top:.5rem;margin-bottom:0}}@media print{html .sidenav .nav .nav-item,html[data-netbox-color-mode=dark] .sidenav .nav .nav-item,html[data-netbox-color-mode=light] .sidenav .nav .nav-item{display:flex;align-items:center;justify-content:space-between;width:100%}}@media print{html .sidenav .nav .nav-item.no-buttons,html[data-netbox-color-mode=dark] .sidenav .nav .nav-item.no-buttons,html[data-netbox-color-mode=light] .sidenav .nav .nav-item.no-buttons{padding-right:5rem}}@media print{html .sidenav .collapse .nav .nav-item .nav-link,html[data-netbox-color-mode=dark] .sidenav .collapse .nav .nav-item .nav-link,html[data-netbox-color-mode=light] .sidenav .collapse .nav .nav-item .nav-link{width:100%;padding:.25rem .25rem .25rem 1rem;margin-top:0;margin-bottom:0;border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}}@media print{html .sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon,html[data-netbox-color-mode=dark] .sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon,html[data-netbox-color-mode=light] .sidenav .collapse .nav .nav-item .nav-link .sidenav-mini-icon{width:1rem;text-align:center;transition:all .1s ease-in-out}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle],html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle],html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]{width:unset;height:100%;padding-left:.5rem;font-weight:700;color:var(--nbx-sidenav-parent-color)}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{color:#343a40;background:#cfe2ff}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle]:after{display:inline-block;margin-left:auto;font-family:"Material Design Icons";font-style:normal;font-weight:700;font-variant:normal;color:#6c757d;text-rendering:auto;-webkit-font-smoothing:antialiased;content:"\f0142";transition:all .1s ease-in-out}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true].active:after{color:#343a40}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle][aria-expanded=true]:after{color:#337ab7;transform:rotate(90deg)}}@media print{html .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle] .nav-link-text{padding-left:.25rem;transition:all .1s ease-in-out}}@media print{html .sidenav .navbar-nav,html[data-netbox-color-mode=dark] .sidenav .navbar-nav,html[data-netbox-color-mode=light] .sidenav .navbar-nav{flex-direction:column;margin-right:-1.5rem;margin-left:-1.5rem}}@media print{html .sidenav .navbar-nav .nav-item,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item{margin-top:2px}}@media print{html .sidenav .navbar-nav .nav-item.disabled,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item.disabled,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item.disabled{cursor:not-allowed;opacity:.8}}@media print{html .sidenav .navbar-nav .nav-item .nav-link,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link{position:relative;display:flex;align-items:center;width:100%;padding:.5rem 1rem;font-size:.875rem;color:var(--nbx-sidenav-link-color);white-space:nowrap;transition:all .1s ease-in-out}}@media print{html .sidenav .navbar-nav .nav-item .nav-link.active,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link.active,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link.active{background-color:var(--nbx-sidebar-link-active-bg)}}@media print{html .sidenav .navbar-nav .nav-item .nav-link:hover:not(.active),html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link:hover:not(.active),html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link:hover:not(.active){color:var(--nbx-body-color);background-color:var(--nbx-sidebar-link-hover-bg)}}@media print{html .sidenav .navbar-nav .nav-item .nav-link>i,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-item .nav-link>i,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-item .nav-link>i{min-width:2rem;font-size:calc(45px / 2);text-align:center}}@media print{html .sidenav .navbar-nav .nav-group-label,html[data-netbox-color-mode=dark] .sidenav .navbar-nav .nav-group-label,html[data-netbox-color-mode=light] .sidenav .navbar-nav .nav-group-label{display:block;font-size:.75rem;font-weight:700;color:var(--nbx-sidenav-group-color);text-transform:uppercase;white-space:nowrap}}@media print{html body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .sidenav-toggle-icon{color:var(--nbx-sidenav-pin-color);transform:rotate(90deg)}}@media print and (min-width: 1200px){html body[data-sidenav-pinned] .sidenav+.content-container,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav+.content-container,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav+.content-container{margin-left:16rem}}@media print{html .g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon,html[data-netbox-color-mode=dark] .g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon,html[data-netbox-color-mode=light] .g-sidenav-show:not(.g-sidenav-pinned) .sidenav .sidenav-toggle-icon{transform:rotate(0)}}@media print{html body[data-sidenav-show] .sidenav,html body[data-sidenav-pinned] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav{max-width:16rem}}@media print{html body[data-sidenav-show] .sidenav .sidenav-brand,html body[data-sidenav-show] .sidenav .navbar-heading,html body[data-sidenav-pinned] .sidenav .sidenav-brand,html body[data-sidenav-pinned] .sidenav .navbar-heading,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .navbar-heading,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .navbar-heading,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .navbar-heading,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .navbar-heading{display:block}}@media print{html body[data-sidenav-show] .sidenav .sidenav-brand,html body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .sidenav-brand{opacity:1;transform:translate(0)}}@media print{html body[data-sidenav-show] .sidenav .sidenav-brand-icon,html body[data-sidenav-pinned] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav .sidenav-brand-icon{position:absolute;opacity:0}}@media print and (max-width: 991.98px){html body[data-sidenav-show] .sidenav,html body[data-sidenav-pinned] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=dark] body[data-sidenav-pinned] .sidenav,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav,html[data-netbox-color-mode=light] body[data-sidenav-pinned] .sidenav{transform:translate(0)}}@media print{html body[data-sidenav-hide] .sidenav .sidenav-header,html body[data-sidenav-hidden] .sidenav .sidenav-header,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-header,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-header,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .sidenav-header,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .sidenav-header{padding:.5rem}}@media print{html body[data-sidenav-hide] .sidenav .sidenav-brand,html body[data-sidenav-hidden] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .sidenav-brand{position:absolute;opacity:0}}@media print{html body[data-sidenav-hide] .sidenav .sidenav-brand-icon,html body[data-sidenav-hidden] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .sidenav-brand-icon,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .sidenav-brand-icon{opacity:1}}@media print{html body[data-sidenav-hide] .sidenav .sidenav-toggle,html body[data-sidenav-hidden] .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .sidenav-toggle,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .sidenav-toggle,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .sidenav-toggle{opacity:0;position:absolute;transition:unset;transition-delay:0ms}}@media print{html body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,html body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .navbar-nav>.nav-item>.nav-link:after,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .navbar-nav>.nav-item>.nav-link:after{content:""}}@media print{html body[data-sidenav-hide] .sidenav .nav-item .collapse,html body[data-sidenav-hidden] .sidenav .nav-item .collapse,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .nav-item .collapse,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .nav-item .collapse,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .nav-item .collapse,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .nav-item .collapse{display:none}}@media print{html body[data-sidenav-hide] .sidenav .nav-link-text,html body[data-sidenav-hidden] .sidenav .nav-link-text,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .nav-link-text,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .nav-link-text,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .nav-link-text,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .nav-link-text{opacity:0}}@media print{html body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=dark] body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=dark] body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=light] body[data-sidenav-hide] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active,html[data-netbox-color-mode=light] body[data-sidenav-hidden] .sidenav .navbar-nav .nav-item .nav-link[data-bs-toggle].active{margin-right:0;margin-left:0;border-radius:unset}}@media print{html body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-brand,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-brand{display:block}}@media print{html body[data-sidenav-show] .sidenav .nav-item .collapse,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .collapse,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .nav-item .collapse{height:auto;transition:all .1s ease-in-out}}@media print{html body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .nav-item .nav-link .nav-link-text{opacity:1}}@media print{html body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .nav-item .sidenav-mini-icon{opacity:0}}@media print and (min-width: 992px){html body[data-sidenav-show] .sidenav .sidenav-toggle,html[data-netbox-color-mode=dark] body[data-sidenav-show] .sidenav .sidenav-toggle,html[data-netbox-color-mode=light] body[data-sidenav-show] .sidenav .sidenav-toggle{position:relative;opacity:1}}@media print{html .simplebar-track.simplebar-vertical,html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical,html[data-netbox-color-mode=light] .simplebar-track.simplebar-vertical{right:0;width:6px;background-color:transparent}}@media print{html .simplebar-track.simplebar-vertical .simplebar-scrollbar,html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical .simplebar-scrollbar,html[data-netbox-color-mode=light] .simplebar-track.simplebar-vertical .simplebar-scrollbar{transition:none}}@media print{html .simplebar-track.simplebar-vertical .simplebar-scrollbar:before,html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical .simplebar-scrollbar:before,html[data-netbox-color-mode=light] .simplebar-track.simplebar-vertical .simplebar-scrollbar:before{right:0;width:3px;background:var(--nbx-sidebar-scroll);border-radius:.375rem}}@media print{html .simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before,html[data-netbox-color-mode=dark] .simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before,html[data-netbox-color-mode=light] .simplebar-track.simplebar-vertical.simplebar-hover .simplebar-scrollbar:before{width:5px}}@media print{html body,html[data-netbox-color-mode=dark] body,html[data-netbox-color-mode=light] body{color:var(--nbx-body-color);background-color:var(--nbx-body-bg);font-size:.875rem}}@media print{html pre,html[data-netbox-color-mode=dark] pre,html[data-netbox-color-mode=light] pre{white-space:pre}}@media print{html small,html .small,html[data-netbox-color-mode=dark] .small,html[data-netbox-color-mode=light] .small,html[data-netbox-color-mode=dark] small,html[data-netbox-color-mode=light] small{font-size:smaller!important}}@media print{html a[type=button],html[data-netbox-color-mode=dark] a[type=button],html[data-netbox-color-mode=light] a[type=button]{-webkit-appearance:unset!important}}@media print{html *[data-href],html[data-netbox-color-mode=dark] *[data-href],html[data-netbox-color-mode=light] *[data-href]{cursor:pointer}}@media print{html .form-control:not([type=file]),html[data-netbox-color-mode=dark] .form-control:not([type=file]),html[data-netbox-color-mode=light] .form-control:not([type=file]){font-size:inherit}}@media print{html .badge,html[data-netbox-color-mode=dark] .badge,html[data-netbox-color-mode=light] .badge{font-size:.75rem}}@media print{html .text-xs,html[data-netbox-color-mode=dark] .text-xs,html[data-netbox-color-mode=light] .text-xs{font-size:.75rem!important;line-height:1.25!important}}@media print{html .border-input,html[data-netbox-color-mode=dark] .border-input,html[data-netbox-color-mode=light] .border-input{border:1px solid #e9ecef!important}}@media print{html .ws-nowrap,html[data-netbox-color-mode=dark] .ws-nowrap,html[data-netbox-color-mode=light] .ws-nowrap{white-space:nowrap!important}}@media print{html table tr .vertical-align,html table td .vertical-align,html[data-netbox-color-mode=dark] table tr .vertical-align,html[data-netbox-color-mode=dark] table td .vertical-align,html[data-netbox-color-mode=light] table tr .vertical-align,html[data-netbox-color-mode=light] table td .vertical-align{vertical-align:middle}}@media print{html .noprint,html[data-netbox-color-mode=dark] .noprint,html[data-netbox-color-mode=light] .noprint{display:none!important;visibility:hidden!important}}@media print{html .printonly,html[data-netbox-color-mode=dark] .printonly,html[data-netbox-color-mode=light] .printonly{display:none!important;visibility:hidden!important}}@media print{html .printonly,html[data-netbox-color-mode=dark] .printonly,html[data-netbox-color-mode=light] .printonly{display:block!important;visibility:visible!important}}@media print{html :root,html[data-netbox-color-mode=dark] :root,html[data-netbox-color-mode=light] :root{--nbx-sidebar-bg: #e9ecef;--nbx-sidebar-scroll: #adb5bd;--nbx-sidebar-link-hover-bg: rgba(108, 117, 125, .15);--nbx-sidebar-link-active-bg: #cfe2ff;--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(0, 0, 0, .25);--nbx-breadcrumb-bg: #e9ecef;--nbx-body-bg: #fff;--nbx-body-color: #343a40;--nbx-pre-bg: #f8f9fa;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(25, 135, 84, .4);--nbx-change-removed: rgba(220, 53, 69, .4);--nbx-cable-node-bg: #f8f9fa;--nbx-cable-node-border-color: #e9ecef;--nbx-cable-termination-bg: #e9ecef;--nbx-cable-termination-border-color: #dee2e6;--nbx-search-filter-border-left-color: #dee2e6;--nbx-color-mode-toggle-color: #337ab7;--nbx-sidenav-link-color: #343a40;--nbx-sidenav-pin-color: #fd7e14;--nbx-sidenav-parent-color: #343a40;--nbx-sidenav-group-color: #343a40}}@media print{html :root[data-netbox-color-mode=dark],html[data-netbox-color-mode=dark] :root[data-netbox-color-mode=dark],html[data-netbox-color-mode=light] :root[data-netbox-color-mode=dark]{--nbx-sidebar-bg: #212529;--nbx-sidebar-scroll: #495057;--nbx-sidebar-link-active-bg: rgba(110, 168, 254, .25);--nbx-sidebar-link-hover-bg: rgba(173, 181, 189, .15);--nbx-sidebar-title-color: #6c757d;--nbx-sidebar-shadow: inset 0px -25px 20px -25px rgba(255, 255, 255, .05);--nbx-breadcrumb-bg: #343a40;--nbx-body-bg: #1b1f22;--nbx-body-color: #f8f9fa;--nbx-pre-bg: #495057;--nbx-pre-border-color: #6c757d;--nbx-change-added: rgba(117, 183, 152, .4);--nbx-change-removed: rgba(234, 134, 143, .4);--nbx-cable-node-bg: #495057;--nbx-cable-node-border-color: #6c757d;--nbx-cable-termination-bg: #343a40;--nbx-cable-termination-border-color: #495057;--nbx-search-filter-border-left-color: #6c757d;--nbx-color-mode-toggle-color: #ffda6a;--nbx-sidenav-link-color: #e9ecef;--nbx-sidenav-pin-color: #ffc107;--nbx-sidenav-parent-color: #e9ecef;--nbx-sidenav-group-color: #6c757d}}@media print{html .bg-primary button.btn-close,html[data-netbox-color-mode=dark] .bg-primary button.btn-close,html[data-netbox-color-mode=light] .bg-primary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f496e'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-primary,html[data-netbox-color-mode=dark] .btn.btn-ghost-primary,html[data-netbox-color-mode=light] .btn.btn-ghost-primary{color:#337ab7}}@media print{html .btn.btn-ghost-primary:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-primary:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-primary:hover{background-color:#337ab71f}}@media print{html .alert.alert-primary a:not(.btn),html .table-primary a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-primary a:not(.btn),html[data-netbox-color-mode=dark] .table-primary a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-primary a:not(.btn),html[data-netbox-color-mode=light] .table-primary a:not(.btn){font-weight:700;color:#1f496e}}@media print{html .alert.alert-primary .btn:not([class*=btn-outline]),html .table-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-primary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-primary .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-primary a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-primary a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-primary a:not(.btn){font-weight:700;color:#adcae2}}@media print{html .badge.bg-primary,html .toast.bg-primary,html .toast-header.bg-primary,html .progress-bar.bg-primary,html[data-netbox-color-mode=dark] .badge.bg-primary,html[data-netbox-color-mode=dark] .toast.bg-primary,html[data-netbox-color-mode=dark] .toast-header.bg-primary,html[data-netbox-color-mode=dark] .progress-bar.bg-primary,html[data-netbox-color-mode=light] .badge.bg-primary,html[data-netbox-color-mode=light] .toast.bg-primary,html[data-netbox-color-mode=light] .toast-header.bg-primary,html[data-netbox-color-mode=light] .progress-bar.bg-primary{color:#fff}}@media print{html .bg-secondary button.btn-close,html[data-netbox-color-mode=dark] .bg-secondary button.btn-close,html[data-netbox-color-mode=light] .bg-secondary button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2341464b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-secondary,html[data-netbox-color-mode=dark] .btn.btn-ghost-secondary,html[data-netbox-color-mode=light] .btn.btn-ghost-secondary{color:#6c757d}}@media print{html .btn.btn-ghost-secondary:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-secondary:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-secondary:hover{background-color:#6c757d1f}}@media print{html .alert.alert-secondary a:not(.btn),html .table-secondary a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-secondary a:not(.btn),html[data-netbox-color-mode=dark] .table-secondary a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-secondary a:not(.btn),html[data-netbox-color-mode=light] .table-secondary a:not(.btn){font-weight:700;color:#41464b}}@media print{html .alert.alert-secondary .btn:not([class*=btn-outline]),html .table-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-secondary .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-secondary .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-secondary a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-secondary a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-secondary a:not(.btn){font-weight:700;color:#c4c8cb}}@media print{html .badge.bg-secondary,html .toast.bg-secondary,html .toast-header.bg-secondary,html .progress-bar.bg-secondary,html[data-netbox-color-mode=dark] .badge.bg-secondary,html[data-netbox-color-mode=dark] .toast.bg-secondary,html[data-netbox-color-mode=dark] .toast-header.bg-secondary,html[data-netbox-color-mode=dark] .progress-bar.bg-secondary,html[data-netbox-color-mode=light] .badge.bg-secondary,html[data-netbox-color-mode=light] .toast.bg-secondary,html[data-netbox-color-mode=light] .toast-header.bg-secondary,html[data-netbox-color-mode=light] .progress-bar.bg-secondary{color:#fff}}@media print{html .bg-success button.btn-close,html[data-netbox-color-mode=dark] .bg-success button.btn-close,html[data-netbox-color-mode=light] .bg-success button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-success,html[data-netbox-color-mode=dark] .btn.btn-ghost-success,html[data-netbox-color-mode=light] .btn.btn-ghost-success{color:#198754}}@media print{html .btn.btn-ghost-success:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-success:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-success:hover{background-color:#1987541f}}@media print{html .alert.alert-success a:not(.btn),html .table-success a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-success a:not(.btn),html[data-netbox-color-mode=dark] .table-success a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-success a:not(.btn),html[data-netbox-color-mode=light] .table-success a:not(.btn){font-weight:700;color:#0f5132}}@media print{html .alert.alert-success .btn:not([class*=btn-outline]),html .table-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-success .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-success .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-success a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-success a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-success a:not(.btn){font-weight:700;color:#a3cfbb}}@media print{html .badge.bg-success,html .toast.bg-success,html .toast-header.bg-success,html .progress-bar.bg-success,html[data-netbox-color-mode=dark] .badge.bg-success,html[data-netbox-color-mode=dark] .toast.bg-success,html[data-netbox-color-mode=dark] .toast-header.bg-success,html[data-netbox-color-mode=dark] .progress-bar.bg-success,html[data-netbox-color-mode=light] .badge.bg-success,html[data-netbox-color-mode=light] .toast.bg-success,html[data-netbox-color-mode=light] .toast-header.bg-success,html[data-netbox-color-mode=light] .progress-bar.bg-success{color:#fff}}@media print{html .bg-info button.btn-close,html[data-netbox-color-mode=dark] .bg-info button.btn-close,html[data-netbox-color-mode=light] .bg-info button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23225660'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-info,html[data-netbox-color-mode=dark] .btn.btn-ghost-info,html[data-netbox-color-mode=light] .btn.btn-ghost-info{color:#54d6f0}}@media print{html .btn.btn-ghost-info:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-info:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-info:hover{background-color:#54d6f01f}}@media print{html .alert.alert-info a:not(.btn),html .table-info a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-info a:not(.btn),html[data-netbox-color-mode=dark] .table-info a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-info a:not(.btn),html[data-netbox-color-mode=light] .table-info a:not(.btn){font-weight:700;color:#225660}}@media print{html .alert.alert-info .btn:not([class*=btn-outline]),html .table-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-info .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-info .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-info a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-info a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-info a:not(.btn){font-weight:700;color:#225660}}@media print{html .badge.bg-info,html .toast.bg-info,html .toast-header.bg-info,html .progress-bar.bg-info,html[data-netbox-color-mode=dark] .badge.bg-info,html[data-netbox-color-mode=dark] .toast.bg-info,html[data-netbox-color-mode=dark] .toast-header.bg-info,html[data-netbox-color-mode=dark] .progress-bar.bg-info,html[data-netbox-color-mode=light] .badge.bg-info,html[data-netbox-color-mode=light] .toast.bg-info,html[data-netbox-color-mode=light] .toast-header.bg-info,html[data-netbox-color-mode=light] .progress-bar.bg-info{color:#000}}@media print{html .bg-warning button.btn-close,html[data-netbox-color-mode=dark] .bg-warning button.btn-close,html[data-netbox-color-mode=light] .bg-warning button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-warning,html[data-netbox-color-mode=dark] .btn.btn-ghost-warning,html[data-netbox-color-mode=light] .btn.btn-ghost-warning{color:#ffc107}}@media print{html .btn.btn-ghost-warning:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-warning:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-warning:hover{background-color:#ffc1071f}}@media print{html .alert.alert-warning a:not(.btn),html .table-warning a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-warning a:not(.btn),html[data-netbox-color-mode=dark] .table-warning a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-warning a:not(.btn),html[data-netbox-color-mode=light] .table-warning a:not(.btn){font-weight:700;color:#664d03}}@media print{html .alert.alert-warning .btn:not([class*=btn-outline]),html .table-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-warning .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-warning .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-warning a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-warning a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-warning a:not(.btn){font-weight:700;color:#664d03}}@media print{html .badge.bg-warning,html .toast.bg-warning,html .toast-header.bg-warning,html .progress-bar.bg-warning,html[data-netbox-color-mode=dark] .badge.bg-warning,html[data-netbox-color-mode=dark] .toast.bg-warning,html[data-netbox-color-mode=dark] .toast-header.bg-warning,html[data-netbox-color-mode=dark] .progress-bar.bg-warning,html[data-netbox-color-mode=light] .badge.bg-warning,html[data-netbox-color-mode=light] .toast.bg-warning,html[data-netbox-color-mode=light] .toast-header.bg-warning,html[data-netbox-color-mode=light] .progress-bar.bg-warning{color:#000}}@media print{html .bg-danger button.btn-close,html[data-netbox-color-mode=dark] .bg-danger button.btn-close,html[data-netbox-color-mode=light] .bg-danger button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-danger,html[data-netbox-color-mode=dark] .btn.btn-ghost-danger,html[data-netbox-color-mode=light] .btn.btn-ghost-danger{color:#dc3545}}@media print{html .btn.btn-ghost-danger:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-danger:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-danger:hover{background-color:#dc35451f}}@media print{html .alert.alert-danger a:not(.btn),html .table-danger a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-danger a:not(.btn),html[data-netbox-color-mode=dark] .table-danger a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-danger a:not(.btn),html[data-netbox-color-mode=light] .table-danger a:not(.btn){font-weight:700;color:#842029}}@media print{html .alert.alert-danger .btn:not([class*=btn-outline]),html .table-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-danger .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-danger .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-danger a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-danger a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-danger a:not(.btn){font-weight:700;color:#f1aeb5}}@media print{html .badge.bg-danger,html .toast.bg-danger,html .toast-header.bg-danger,html .progress-bar.bg-danger,html[data-netbox-color-mode=dark] .badge.bg-danger,html[data-netbox-color-mode=dark] .toast.bg-danger,html[data-netbox-color-mode=dark] .toast-header.bg-danger,html[data-netbox-color-mode=dark] .progress-bar.bg-danger,html[data-netbox-color-mode=light] .badge.bg-danger,html[data-netbox-color-mode=light] .toast.bg-danger,html[data-netbox-color-mode=light] .toast-header.bg-danger,html[data-netbox-color-mode=light] .progress-bar.bg-danger{color:#fff}}@media print{html .bg-light button.btn-close,html[data-netbox-color-mode=dark] .bg-light button.btn-close,html[data-netbox-color-mode=light] .bg-light button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%235d5e60'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-light,html[data-netbox-color-mode=dark] .btn.btn-ghost-light,html[data-netbox-color-mode=light] .btn.btn-ghost-light{color:#e9ecef}}@media print{html .btn.btn-ghost-light:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-light:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-light:hover{background-color:#e9ecef1f}}@media print{html .alert.alert-light a:not(.btn),html .table-light a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-light a:not(.btn),html[data-netbox-color-mode=dark] .table-light a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-light a:not(.btn),html[data-netbox-color-mode=light] .table-light a:not(.btn){font-weight:700;color:#5d5e60}}@media print{html .alert.alert-light .btn:not([class*=btn-outline]),html .table-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-light .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-light .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-light a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-light a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-light a:not(.btn){font-weight:700;color:#5d5e60}}@media print{html .badge.bg-light,html .toast.bg-light,html .toast-header.bg-light,html .progress-bar.bg-light,html[data-netbox-color-mode=dark] .badge.bg-light,html[data-netbox-color-mode=dark] .toast.bg-light,html[data-netbox-color-mode=dark] .toast-header.bg-light,html[data-netbox-color-mode=dark] .progress-bar.bg-light,html[data-netbox-color-mode=light] .badge.bg-light,html[data-netbox-color-mode=light] .toast.bg-light,html[data-netbox-color-mode=light] .toast-header.bg-light,html[data-netbox-color-mode=light] .progress-bar.bg-light{color:#000}}@media print{html .bg-dark button.btn-close,html[data-netbox-color-mode=dark] .bg-dark button.btn-close,html[data-netbox-color-mode=light] .bg-dark button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231f2326'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-dark,html[data-netbox-color-mode=dark] .btn.btn-ghost-dark,html[data-netbox-color-mode=light] .btn.btn-ghost-dark{color:#343a40}}@media print{html .btn.btn-ghost-dark:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-dark:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-dark:hover{background-color:#343a401f}}@media print{html .alert.alert-dark a:not(.btn),html .table-dark a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-dark a:not(.btn),html[data-netbox-color-mode=dark] .table-dark a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-dark a:not(.btn),html[data-netbox-color-mode=light] .table-dark a:not(.btn){font-weight:700;color:#1f2326}}@media print{html .alert.alert-dark .btn:not([class*=btn-outline]),html .table-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-dark .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-dark .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-dark a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-dark a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-dark a:not(.btn){font-weight:700;color:#aeb0b3}}@media print{html .badge.bg-dark,html .toast.bg-dark,html .toast-header.bg-dark,html .progress-bar.bg-dark,html[data-netbox-color-mode=dark] .badge.bg-dark,html[data-netbox-color-mode=dark] .toast.bg-dark,html[data-netbox-color-mode=dark] .toast-header.bg-dark,html[data-netbox-color-mode=dark] .progress-bar.bg-dark,html[data-netbox-color-mode=light] .badge.bg-dark,html[data-netbox-color-mode=light] .toast.bg-dark,html[data-netbox-color-mode=light] .toast-header.bg-dark,html[data-netbox-color-mode=light] .progress-bar.bg-dark{color:#fff}}@media print{html .bg-blue button.btn-close,html[data-netbox-color-mode=dark] .bg-blue button.btn-close,html[data-netbox-color-mode=light] .bg-blue button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23084298'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-blue,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue,html[data-netbox-color-mode=light] .btn.btn-ghost-blue{color:#0d6efd}}@media print{html .btn.btn-ghost-blue:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-blue:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-blue:hover{background-color:#0d6efd1f}}@media print{html .alert.alert-blue a:not(.btn),html .table-blue a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-blue a:not(.btn),html[data-netbox-color-mode=dark] .table-blue a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-blue a:not(.btn),html[data-netbox-color-mode=light] .table-blue a:not(.btn){font-weight:700;color:#084298}}@media print{html .alert.alert-blue .btn:not([class*=btn-outline]),html .table-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-blue .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-blue .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-blue a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-blue a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-blue a:not(.btn){font-weight:700;color:#9ec5fe}}@media print{html .badge.bg-blue,html .toast.bg-blue,html .toast-header.bg-blue,html .progress-bar.bg-blue,html[data-netbox-color-mode=dark] .badge.bg-blue,html[data-netbox-color-mode=dark] .toast.bg-blue,html[data-netbox-color-mode=dark] .toast-header.bg-blue,html[data-netbox-color-mode=dark] .progress-bar.bg-blue,html[data-netbox-color-mode=light] .badge.bg-blue,html[data-netbox-color-mode=light] .toast.bg-blue,html[data-netbox-color-mode=light] .toast-header.bg-blue,html[data-netbox-color-mode=light] .progress-bar.bg-blue{color:#fff}}@media print{html .bg-indigo button.btn-close,html[data-netbox-color-mode=dark] .bg-indigo button.btn-close,html[data-netbox-color-mode=light] .bg-indigo button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%233d0a91'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-indigo,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo{color:#6610f2}}@media print{html .btn.btn-ghost-indigo:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-indigo:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-indigo:hover{background-color:#6610f21f}}@media print{html .alert.alert-indigo a:not(.btn),html .table-indigo a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-indigo a:not(.btn),html[data-netbox-color-mode=dark] .table-indigo a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-indigo a:not(.btn),html[data-netbox-color-mode=light] .table-indigo a:not(.btn){font-weight:700;color:#3d0a91}}@media print{html .alert.alert-indigo .btn:not([class*=btn-outline]),html .table-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-indigo .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-indigo .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-indigo a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-indigo a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-indigo a:not(.btn){font-weight:700;color:#c29ffa}}@media print{html .badge.bg-indigo,html .toast.bg-indigo,html .toast-header.bg-indigo,html .progress-bar.bg-indigo,html[data-netbox-color-mode=dark] .badge.bg-indigo,html[data-netbox-color-mode=dark] .toast.bg-indigo,html[data-netbox-color-mode=dark] .toast-header.bg-indigo,html[data-netbox-color-mode=dark] .progress-bar.bg-indigo,html[data-netbox-color-mode=light] .badge.bg-indigo,html[data-netbox-color-mode=light] .toast.bg-indigo,html[data-netbox-color-mode=light] .toast-header.bg-indigo,html[data-netbox-color-mode=light] .progress-bar.bg-indigo{color:#fff}}@media print{html .bg-purple button.btn-close,html[data-netbox-color-mode=dark] .bg-purple button.btn-close,html[data-netbox-color-mode=light] .bg-purple button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23432874'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-purple,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple,html[data-netbox-color-mode=light] .btn.btn-ghost-purple{color:#6f42c1}}@media print{html .btn.btn-ghost-purple:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-purple:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-purple:hover{background-color:#6f42c11f}}@media print{html .alert.alert-purple a:not(.btn),html .table-purple a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-purple a:not(.btn),html[data-netbox-color-mode=dark] .table-purple a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-purple a:not(.btn),html[data-netbox-color-mode=light] .table-purple a:not(.btn){font-weight:700;color:#432874}}@media print{html .alert.alert-purple .btn:not([class*=btn-outline]),html .table-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-purple .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-purple .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-purple a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-purple a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-purple a:not(.btn){font-weight:700;color:#c5b3e6}}@media print{html .badge.bg-purple,html .toast.bg-purple,html .toast-header.bg-purple,html .progress-bar.bg-purple,html[data-netbox-color-mode=dark] .badge.bg-purple,html[data-netbox-color-mode=dark] .toast.bg-purple,html[data-netbox-color-mode=dark] .toast-header.bg-purple,html[data-netbox-color-mode=dark] .progress-bar.bg-purple,html[data-netbox-color-mode=light] .badge.bg-purple,html[data-netbox-color-mode=light] .toast.bg-purple,html[data-netbox-color-mode=light] .toast-header.bg-purple,html[data-netbox-color-mode=light] .progress-bar.bg-purple{color:#fff}}@media print{html .bg-pink button.btn-close,html[data-netbox-color-mode=dark] .bg-pink button.btn-close,html[data-netbox-color-mode=light] .bg-pink button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23801f4f'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-pink,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink,html[data-netbox-color-mode=light] .btn.btn-ghost-pink{color:#d63384}}@media print{html .btn.btn-ghost-pink:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-pink:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-pink:hover{background-color:#d633841f}}@media print{html .alert.alert-pink a:not(.btn),html .table-pink a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-pink a:not(.btn),html[data-netbox-color-mode=dark] .table-pink a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-pink a:not(.btn),html[data-netbox-color-mode=light] .table-pink a:not(.btn){font-weight:700;color:#801f4f}}@media print{html .alert.alert-pink .btn:not([class*=btn-outline]),html .table-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-pink .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-pink .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-pink a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-pink a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-pink a:not(.btn){font-weight:700;color:#efadce}}@media print{html .badge.bg-pink,html .toast.bg-pink,html .toast-header.bg-pink,html .progress-bar.bg-pink,html[data-netbox-color-mode=dark] .badge.bg-pink,html[data-netbox-color-mode=dark] .toast.bg-pink,html[data-netbox-color-mode=dark] .toast-header.bg-pink,html[data-netbox-color-mode=dark] .progress-bar.bg-pink,html[data-netbox-color-mode=light] .badge.bg-pink,html[data-netbox-color-mode=light] .toast.bg-pink,html[data-netbox-color-mode=light] .toast-header.bg-pink,html[data-netbox-color-mode=light] .progress-bar.bg-pink{color:#fff}}@media print{html .bg-red button.btn-close,html[data-netbox-color-mode=dark] .bg-red button.btn-close,html[data-netbox-color-mode=light] .bg-red button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23842029'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-red,html[data-netbox-color-mode=dark] .btn.btn-ghost-red,html[data-netbox-color-mode=light] .btn.btn-ghost-red{color:#dc3545}}@media print{html .btn.btn-ghost-red:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-red:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-red:hover{background-color:#dc35451f}}@media print{html .alert.alert-red a:not(.btn),html .table-red a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-red a:not(.btn),html[data-netbox-color-mode=dark] .table-red a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-red a:not(.btn),html[data-netbox-color-mode=light] .table-red a:not(.btn){font-weight:700;color:#842029}}@media print{html .alert.alert-red .btn:not([class*=btn-outline]),html .table-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-red .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-red .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-red a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-red a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-red a:not(.btn){font-weight:700;color:#f1aeb5}}@media print{html .badge.bg-red,html .toast.bg-red,html .toast-header.bg-red,html .progress-bar.bg-red,html[data-netbox-color-mode=dark] .badge.bg-red,html[data-netbox-color-mode=dark] .toast.bg-red,html[data-netbox-color-mode=dark] .toast-header.bg-red,html[data-netbox-color-mode=dark] .progress-bar.bg-red,html[data-netbox-color-mode=light] .badge.bg-red,html[data-netbox-color-mode=light] .toast.bg-red,html[data-netbox-color-mode=light] .toast-header.bg-red,html[data-netbox-color-mode=light] .progress-bar.bg-red{color:#fff}}@media print{html .bg-orange button.btn-close,html[data-netbox-color-mode=dark] .bg-orange button.btn-close,html[data-netbox-color-mode=light] .bg-orange button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23984c0c'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-orange,html[data-netbox-color-mode=dark] .btn.btn-ghost-orange,html[data-netbox-color-mode=light] .btn.btn-ghost-orange{color:#fd7e14}}@media print{html .btn.btn-ghost-orange:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-orange:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-orange:hover{background-color:#fd7e141f}}@media print{html .alert.alert-orange a:not(.btn),html .table-orange a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-orange a:not(.btn),html[data-netbox-color-mode=dark] .table-orange a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-orange a:not(.btn),html[data-netbox-color-mode=light] .table-orange a:not(.btn){font-weight:700;color:#984c0c}}@media print{html .alert.alert-orange .btn:not([class*=btn-outline]),html .table-orange .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-orange .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-orange .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-orange .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-orange .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-orange a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-orange a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-orange a:not(.btn){font-weight:700;color:#653208}}@media print{html .badge.bg-orange,html .toast.bg-orange,html .toast-header.bg-orange,html .progress-bar.bg-orange,html[data-netbox-color-mode=dark] .badge.bg-orange,html[data-netbox-color-mode=dark] .toast.bg-orange,html[data-netbox-color-mode=dark] .toast-header.bg-orange,html[data-netbox-color-mode=dark] .progress-bar.bg-orange,html[data-netbox-color-mode=light] .badge.bg-orange,html[data-netbox-color-mode=light] .toast.bg-orange,html[data-netbox-color-mode=light] .toast-header.bg-orange,html[data-netbox-color-mode=light] .progress-bar.bg-orange{color:#000}}@media print{html .bg-yellow button.btn-close,html[data-netbox-color-mode=dark] .bg-yellow button.btn-close,html[data-netbox-color-mode=light] .bg-yellow button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23664d03'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-yellow,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow{color:#ffc107}}@media print{html .btn.btn-ghost-yellow:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-yellow:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-yellow:hover{background-color:#ffc1071f}}@media print{html .alert.alert-yellow a:not(.btn),html .table-yellow a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-yellow a:not(.btn),html[data-netbox-color-mode=dark] .table-yellow a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-yellow a:not(.btn),html[data-netbox-color-mode=light] .table-yellow a:not(.btn){font-weight:700;color:#664d03}}@media print{html .alert.alert-yellow .btn:not([class*=btn-outline]),html .table-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-yellow .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-yellow .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-yellow a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-yellow a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-yellow a:not(.btn){font-weight:700;color:#664d03}}@media print{html .badge.bg-yellow,html .toast.bg-yellow,html .toast-header.bg-yellow,html .progress-bar.bg-yellow,html[data-netbox-color-mode=dark] .badge.bg-yellow,html[data-netbox-color-mode=dark] .toast.bg-yellow,html[data-netbox-color-mode=dark] .toast-header.bg-yellow,html[data-netbox-color-mode=dark] .progress-bar.bg-yellow,html[data-netbox-color-mode=light] .badge.bg-yellow,html[data-netbox-color-mode=light] .toast.bg-yellow,html[data-netbox-color-mode=light] .toast-header.bg-yellow,html[data-netbox-color-mode=light] .progress-bar.bg-yellow{color:#000}}@media print{html .bg-green button.btn-close,html[data-netbox-color-mode=dark] .bg-green button.btn-close,html[data-netbox-color-mode=light] .bg-green button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f5132'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-green,html[data-netbox-color-mode=dark] .btn.btn-ghost-green,html[data-netbox-color-mode=light] .btn.btn-ghost-green{color:#198754}}@media print{html .btn.btn-ghost-green:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-green:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-green:hover{background-color:#1987541f}}@media print{html .alert.alert-green a:not(.btn),html .table-green a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-green a:not(.btn),html[data-netbox-color-mode=dark] .table-green a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-green a:not(.btn),html[data-netbox-color-mode=light] .table-green a:not(.btn){font-weight:700;color:#0f5132}}@media print{html .alert.alert-green .btn:not([class*=btn-outline]),html .table-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-green .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-green .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-green a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-green a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-green a:not(.btn){font-weight:700;color:#a3cfbb}}@media print{html .badge.bg-green,html .toast.bg-green,html .toast-header.bg-green,html .progress-bar.bg-green,html[data-netbox-color-mode=dark] .badge.bg-green,html[data-netbox-color-mode=dark] .toast.bg-green,html[data-netbox-color-mode=dark] .toast-header.bg-green,html[data-netbox-color-mode=dark] .progress-bar.bg-green,html[data-netbox-color-mode=light] .badge.bg-green,html[data-netbox-color-mode=light] .toast.bg-green,html[data-netbox-color-mode=light] .toast-header.bg-green,html[data-netbox-color-mode=light] .progress-bar.bg-green{color:#fff}}@media print{html .bg-teal button.btn-close,html[data-netbox-color-mode=dark] .bg-teal button.btn-close,html[data-netbox-color-mode=light] .bg-teal button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2313795b'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-teal,html[data-netbox-color-mode=dark] .btn.btn-ghost-teal,html[data-netbox-color-mode=light] .btn.btn-ghost-teal{color:#20c997}}@media print{html .btn.btn-ghost-teal:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-teal:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-teal:hover{background-color:#20c9971f}}@media print{html .alert.alert-teal a:not(.btn),html .table-teal a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-teal a:not(.btn),html[data-netbox-color-mode=dark] .table-teal a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-teal a:not(.btn),html[data-netbox-color-mode=light] .table-teal a:not(.btn){font-weight:700;color:#13795b}}@media print{html .alert.alert-teal .btn:not([class*=btn-outline]),html .table-teal .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-teal .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-teal .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-teal .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-teal .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-teal a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-teal a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-teal a:not(.btn){font-weight:700;color:#0d503c}}@media print{html .badge.bg-teal,html .toast.bg-teal,html .toast-header.bg-teal,html .progress-bar.bg-teal,html[data-netbox-color-mode=dark] .badge.bg-teal,html[data-netbox-color-mode=dark] .toast.bg-teal,html[data-netbox-color-mode=dark] .toast-header.bg-teal,html[data-netbox-color-mode=dark] .progress-bar.bg-teal,html[data-netbox-color-mode=light] .badge.bg-teal,html[data-netbox-color-mode=light] .toast.bg-teal,html[data-netbox-color-mode=light] .toast-header.bg-teal,html[data-netbox-color-mode=light] .progress-bar.bg-teal{color:#000}}@media print{html .bg-cyan button.btn-close,html[data-netbox-color-mode=dark] .bg-cyan button.btn-close,html[data-netbox-color-mode=light] .bg-cyan button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23055160'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-cyan,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan{color:#0dcaf0}}@media print{html .btn.btn-ghost-cyan:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-cyan:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-cyan:hover{background-color:#0dcaf01f}}@media print{html .alert.alert-cyan a:not(.btn),html .table-cyan a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-cyan a:not(.btn),html[data-netbox-color-mode=dark] .table-cyan a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-cyan a:not(.btn),html[data-netbox-color-mode=light] .table-cyan a:not(.btn){font-weight:700;color:#055160}}@media print{html .alert.alert-cyan .btn:not([class*=btn-outline]),html .table-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-cyan .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-cyan .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-cyan a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-cyan a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-cyan a:not(.btn){font-weight:700;color:#055160}}@media print{html .badge.bg-cyan,html .toast.bg-cyan,html .toast-header.bg-cyan,html .progress-bar.bg-cyan,html[data-netbox-color-mode=dark] .badge.bg-cyan,html[data-netbox-color-mode=dark] .toast.bg-cyan,html[data-netbox-color-mode=dark] .toast-header.bg-cyan,html[data-netbox-color-mode=dark] .progress-bar.bg-cyan,html[data-netbox-color-mode=light] .badge.bg-cyan,html[data-netbox-color-mode=light] .toast.bg-cyan,html[data-netbox-color-mode=light] .toast-header.bg-cyan,html[data-netbox-color-mode=light] .progress-bar.bg-cyan{color:#000}}@media print{html .bg-gray button.btn-close,html[data-netbox-color-mode=dark] .bg-gray button.btn-close,html[data-netbox-color-mode=light] .bg-gray button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23686d71'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-gray,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray,html[data-netbox-color-mode=light] .btn.btn-ghost-gray{color:#adb5bd}}@media print{html .btn.btn-ghost-gray:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-gray:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-gray:hover{background-color:#adb5bd1f}}@media print{html .alert.alert-gray a:not(.btn),html .table-gray a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-gray a:not(.btn),html[data-netbox-color-mode=dark] .table-gray a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-gray a:not(.btn),html[data-netbox-color-mode=light] .table-gray a:not(.btn){font-weight:700;color:#686d71}}@media print{html .alert.alert-gray .btn:not([class*=btn-outline]),html .table-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-gray .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-gray .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-gray a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-gray a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-gray a:not(.btn){font-weight:700;color:#45484c}}@media print{html .badge.bg-gray,html .toast.bg-gray,html .toast-header.bg-gray,html .progress-bar.bg-gray,html[data-netbox-color-mode=dark] .badge.bg-gray,html[data-netbox-color-mode=dark] .toast.bg-gray,html[data-netbox-color-mode=dark] .toast-header.bg-gray,html[data-netbox-color-mode=dark] .progress-bar.bg-gray,html[data-netbox-color-mode=light] .badge.bg-gray,html[data-netbox-color-mode=light] .toast.bg-gray,html[data-netbox-color-mode=light] .toast-header.bg-gray,html[data-netbox-color-mode=light] .progress-bar.bg-gray{color:#000}}@media print{html .bg-black button.btn-close,html[data-netbox-color-mode=dark] .bg-black button.btn-close,html[data-netbox-color-mode=light] .bg-black button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='black'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-black,html[data-netbox-color-mode=dark] .btn.btn-ghost-black,html[data-netbox-color-mode=light] .btn.btn-ghost-black{color:#000}}@media print{html .btn.btn-ghost-black:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-black:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-black:hover{background-color:#0000001f}}@media print{html .alert.alert-black a:not(.btn),html .table-black a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-black a:not(.btn),html[data-netbox-color-mode=dark] .table-black a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-black a:not(.btn),html[data-netbox-color-mode=light] .table-black a:not(.btn){font-weight:700;color:#000}}@media print{html .alert.alert-black .btn:not([class*=btn-outline]),html .table-black .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-black .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-black .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-black .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-black .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-black a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-black a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-black a:not(.btn){font-weight:700;color:#999}}@media print{html .badge.bg-black,html .toast.bg-black,html .toast-header.bg-black,html .progress-bar.bg-black,html[data-netbox-color-mode=dark] .badge.bg-black,html[data-netbox-color-mode=dark] .toast.bg-black,html[data-netbox-color-mode=dark] .toast-header.bg-black,html[data-netbox-color-mode=dark] .progress-bar.bg-black,html[data-netbox-color-mode=light] .badge.bg-black,html[data-netbox-color-mode=light] .toast.bg-black,html[data-netbox-color-mode=light] .toast-header.bg-black,html[data-netbox-color-mode=light] .progress-bar.bg-black{color:#fff}}@media print{html .bg-white button.btn-close,html[data-netbox-color-mode=dark] .bg-white button.btn-close,html[data-netbox-color-mode=light] .bg-white button.btn-close{background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23666666'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}}@media print{html .btn.btn-ghost-white,html[data-netbox-color-mode=dark] .btn.btn-ghost-white,html[data-netbox-color-mode=light] .btn.btn-ghost-white{color:#fff}}@media print{html .btn.btn-ghost-white:hover,html[data-netbox-color-mode=dark] .btn.btn-ghost-white:hover,html[data-netbox-color-mode=light] .btn.btn-ghost-white:hover{background-color:#ffffff1f}}@media print{html .alert.alert-white a:not(.btn),html .table-white a:not(.btn),html[data-netbox-color-mode=dark] .alert.alert-white a:not(.btn),html[data-netbox-color-mode=dark] .table-white a:not(.btn),html[data-netbox-color-mode=light] .alert.alert-white a:not(.btn),html[data-netbox-color-mode=light] .table-white a:not(.btn){font-weight:700;color:#666}}@media print{html .alert.alert-white .btn:not([class*=btn-outline]),html .table-white .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .alert.alert-white .btn:not([class*=btn-outline]),html[data-netbox-color-mode=dark] .table-white .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .alert.alert-white .btn:not([class*=btn-outline]),html[data-netbox-color-mode=light] .table-white .btn:not([class*=btn-outline]){border-color:#495057}}@media print{html .toast.bg-white a:not(.btn),html[data-netbox-color-mode=dark] .toast.bg-white a:not(.btn),html[data-netbox-color-mode=light] .toast.bg-white a:not(.btn){font-weight:700;color:#666}}@media print{html .badge.bg-white,html .toast.bg-white,html .toast-header.bg-white,html .progress-bar.bg-white,html[data-netbox-color-mode=dark] .badge.bg-white,html[data-netbox-color-mode=dark] .toast.bg-white,html[data-netbox-color-mode=dark] .toast-header.bg-white,html[data-netbox-color-mode=dark] .progress-bar.bg-white,html[data-netbox-color-mode=light] .badge.bg-white,html[data-netbox-color-mode=light] .toast.bg-white,html[data-netbox-color-mode=light] .toast-header.bg-white,html[data-netbox-color-mode=light] .progress-bar.bg-white{color:#000}}@media print{html table td>.progress,html[data-netbox-color-mode=dark] table td>.progress,html[data-netbox-color-mode=light] table td>.progress{min-width:6rem}}@media print{html .small .form-control,html[data-netbox-color-mode=dark] .small .form-control,html[data-netbox-color-mode=light] .small .form-control{font-size:.875rem}}@media print{html :not(.card-body)>.col:not(:last-child):not(:only-child),html[data-netbox-color-mode=dark] :not(.card-body)>.col:not(:last-child):not(:only-child),html[data-netbox-color-mode=light] :not(.card-body)>.col:not(:last-child):not(:only-child){margin-bottom:1rem}}@media print{html .nav-mobile,html[data-netbox-color-mode=dark] .nav-mobile,html[data-netbox-color-mode=light] .nav-mobile{display:none;flex-direction:column;align-items:center;justify-content:space-between;width:100%}}@media print and (max-width: 991.98px){html .nav-mobile,html[data-netbox-color-mode=dark] .nav-mobile,html[data-netbox-color-mode=light] .nav-mobile{display:flex}}@media print{html .nav-mobile .nav-mobile-top,html[data-netbox-color-mode=dark] .nav-mobile .nav-mobile-top,html[data-netbox-color-mode=light] .nav-mobile .nav-mobile-top{display:flex;align-items:center;justify-content:space-between;width:100%}}@media print{html .card>.table.table-flush,html[data-netbox-color-mode=dark] .card>.table.table-flush,html[data-netbox-color-mode=light] .card>.table.table-flush{margin-bottom:0;overflow:hidden;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}}@media print{html .card>.table.table-flush thead th[scope=col],html[data-netbox-color-mode=dark] .card>.table.table-flush thead th[scope=col],html[data-netbox-color-mode=light] .card>.table.table-flush thead th[scope=col]{padding-top:1rem;padding-bottom:1rem;text-transform:uppercase;vertical-align:middle;background-color:#f8f9fa;border-top:1px solid rgba(0,0,0,.125);border-bottom-color:#00000020}}@media print{html .card>.table.table-flush th,html .card>.table.table-flush td,html[data-netbox-color-mode=dark] .card>.table.table-flush th,html[data-netbox-color-mode=dark] .card>.table.table-flush td,html[data-netbox-color-mode=light] .card>.table.table-flush th,html[data-netbox-color-mode=light] .card>.table.table-flush td{padding-right:1.5rem!important;padding-left:1.5rem!important;border-right:0;border-left:0}}@media print{html .card>.table.table-flush tr[class],html[data-netbox-color-mode=dark] .card>.table.table-flush tr[class],html[data-netbox-color-mode=light] .card>.table.table-flush tr[class]{border-color:#00000020!important}}@media print{html .card>.table.table-flush tr[class]:last-of-type,html[data-netbox-color-mode=dark] .card>.table.table-flush tr[class]:last-of-type,html[data-netbox-color-mode=light] .card>.table.table-flush tr[class]:last-of-type{border-bottom-color:transparent!important;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}}@media print{html .header-alert-container,html[data-netbox-color-mode=dark] .header-alert-container,html[data-netbox-color-mode=light] .header-alert-container{display:flex;align-items:center;justify-content:center;padding:0 1rem}}@media print{html .header-alert-container .alert,html[data-netbox-color-mode=dark] .header-alert-container .alert,html[data-netbox-color-mode=light] .header-alert-container .alert{width:100%}}@media print and (min-width: 768px){html .header-alert-container .alert,html[data-netbox-color-mode=dark] .header-alert-container .alert,html[data-netbox-color-mode=light] .header-alert-container .alert{max-width:75%}}@media print and (min-width: 992px){html .header-alert-container .alert,html[data-netbox-color-mode=dark] .header-alert-container .alert,html[data-netbox-color-mode=light] .header-alert-container .alert{max-width:50%}}@media print{html span.profile-button .dropdown-menu,html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu,html[data-netbox-color-mode=light] span.profile-button .dropdown-menu{right:0;left:auto;display:block!important;margin-top:.5rem;box-shadow:0 .5rem 1rem #00000026;transition:opacity .2s ease-in-out}}@media print{html span.profile-button .dropdown-menu:not(.show),html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu:not(.show),html[data-netbox-color-mode=light] span.profile-button .dropdown-menu:not(.show){pointer-events:none;opacity:0}}@media print{html span.profile-button .dropdown-menu.show,html[data-netbox-color-mode=dark] span.profile-button .dropdown-menu.show,html[data-netbox-color-mode=light] span.profile-button .dropdown-menu.show{pointer-events:auto;opacity:1}}@media print{html div#advanced-search-content div.card div.card-body div.col:not(:last-child),html[data-netbox-color-mode=dark] div#advanced-search-content div.card div.card-body div.col:not(:last-child),html[data-netbox-color-mode=light] div#advanced-search-content div.card div.card-body div.col:not(:last-child){margin-right:1rem}}@media print{html table td a,html[data-netbox-color-mode=dark] table td a,html[data-netbox-color-mode=light] table td a{text-decoration:none}}@media print{html table td a:hover,html[data-netbox-color-mode=dark] table td a:hover,html[data-netbox-color-mode=light] table td a:hover{text-decoration:underline}}@media print{html table td .dropdown,html[data-netbox-color-mode=dark] table td .dropdown,html[data-netbox-color-mode=light] table td .dropdown{position:static}}@media print{html table th a,html table th a:hover,html[data-netbox-color-mode=dark] table th a,html[data-netbox-color-mode=dark] table th a:hover,html[data-netbox-color-mode=light] table th a,html[data-netbox-color-mode=light] table th a:hover{color:#212529;text-decoration:none}}@media print{html table td,html table th,html[data-netbox-color-mode=dark] table td,html[data-netbox-color-mode=dark] table th,html[data-netbox-color-mode=light] table td,html[data-netbox-color-mode=light] table th{font-size:.875rem;line-height:1.25;vertical-align:middle}}@media print{html table td.min-width,html table th.min-width,html[data-netbox-color-mode=dark] table td.min-width,html[data-netbox-color-mode=dark] table th.min-width,html[data-netbox-color-mode=light] table td.min-width,html[data-netbox-color-mode=light] table th.min-width{width:1%}}@media print{html table td .form-check-input,html table th .form-check-input,html[data-netbox-color-mode=dark] table td .form-check-input,html[data-netbox-color-mode=dark] table th .form-check-input,html[data-netbox-color-mode=light] table td .form-check-input,html[data-netbox-color-mode=light] table th .form-check-input{margin-top:.125em;font-size:1rem}}@media print{html table td .btn-sm,html table td .btn-group-sm>.btn,html table th .btn-sm,html table th .btn-group-sm>.btn,html[data-netbox-color-mode=dark] table td .btn-sm,html[data-netbox-color-mode=dark] table td html[data-netbox-color-mode=light] .btn-group-sm>.btn,html[data-netbox-color-mode=dark] table th .btn-sm,html[data-netbox-color-mode=dark] table th html[data-netbox-color-mode=light] .btn-group-sm>.btn,html[data-netbox-color-mode=light] table td .btn-sm,html[data-netbox-color-mode=light] table td html[data-netbox-color-mode=dark] .btn-group-sm>.btn,html[data-netbox-color-mode=light] table th .btn-sm,html[data-netbox-color-mode=light] table th html[data-netbox-color-mode=dark] .btn-group-sm>.btn{line-height:1}}@media print{html table td p,html table th p,html[data-netbox-color-mode=dark] table td p,html[data-netbox-color-mode=dark] table th p,html[data-netbox-color-mode=light] table td p,html[data-netbox-color-mode=light] table th p{margin-bottom:0}}@media print{html table th.asc a:after,html[data-netbox-color-mode=dark] table th.asc a:after,html[data-netbox-color-mode=light] table th.asc a:after{content:"\f0140";font-family:"Material Design Icons"}}@media print{html table th.desc a:after,html[data-netbox-color-mode=dark] table th.desc a:after,html[data-netbox-color-mode=light] table th.desc a:after{content:"\f0143";font-family:"Material Design Icons"}}@media print{html table.table>:not(caption)>*>*,html[data-netbox-color-mode=dark] table.table>:not(caption)>*>*,html[data-netbox-color-mode=light] table.table>:not(caption)>*>*{padding-right:.25rem!important;padding-left:.25rem!important}}@media print{html table.object-list th,html[data-netbox-color-mode=dark] table.object-list th,html[data-netbox-color-mode=light] table.object-list th{font-size:.75rem;line-height:1;vertical-align:bottom}}@media print{html table.attr-table th,html[data-netbox-color-mode=dark] table.attr-table th,html[data-netbox-color-mode=light] table.attr-table th{font-weight:normal;width:25%}}@media print{html div.title-container,html[data-netbox-color-mode=dark] div.title-container,html[data-netbox-color-mode=light] div.title-container{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:space-between}}@media print and (min-width: 992px){html div.title-container,html[data-netbox-color-mode=dark] div.title-container,html[data-netbox-color-mode=light] div.title-container{flex-direction:row}}@media print{html div.title-container #content-title,html[data-netbox-color-mode=dark] div.title-container #content-title,html[data-netbox-color-mode=light] div.title-container #content-title{display:flex;flex:1 0;flex-direction:column;padding-bottom:.5rem}}@media print{html .controls,html[data-netbox-color-mode=dark] .controls,html[data-netbox-color-mode=light] .controls{margin-bottom:.5rem}}@media print{html .controls,html[data-netbox-color-mode=dark] .controls,html[data-netbox-color-mode=light] .controls{display:none!important}}@media print{html .controls .control-group,html[data-netbox-color-mode=dark] .controls .control-group,html[data-netbox-color-mode=light] .controls .control-group{display:flex;flex-wrap:wrap;justify-content:flex-start}}@media print and (min-width: 992px){html .controls .control-group,html[data-netbox-color-mode=dark] .controls .control-group,html[data-netbox-color-mode=light] .controls .control-group{justify-content:flex-end}}@media print{html .controls .control-group>*,html[data-netbox-color-mode=dark] .controls .control-group>*,html[data-netbox-color-mode=light] .controls .control-group>*{margin:.25rem}}@media print{html .controls .control-group>*:first-child,html[data-netbox-color-mode=dark] .controls .control-group>*:first-child,html[data-netbox-color-mode=light] .controls .control-group>*:first-child{margin-left:0}}@media print{html .controls .control-group>*:last-child,html[data-netbox-color-mode=dark] .controls .control-group>*:last-child,html[data-netbox-color-mode=light] .controls .control-group>*:last-child{margin-right:0}}@media print{html .object-subtitle,html[data-netbox-color-mode=dark] .object-subtitle,html[data-netbox-color-mode=light] .object-subtitle{display:block;font-size:.875rem;color:#6c757d}}@media print and (min-width: 768px){html .object-subtitle,html[data-netbox-color-mode=dark] .object-subtitle,html[data-netbox-color-mode=light] .object-subtitle{display:inline-block}}@media print{html .object-subtitle>span,html[data-netbox-color-mode=dark] .object-subtitle>span,html[data-netbox-color-mode=light] .object-subtitle>span{display:block}}@media print{html .object-subtitle>span.separator,html[data-netbox-color-mode=dark] .object-subtitle>span.separator,html[data-netbox-color-mode=light] .object-subtitle>span.separator{display:none}}@media print and (min-width: 768px){html .object-subtitle>span,html .object-subtitle>span.separator,html[data-netbox-color-mode=dark] .object-subtitle>span,html[data-netbox-color-mode=dark] .object-subtitle>span.separator,html[data-netbox-color-mode=light] .object-subtitle>span,html[data-netbox-color-mode=light] .object-subtitle>span.separator{display:inline-block}}@media print{html nav.search,html[data-netbox-color-mode=dark] nav.search,html[data-netbox-color-mode=light] nav.search{z-index:999;justify-content:center;background-color:var(--nbx-body-bg)}}@media print{html nav.search .search-container,html[data-netbox-color-mode=dark] nav.search .search-container,html[data-netbox-color-mode=light] nav.search .search-container{display:flex;width:100%}}@media print and (max-width: 991.98px){html nav.search .search-container,html[data-netbox-color-mode=dark] nav.search .search-container,html[data-netbox-color-mode=light] nav.search .search-container{display:none}}@media print{html nav.search .input-group .search-obj-selected,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selected,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selected{border-color:#e9ecef}}@media print{html nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle{color:#000;border-color:#e9ecef;margin-left:0;font-weight:400;line-height:1.5;color:#212529;background-color:#e9ecef;border:1px solid #e9ecef;border-radius:.375rem;border-left:1px solid var(--nbx-search-filter-border-left-color)}}@media print{html nav.search .input-group .dropdown-toggle:hover,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:hover,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:hover{color:#000;background-color:#eceff1;border-color:#ebeef1}}@media print{.btn-check:focus+html nav.search .input-group .dropdown-toggle,html nav.search .input-group .dropdown-toggle:focus,.btn-check:focus+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,.btn-check:focus+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:focus{color:#000;background-color:#eceff1;border-color:#ebeef1;box-shadow:0 0 0 .25rem #c6c9cb80}}@media print{.btn-check:checked+html nav.search .input-group .dropdown-toggle,.btn-check:active+html nav.search .input-group .dropdown-toggle,html nav.search .input-group .dropdown-toggle:active,html nav.search .input-group .dropdown-toggle.active,.show>html nav.search .input-group .dropdown-toggle.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,.btn-check:active+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:active,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.active,.show>html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.dropdown-toggle,.btn-check:checked+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle,.btn-check:active+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:active,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.active,.show>html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.dropdown-toggle{color:#000;background-color:#edf0f2;border-color:#ebeef1}}@media print{.btn-check:checked+html nav.search .input-group .dropdown-toggle:focus,.btn-check:active+html nav.search .input-group .dropdown-toggle:focus,html nav.search .input-group .dropdown-toggle:active:focus,html nav.search .input-group .dropdown-toggle.active:focus,.show>html nav.search .input-group .dropdown-toggle.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,.btn-check:active+html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:active:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.active:focus,.show>html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.dropdown-toggle:focus,.btn-check:checked+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:focus,.btn-check:active+html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:active:focus,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.active:focus,.show>html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #c6c9cb80}}@media print{html nav.search .input-group .dropdown-toggle:disabled,html nav.search .input-group .dropdown-toggle.disabled,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:disabled,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle.disabled,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:disabled,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle.disabled{color:#000;background-color:#e9ecef;border-color:#e9ecef}}@media print{html nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:focus,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:focus{box-shadow:unset!important}}@media print{html nav.search .input-group .dropdown-toggle:after,html[data-netbox-color-mode=dark] nav.search .input-group .dropdown-toggle:after,html[data-netbox-color-mode=light] nav.search .input-group .dropdown-toggle:after{display:none}}@media print{html nav.search .input-group .search-obj-selector,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selector{max-height:70vh;overflow-y:auto}}@media print{html nav.search .input-group .search-obj-selector .dropdown-item,html nav.search .input-group .search-obj-selector .dropdown-header,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-item,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-header,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selector .dropdown-item,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selector .dropdown-header{font-size:.875rem}}@media print{html nav.search .input-group .search-obj-selector .dropdown-header,html[data-netbox-color-mode=dark] nav.search .input-group .search-obj-selector .dropdown-header,html[data-netbox-color-mode=light] nav.search .input-group .search-obj-selector .dropdown-header{text-transform:uppercase}}@media print{html main.layout,html[data-netbox-color-mode=dark] main.layout,html[data-netbox-color-mode=light] main.layout{display:flex;flex-wrap:nowrap;height:100vh;height:-webkit-fill-available;max-height:100vh;overflow-x:auto;overflow-y:hidden}}@media print{html main.layout,html[data-netbox-color-mode=dark] main.layout,html[data-netbox-color-mode=light] main.layout{position:static!important;display:block!important;height:100%;overflow-x:visible!important;overflow-y:visible!important}}@media print{html main.login-container,html[data-netbox-color-mode=dark] main.login-container,html[data-netbox-color-mode=light] main.login-container{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;max-width:100vw;height:calc(100vh - 4rem);padding-top:40px;padding-bottom:40px}}@media print{html main.login-container+footer.footer button.color-mode-toggle,html[data-netbox-color-mode=dark] main.login-container+footer.footer button.color-mode-toggle,html[data-netbox-color-mode=light] main.login-container+footer.footer button.color-mode-toggle{color:var(--nbx-color-mode-toggle-color)}}@media print{html .footer,html[data-netbox-color-mode=dark] .footer,html[data-netbox-color-mode=light] .footer{padding:0}}@media print{html .footer .nav-link,html[data-netbox-color-mode=dark] .footer .nav-link,html[data-netbox-color-mode=light] .footer .nav-link{padding:.5rem}}@media print and (max-width: 767.98px){html .footer,html[data-netbox-color-mode=dark] .footer,html[data-netbox-color-mode=light] .footer{margin-bottom:8rem}}@media print{html footer.login-footer,html[data-netbox-color-mode=dark] footer.login-footer,html[data-netbox-color-mode=light] footer.login-footer{height:4rem;margin-top:auto}}@media print{html footer.login-footer .container-fluid,html footer.login-footer .container-sm,html footer.login-footer .container-md,html footer.login-footer .container-lg,html footer.login-footer .container-xl,html footer.login-footer .container-xxl,html[data-netbox-color-mode=dark] footer.login-footer .container-fluid,html[data-netbox-color-mode=light] footer.login-footer .container-fluid{display:flex;justify-content:flex-end;padding:.75rem 1.5rem}}@media print{html h1.accordion-item-title,html .accordion-item-title.h1,html h2.accordion-item-title,html .accordion-item-title.h2,html h3.accordion-item-title,html .accordion-item-title.h3,html h4.accordion-item-title,html .accordion-item-title.h4,html h5.accordion-item-title,html .accordion-item-title.h5,html h6.accordion-item-title,html .accordion-item-title.h6,html[data-netbox-color-mode=dark] h1.accordion-item-title,html[data-netbox-color-mode=dark] h2.accordion-item-title,html[data-netbox-color-mode=dark] h3.accordion-item-title,html[data-netbox-color-mode=dark] h4.accordion-item-title,html[data-netbox-color-mode=dark] h5.accordion-item-title,html[data-netbox-color-mode=dark] h6.accordion-item-title,html[data-netbox-color-mode=light] h1.accordion-item-title,html[data-netbox-color-mode=light] h2.accordion-item-title,html[data-netbox-color-mode=light] h3.accordion-item-title,html[data-netbox-color-mode=light] h4.accordion-item-title,html[data-netbox-color-mode=light] h5.accordion-item-title,html[data-netbox-color-mode=light] h6.accordion-item-title{padding:.25rem .5rem;font-size:.875rem;font-weight:700;color:var(--nbx-sidebar-title-color);text-transform:uppercase}}@media print{html .form-login,html[data-netbox-color-mode=dark] .form-login,html[data-netbox-color-mode=light] .form-login{width:100%;max-width:330px;padding:15px}}@media print{html .form-login input:focus,html[data-netbox-color-mode=dark] .form-login input:focus,html[data-netbox-color-mode=light] .form-login input:focus{z-index:1}}@media print{html .form-login input[type=text],html[data-netbox-color-mode=dark] .form-login input[type=text],html[data-netbox-color-mode=light] .form-login input[type=text]{margin-bottom:-1px;border-bottom-right-radius:0;border-bottom-left-radius:0}}@media print{html .form-login input[type=password],html[data-netbox-color-mode=dark] .form-login input[type=password],html[data-netbox-color-mode=light] .form-login input[type=password]{margin-bottom:10px;border-top-left-radius:0;border-top-right-radius:0}}@media print{html .form-login .form-control,html[data-netbox-color-mode=dark] .form-login .form-control,html[data-netbox-color-mode=light] .form-login .form-control{position:relative;box-sizing:border-box;height:auto;padding:10px;font-size:16px}}@media print{html .navbar-brand,html[data-netbox-color-mode=dark] .navbar-brand,html[data-netbox-color-mode=light] .navbar-brand{padding-top:.75rem;padding-bottom:.75rem;font-size:1rem}}@media print{html nav.nav.nav-pills .nav-item.nav-link,html[data-netbox-color-mode=dark] nav.nav.nav-pills .nav-item.nav-link,html[data-netbox-color-mode=light] nav.nav.nav-pills .nav-item.nav-link{padding:.25rem .5rem;font-size:.875rem;border-radius:.375rem}}@media print{html nav.nav.nav-pills .nav-item.nav-link:hover,html[data-netbox-color-mode=dark] nav.nav.nav-pills .nav-item.nav-link:hover,html[data-netbox-color-mode=light] nav.nav.nav-pills .nav-item.nav-link:hover{color:#343a40;background-color:#cfe2ff}}@media print{html div.content-container,html[data-netbox-color-mode=dark] div.content-container,html[data-netbox-color-mode=light] div.content-container{position:relative;display:flex;flex-direction:column;width:calc(100% - 3rem);min-height:100vh;overflow-x:hidden;overflow-y:auto}}@media print{html div.content-container:focus,html div.content-container:focus-visible,html[data-netbox-color-mode=dark] div.content-container:focus,html[data-netbox-color-mode=dark] div.content-container:focus-visible,html[data-netbox-color-mode=light] div.content-container:focus,html[data-netbox-color-mode=light] div.content-container:focus-visible{outline:0}}@media print{html div.content-container div.content,html[data-netbox-color-mode=dark] div.content-container div.content,html[data-netbox-color-mode=light] div.content-container div.content{flex:1}}@media print and (max-width: 991.98px){html div.content-container,html[data-netbox-color-mode=dark] div.content-container,html[data-netbox-color-mode=light] div.content-container{width:100%}}@media print{html div.content-container,html[data-netbox-color-mode=dark] div.content-container,html[data-netbox-color-mode=light] div.content-container{width:100%!important;margin-left:0!important}}@media print and (max-width: 768px){html .sidebar.collapse.show~.content-container>.content,html[data-netbox-color-mode=dark] .sidebar.collapse.show~.content-container>.content,html[data-netbox-color-mode=light] .sidebar.collapse.show~.content-container>.content{position:fixed;top:0;left:0;overflow-y:hidden}}@media print{html .tooltip,html[data-netbox-color-mode=dark] .tooltip,html[data-netbox-color-mode=light] .tooltip{pointer-events:none}}@media print{html span.color-label,html[data-netbox-color-mode=dark] span.color-label,html[data-netbox-color-mode=light] span.color-label{display:block;width:5rem;height:1rem;padding:.35em .65em;border:1px solid #303030;border-radius:.375rem;box-shadow:0 .125rem .25rem #00000013}}@media print{html .btn,html[data-netbox-color-mode=dark] .btn,html[data-netbox-color-mode=light] .btn{white-space:nowrap}}@media print{html .card,html[data-netbox-color-mode=dark] .card,html[data-netbox-color-mode=light] .card{box-shadow:0 .125rem .25rem #00000013}}@media print{html .card .card-header,html[data-netbox-color-mode=dark] .card .card-header,html[data-netbox-color-mode=light] .card .card-header{padding:1rem;color:var(--nbx-body-color);border-bottom:none}}@media print{html .card .card-header+.card-body,html[data-netbox-color-mode=dark] .card .card-header+.card-body,html[data-netbox-color-mode=light] .card .card-header+.card-body{padding-top:0}}@media print{html .card .card-body.small .form-control,html .card .card-body.small .form-select,html[data-netbox-color-mode=dark] .card .card-body.small .form-control,html[data-netbox-color-mode=dark] .card .card-body.small .form-select,html[data-netbox-color-mode=light] .card .card-body.small .form-control,html[data-netbox-color-mode=light] .card .card-body.small .form-select{font-size:.875rem}}@media print{html .card .card-divider,html[data-netbox-color-mode=dark] .card .card-divider,html[data-netbox-color-mode=light] .card .card-divider{width:100%;height:1px;margin:1rem 0;border-top:1px solid rgba(0,0,0,.125);opacity:.25}}@media print{html .card,html[data-netbox-color-mode=dark] .card,html[data-netbox-color-mode=light] .card{box-shadow:unset!important}}@media print{html .form-floating,html[data-netbox-color-mode=dark] .form-floating,html[data-netbox-color-mode=light] .form-floating{position:relative}}@media print{html .form-floating>.input-group>.form-control,html .form-floating>.input-group>.form-select,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}}@media print{html .form-floating>.input-group>label,html[data-netbox-color-mode=dark] .form-floating>.input-group>label,html[data-netbox-color-mode=light] .form-floating>.input-group>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}}@media print and (prefers-reduced-motion: reduce){html .form-floating>.input-group>label,html[data-netbox-color-mode=dark] .form-floating>.input-group>label,html[data-netbox-color-mode=light] .form-floating>.input-group>label{transition:none}}@media print{html .form-floating>.input-group>.form-control::placeholder,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control::placeholder,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control::placeholder{color:transparent}}@media print{html .form-floating>.input-group>.form-control:focus,html .form-floating>.input-group>.form-control:not(:placeholder-shown),html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:focus,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:not(:placeholder-shown),html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:focus,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.input-group>.form-control:-webkit-autofill,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:-webkit-autofill,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.input-group>.form-select,html .form-floating>.choices>.choices__inner,html .form-floating>.ss-main span.placeholder,html .form-floating>.ss-main div.ss-values,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select,html[data-netbox-color-mode=dark] .form-floating>.choices>.choices__inner,html[data-netbox-color-mode=dark] .form-floating>.ss-main span.placeholder,html[data-netbox-color-mode=dark] .form-floating>.ss-main div.ss-values,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-select,html[data-netbox-color-mode=light] .form-floating>.choices>.choices__inner,html[data-netbox-color-mode=light] .form-floating>.ss-main span.placeholder,html[data-netbox-color-mode=light] .form-floating>.ss-main div.ss-values{padding-top:1.625rem;padding-bottom:.625rem}}@media print{html .form-floating>.input-group>.form-control:focus~label,html .form-floating>.input-group>.form-control:not(:placeholder-shown)~label,html .form-floating>.input-group>.form-select~label,html .form-floating>.choices~label,html .form-floating>.ss-main~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:focus~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-select~label,html[data-netbox-color-mode=dark] .form-floating>.choices~label,html[data-netbox-color-mode=dark] .form-floating>.ss-main~label,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:focus~label,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:not(:placeholder-shown)~label,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-select~label,html[data-netbox-color-mode=light] .form-floating>.choices~label,html[data-netbox-color-mode=light] .form-floating>.ss-main~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem);z-index:4}}@media print{html .form-floating>.input-group>.form-control:-webkit-autofill~label,html[data-netbox-color-mode=dark] .form-floating>.input-group>.form-control:-webkit-autofill~label,html[data-netbox-color-mode=light] .form-floating>.input-group>.form-control:-webkit-autofill~label{z-index:4;opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}}@media print{html .form-object-edit,html[data-netbox-color-mode=dark] .form-object-edit,html[data-netbox-color-mode=light] .form-object-edit{margin:0 auto;max-width:800px}}@media print{html textarea.form-control[rows="10"],html[data-netbox-color-mode=dark] textarea.form-control[rows="10"],html[data-netbox-color-mode=light] textarea.form-control[rows="10"]{height:18rem}}@media print{html textarea#id_local_context_data,html textarea.markdown,html textarea#id_public_key,html textarea.form-control[name=csv],html textarea.form-control[name=data],html[data-netbox-color-mode=dark] textarea#id_local_context_data,html[data-netbox-color-mode=dark] textarea.markdown,html[data-netbox-color-mode=dark] textarea#id_public_key,html[data-netbox-color-mode=dark] textarea.form-control[name=csv],html[data-netbox-color-mode=dark] textarea.form-control[name=data],html[data-netbox-color-mode=light] textarea#id_local_context_data,html[data-netbox-color-mode=light] textarea.markdown,html[data-netbox-color-mode=light] textarea#id_public_key,html[data-netbox-color-mode=light] textarea.form-control[name=csv],html[data-netbox-color-mode=light] textarea.form-control[name=data]{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}}@media print{html .card:not(:only-of-type),html[data-netbox-color-mode=dark] .card:not(:only-of-type),html[data-netbox-color-mode=light] .card:not(:only-of-type){margin-bottom:1rem}}@media print{html .stat-btn,html[data-netbox-color-mode=dark] .stat-btn,html[data-netbox-color-mode=light] .stat-btn{min-width:3rem}}@media print{html nav.breadcrumb-container,html[data-netbox-color-mode=dark] nav.breadcrumb-container,html[data-netbox-color-mode=light] nav.breadcrumb-container{width:fit-content;padding:.35em .65em;font-size:.875rem}}@media print{html nav.breadcrumb-container ol.breadcrumb,html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb,html[data-netbox-color-mode=light] nav.breadcrumb-container ol.breadcrumb{margin-bottom:0}}@media print{html nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a,html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a,html[data-netbox-color-mode=light] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a{text-decoration:none}}@media print{html nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover,html[data-netbox-color-mode=dark] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover,html[data-netbox-color-mode=light] nav.breadcrumb-container ol.breadcrumb li.breadcrumb-item>a:hover{text-decoration:underline}}@media print{html label.required,html[data-netbox-color-mode=dark] label.required,html[data-netbox-color-mode=light] label.required{font-weight:700}}@media print{html label.required:after,html[data-netbox-color-mode=dark] label.required:after,html[data-netbox-color-mode=light] label.required:after{position:absolute;display:inline-block;margin:0 0 0 2px;font-family:"Material Design Icons";font-size:8px;font-style:normal;font-weight:600;text-decoration:none;content:"\f06c4"}}@media print{html div.bulk-buttons,html[data-netbox-color-mode=dark] div.bulk-buttons,html[data-netbox-color-mode=light] div.bulk-buttons{display:flex;justify-content:space-between;margin:.5rem 0}}@media print{html div.bulk-buttons>div.bulk-button-group,html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group,html[data-netbox-color-mode=light] div.bulk-buttons>div.bulk-button-group{display:flex;flex-wrap:wrap;align-items:flex-start}}@media print{html div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child,html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child,html[data-netbox-color-mode=light] div.bulk-buttons>div.bulk-button-group:first-of-type:not(:last-of-type)>*:first-child{margin-left:0}}@media print{html div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child,html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child,html[data-netbox-color-mode=light] div.bulk-buttons>div.bulk-button-group:last-of-type:not(:first-of-type)>*:last-child{margin-right:0}}@media print{html div.bulk-buttons>div.bulk-button-group>*,html[data-netbox-color-mode=dark] div.bulk-buttons>div.bulk-button-group>*,html[data-netbox-color-mode=light] div.bulk-buttons>div.bulk-button-group>*{margin:.25rem}}@media print{html table tbody tr.primary,html[data-netbox-color-mode=dark] table tbody tr.primary,html[data-netbox-color-mode=light] table tbody tr.primary{background-color:#337ab726;border-color:#adb5bd}}@media print{html table tbody tr.secondary,html[data-netbox-color-mode=dark] table tbody tr.secondary,html[data-netbox-color-mode=light] table tbody tr.secondary{background-color:#6c757d26;border-color:#adb5bd}}@media print{html table tbody tr.success,html[data-netbox-color-mode=dark] table tbody tr.success,html[data-netbox-color-mode=light] table tbody tr.success{background-color:#19875426;border-color:#adb5bd}}@media print{html table tbody tr.info,html[data-netbox-color-mode=dark] table tbody tr.info,html[data-netbox-color-mode=light] table tbody tr.info{background-color:#54d6f026;border-color:#adb5bd}}@media print{html table tbody tr.warning,html[data-netbox-color-mode=dark] table tbody tr.warning,html[data-netbox-color-mode=light] table tbody tr.warning{background-color:#ffc10726;border-color:#adb5bd}}@media print{html table tbody tr.danger,html[data-netbox-color-mode=dark] table tbody tr.danger,html[data-netbox-color-mode=light] table tbody tr.danger{background-color:#dc354526;border-color:#adb5bd}}@media print{html table tbody tr.light,html[data-netbox-color-mode=dark] table tbody tr.light,html[data-netbox-color-mode=light] table tbody tr.light{background-color:#e9ecef26;border-color:#adb5bd}}@media print{html table tbody tr.dark,html[data-netbox-color-mode=dark] table tbody tr.dark,html[data-netbox-color-mode=light] table tbody tr.dark{background-color:#343a4026;border-color:#adb5bd}}@media print{html table tbody tr.blue,html[data-netbox-color-mode=dark] table tbody tr.blue,html[data-netbox-color-mode=light] table tbody tr.blue{background-color:#0d6efd26;border-color:#adb5bd}}@media print{html table tbody tr.indigo,html[data-netbox-color-mode=dark] table tbody tr.indigo,html[data-netbox-color-mode=light] table tbody tr.indigo{background-color:#6610f226;border-color:#adb5bd}}@media print{html table tbody tr.purple,html[data-netbox-color-mode=dark] table tbody tr.purple,html[data-netbox-color-mode=light] table tbody tr.purple{background-color:#6f42c126;border-color:#adb5bd}}@media print{html table tbody tr.pink,html[data-netbox-color-mode=dark] table tbody tr.pink,html[data-netbox-color-mode=light] table tbody tr.pink{background-color:#d6338426;border-color:#adb5bd}}@media print{html table tbody tr.red,html[data-netbox-color-mode=dark] table tbody tr.red,html[data-netbox-color-mode=light] table tbody tr.red{background-color:#dc354526;border-color:#adb5bd}}@media print{html table tbody tr.orange,html[data-netbox-color-mode=dark] table tbody tr.orange,html[data-netbox-color-mode=light] table tbody tr.orange{background-color:#fd7e1426;border-color:#adb5bd}}@media print{html table tbody tr.yellow,html[data-netbox-color-mode=dark] table tbody tr.yellow,html[data-netbox-color-mode=light] table tbody tr.yellow{background-color:#ffc10726;border-color:#adb5bd}}@media print{html table tbody tr.green,html[data-netbox-color-mode=dark] table tbody tr.green,html[data-netbox-color-mode=light] table tbody tr.green{background-color:#19875426;border-color:#adb5bd}}@media print{html table tbody tr.teal,html[data-netbox-color-mode=dark] table tbody tr.teal,html[data-netbox-color-mode=light] table tbody tr.teal{background-color:#20c99726;border-color:#adb5bd}}@media print{html table tbody tr.cyan,html[data-netbox-color-mode=dark] table tbody tr.cyan,html[data-netbox-color-mode=light] table tbody tr.cyan{background-color:#0dcaf026;border-color:#adb5bd}}@media print{html table tbody tr.gray,html[data-netbox-color-mode=dark] table tbody tr.gray,html[data-netbox-color-mode=light] table tbody tr.gray{background-color:#adb5bd26;border-color:#adb5bd}}@media print{html table tbody tr.black,html[data-netbox-color-mode=dark] table tbody tr.black,html[data-netbox-color-mode=light] table tbody tr.black{background-color:#00000026;border-color:#adb5bd}}@media print{html table tbody tr.white,html[data-netbox-color-mode=dark] table tbody tr.white,html[data-netbox-color-mode=light] table tbody tr.white{background-color:#ffffff26;border-color:#adb5bd}}@media print{html table .table-badge-group .table-badge,html[data-netbox-color-mode=dark] table .table-badge-group .table-badge,html[data-netbox-color-mode=light] table .table-badge-group .table-badge{display:block;width:min-content;font-size:.875rem;font-weight:400}}@media print{html table .table-badge-group .table-badge:not(.badge),html[data-netbox-color-mode=dark] table .table-badge-group .table-badge:not(.badge),html[data-netbox-color-mode=light] table .table-badge-group .table-badge:not(.badge){padding:0 .65em}}@media print{html table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child),html[data-netbox-color-mode=dark] table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child),html[data-netbox-color-mode=light] table .table-badge-group .table-badge.badge:not(:last-of-type):not(:only-child){margin-bottom:.25rem}}@media print{html pre.change-data,html[data-netbox-color-mode=dark] pre.change-data,html[data-netbox-color-mode=light] pre.change-data{padding-right:0;padding-left:0}}@media print{html pre.change-data>span,html[data-netbox-color-mode=dark] pre.change-data>span,html[data-netbox-color-mode=light] pre.change-data>span{display:block;padding-right:1rem;padding-left:1rem}}@media print{html pre.change-data>span.added,html[data-netbox-color-mode=dark] pre.change-data>span.added,html[data-netbox-color-mode=light] pre.change-data>span.added{background-color:var(--nbx-change-added)}}@media print{html pre.change-data>span.removed,html[data-netbox-color-mode=dark] pre.change-data>span.removed,html[data-netbox-color-mode=light] pre.change-data>span.removed{background-color:var(--nbx-change-removed)}}@media print{html pre.change-diff,html[data-netbox-color-mode=dark] pre.change-diff,html[data-netbox-color-mode=light] pre.change-diff{border-color:transparent}}@media print{html pre.change-diff.change-removed,html[data-netbox-color-mode=dark] pre.change-diff.change-removed,html[data-netbox-color-mode=light] pre.change-diff.change-removed{background-color:var(--nbx-change-removed)}}@media print{html pre.change-diff.change-added,html[data-netbox-color-mode=dark] pre.change-diff.change-added,html[data-netbox-color-mode=light] pre.change-diff.change-added{background-color:var(--nbx-change-added)}}@media print{html div.card-overlay,html[data-netbox-color-mode=dark] div.card-overlay,html[data-netbox-color-mode=light] div.card-overlay{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#ffffffbf;border-radius:.375rem}}@media print{html div.card-overlay>div.spinner-border,html[data-netbox-color-mode=dark] div.card-overlay>div.spinner-border,html[data-netbox-color-mode=light] div.card-overlay>div.spinner-border{width:6rem;height:6rem;color:#6c757d}}@media print{html .table-controls,html[data-netbox-color-mode=dark] .table-controls,html[data-netbox-color-mode=light] .table-controls{display:flex}}@media print and (min-width: 768px){html .table-controls,html[data-netbox-color-mode=dark] .table-controls,html[data-netbox-color-mode=light] .table-controls{margin-top:0!important;margin-bottom:0!important}}@media print{html .table-controls .table-configure,html[data-netbox-color-mode=dark] .table-controls .table-configure,html[data-netbox-color-mode=light] .table-controls .table-configure{justify-content:flex-start}}@media print and (min-width: 768px){html .table-controls .table-configure,html[data-netbox-color-mode=dark] .table-controls .table-configure,html[data-netbox-color-mode=light] .table-controls .table-configure{justify-content:flex-end}}@media print{html .table-controls .form-switch.form-check-inline,html[data-netbox-color-mode=dark] .table-controls .form-switch.form-check-inline,html[data-netbox-color-mode=light] .table-controls .form-switch.form-check-inline{flex:1 0 auto;font-size:.875rem}}@media print{html .nav-tabs .nav-link:hover,html[data-netbox-color-mode=dark] .nav-tabs .nav-link:hover,html[data-netbox-color-mode=light] .nav-tabs .nav-link:hover{border-bottom-color:transparent}}@media print{html .nav-tabs .nav-link.active,html[data-netbox-color-mode=dark] .nav-tabs .nav-link.active,html[data-netbox-color-mode=light] .nav-tabs .nav-link.active{background-color:#f8f9fa;border-bottom-color:#f8f9fa;transform:translateY(1px)}}@media print{html .tab-content,html[data-netbox-color-mode=dark] .tab-content,html[data-netbox-color-mode=light] .tab-content{display:flex;flex-direction:column;padding:1rem;background-color:#f8f9fa;border-bottom:1px solid #dee2e6}}@media print{html .tab-content,html[data-netbox-color-mode=dark] .tab-content,html[data-netbox-color-mode=light] .tab-content{background-color:var(--nbx-body-bg)!important;border-bottom:none!important}}@media print{html .masonry,html[data-netbox-color-mode=dark] .masonry,html[data-netbox-color-mode=light] .masonry{position:static!important;display:block!important;height:unset!important}}@media print{html .masonry .masonry-item,html[data-netbox-color-mode=dark] .masonry .masonry-item,html[data-netbox-color-mode=light] .masonry .masonry-item{position:static!important;top:unset!important;left:unset!important;display:block!important}}@media print{html .record-depth,html[data-netbox-color-mode=dark] .record-depth,html[data-netbox-color-mode=light] .record-depth{display:inline;font-size:1rem;user-select:none;opacity:.33}}@media print{html .record-depth span:only-of-type,html .record-depth span:last-of-type,html[data-netbox-color-mode=dark] .record-depth span:only-of-type,html[data-netbox-color-mode=dark] .record-depth span:last-of-type,html[data-netbox-color-mode=light] .record-depth span:only-of-type,html[data-netbox-color-mode=light] .record-depth span:last-of-type{margin-right:.25rem}}@media print{html .popover.image-preview-popover,html[data-netbox-color-mode=dark] .popover.image-preview-popover,html[data-netbox-color-mode=light] .popover.image-preview-popover{max-width:unset}}@media print{html .rendered-markdown table,html[data-netbox-color-mode=dark] .rendered-markdown table,html[data-netbox-color-mode=light] .rendered-markdown table{width:100%}}@media print{html .rendered-markdown th,html[data-netbox-color-mode=dark] .rendered-markdown th,html[data-netbox-color-mode=light] .rendered-markdown th{border-bottom:2px solid #ddd;padding:8px}}@media print{html .rendered-markdown td,html[data-netbox-color-mode=dark] .rendered-markdown td,html[data-netbox-color-mode=light] .rendered-markdown td{border-top:1px solid #ddd;padding:8px}}@media print{html td pre,html[data-netbox-color-mode=dark] td pre,html[data-netbox-color-mode=light] td pre{margin-bottom:0}}@media print{html pre.block,html[data-netbox-color-mode=dark] pre.block,html[data-netbox-color-mode=light] pre.block{padding:1rem;background-color:var(--nbx-pre-bg);border:1px solid var(--nbx-pre-border-color);border-radius:.375rem}}@media print{html #django-messages,html[data-netbox-color-mode=dark] #django-messages,html[data-netbox-color-mode=light] #django-messages{position:fixed;right:1rem;bottom:0;margin:1rem}}@media print{html html[data-netbox-url-name=home] .content-container,html html[data-netbox-url-name=home] .search,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home] .content-container,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home] .search,html[data-netbox-color-mode=light] html[data-netbox-url-name=home] .content-container,html[data-netbox-color-mode=light] html[data-netbox-url-name=home] .search{background-color:#f8f9fa!important}}@media print{html html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html[data-netbox-color-mode=dark] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search,html[data-netbox-color-mode=light] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .content-container,html[data-netbox-color-mode=light] html[data-netbox-url-name=home][data-netbox-color-mode=dark] .search{background-color:#171b1d!important}}@media print{html html[data-netbox-url-name=login] #django-messages,html[data-netbox-color-mode=dark] html[data-netbox-url-name=login] #django-messages,html[data-netbox-color-mode=light] html[data-netbox-url-name=login] #django-messages{display:none}} diff --git a/netbox/project-static/styles/theme-base.scss b/netbox/project-static/styles/theme-base.scss index 26a1811bc84..97f6dd0207d 100644 --- a/netbox/project-static/styles/theme-base.scss +++ b/netbox/project-static/styles/theme-base.scss @@ -33,95 +33,6 @@ $darkest: #171b1d; @import '../node_modules/bootstrap/scss/variables'; -// Make color palette colors available as theme colors. -// For example, you could use `.bg-red-100`, if needed. -$theme-color-addons: ( - 'darker': $darker, - 'darkest': $darkest, - 'gray': $gray-400, - 'gray-100': $gray-100, - 'gray-200': $gray-200, - 'gray-300': $gray-300, - 'gray-400': $gray-400, - 'gray-500': $gray-500, - 'gray-600': $gray-600, - 'gray-700': $gray-700, - 'gray-800': $gray-800, - 'gray-900': $gray-900, - 'red-100': $red-100, - 'red-200': $red-200, - 'red-300': $red-300, - 'red-400': $red-400, - 'red-500': $red-500, - 'red-600': $red-600, - 'red-700': $red-700, - 'red-800': $red-800, - 'red-900': $red-900, - 'yellow-100': $yellow-100, - 'yellow-200': $yellow-200, - 'yellow-300': $yellow-300, - 'yellow-400': $yellow-400, - 'yellow-500': $yellow-500, - 'yellow-600': $yellow-600, - 'yellow-700': $yellow-700, - 'yellow-800': $yellow-800, - 'yellow-900': $yellow-900, - 'green-100': $green-100, - 'green-200': $green-200, - 'green-300': $green-300, - 'green-400': $green-400, - 'green-500': $green-500, - 'green-600': $green-600, - 'green-700': $green-700, - 'green-800': $green-800, - 'green-900': $green-900, - 'blue-100': $blue-100, - 'blue-200': $blue-200, - 'blue-300': $blue-300, - 'blue-400': $blue-400, - 'blue-500': $blue-500, - 'blue-600': $blue-600, - 'blue-700': $blue-700, - 'blue-800': $blue-800, - 'blue-900': $blue-900, - 'cyan-100': $cyan-100, - 'cyan-200': $cyan-200, - 'cyan-300': $cyan-300, - 'cyan-400': $cyan-400, - 'cyan-500': $cyan-500, - 'cyan-600': $cyan-600, - 'cyan-700': $cyan-700, - 'cyan-800': $cyan-800, - 'cyan-900': $cyan-900, - 'indigo-100': $indigo-100, - 'indigo-200': $indigo-200, - 'indigo-300': $indigo-300, - 'indigo-400': $indigo-400, - 'indigo-500': $indigo-500, - 'indigo-600': $indigo-600, - 'indigo-700': $indigo-700, - 'indigo-800': $indigo-800, - 'indigo-900': $indigo-900, - 'purple-100': $purple-100, - 'purple-200': $purple-200, - 'purple-300': $purple-300, - 'purple-400': $purple-400, - 'purple-500': $purple-500, - 'purple-600': $purple-600, - 'purple-700': $purple-700, - 'purple-800': $purple-800, - 'purple-900': $purple-900, - 'pink-100': $pink-100, - 'pink-200': $pink-200, - 'pink-300': $pink-300, - 'pink-400': $pink-400, - 'pink-500': $pink-500, - 'pink-600': $pink-600, - 'pink-700': $pink-700, - 'pink-800': $pink-800, - 'pink-900': $pink-900, -); - // This is the same value as the default from Bootstrap, but it needs to be in scope prior to // importing _variables.scss from Bootstrap. $btn-close-width: 1em; diff --git a/netbox/project-static/styles/theme-dark.scss b/netbox/project-static/styles/theme-dark.scss index c5fb5dcf144..c787d38bf8f 100644 --- a/netbox/project-static/styles/theme-dark.scss +++ b/netbox/project-static/styles/theme-dark.scss @@ -3,6 +3,7 @@ @use 'sass:map'; @import './theme-base'; +// Theme colors (BS5 classes) $primary: $blue-300; $secondary: $gray-500; $success: $green-300; @@ -13,6 +14,7 @@ $light: $gray-300; $dark: $gray-500; $theme-colors: ( + // BS5 theme colors 'primary': $primary, 'secondary': $secondary, 'success': $success, @@ -21,18 +23,23 @@ $theme-colors: ( 'danger': $danger, 'light': $light, 'dark': $dark, - 'red': $red-300, - 'yellow': $yellow-300, - 'green': $green-300, + + // General-purpose palette 'blue': $blue-300, - 'cyan': $cyan-300, 'indigo': $indigo-300, 'purple': $purple-300, 'pink': $pink-300, + 'red': $red-300, + 'orange': $orange-300, + 'yellow': $yellow-300, + 'green': $green-300, + 'teal': $teal-300, + 'cyan': $cyan-300, + 'gray': $gray-300, + 'black': $black, + 'white': $white, ); -$theme-colors: map-merge($theme-colors, $theme-color-addons); - // Gradient $gradient: linear-gradient(180deg, rgba($white, 0.15), rgba($white, 0)); diff --git a/netbox/project-static/styles/theme-light.scss b/netbox/project-static/styles/theme-light.scss index 4e638c75e76..05ead54b5e0 100644 --- a/netbox/project-static/styles/theme-light.scss +++ b/netbox/project-static/styles/theme-light.scss @@ -4,23 +4,42 @@ $input-border-color: $gray-200; -$theme-colors: map-merge( - $theme-colors, - ( - 'primary': #337ab7, - 'info': #54d6f0, - 'red': $red-500, - 'yellow': $yellow-500, - 'green': $green-500, - 'blue': $blue-500, - 'cyan': $cyan-500, - 'indigo': $indigo-500, - 'purple': $purple-500, - 'pink': $pink-500, - ) -); +// Theme colors (BS5 classes) +$primary: #337ab7; +$secondary: $gray-600; +$success: $green-500; +$info: #54d6f0; +$warning: $yellow-500; +$danger: $red-500; +$light: $gray-200; +$dark: $gray-800; -$theme-colors: map-merge($theme-colors, $theme-color-addons); +$theme-colors: ( + // BS5 theme colors + 'primary': $primary, + 'secondary': $secondary, + 'success': $success, + 'info': $info, + 'warning': $warning, + 'danger': $danger, + 'light': $light, + 'dark': $dark, + + // General-purpose palette + 'blue': $blue-500, + 'indigo': $indigo-500, + 'purple': $purple-500, + 'pink': $pink-500, + 'red': $red-500, + 'orange': $orange-500, + 'yellow': $yellow-500, + 'green': $green-500, + 'teal': $teal-500, + 'cyan': $cyan-500, + 'gray': $gray-500, + 'black': $black, + 'white': $white, +); $light: $gray-200; From b3ea007e0a286ad414162a53b10dc248e134723f Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 20:18:07 -0500 Subject: [PATCH 055/271] Update ChoiceSets to use base colors --- netbox/circuits/choices.py | 12 ++++---- netbox/dcim/choices.py | 52 ++++++++++++++++---------------- netbox/extras/choices.py | 24 +++++++-------- netbox/ipam/choices.py | 46 ++++++++++++++-------------- netbox/virtualization/choices.py | 12 ++++---- 5 files changed, 73 insertions(+), 73 deletions(-) diff --git a/netbox/circuits/choices.py b/netbox/circuits/choices.py index 007b4529834..fd58abb97cb 100644 --- a/netbox/circuits/choices.py +++ b/netbox/circuits/choices.py @@ -16,12 +16,12 @@ class CircuitStatusChoices(ChoiceSet): STATUS_DECOMMISSIONED = 'decommissioned' CHOICES = [ - (STATUS_PLANNED, 'Planned', 'info'), - (STATUS_PROVISIONING, 'Provisioning', 'primary'), - (STATUS_ACTIVE, 'Active', 'success'), - (STATUS_OFFLINE, 'Offline', 'danger'), - (STATUS_DEPROVISIONING, 'Deprovisioning', 'warning'), - (STATUS_DECOMMISSIONED, 'Decommissioned', 'secondary'), + (STATUS_PLANNED, 'Planned', 'cyan'), + (STATUS_PROVISIONING, 'Provisioning', 'blue'), + (STATUS_ACTIVE, 'Active', 'green'), + (STATUS_OFFLINE, 'Offline', 'red'), + (STATUS_DEPROVISIONING, 'Deprovisioning', 'yellow'), + (STATUS_DECOMMISSIONED, 'Decommissioned', 'gray'), ] diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index bcc9265804d..368ee1336ce 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -15,11 +15,11 @@ class SiteStatusChoices(ChoiceSet): STATUS_RETIRED = 'retired' CHOICES = [ - (STATUS_PLANNED, 'Planned', 'info'), - (STATUS_STAGING, 'Staging', 'primary'), - (STATUS_ACTIVE, 'Active', 'primary'), - (STATUS_DECOMMISSIONING, 'Decommissioning', 'warning'), - (STATUS_RETIRED, 'Retired', 'danger'), + (STATUS_PLANNED, 'Planned', 'cyan'), + (STATUS_STAGING, 'Staging', 'blue'), + (STATUS_ACTIVE, 'Active', 'green'), + (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'), + (STATUS_RETIRED, 'Retired', 'red'), ] @@ -69,11 +69,11 @@ class RackStatusChoices(ChoiceSet): STATUS_DEPRECATED = 'deprecated' CHOICES = [ - (STATUS_RESERVED, 'Reserved', 'warning'), - (STATUS_AVAILABLE, 'Available', 'success'), - (STATUS_PLANNED, 'Planned', 'info'), - (STATUS_ACTIVE, 'Active', 'primary'), - (STATUS_DEPRECATED, 'Deprecated', 'danger'), + (STATUS_RESERVED, 'Reserved', 'yellow'), + (STATUS_AVAILABLE, 'Available', 'green'), + (STATUS_PLANNED, 'Planned', 'cyan'), + (STATUS_ACTIVE, 'Active', 'blue'), + (STATUS_DEPRECATED, 'Deprecated', 'red'), ] @@ -141,13 +141,13 @@ class DeviceStatusChoices(ChoiceSet): STATUS_DECOMMISSIONING = 'decommissioning' CHOICES = [ - (STATUS_OFFLINE, 'Offline', 'warning'), - (STATUS_ACTIVE, 'Active', 'success'), - (STATUS_PLANNED, 'Planned', 'info'), - (STATUS_STAGED, 'Staged', 'primary'), - (STATUS_FAILED, 'Failed', 'danger'), - (STATUS_INVENTORY, 'Inventory', 'secondary'), - (STATUS_DECOMMISSIONING, 'Decommissioning', 'warning'), + (STATUS_OFFLINE, 'Offline', 'gray'), + (STATUS_ACTIVE, 'Active', 'green'), + (STATUS_PLANNED, 'Planned', 'cyan'), + (STATUS_STAGED, 'Staged', 'blue'), + (STATUS_FAILED, 'Failed', 'red'), + (STATUS_INVENTORY, 'Inventory', 'purple'), + (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'), ] @@ -1121,9 +1121,9 @@ class LinkStatusChoices(ChoiceSet): STATUS_DECOMMISSIONING = 'decommissioning' CHOICES = ( - (STATUS_CONNECTED, 'Connected', 'success'), - (STATUS_PLANNED, 'Planned', 'info'), - (STATUS_DECOMMISSIONING, 'Decommissioning', 'warning'), + (STATUS_CONNECTED, 'Connected', 'green'), + (STATUS_PLANNED, 'Planned', 'blue'), + (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'), ) @@ -1162,10 +1162,10 @@ class PowerFeedStatusChoices(ChoiceSet): STATUS_FAILED = 'failed' CHOICES = [ - (STATUS_OFFLINE, 'Offline', 'warning'), - (STATUS_ACTIVE, 'Active', 'success'), - (STATUS_PLANNED, 'Planned', 'info'), - (STATUS_FAILED, 'Failed', 'danger'), + (STATUS_OFFLINE, 'Offline', 'gray'), + (STATUS_ACTIVE, 'Active', 'green'), + (STATUS_PLANNED, 'Planned', 'blue'), + (STATUS_FAILED, 'Failed', 'red'), ] @@ -1175,8 +1175,8 @@ class PowerFeedTypeChoices(ChoiceSet): TYPE_REDUNDANT = 'redundant' CHOICES = ( - (TYPE_PRIMARY, 'Primary', 'success'), - (TYPE_REDUNDANT, 'Redundant', 'info'), + (TYPE_PRIMARY, 'Primary', 'green'), + (TYPE_REDUNDANT, 'Redundant', 'cyan'), ) diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index ff117c4e5d4..c01e64831d0 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -91,9 +91,9 @@ class ObjectChangeActionChoices(ChoiceSet): ACTION_DELETE = 'delete' CHOICES = ( - (ACTION_CREATE, 'Created', 'success'), - (ACTION_UPDATE, 'Updated', 'primary'), - (ACTION_DELETE, 'Deleted', 'danger'), + (ACTION_CREATE, 'Created', 'green'), + (ACTION_UPDATE, 'Updated', 'blue'), + (ACTION_DELETE, 'Deleted', 'red'), ) @@ -109,10 +109,10 @@ class JournalEntryKindChoices(ChoiceSet): KIND_DANGER = 'danger' CHOICES = ( - (KIND_INFO, 'Info', 'info'), - (KIND_SUCCESS, 'Success', 'success'), - (KIND_WARNING, 'Warning', 'warning'), - (KIND_DANGER, 'Danger', 'danger'), + (KIND_INFO, 'Info', 'cyan'), + (KIND_SUCCESS, 'Success', 'green'), + (KIND_WARNING, 'Warning', 'yellow'), + (KIND_DANGER, 'Danger', 'red'), ) @@ -129,11 +129,11 @@ class LogLevelChoices(ChoiceSet): LOG_FAILURE = 'failure' CHOICES = ( - (LOG_DEFAULT, 'Default', 'secondary'), - (LOG_SUCCESS, 'Success', 'success'), - (LOG_INFO, 'Info', 'info'), - (LOG_WARNING, 'Warning', 'warning'), - (LOG_FAILURE, 'Failure', 'danger'), + (LOG_DEFAULT, 'Default', 'gray'), + (LOG_SUCCESS, 'Success', 'green'), + (LOG_INFO, 'Info', 'cyan'), + (LOG_WARNING, 'Warning', 'yellow'), + (LOG_FAILURE, 'Failure', 'red'), ) diff --git a/netbox/ipam/choices.py b/netbox/ipam/choices.py index 849f6a6bc12..f9e4afffb49 100644 --- a/netbox/ipam/choices.py +++ b/netbox/ipam/choices.py @@ -25,10 +25,10 @@ class PrefixStatusChoices(ChoiceSet): STATUS_DEPRECATED = 'deprecated' CHOICES = [ - (STATUS_CONTAINER, 'Container', 'secondary'), - (STATUS_ACTIVE, 'Active', 'primary'), - (STATUS_RESERVED, 'Reserved', 'info'), - (STATUS_DEPRECATED, 'Deprecated', 'danger'), + (STATUS_CONTAINER, 'Container', 'gray'), + (STATUS_ACTIVE, 'Active', 'blue'), + (STATUS_RESERVED, 'Reserved', 'cyan'), + (STATUS_DEPRECATED, 'Deprecated', 'red'), ] @@ -44,9 +44,9 @@ class IPRangeStatusChoices(ChoiceSet): STATUS_DEPRECATED = 'deprecated' CHOICES = [ - (STATUS_ACTIVE, 'Active', 'primary'), - (STATUS_RESERVED, 'Reserved', 'info'), - (STATUS_DEPRECATED, 'Deprecated', 'danger'), + (STATUS_ACTIVE, 'Active', 'blue'), + (STATUS_RESERVED, 'Reserved', 'cyan'), + (STATUS_DEPRECATED, 'Deprecated', 'red'), ] @@ -64,11 +64,11 @@ class IPAddressStatusChoices(ChoiceSet): STATUS_SLAAC = 'slaac' CHOICES = [ - (STATUS_ACTIVE, 'Active', 'primary'), - (STATUS_RESERVED, 'Reserved', 'info'), - (STATUS_DEPRECATED, 'Deprecated', 'danger'), - (STATUS_DHCP, 'DHCP', 'success'), - (STATUS_SLAAC, 'SLAAC', 'success'), + (STATUS_ACTIVE, 'Active', 'blue'), + (STATUS_RESERVED, 'Reserved', 'cyan'), + (STATUS_DEPRECATED, 'Deprecated', 'red'), + (STATUS_DHCP, 'DHCP', 'green'), + (STATUS_SLAAC, 'SLAAC', 'purple'), ] @@ -84,14 +84,14 @@ class IPAddressRoleChoices(ChoiceSet): ROLE_CARP = 'carp' CHOICES = ( - (ROLE_LOOPBACK, 'Loopback', 'secondary'), - (ROLE_SECONDARY, 'Secondary', 'primary'), - (ROLE_ANYCAST, 'Anycast', 'warning'), - (ROLE_VIP, 'VIP'), - (ROLE_VRRP, 'VRRP', 'success'), - (ROLE_HSRP, 'HSRP', 'success'), - (ROLE_GLBP, 'GLBP', 'success'), - (ROLE_CARP, 'CARP'), 'success', + (ROLE_LOOPBACK, 'Loopback', 'gray'), + (ROLE_SECONDARY, 'Secondary', 'blue'), + (ROLE_ANYCAST, 'Anycast', 'yellow'), + (ROLE_VIP, 'VIP', 'purple'), + (ROLE_VRRP, 'VRRP', 'green'), + (ROLE_HSRP, 'HSRP', 'green'), + (ROLE_GLBP, 'GLBP', 'green'), + (ROLE_CARP, 'CARP'), 'green', ) @@ -141,9 +141,9 @@ class VLANStatusChoices(ChoiceSet): STATUS_DEPRECATED = 'deprecated' CHOICES = [ - (STATUS_ACTIVE, 'Active', 'primary'), - (STATUS_RESERVED, 'Reserved', 'info'), - (STATUS_DEPRECATED, 'Deprecated', 'danger'), + (STATUS_ACTIVE, 'Active', 'blue'), + (STATUS_RESERVED, 'Reserved', 'cyan'), + (STATUS_DEPRECATED, 'Deprecated', 'red'), ] diff --git a/netbox/virtualization/choices.py b/netbox/virtualization/choices.py index 1aaaf6bf9a2..bb9220d09ff 100644 --- a/netbox/virtualization/choices.py +++ b/netbox/virtualization/choices.py @@ -16,10 +16,10 @@ class VirtualMachineStatusChoices(ChoiceSet): STATUS_DECOMMISSIONING = 'decommissioning' CHOICES = [ - (STATUS_OFFLINE, 'Offline', 'warning'), - (STATUS_ACTIVE, 'Active', 'success'), - (STATUS_PLANNED, 'Planned', 'info'), - (STATUS_STAGED, 'Staged', 'primary'), - (STATUS_FAILED, 'Failed', 'danger'), - (STATUS_DECOMMISSIONING, 'Decommissioning', 'warning'), + (STATUS_OFFLINE, 'Offline', 'gray'), + (STATUS_ACTIVE, 'Active', 'green'), + (STATUS_PLANNED, 'Planned', 'cyan'), + (STATUS_STAGED, 'Staged', 'blue'), + (STATUS_FAILED, 'Failed', 'red'), + (STATUS_DECOMMISSIONING, 'Decommissioning', 'yellow'), ] From b60ace80be3896966005b03ce93641afd20851b5 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 28 Dec 2021 20:21:35 -0500 Subject: [PATCH 056/271] Update documentation for FIELD_CHOICES --- docs/configuration/optional-settings.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/docs/configuration/optional-settings.md b/docs/configuration/optional-settings.md index fcebf7af629..110ca932210 100644 --- a/docs/configuration/optional-settings.md +++ b/docs/configuration/optional-settings.md @@ -161,16 +161,16 @@ EXEMPT_VIEW_PERMISSIONS = ['*'] Default: Empty dictionary -Some static choice fields on models can be configured with custom values. This is done by defining `FIELD_CHOICES` as a dictionary mapping model fields to their choices list. Each choice in the list must have a database value and a human-friendly label, and may optionally specify a color. +Some static choice fields on models can be configured with custom values. This is done by defining `FIELD_CHOICES` as a dictionary mapping model fields to their choices list. Each choice in the list must have a database value and a human-friendly label, and may optionally specify a color. (A list of available colors is provided below.) For example, to specify a custom set of choices for the site status field: ```python FIELD_CHOICES = { 'dcim.Site.status': ( - ('foo', 'Foo'), - ('bar', 'Bar'), - ('baz', 'Baz'), + ('foo', 'Foo', 'red'), + ('bar', 'Bar', 'green'), + ('baz', 'Baz', 'blue'), ) } ``` @@ -190,6 +190,22 @@ The following model field support configurable choices: * `ipam.VLAN.status` * `virtualization.VirtualMachine.status` +The following colors are supported: + +* `blue` +* `indigo` +* `purple` +* `pink` +* `red` +* `orange` +* `yellow` +* `green` +* `teal` +* `cyan` +* `gray` +* `black` +* `white` + --- ## HTTP_PROXIES From 4c15f4a84f9d18ece8d908c3bdaf0e92bb723666 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 29 Dec 2021 15:02:25 -0500 Subject: [PATCH 057/271] Initial work on #8118 --- netbox/dcim/api/nested_serializers.py | 10 ++ netbox/dcim/api/serializers.py | 34 +++++ netbox/dcim/api/urls.py | 1 + netbox/dcim/api/views.py | 6 + netbox/dcim/constants.py | 12 ++ netbox/dcim/filtersets.py | 44 +++++++ netbox/dcim/forms/bulk_edit.py | 26 ++++ netbox/dcim/forms/models.py | 43 +++++++ netbox/dcim/forms/object_import.py | 85 ++++++++++--- netbox/dcim/graphql/schema.py | 3 + netbox/dcim/graphql/types.py | 9 ++ .../0148_inventoryitem_templates.py | 43 +++++++ .../dcim/models/device_component_templates.py | 120 ++++++++++++++++-- netbox/dcim/models/devices.py | 3 + netbox/dcim/tables/devicetypes.py | 26 +++- netbox/dcim/tests/test_api.py | 51 ++++++++ netbox/dcim/tests/test_filtersets.py | 80 ++++++++++++ netbox/dcim/tests/test_views.py | 72 ++++++++++- netbox/dcim/urls.py | 11 +- netbox/dcim/views.py | 54 ++++++++ netbox/templates/dcim/devicetype/base.html | 11 ++ 21 files changed, 712 insertions(+), 32 deletions(-) create mode 100644 netbox/dcim/migrations/0148_inventoryitem_templates.py diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 0cd112a1d85..0ec0e07e0cd 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -21,6 +21,7 @@ __all__ = [ 'NestedInterfaceTemplateSerializer', 'NestedInventoryItemSerializer', 'NestedInventoryItemRoleSerializer', + 'NestedInventoryItemTemplateSerializer', 'NestedManufacturerSerializer', 'NestedModuleBaySerializer', 'NestedModuleBayTemplateSerializer', @@ -231,6 +232,15 @@ class NestedDeviceBayTemplateSerializer(WritableNestedSerializer): fields = ['id', 'url', 'display', 'name'] +class NestedInventoryItemTemplateSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') + _depth = serializers.IntegerField(source='level', read_only=True) + + class Meta: + model = models.InventoryItemTemplate + fields = ['id', 'url', 'display', 'name', '_depth'] + + # # Devices # diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 30f451e8458..3bc369a640a 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -447,6 +447,40 @@ class DeviceBayTemplateSerializer(ValidatedModelSerializer): fields = ['id', 'url', 'display', 'device_type', 'name', 'label', 'description', 'created', 'last_updated'] +class InventoryItemTemplateSerializer(ValidatedModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') + device_type = NestedDeviceTypeSerializer() + parent = serializers.PrimaryKeyRelatedField( + queryset=InventoryItemTemplate.objects.all(), + allow_null=True, + default=None + ) + role = NestedInventoryItemRoleSerializer(required=False, allow_null=True) + manufacturer = NestedManufacturerSerializer(required=False, allow_null=True, default=None) + component_type = ContentTypeField( + queryset=ContentType.objects.filter(MODULAR_COMPONENT_TEMPLATE_MODELS), + required=False, + allow_null=True + ) + component = serializers.SerializerMethodField(read_only=True) + _depth = serializers.IntegerField(source='level', read_only=True) + + class Meta: + model = InventoryItemTemplate + fields = [ + 'id', 'url', 'display', 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', + 'description', 'component_type', 'component_id', 'component', 'created', 'last_updated', '_depth', + ] + + @swagger_serializer_method(serializer_or_field=serializers.DictField) + def get_component(self, obj): + if obj.component is None: + return None + serializer = get_serializer_for_model(obj.component, prefix='Nested') + context = {'request': self.context['request']} + return serializer(obj.component, context=context).data + + # # Devices # diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index be963d36dfb..c6f48aed3ac 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -31,6 +31,7 @@ router.register('front-port-templates', views.FrontPortTemplateViewSet) router.register('rear-port-templates', views.RearPortTemplateViewSet) router.register('module-bay-templates', views.ModuleBayTemplateViewSet) router.register('device-bay-templates', views.DeviceBayTemplateViewSet) +router.register('inventory-item-templates', views.InventoryItemTemplateViewSet) # Device/modules router.register('device-roles', views.DeviceRoleViewSet) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 479abf7b2e6..31c1fd1d083 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -350,6 +350,12 @@ class DeviceBayTemplateViewSet(ModelViewSet): filterset_class = filtersets.DeviceBayTemplateFilterSet +class InventoryItemTemplateViewSet(ModelViewSet): + queryset = InventoryItemTemplate.objects.prefetch_related('device_type__manufacturer', 'role') + serializer_class = serializers.InventoryItemTemplateSerializer + filterset_class = filtersets.InventoryItemTemplateFilterSet + + # # Device roles # diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index 00126ebf82c..45844b04911 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -62,6 +62,18 @@ POWERFEED_MAX_UTILIZATION_DEFAULT = 80 # Percentage # Device components # +MODULAR_COMPONENT_TEMPLATE_MODELS = Q( + app_label='dcim', + model__in=( + 'consoleporttemplate', + 'consoleserverporttemplate', + 'frontporttemplate', + 'interfacetemplate', + 'poweroutlettemplate', + 'powerporttemplate', + 'rearporttemplate', + )) + MODULAR_COMPONENT_MODELS = Q( app_label='dcim', model__in=( diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 14a2ae3eea7..9069ab25ca7 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -40,6 +40,7 @@ __all__ = ( 'InterfaceTemplateFilterSet', 'InventoryItemFilterSet', 'InventoryItemRoleFilterSet', + 'InventoryItemTemplateFilterSet', 'LocationFilterSet', 'ManufacturerFilterSet', 'ModuleBayFilterSet', @@ -687,6 +688,49 @@ class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponent fields = ['id', 'name'] +class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): + parent_id = django_filters.ModelMultipleChoiceFilter( + queryset=InventoryItemTemplate.objects.all(), + label='Parent inventory item (ID)', + ) + manufacturer_id = django_filters.ModelMultipleChoiceFilter( + queryset=Manufacturer.objects.all(), + label='Manufacturer (ID)', + ) + manufacturer = django_filters.ModelMultipleChoiceFilter( + field_name='manufacturer__slug', + queryset=Manufacturer.objects.all(), + to_field_name='slug', + label='Manufacturer (slug)', + ) + role_id = django_filters.ModelMultipleChoiceFilter( + queryset=InventoryItemRole.objects.all(), + label='Role (ID)', + ) + role = django_filters.ModelMultipleChoiceFilter( + field_name='role__slug', + queryset=InventoryItemRole.objects.all(), + to_field_name='slug', + label='Role (slug)', + ) + component_type = ContentTypeFilter() + component_id = MultiValueNumberFilter() + + class Meta: + model = InventoryItemTemplate + fields = ['id', 'name', 'label', 'part_id'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + qs_filter = ( + Q(name__icontains=value) | + Q(part_id__icontains=value) | + Q(description__icontains=value) + ) + return queryset.filter(qs_filter) + + class DeviceRoleFilterSet(OrganizationalModelFilterSet): tag = TagFilter() diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 93a90a1cb6a..3cd8ec35e77 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -31,6 +31,7 @@ __all__ = ( 'InterfaceTemplateBulkEditForm', 'InventoryItemBulkEditForm', 'InventoryItemRoleBulkEditForm', + 'InventoryItemTemplateBulkEditForm', 'LocationBulkEditForm', 'ManufacturerBulkEditForm', 'ModuleBulkEditForm', @@ -907,6 +908,31 @@ class DeviceBayTemplateBulkEditForm(BulkEditForm): nullable_fields = ('label', 'description') +class InventoryItemTemplateBulkEditForm(BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=InventoryItemTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + description = forms.CharField( + required=False + ) + role = DynamicModelChoiceField( + queryset=InventoryItemRole.objects.all(), + required=False + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + + class Meta: + nullable_fields = ['label', 'role', 'manufacturer', 'part_id', 'description'] + + # # Device components # diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index e2c343028f5..9fcea766169 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -38,6 +38,7 @@ __all__ = ( 'InterfaceTemplateForm', 'InventoryItemForm', 'InventoryItemRoleForm', + 'InventoryItemTemplateForm', 'LocationForm', 'ManufacturerForm', 'ModuleForm', @@ -1073,6 +1074,48 @@ class DeviceBayTemplateForm(BootstrapMixin, forms.ModelForm): } +class InventoryItemTemplateForm(BootstrapMixin, forms.ModelForm): + parent = DynamicModelChoiceField( + queryset=InventoryItem.objects.all(), + required=False, + query_params={ + 'device_id': '$device' + } + ) + role = DynamicModelChoiceField( + queryset=InventoryItemRole.objects.all(), + required=False + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + component_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=MODULAR_COMPONENT_MODELS, + required=False, + widget=forms.HiddenInput + ) + component_id = forms.IntegerField( + required=False, + widget=forms.HiddenInput + ) + + class Meta: + model = InventoryItemTemplate + fields = [ + 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'description', + 'component_type', 'component_id', + ] + fieldsets = ( + ('Inventory Item', ('device_type', 'parent', 'name', 'label', 'role', 'description')), + ('Hardware', ('manufacturer', 'part_id')), + ) + widgets = { + 'device_type': forms.HiddenInput(), + } + + # # Device components # diff --git a/netbox/dcim/forms/object_import.py b/netbox/dcim/forms/object_import.py index 36c6ae8bc8e..afbcd654318 100644 --- a/netbox/dcim/forms/object_import.py +++ b/netbox/dcim/forms/object_import.py @@ -11,6 +11,7 @@ __all__ = ( 'DeviceTypeImportForm', 'FrontPortTemplateImportForm', 'InterfaceTemplateImportForm', + 'InventoryItemTemplateImportForm', 'ModuleBayTemplateImportForm', 'ModuleTypeImportForm', 'PowerOutletTemplateImportForm', @@ -49,24 +50,7 @@ class ModuleTypeImportForm(BootstrapMixin, forms.ModelForm): # class ComponentTemplateImportForm(BootstrapMixin, forms.ModelForm): - - def clean_device_type(self): - # Limit fields referencing other components to the parent DeviceType - if data := self.cleaned_data['device_type']: - for field_name, field in self.fields.items(): - if isinstance(field, forms.ModelChoiceField) and field_name not in ['device_type', 'module_type']: - field.queryset = field.queryset.filter(device_type=data) - - return data - - def clean_module_type(self): - # Limit fields referencing other components to the parent ModuleType - if data := self.cleaned_data['module_type']: - for field_name, field in self.fields.items(): - if isinstance(field, forms.ModelChoiceField) and field_name not in ['device_type', 'module_type']: - field.queryset = field.queryset.filter(module_type=data) - - return data + pass class ConsolePortTemplateImportForm(ComponentTemplateImportForm): @@ -109,6 +93,20 @@ class PowerOutletTemplateImportForm(ComponentTemplateImportForm): 'device_type', 'module_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', ] + def clean_device_type(self): + if device_type := self.cleaned_data['device_type']: + power_port = self.fields['power_port'] + power_port.queryset = power_port.queryset.filter(device_type=device_type) + + return device_type + + def clean_module_type(self): + if module_type := self.cleaned_data['module_type']: + power_port = self.fields['power_port'] + power_port.queryset = power_port.queryset.filter(module_type=module_type) + + return module_type + class InterfaceTemplateImportForm(ComponentTemplateImportForm): type = forms.ChoiceField( @@ -131,6 +129,20 @@ class FrontPortTemplateImportForm(ComponentTemplateImportForm): to_field_name='name' ) + def clean_device_type(self): + if device_type := self.cleaned_data['device_type']: + rear_port = self.fields['rear_port'] + rear_port.queryset = rear_port.queryset.filter(device_type=device_type) + + return device_type + + def clean_module_type(self): + if module_type := self.cleaned_data['module_type']: + rear_port = self.fields['rear_port'] + rear_port.queryset = rear_port.queryset.filter(module_type=module_type) + + return module_type + class Meta: model = FrontPortTemplate fields = [ @@ -166,3 +178,40 @@ class DeviceBayTemplateImportForm(ComponentTemplateImportForm): fields = [ 'device_type', 'name', 'label', 'description', ] + + +class InventoryItemTemplateImportForm(ComponentTemplateImportForm): + parent = forms.ModelChoiceField( + queryset=InventoryItemTemplate.objects.all(), + required=False + ) + role = forms.ModelChoiceField( + queryset=InventoryItemRole.objects.all(), + to_field_name='name', + required=False + ) + manufacturer = forms.ModelChoiceField( + queryset=Manufacturer.objects.all(), + to_field_name='name', + required=False + ) + + class Meta: + model = InventoryItemTemplate + fields = [ + 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'description', + ] + + def clean_device_type(self): + if device_type := self.cleaned_data['device_type']: + parent = self.fields['parent'] + parent.queryset = parent.queryset.filter(device_type=device_type) + + return device_type + + def clean_module_type(self): + if module_type := self.cleaned_data['module_type']: + parent = self.fields['parent'] + parent.queryset = parent.queryset.filter(module_type=module_type) + + return module_type diff --git a/netbox/dcim/graphql/schema.py b/netbox/dcim/graphql/schema.py index 8e03ab409ab..1d5b6a58092 100644 --- a/netbox/dcim/graphql/schema.py +++ b/netbox/dcim/graphql/schema.py @@ -53,6 +53,9 @@ class DCIMQuery(graphene.ObjectType): inventory_item_role = ObjectField(InventoryItemRoleType) inventory_item_role_list = ObjectListField(InventoryItemRoleType) + inventory_item_template = ObjectField(InventoryItemTemplateType) + inventory_item_template_list = ObjectListField(InventoryItemTemplateType) + location = ObjectField(LocationType) location_list = ObjectListField(LocationType) diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index b2a94c3ed47..a47ca40ca0a 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -26,6 +26,7 @@ __all__ = ( 'InterfaceTemplateType', 'InventoryItemType', 'InventoryItemRoleType', + 'InventoryItemTemplateType', 'LocationType', 'ManufacturerType', 'ModuleType', @@ -172,6 +173,14 @@ class DeviceBayTemplateType(ComponentTemplateObjectType): filterset_class = filtersets.DeviceBayTemplateFilterSet +class InventoryItemTemplateType(ComponentTemplateObjectType): + + class Meta: + model = models.InventoryItemTemplate + fields = '__all__' + filterset_class = filtersets.InventoryItemTemplateFilterSet + + class DeviceRoleType(OrganizationalObjectType): class Meta: diff --git a/netbox/dcim/migrations/0148_inventoryitem_templates.py b/netbox/dcim/migrations/0148_inventoryitem_templates.py new file mode 100644 index 00000000000..8c3fe78c37c --- /dev/null +++ b/netbox/dcim/migrations/0148_inventoryitem_templates.py @@ -0,0 +1,43 @@ +from django.db import migrations, models +import django.db.models.deletion +import mptt.fields +import utilities.fields +import utilities.ordering + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('dcim', '0147_inventoryitem_component'), + ] + + operations = [ + migrations.CreateModel( + name='InventoryItemTemplate', + fields=[ + ('created', models.DateField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=64)), + ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)), + ('label', models.CharField(blank=True, max_length=64)), + ('description', models.CharField(blank=True, max_length=200)), + ('component_id', models.PositiveBigIntegerField(blank=True, null=True)), + ('part_id', models.CharField(blank=True, max_length=50)), + ('lft', models.PositiveIntegerField(editable=False)), + ('rght', models.PositiveIntegerField(editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(editable=False)), + ('component_type', models.ForeignKey(blank=True, limit_choices_to=models.Q(('app_label', 'dcim'), ('model__in', ('consoleporttemplate', 'consoleserverporttemplate', 'frontporttemplate', 'interfacetemplate', 'poweroutlettemplate', 'powerporttemplate', 'rearporttemplate'))), null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')), + ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='inventoryitemtemplates', to='dcim.devicetype')), + ('manufacturer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='inventory_item_templates', to='dcim.manufacturer')), + ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='child_items', to='dcim.inventoryitemtemplate')), + ('role', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='inventory_item_templates', to='dcim.inventoryitemrole')), + ], + options={ + 'ordering': ('device_type__id', 'parent__id', '_name'), + 'unique_together': {('device_type', 'parent', 'name')}, + }, + ), + ] diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 71fed25c582..b3ede828225 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -1,15 +1,20 @@ +from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models +from mptt.models import MPTTModel, TreeForeignKey from dcim.choices import * from dcim.constants import * from extras.utils import extras_features from netbox.models import ChangeLoggedModel from utilities.fields import ColorField, NaturalOrderingField +from utilities.mptt import TreeManager from utilities.ordering import naturalize_interface from .device_components import ( - ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface, ModuleBay, PowerOutlet, PowerPort, RearPort, + ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface, InventoryItem, ModuleBay, PowerOutlet, PowerPort, + RearPort, ) @@ -19,6 +24,7 @@ __all__ = ( 'DeviceBayTemplate', 'FrontPortTemplate', 'InterfaceTemplate', + 'InventoryItemTemplate', 'ModuleBayTemplate', 'PowerOutletTemplate', 'PowerPortTemplate', @@ -140,6 +146,8 @@ class ConsolePortTemplate(ModularComponentTemplateModel): blank=True ) + component_model = ConsolePort + class Meta: ordering = ('device_type', 'module_type', '_name') unique_together = ( @@ -148,7 +156,7 @@ class ConsolePortTemplate(ModularComponentTemplateModel): ) def instantiate(self, **kwargs): - return ConsolePort( + return self.component_model( name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, @@ -167,6 +175,8 @@ class ConsoleServerPortTemplate(ModularComponentTemplateModel): blank=True ) + component_model = ConsoleServerPort + class Meta: ordering = ('device_type', 'module_type', '_name') unique_together = ( @@ -175,7 +185,7 @@ class ConsoleServerPortTemplate(ModularComponentTemplateModel): ) def instantiate(self, **kwargs): - return ConsoleServerPort( + return self.component_model( name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, @@ -206,6 +216,8 @@ class PowerPortTemplate(ModularComponentTemplateModel): help_text="Allocated power draw (watts)" ) + component_model = PowerPort + class Meta: ordering = ('device_type', 'module_type', '_name') unique_together = ( @@ -214,7 +226,7 @@ class PowerPortTemplate(ModularComponentTemplateModel): ) def instantiate(self, **kwargs): - return PowerPort( + return self.component_model( name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, @@ -257,6 +269,8 @@ class PowerOutletTemplate(ModularComponentTemplateModel): help_text="Phase (for three-phase feeds)" ) + component_model = PowerOutlet + class Meta: ordering = ('device_type', 'module_type', '_name') unique_together = ( @@ -283,7 +297,7 @@ class PowerOutletTemplate(ModularComponentTemplateModel): power_port = PowerPort.objects.get(name=self.power_port.name, **kwargs) else: power_port = None - return PowerOutlet( + return self.component_model( name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, @@ -314,6 +328,8 @@ class InterfaceTemplate(ModularComponentTemplateModel): verbose_name='Management only' ) + component_model = Interface + class Meta: ordering = ('device_type', 'module_type', '_name') unique_together = ( @@ -322,7 +338,7 @@ class InterfaceTemplate(ModularComponentTemplateModel): ) def instantiate(self, **kwargs): - return Interface( + return self.component_model( name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, @@ -356,6 +372,8 @@ class FrontPortTemplate(ModularComponentTemplateModel): ] ) + component_model = FrontPort + class Meta: ordering = ('device_type', 'module_type', '_name') unique_together = ( @@ -391,7 +409,7 @@ class FrontPortTemplate(ModularComponentTemplateModel): rear_port = RearPort.objects.get(name=self.rear_port.name, **kwargs) else: rear_port = None - return FrontPort( + return self.component_model( name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, @@ -422,6 +440,8 @@ class RearPortTemplate(ModularComponentTemplateModel): ] ) + component_model = RearPort + class Meta: ordering = ('device_type', 'module_type', '_name') unique_together = ( @@ -430,7 +450,7 @@ class RearPortTemplate(ModularComponentTemplateModel): ) def instantiate(self, **kwargs): - return RearPort( + return self.component_model( name=self.resolve_name(kwargs.get('module')), label=self.label, type=self.type, @@ -451,12 +471,14 @@ class ModuleBayTemplate(ComponentTemplateModel): help_text='Identifier to reference when renaming installed components' ) + component_model = ModuleBay + class Meta: ordering = ('device_type', '_name') unique_together = ('device_type', 'name') def instantiate(self, device): - return ModuleBay( + return self.component_model( device=device, name=self.name, label=self.label, @@ -469,12 +491,14 @@ class DeviceBayTemplate(ComponentTemplateModel): """ A template for a DeviceBay to be created for a new parent Device. """ + component_model = DeviceBay + class Meta: ordering = ('device_type', '_name') unique_together = ('device_type', 'name') def instantiate(self, device): - return DeviceBay( + return self.component_model( device=device, name=self.name, label=self.label @@ -485,3 +509,79 @@ class DeviceBayTemplate(ComponentTemplateModel): raise ValidationError( f"Subdevice role of device type ({self.device_type}) must be set to \"parent\" to allow device bays." ) + + +@extras_features('webhooks') +class InventoryItemTemplate(MPTTModel, ComponentTemplateModel): + """ + A template for an InventoryItem to be created for a new parent Device. + """ + parent = TreeForeignKey( + to='self', + on_delete=models.CASCADE, + related_name='child_items', + blank=True, + null=True, + db_index=True + ) + component_type = models.ForeignKey( + to=ContentType, + limit_choices_to=MODULAR_COMPONENT_TEMPLATE_MODELS, + on_delete=models.PROTECT, + related_name='+', + blank=True, + null=True + ) + component_id = models.PositiveBigIntegerField( + blank=True, + null=True + ) + component = GenericForeignKey( + ct_field='component_type', + fk_field='component_id' + ) + role = models.ForeignKey( + to='dcim.InventoryItemRole', + on_delete=models.PROTECT, + related_name='inventory_item_templates', + blank=True, + null=True + ) + manufacturer = models.ForeignKey( + to='dcim.Manufacturer', + on_delete=models.PROTECT, + related_name='inventory_item_templates', + blank=True, + null=True + ) + part_id = models.CharField( + max_length=50, + verbose_name='Part ID', + blank=True, + help_text='Manufacturer-assigned part identifier' + ) + + objects = TreeManager() + component_model = InventoryItem + + class Meta: + ordering = ('device_type__id', 'parent__id', '_name') + unique_together = ('device_type', 'parent', 'name') + + def instantiate(self, **kwargs): + parent = InventoryItemTemplate.objects.get(name=self.parent.name, **kwargs) if self.parent else None + if self.component: + model = self.component.component_model + component = model.objects.get(name=self.component.name, **kwargs) + else: + component = None + return self.component_model( + parent=parent, + name=self.name, + label=self.label, + component=component, + role=self.role, + manufacturer=self.manufacturer, + part_id=self.part_id, + **kwargs + ) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 8d0a7ae19e6..631f0c8c1db 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -933,6 +933,9 @@ class Device(PrimaryModel, ConfigContextModel): DeviceBay.objects.bulk_create( [x.instantiate(device=self) for x in self.device_type.devicebaytemplates.all()] ) + # Avoid bulk_create to handle MPTT + for x in self.device_type.inventoryitemtemplates.all(): + x.instantiate(device=self).save() # Update Site and Rack assignment for any child Devices devices = Device.objects.filter(parent_bay__device=self) diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index ad4c4d84412..885fe69a4d1 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -1,8 +1,9 @@ import django_tables2 as tables +from django_tables2.utils import Accessor from dcim.models import ( ConsolePortTemplate, ConsoleServerPortTemplate, DeviceBayTemplate, DeviceType, FrontPortTemplate, InterfaceTemplate, - Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, + InventoryItemTemplate, Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, ) from utilities.tables import ( BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, @@ -15,6 +16,7 @@ __all__ = ( 'DeviceTypeTable', 'FrontPortTemplateTable', 'InterfaceTemplateTable', + 'InventoryItemTemplateTable', 'ManufacturerTable', 'ModuleBayTemplateTable', 'PowerOutletTemplateTable', @@ -223,3 +225,25 @@ class DeviceBayTemplateTable(ComponentTemplateTable): model = DeviceBayTemplate fields = ('pk', 'name', 'label', 'description', 'actions') empty_text = "None" + + +class InventoryItemTemplateTable(ComponentTemplateTable): + actions = ButtonsColumn( + model=InventoryItemTemplate, + buttons=('edit', 'delete') + ) + role = tables.Column( + linkify=True + ) + manufacturer = tables.Column( + linkify=True + ) + component = tables.Column( + accessor=Accessor('component'), + orderable=False + ) + + class Meta(ComponentTemplateTable.Meta): + model = InventoryItemTemplate + fields = ('pk', 'name', 'label', 'role', 'manufacturer', 'part_id', 'component', 'description', 'actions') + empty_text = "None" diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index b3c41e277fd..0c9b918dff1 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -897,6 +897,57 @@ class DeviceBayTemplateTest(APIViewTestCases.APIViewTestCase): ] +class InventoryItemTemplateTest(APIViewTestCases.APIViewTestCase): + model = InventoryItemTemplate + brief_fields = ['_depth', 'display', 'id', 'name', 'url'] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + devicetype = DeviceType.objects.create( + manufacturer=manufacturer, + model='Device Type 1', + slug='device-type-1' + ) + role = InventoryItemRole.objects.create(name='Inventory Item Role 1', slug='inventory-item-role-1') + + inventory_item_templates = ( + InventoryItemTemplate(device_type=devicetype, name='Inventory Item Template 1', manufacturer=manufacturer, role=role), + InventoryItemTemplate(device_type=devicetype, name='Inventory Item Template 2', manufacturer=manufacturer, role=role), + InventoryItemTemplate(device_type=devicetype, name='Inventory Item Template 3', manufacturer=manufacturer, role=role), + InventoryItemTemplate(device_type=devicetype, name='Inventory Item Template 4', manufacturer=manufacturer, role=role), + ) + for item in inventory_item_templates: + item.save() + + cls.create_data = [ + { + 'device_type': devicetype.pk, + 'name': 'Inventory Item Template 5', + 'manufacturer': manufacturer.pk, + 'role': role.pk, + 'parent': inventory_item_templates[3].pk, + }, + { + 'device_type': devicetype.pk, + 'name': 'Inventory Item Template 6', + 'manufacturer': manufacturer.pk, + 'role': role.pk, + 'parent': inventory_item_templates[3].pk, + }, + { + 'device_type': devicetype.pk, + 'name': 'Inventory Item Template 7', + 'manufacturer': manufacturer.pk, + 'role': role.pk, + 'parent': inventory_item_templates[3].pk, + }, + ] + + class DeviceRoleTest(APIViewTestCases.APIViewTestCase): model = DeviceRole brief_fields = ['device_count', 'display', 'id', 'name', 'slug', 'url', 'virtualmachine_count'] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index f53705336b2..2973e46e711 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -1214,6 +1214,86 @@ class DeviceBayTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class InventoryItemTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = InventoryItemTemplate.objects.all() + filterset = InventoryItemTemplateFilterSet + + @classmethod + def setUpTestData(cls): + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + Manufacturer(name='Manufacturer 3', slug='manufacturer-3'), + ) + Manufacturer.objects.bulk_create(manufacturers) + + device_types = ( + DeviceType(manufacturer=manufacturers[0], model='Model 1', slug='model-1'), + DeviceType(manufacturer=manufacturers[0], model='Model 2', slug='model-2'), + DeviceType(manufacturer=manufacturers[0], model='Model 3', slug='model-3'), + ) + DeviceType.objects.bulk_create(device_types) + + inventory_item_roles = ( + InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1'), + InventoryItemRole(name='Inventory Item Role 2', slug='inventory-item-role-2'), + InventoryItemRole(name='Inventory Item Role 3', slug='inventory-item-role-3'), + ) + InventoryItemRole.objects.bulk_create(inventory_item_roles) + + inventory_item_templates = ( + InventoryItemTemplate(device_type=device_types[0], name='Inventory Item 1', label='A', role=inventory_item_roles[0], manufacturer=manufacturers[0], part_id='1001'), + InventoryItemTemplate(device_type=device_types[1], name='Inventory Item 2', label='B', role=inventory_item_roles[1], manufacturer=manufacturers[1], part_id='1002'), + InventoryItemTemplate(device_type=device_types[2], name='Inventory Item 3', label='C', role=inventory_item_roles[2], manufacturer=manufacturers[2], part_id='1003'), + ) + for item in inventory_item_templates: + item.save() + + child_inventory_item_templates = ( + InventoryItemTemplate(device_type=device_types[0], name='Inventory Item 1A', parent=inventory_item_templates[0]), + InventoryItemTemplate(device_type=device_types[1], name='Inventory Item 2A', parent=inventory_item_templates[1]), + InventoryItemTemplate(device_type=device_types[2], name='Inventory Item 3A', parent=inventory_item_templates[2]), + ) + for item in child_inventory_item_templates: + item.save() + + def test_name(self): + params = {'name': ['Inventory Item 1', 'Inventory Item 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_devicetype_id(self): + device_types = DeviceType.objects.all()[:2] + params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_label(self): + params = {'label': ['A', 'B']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_part_id(self): + params = {'part_id': ['1001', '1002']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_parent_id(self): + parent_items = InventoryItemTemplate.objects.filter(parent__isnull=True)[:2] + params = {'parent_id': [parent_items[0].pk, parent_items[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_role(self): + roles = InventoryItemRole.objects.all()[:2] + params = {'role_id': [roles[0].pk, roles[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'role': [roles[0].slug, roles[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_manufacturer(self): + manufacturers = Manufacturer.objects.all()[:2] + params = {'manufacturer_id': [manufacturers[0].pk, manufacturers[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'manufacturer': [manufacturers[0].slug, manufacturers[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class DeviceRoleTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = DeviceRole.objects.all() filterset = DeviceRoleFilterSet diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 8f077df92b0..8f7cb606b89 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -580,6 +580,20 @@ class DeviceTypeTestCase( url = reverse('dcim:devicetype_devicebays', kwargs={'pk': devicetype.pk}) self.assertHttpStatus(self.client.get(url), 200) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_devicetype_inventoryitems(self): + devicetype = DeviceType.objects.first() + inventory_items = ( + DeviceBayTemplate(device_type=devicetype, name='Device Bay 1'), + DeviceBayTemplate(device_type=devicetype, name='Device Bay 2'), + DeviceBayTemplate(device_type=devicetype, name='Device Bay 3'), + ) + for inventory_item in inventory_items: + inventory_item.save() + + url = reverse('dcim:devicetype_inventoryitems', kwargs={'pk': devicetype.pk}) + self.assertHttpStatus(self.client.get(url), 200) + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_import_objects(self): """ @@ -659,6 +673,13 @@ device-bays: - name: Device Bay 1 - name: Device Bay 2 - name: Device Bay 3 +inventory-items: + - name: Inventory Item 1 + manufacturer: Generic + - name: Inventory Item 2 + manufacturer: Generic + - name: Inventory Item 3 + manufacturer: Generic """ # Create the manufacturer @@ -677,6 +698,7 @@ device-bays: 'dcim.add_rearporttemplate', 'dcim.add_modulebaytemplate', 'dcim.add_devicebaytemplate', + 'dcim.add_inventoryitemtemplate', ) form_data = { @@ -729,13 +751,17 @@ device-bays: self.assertEqual(fp1.rear_port_position, 1) self.assertEqual(device_type.modulebaytemplates.count(), 3) - db1 = ModuleBayTemplate.objects.first() - self.assertEqual(db1.name, 'Module Bay 1') + mb1 = ModuleBayTemplate.objects.first() + self.assertEqual(mb1.name, 'Module Bay 1') self.assertEqual(device_type.devicebaytemplates.count(), 3) db1 = DeviceBayTemplate.objects.first() self.assertEqual(db1.name, 'Device Bay 1') + self.assertEqual(device_type.inventoryitemtemplates.count(), 3) + ii1 = InventoryItemTemplate.objects.first() + self.assertEqual(ii1.name, 'Inventory Item 1') + def test_export_objects(self): url = reverse('dcim:devicetype_list') self.add_permissions('dcim.view_devicetype') @@ -1393,6 +1419,48 @@ class DeviceBayTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCas } +class InventoryItemTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase): + model = InventoryItemTemplate + + @classmethod + def setUpTestData(cls): + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + ) + Manufacturer.objects.bulk_create(manufacturers) + + devicetypes = ( + DeviceType(manufacturer=manufacturers[0], model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturers[0], model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(devicetypes) + + inventory_item_templates = ( + InventoryItemTemplate(device_type=devicetypes[0], name='Inventory Item Template 1', manufacturer=manufacturers[0]), + InventoryItemTemplate(device_type=devicetypes[0], name='Inventory Item Template 2', manufacturer=manufacturers[0]), + InventoryItemTemplate(device_type=devicetypes[0], name='Inventory Item Template 3', manufacturer=manufacturers[0]), + ) + for item in inventory_item_templates: + item.save() + + cls.form_data = { + 'device_type': devicetypes[1].pk, + 'name': 'Inventory Item Template X', + 'manufacturer': manufacturers[1].pk, + } + + cls.bulk_create_data = { + 'device_type': devicetypes[1].pk, + 'name_pattern': 'Inventory Item Template [4-6]', + 'manufacturer': manufacturers[1].pk, + } + + cls.bulk_edit_data = { + 'description': 'Foo bar', + } + + class DeviceRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase): model = DeviceRole diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index d45ce75770e..bfd6fecad94 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -115,6 +115,7 @@ urlpatterns = [ path('device-types//rear-ports/', views.DeviceTypeRearPortsView.as_view(), name='devicetype_rearports'), path('device-types//module-bays/', views.DeviceTypeModuleBaysView.as_view(), name='devicetype_modulebays'), path('device-types//device-bays/', views.DeviceTypeDeviceBaysView.as_view(), name='devicetype_devicebays'), + path('device-types//inventory-items/', views.DeviceTypeInventoryItemsView.as_view(), name='devicetype_inventoryitems'), path('device-types//edit/', views.DeviceTypeEditView.as_view(), name='devicetype_edit'), path('device-types//delete/', views.DeviceTypeDeleteView.as_view(), name='devicetype_delete'), path('device-types//changelog/', ObjectChangeLogView.as_view(), name='devicetype_changelog', kwargs={'model': DeviceType}), @@ -203,7 +204,7 @@ urlpatterns = [ path('device-bay-templates//edit/', views.DeviceBayTemplateEditView.as_view(), name='devicebaytemplate_edit'), path('device-bay-templates//delete/', views.DeviceBayTemplateDeleteView.as_view(), name='devicebaytemplate_delete'), - # Device bay templates + # Module bay templates path('module-bay-templates/add/', views.ModuleBayTemplateCreateView.as_view(), name='modulebaytemplate_add'), path('module-bay-templates/edit/', views.ModuleBayTemplateBulkEditView.as_view(), name='modulebaytemplate_bulk_edit'), path('module-bay-templates/rename/', views.ModuleBayTemplateBulkRenameView.as_view(), name='modulebaytemplate_bulk_rename'), @@ -211,6 +212,14 @@ urlpatterns = [ path('module-bay-templates//edit/', views.ModuleBayTemplateEditView.as_view(), name='modulebaytemplate_edit'), path('module-bay-templates//delete/', views.ModuleBayTemplateDeleteView.as_view(), name='modulebaytemplate_delete'), + # Inventory item templates + path('inventory-item-templates/add/', views.InventoryItemTemplateCreateView.as_view(), name='inventoryitemtemplate_add'), + path('inventory-item-templates/edit/', views.InventoryItemTemplateBulkEditView.as_view(), name='inventoryitemtemplate_bulk_edit'), + path('inventory-item-templates/rename/', views.InventoryItemTemplateBulkRenameView.as_view(), name='inventoryitemtemplate_bulk_rename'), + path('inventory-item-templates/delete/', views.InventoryItemTemplateBulkDeleteView.as_view(), name='inventoryitemtemplate_bulk_delete'), + path('inventory-item-templates//edit/', views.InventoryItemTemplateEditView.as_view(), name='inventoryitemtemplate_edit'), + path('inventory-item-templates//delete/', views.InventoryItemTemplateDeleteView.as_view(), name='inventoryitemtemplate_delete'), + # Device roles path('device-roles/', views.DeviceRoleListView.as_view(), name='devicerole_list'), path('device-roles/add/', views.DeviceRoleEditView.as_view(), name='devicerole_add'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 4e63c0e76cf..54d100f415a 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -869,6 +869,13 @@ class DeviceTypeDeviceBaysView(DeviceTypeComponentsView): viewname = 'dcim:devicetype_devicebays' +class DeviceTypeInventoryItemsView(DeviceTypeComponentsView): + child_model = InventoryItemTemplate + table = tables.InventoryItemTemplateTable + filterset = filtersets.InventoryItemTemplateFilterSet + viewname = 'dcim:devicetype_inventoryitems' + + class DeviceTypeEditView(generic.ObjectEditView): queryset = DeviceType.objects.all() model_form = forms.DeviceTypeForm @@ -890,6 +897,7 @@ class DeviceTypeImportView(generic.ObjectImportView): 'dcim.add_rearporttemplate', 'dcim.add_modulebaytemplate', 'dcim.add_devicebaytemplate', + 'dcim.add_inventoryitemtemplate', ] queryset = DeviceType.objects.all() model_form = forms.DeviceTypeImportForm @@ -903,6 +911,7 @@ class DeviceTypeImportView(generic.ObjectImportView): ('front-ports', forms.FrontPortTemplateImportForm), ('module-bays', forms.ModuleBayTemplateImportForm), ('device-bays', forms.DeviceBayTemplateImportForm), + ('inventory-items', forms.InventoryItemTemplateImportForm), )) def prep_related_object_data(self, parent, data): @@ -1362,6 +1371,51 @@ class DeviceBayTemplateBulkDeleteView(generic.BulkDeleteView): table = tables.DeviceBayTemplateTable +# +# Inventory item templates +# + +class InventoryItemTemplateCreateView(generic.ComponentCreateView): + queryset = InventoryItemTemplate.objects.all() + form = forms.DeviceTypeComponentCreateForm + model_form = forms.InventoryItemTemplateForm + + def alter_object(self, instance, request): + # Set component (if any) + component_type = request.GET.get('component_type') + component_id = request.GET.get('component_id') + + if component_type and component_id: + content_type = get_object_or_404(ContentType, pk=component_type) + instance.component = get_object_or_404(content_type.model_class(), pk=component_id) + + return instance + + +class InventoryItemTemplateEditView(generic.ObjectEditView): + queryset = InventoryItemTemplate.objects.all() + model_form = forms.InventoryItemTemplateForm + + +class InventoryItemTemplateDeleteView(generic.ObjectDeleteView): + queryset = InventoryItemTemplate.objects.all() + + +class InventoryItemTemplateBulkEditView(generic.BulkEditView): + queryset = InventoryItemTemplate.objects.all() + table = tables.InventoryItemTemplateTable + form = forms.InventoryItemTemplateBulkEditForm + + +class InventoryItemTemplateBulkRenameView(generic.BulkRenameView): + queryset = InventoryItemTemplate.objects.all() + + +class InventoryItemTemplateBulkDeleteView(generic.BulkDeleteView): + queryset = InventoryItemTemplate.objects.all() + table = tables.InventoryItemTemplateTable + + # # Device roles # diff --git a/netbox/templates/dcim/devicetype/base.html b/netbox/templates/dcim/devicetype/base.html index 9c0b08c190c..e2bb72a740d 100644 --- a/netbox/templates/dcim/devicetype/base.html +++ b/netbox/templates/dcim/devicetype/base.html @@ -44,6 +44,9 @@ {% if perms.dcim.add_devicebaytemplate %}
  • Device Bays
  • {% endif %} + {% if perms.dcim.add_inventoryitemtemplate %} +
  • Inventory Items
  • + {% endif %} {% endif %} @@ -127,4 +130,12 @@ {% endif %} {% endwith %} + + {% with tab_name='inventory-item-templates' inventoryitem_count=object.inventoryitemtemplates.count %} + {% if active_tab == tab_name or inventoryitem_count %} + + {% endif %} + {% endwith %} {% endblock %} From 791cc093f478f987c1ed52fd6e9064003eb963e6 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 29 Dec 2021 16:30:44 -0500 Subject: [PATCH 058/271] Enable the association of inventory item templates with component templates --- netbox/dcim/forms/models.py | 2 +- netbox/dcim/tables/devicetypes.py | 22 +++++++++++++------ netbox/dcim/tables/template_code.py | 13 +++++++++++ netbox/dcim/views.py | 1 + netbox/netbox/views/generic/object_views.py | 13 ++--------- .../templates/dcim/inventoryitem_create.html | 16 +++++++------- 6 files changed, 40 insertions(+), 27 deletions(-) diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 9fcea766169..65b7d46a8fe 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1092,7 +1092,7 @@ class InventoryItemTemplateForm(BootstrapMixin, forms.ModelForm): ) component_type = ContentTypeChoiceField( queryset=ContentType.objects.all(), - limit_choices_to=MODULAR_COMPONENT_MODELS, + limit_choices_to=MODULAR_COMPONENT_TEMPLATE_MODELS, required=False, widget=forms.HiddenInput ) diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 885fe69a4d1..525c6903075 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -8,6 +8,7 @@ from dcim.models import ( from utilities.tables import ( BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, ) +from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS __all__ = ( 'ConsolePortTemplateTable', @@ -114,7 +115,8 @@ class ComponentTemplateTable(BaseTable): class ConsolePortTemplateTable(ComponentTemplateTable): actions = ButtonsColumn( model=ConsolePortTemplate, - buttons=('edit', 'delete') + buttons=('edit', 'delete'), + prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -126,7 +128,8 @@ class ConsolePortTemplateTable(ComponentTemplateTable): class ConsoleServerPortTemplateTable(ComponentTemplateTable): actions = ButtonsColumn( model=ConsoleServerPortTemplate, - buttons=('edit', 'delete') + buttons=('edit', 'delete'), + prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -138,7 +141,8 @@ class ConsoleServerPortTemplateTable(ComponentTemplateTable): class PowerPortTemplateTable(ComponentTemplateTable): actions = ButtonsColumn( model=PowerPortTemplate, - buttons=('edit', 'delete') + buttons=('edit', 'delete'), + prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -150,7 +154,8 @@ class PowerPortTemplateTable(ComponentTemplateTable): class PowerOutletTemplateTable(ComponentTemplateTable): actions = ButtonsColumn( model=PowerOutletTemplate, - buttons=('edit', 'delete') + buttons=('edit', 'delete'), + prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -165,7 +170,8 @@ class InterfaceTemplateTable(ComponentTemplateTable): ) actions = ButtonsColumn( model=InterfaceTemplate, - buttons=('edit', 'delete') + buttons=('edit', 'delete'), + prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -181,7 +187,8 @@ class FrontPortTemplateTable(ComponentTemplateTable): color = ColorColumn() actions = ButtonsColumn( model=FrontPortTemplate, - buttons=('edit', 'delete') + buttons=('edit', 'delete'), + prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -194,7 +201,8 @@ class RearPortTemplateTable(ComponentTemplateTable): color = ColorColumn() actions = ButtonsColumn( model=RearPortTemplate, - buttons=('edit', 'delete') + buttons=('edit', 'delete'), + prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 6b44c4b3f0b..2b6c02b8295 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -93,6 +93,19 @@ LOCATION_ELEVATIONS = """ """ +# +# Device component templatebuttons +# + +MODULAR_COMPONENT_TEMPLATE_BUTTONS = """ +{% load helpers %} +{% if perms.dcim.add_invnetoryitemtemplate %} + + + +{% endif %} +""" + # # Device component buttons # diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 54d100f415a..e6412453954 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1379,6 +1379,7 @@ class InventoryItemTemplateCreateView(generic.ComponentCreateView): queryset = InventoryItemTemplate.objects.all() form = forms.DeviceTypeComponentCreateForm model_form = forms.InventoryItemTemplateForm + template_name = 'dcim/inventoryitem_create.html' def alter_object(self, instance, request): # Set component (if any) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 5895a7a6e05..607501a9b36 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -737,6 +737,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View 'return_url': self.get_return_url(request), }) + # TODO: Refactor this method for clarity & better error reporting def validate_form(self, request, form): """ Validate form values and set errors on the form object as they are detected. If @@ -763,17 +764,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View if component_form.is_valid(): new_components.append(component_form) - else: - for field, errors in component_form.errors.as_data().items(): - # Assign errors on the child form's name/label field to name_pattern/label_pattern on the parent form - if field == 'name': - field = 'name_pattern' - elif field == 'label': - field = 'label_pattern' - for e in errors: - form.add_error(field, '{}: {}'.format(name, ', '.join(e))) - - if not form.errors: + if not form.errors and not component_form.errors: try: with transaction.atomic(): # Create the new components diff --git a/netbox/templates/dcim/inventoryitem_create.html b/netbox/templates/dcim/inventoryitem_create.html index ef20a218819..43c5b39fa46 100644 --- a/netbox/templates/dcim/inventoryitem_create.html +++ b/netbox/templates/dcim/inventoryitem_create.html @@ -1,17 +1,17 @@ -{% extends 'dcim/component_create.html' %} +{% extends 'generic/object_edit.html' %} {% load helpers %} +{% load form_helpers %} {% block form %} + {% render_form replication_form %} {% if obj.component %}
    - -
    -
    - {{ obj.component }} + +
    +
    -
    {% endif %} {{ block.super }} From 1edf80db8eead41037ead4960634c6ea28e2078e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 29 Dec 2021 16:40:03 -0500 Subject: [PATCH 059/271] Changelog & documentation for #8118 --- docs/models/dcim/devicetype.md | 4 ++-- docs/models/dcim/inventoryitem.md | 6 +++--- docs/models/dcim/inventoryitemtemplate.md | 3 +++ docs/release-notes/version-3.2.md | 7 +++++++ 4 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 docs/models/dcim/inventoryitemtemplate.md diff --git a/docs/models/dcim/devicetype.md b/docs/models/dcim/devicetype.md index b919465c8b9..cf42185f493 100644 --- a/docs/models/dcim/devicetype.md +++ b/docs/models/dcim/devicetype.md @@ -4,13 +4,13 @@ A device type represents a particular make and model of hardware that exists in Device types are instantiated as devices installed within sites and/or equipment racks. For example, you might define a device type to represent a Juniper EX4300-48T network switch with 48 Ethernet interfaces. You can then create multiple _instances_ of this type named "switch1," "switch2," and so on. Each device will automatically inherit the components (such as interfaces) of its device type at the time of creation. However, changes made to a device type will **not** apply to instances of that device type retroactively. -Some devices house child devices which share physical resources, like space and power, but which functional independently from one another. A common example of this is blade server chassis. Each device type is designated as one of the following: +Some devices house child devices which share physical resources, like space and power, but which function independently. A common example of this is blade server chassis. Each device type is designated as one of the following: * A parent device (which has device bays) * A child device (which must be installed within a device bay) * Neither !!! note - This parent/child relationship is **not** suitable for modeling chassis-based devices, wherein child members share a common control plane. Instead, line cards and similarly non-autonomous hardware should be modeled as inventory items within a device, with any associated interfaces or other components assigned directly to the device. + This parent/child relationship is **not** suitable for modeling chassis-based devices, wherein child members share a common control plane. Instead, line cards and similarly non-autonomous hardware should be modeled as modules or inventory items within a device. A device type may optionally specify an airflow direction, such as front-to-rear, rear-to-front, or passive. Airflow direction may also be set separately per device. If it is not defined for a device at the time of its creation, it will inherit the airflow setting of its device type. diff --git a/docs/models/dcim/inventoryitem.md b/docs/models/dcim/inventoryitem.md index f9837183392..fbd3172bbe6 100644 --- a/docs/models/dcim/inventoryitem.md +++ b/docs/models/dcim/inventoryitem.md @@ -1,7 +1,7 @@ # Inventory Items -Inventory items represent hardware components installed within a device, such as a power supply or CPU or line card. Inventory items are distinct from other device components in that they cannot be templatized on a device type, and cannot be connected by cables. They are intended to be used primarily for inventory purposes. +Inventory items represent hardware components installed within a device, such as a power supply or CPU or line card. They are intended to be used primarily for inventory purposes. -Each inventory item can be assigned a functional role, manufacturer, part ID, serial number, and asset tag (all optional). A boolean toggle is also provided to indicate whether each item was entered manually or discovered automatically (by some process outside of NetBox). +Each inventory item can be assigned a functional role, manufacturer, part ID, serial number, and asset tag (all optional). A boolean toggle is also provided to indicate whether each item was entered manually or discovered automatically (by some process outside NetBox). -Inventory items are hierarchical in nature, such that any individual item may be designated as the parent for other items. For example, an inventory item might be created to represent a line card which houses several SFP optics, each of which exists as a child item within the device. +Inventory items are hierarchical in nature, such that any individual item may be designated as the parent for other items. For example, an inventory item might be created to represent a line card which houses several SFP optics, each of which exists as a child item within the device. An inventory item may also be associated with a specific component within the same device. For example, you may wish to associate a transceiver with an interface. diff --git a/docs/models/dcim/inventoryitemtemplate.md b/docs/models/dcim/inventoryitemtemplate.md new file mode 100644 index 00000000000..3167ed4abfe --- /dev/null +++ b/docs/models/dcim/inventoryitemtemplate.md @@ -0,0 +1,3 @@ +# Inventory Item Templates + +A template for an inventory item that will be automatically created when instantiating a new device. All attributes of this object will be copied to the new inventory item, including the associations with a parent item and assigned component, if any. diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index e0db0b13b97..d2702cfdaab 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -42,6 +42,12 @@ FIELD_CHOICES = { } ``` +#### Inventory Item Templates ([#8118](https://github.com/netbox-community/netbox/issues/8118)) + +Inventory items can now be templatized on a device type similar to the other component types. This enables users to better pre-model fixed hardware components. + +Inventory item templates can be arranged hierarchically within a device type, and may be assigned to other components. These relationships will be mirrored when instantiating inventory items on a newly-created device. + ### Enhancements * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation @@ -62,6 +68,7 @@ FIELD_CHOICES = { * Added the following endpoints: * `/api/dcim/inventory-item-roles/` + * `/api/dcim/inventory-item-templates/` * `/api/dcim/modules/` * `/api/dcim/module-bays/` * `/api/dcim/module-bay-templates/` From 9f53497e391f29961bda990eda88a8a943e5c96f Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 29 Dec 2021 20:28:12 -0500 Subject: [PATCH 060/271] Clean up & expand button color choices --- netbox/extras/choices.py | 33 +++++--------------------------- netbox/extras/models/models.py | 2 +- netbox/utilities/choices.py | 35 +++++++++++++++++++++++----------- 3 files changed, 30 insertions(+), 40 deletions(-) diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index c01e64831d0..cf64bc005df 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -1,4 +1,4 @@ -from utilities.choices import ChoiceSet +from utilities.choices import ButtonColorChoices, ChoiceSet # @@ -47,36 +47,13 @@ class CustomFieldFilterLogicChoices(ChoiceSet): # CustomLinks # -class CustomLinkButtonClassChoices(ChoiceSet): +class CustomLinkButtonClassChoices(ButtonColorChoices): - CLASS_DEFAULT = 'outline-dark' - CLASS_LINK = 'ghost-dark' - CLASS_BLUE = 'blue' - CLASS_INDIGO = 'indigo' - CLASS_PURPLE = 'purple' - CLASS_PINK = 'pink' - CLASS_RED = 'red' - CLASS_ORANGE = 'orange' - CLASS_YELLOW = 'yellow' - CLASS_GREEN = 'green' - CLASS_TEAL = 'teal' - CLASS_CYAN = 'cyan' - CLASS_GRAY = 'secondary' + LINK = 'ghost-dark' CHOICES = ( - (CLASS_DEFAULT, 'Default'), - (CLASS_LINK, 'Link'), - (CLASS_BLUE, 'Blue'), - (CLASS_INDIGO, 'Indigo'), - (CLASS_PURPLE, 'Purple'), - (CLASS_PINK, 'Pink'), - (CLASS_RED, 'Red'), - (CLASS_ORANGE, 'Orange'), - (CLASS_YELLOW, 'Yellow'), - (CLASS_GREEN, 'Green'), - (CLASS_TEAL, 'Teal'), - (CLASS_CYAN, 'Cyan'), - (CLASS_GRAY, 'Gray'), + *ButtonColorChoices.CHOICES, + (LINK, 'Link'), ) # diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 5471f4d67bc..ac3a23410d9 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -212,7 +212,7 @@ class CustomLink(ChangeLoggedModel): button_class = models.CharField( max_length=30, choices=CustomLinkButtonClassChoices, - default=CustomLinkButtonClassChoices.CLASS_DEFAULT, + default=CustomLinkButtonClassChoices.DEFAULT, help_text="The class of the first link in a group will be used for the dropdown button" ) new_window = models.BooleanField( diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index 7127834481b..b500f5b9d43 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -161,21 +161,34 @@ class ButtonColorChoices(ChoiceSet): Map standard button color choices to Bootstrap 3 button classes """ DEFAULT = 'outline-dark' - BLUE = 'primary' - CYAN = 'info' - GREEN = 'success' - RED = 'danger' - YELLOW = 'warning' - GREY = 'secondary' - BLACK = 'dark' + BLUE = 'blue' + INDIGO = 'indigo' + PURPLE = 'purple' + PINK = 'pink' + RED = 'red' + ORANGE = 'orange' + YELLOW = 'yellow' + GREEN = 'green' + TEAL = 'teal' + CYAN = 'cyan' + GRAY = 'gray' + GREY = 'gray' # Backward compatability for <3.2 + BLACK = 'black' + WHITE = 'white' CHOICES = ( (DEFAULT, 'Default'), (BLUE, 'Blue'), - (CYAN, 'Cyan'), - (GREEN, 'Green'), + (INDIGO, 'Indigo'), + (PURPLE, 'Purple'), + (PINK, 'Pink'), (RED, 'Red'), + (ORANGE, 'Orange'), (YELLOW, 'Yellow'), - (GREY, 'Grey'), - (BLACK, 'Black') + (GREEN, 'Green'), + (TEAL, 'Teal'), + (CYAN, 'Cyan'), + (GRAY, 'Gray'), + (BLACK, 'Black'), + (WHITE, 'White'), ) From 8e699617448757f1b10a0befce7290b678f50494 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 30 Dec 2021 08:15:43 -0500 Subject: [PATCH 061/271] Fix CustomLinkButtonClassChoices references in tests --- netbox/extras/tests/test_views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index 67abcf5430e..34d5cb67e27 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -68,7 +68,7 @@ class CustomLinkTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'name': 'Custom Link X', 'content_type': site_ct.pk, 'weight': 100, - 'button_class': CustomLinkButtonClassChoices.CLASS_DEFAULT, + 'button_class': CustomLinkButtonClassChoices.DEFAULT, 'link_text': 'Link X', 'link_url': 'http://example.com/?x' } @@ -81,7 +81,7 @@ class CustomLinkTestCase(ViewTestCases.PrimaryObjectViewTestCase): ) cls.bulk_edit_data = { - 'button_class': CustomLinkButtonClassChoices.CLASS_CYAN, + 'button_class': CustomLinkButtonClassChoices.CYAN, 'weight': 200, } From fa1e28e860c4bdb3e585a968bd248a2ac666e1f6 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 30 Dec 2021 17:03:41 -0500 Subject: [PATCH 062/271] Initial work on #7006 --- netbox/extras/api/customfields.py | 15 +- netbox/extras/choices.py | 2 + netbox/extras/forms/customfields.py | 13 +- netbox/extras/forms/models.py | 2 +- .../migrations/0068_custom_object_field.py | 18 ++ netbox/extras/models/customfields.py | 41 +++- netbox/extras/tests/test_customfields.py | 231 +++++++++--------- netbox/extras/tests/test_forms.py | 14 +- netbox/netbox/models.py | 15 +- .../templates/inc/panels/custom_fields.html | 2 + 10 files changed, 224 insertions(+), 129 deletions(-) create mode 100644 netbox/extras/migrations/0068_custom_object_field.py diff --git a/netbox/extras/api/customfields.py b/netbox/extras/api/customfields.py index 5cb1fc27618..f2f4b69a6fa 100644 --- a/netbox/extras/api/customfields.py +++ b/netbox/extras/api/customfields.py @@ -1,6 +1,7 @@ from django.contrib.contenttypes.models import ContentType from rest_framework.fields import Field +from extras.choices import CustomFieldTypeChoices from extras.models import CustomField @@ -44,9 +45,17 @@ class CustomFieldsDataField(Field): return self._custom_fields def to_representation(self, obj): - return { - cf.name: obj.get(cf.name) for cf in self._get_custom_fields() - } + # TODO: Fix circular import + from utilities.api import get_serializer_for_model + data = {} + for cf in self._get_custom_fields(): + value = cf.deserialize(obj.get(cf.name)) + if value is not None and cf.type == CustomFieldTypeChoices.TYPE_OBJECT: + serializer = get_serializer_for_model(cf.object_type.model_class(), prefix='Nested') + value = serializer(value, context=self.parent.context).data + data[cf.name] = value + + return data def to_internal_value(self, data): # If updating an existing instance, start with existing custom_field_data diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index cf64bc005df..5c18f2705ef 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -16,6 +16,7 @@ class CustomFieldTypeChoices(ChoiceSet): TYPE_JSON = 'json' TYPE_SELECT = 'select' TYPE_MULTISELECT = 'multiselect' + TYPE_OBJECT = 'object' CHOICES = ( (TYPE_TEXT, 'Text'), @@ -27,6 +28,7 @@ class CustomFieldTypeChoices(ChoiceSet): (TYPE_JSON, 'JSON'), (TYPE_SELECT, 'Selection'), (TYPE_MULTISELECT, 'Multiple selection'), + (TYPE_OBJECT, 'NetBox object'), ) diff --git a/netbox/extras/forms/customfields.py b/netbox/extras/forms/customfields.py index d58e6ce65b3..bd28a30e788 100644 --- a/netbox/extras/forms/customfields.py +++ b/netbox/extras/forms/customfields.py @@ -20,7 +20,7 @@ class CustomFieldsMixin: Extend a Form to include custom field support. """ def __init__(self, *args, **kwargs): - self.custom_fields = [] + self.custom_fields = {} super().__init__(*args, **kwargs) @@ -49,7 +49,7 @@ class CustomFieldsMixin: self.fields[field_name] = self._get_form_field(customfield) # Annotate the field in the list of CustomField form fields - self.custom_fields.append(field_name) + self.custom_fields[field_name] = customfield class CustomFieldModelForm(BootstrapMixin, CustomFieldsMixin, forms.ModelForm): @@ -70,12 +70,15 @@ class CustomFieldModelForm(BootstrapMixin, CustomFieldsMixin, forms.ModelForm): def clean(self): # Save custom field data on instance - for cf_name in self.custom_fields: + for cf_name, customfield in self.custom_fields.items(): key = cf_name[3:] # Strip "cf_" from field name value = self.cleaned_data.get(cf_name) - empty_values = self.fields[cf_name].empty_values + # Convert "empty" values to null - self.instance.custom_field_data[key] = value if value not in empty_values else None + if value in self.fields[cf_name].empty_values: + self.instance.custom_field_data[key] = None + else: + self.instance.custom_field_data[key] = customfield.serialize(value) return super().clean() diff --git a/netbox/extras/forms/models.py b/netbox/extras/forms/models.py index d7521472294..55e58a7f21d 100644 --- a/netbox/extras/forms/models.py +++ b/netbox/extras/forms/models.py @@ -35,7 +35,7 @@ class CustomFieldForm(BootstrapMixin, forms.ModelForm): model = CustomField fields = '__all__' fieldsets = ( - ('Custom Field', ('name', 'label', 'type', 'weight', 'required', 'description')), + ('Custom Field', ('name', 'label', 'type', 'object_type', 'weight', 'required', 'description')), ('Assigned Models', ('content_types',)), ('Behavior', ('filter_logic',)), ('Values', ('default', 'choices')), diff --git a/netbox/extras/migrations/0068_custom_object_field.py b/netbox/extras/migrations/0068_custom_object_field.py new file mode 100644 index 00000000000..0fa50a84d6e --- /dev/null +++ b/netbox/extras/migrations/0068_custom_object_field.py @@ -0,0 +1,18 @@ +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('extras', '0067_configcontext_cluster_types'), + ] + + operations = [ + migrations.AddField( + model_name='customfield', + name='object_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='contenttypes.contenttype'), + ), + ] diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 8c817ad33b4..fa65cbdee65 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -16,7 +16,8 @@ from extras.utils import FeatureQuery, extras_features from netbox.models import ChangeLoggedModel from utilities import filters from utilities.forms import ( - CSVChoiceField, DatePicker, LaxURLField, StaticSelectMultiple, StaticSelect, add_blank_choice, + CSVChoiceField, DatePicker, DynamicModelChoiceField, LaxURLField, StaticSelectMultiple, StaticSelect, + add_blank_choice, ) from utilities.querysets import RestrictedQuerySet from utilities.validators import validate_regex @@ -50,8 +51,17 @@ class CustomField(ChangeLoggedModel): type = models.CharField( max_length=50, choices=CustomFieldTypeChoices, - default=CustomFieldTypeChoices.TYPE_TEXT + default=CustomFieldTypeChoices.TYPE_TEXT, + help_text='The type of data this custom field holds' ) + object_type = models.ForeignKey( + to=ContentType, + on_delete=models.PROTECT, + blank=True, + null=True, + help_text='The type of NetBox object this field maps to (for object fields)' + ) + name = models.CharField( max_length=50, unique=True, @@ -122,7 +132,6 @@ class CustomField(ChangeLoggedModel): null=True, help_text='Comma-separated list of available choices (for selection fields)' ) - objects = CustomFieldManager() class Meta: @@ -234,6 +243,23 @@ class CustomField(ChangeLoggedModel): 'default': f"The specified default value ({self.default}) is not listed as an available choice." }) + def serialize(self, value): + """ + Prepare a value for storage as JSON data. + """ + if self.type == CustomFieldTypeChoices.TYPE_OBJECT and value is not None: + return value.pk + return value + + def deserialize(self, value): + """ + Convert JSON data to a Python object suitable for the field type. + """ + if self.type == CustomFieldTypeChoices.TYPE_OBJECT and value is not None: + model = self.object_type.model_class() + return model.objects.filter(pk=value).first() + return value + def to_form_field(self, set_initial=True, enforce_required=True, for_csv_import=False): """ Return a form field suitable for setting a CustomField's value for an object. @@ -300,6 +326,15 @@ class CustomField(ChangeLoggedModel): elif self.type == CustomFieldTypeChoices.TYPE_JSON: field = forms.JSONField(required=required, initial=initial) + # Object + elif self.type == CustomFieldTypeChoices.TYPE_OBJECT: + model = self.object_type.model_class() + field = DynamicModelChoiceField( + queryset=model.objects.all(), + required=required, + initial=initial + ) + # Text else: if self.type == CustomFieldTypeChoices.TYPE_LONGTEXT: diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index fdabe0fcf2b..df803ce1b8c 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -8,6 +8,7 @@ from dcim.forms import SiteCSVForm from dcim.models import Site, Rack from extras.choices import * from extras.models import CustomField +from ipam.models import VLAN from utilities.testing import APITestCase, TestCase from virtualization.models import VirtualMachine @@ -201,76 +202,67 @@ class CustomFieldAPITest(APITestCase): def setUpTestData(cls): content_type = ContentType.objects.get_for_model(Site) - # Text custom field - cls.cf_text = CustomField(type=CustomFieldTypeChoices.TYPE_TEXT, name='text_field', default='foo') - cls.cf_text.save() - cls.cf_text.content_types.set([content_type]) + # Create some VLANs + vlans = ( + VLAN(name='VLAN 1', vid=1), + VLAN(name='VLAN 2', vid=2), + ) + VLAN.objects.bulk_create(vlans) - # Long text custom field - cls.cf_longtext = CustomField(type=CustomFieldTypeChoices.TYPE_LONGTEXT, name='longtext_field', default='ABC') - cls.cf_longtext.save() - cls.cf_longtext.content_types.set([content_type]) + custom_fields = ( + CustomField(type=CustomFieldTypeChoices.TYPE_TEXT, name='text_field', default='foo'), + CustomField(type=CustomFieldTypeChoices.TYPE_LONGTEXT, name='longtext_field', default='ABC'), + CustomField(type=CustomFieldTypeChoices.TYPE_INTEGER, name='number_field', default=123), + CustomField(type=CustomFieldTypeChoices.TYPE_BOOLEAN, name='boolean_field', default=False), + CustomField(type=CustomFieldTypeChoices.TYPE_DATE, name='date_field', default='2020-01-01'), + CustomField(type=CustomFieldTypeChoices.TYPE_URL, name='url_field', default='http://example.com/1'), + CustomField(type=CustomFieldTypeChoices.TYPE_JSON, name='json_field', default='{"x": "y"}'), + CustomField(type=CustomFieldTypeChoices.TYPE_SELECT, name='choice_field', default='Foo', choices=( + 'Foo', 'Bar', 'Baz' + )), + CustomField( + type=CustomFieldTypeChoices.TYPE_OBJECT, + name='object_field', + object_type=ContentType.objects.get_for_model(VLAN), + default=vlans[0].pk, + ), + ) + for cf in custom_fields: + cf.save() + cf.content_types.set([content_type]) - # Integer custom field - cls.cf_integer = CustomField(type=CustomFieldTypeChoices.TYPE_INTEGER, name='number_field', default=123) - cls.cf_integer.save() - cls.cf_integer.content_types.set([content_type]) - - # Boolean custom field - cls.cf_boolean = CustomField(type=CustomFieldTypeChoices.TYPE_BOOLEAN, name='boolean_field', default=False) - cls.cf_boolean.save() - cls.cf_boolean.content_types.set([content_type]) - - # Date custom field - cls.cf_date = CustomField(type=CustomFieldTypeChoices.TYPE_DATE, name='date_field', default='2020-01-01') - cls.cf_date.save() - cls.cf_date.content_types.set([content_type]) - - # URL custom field - cls.cf_url = CustomField(type=CustomFieldTypeChoices.TYPE_URL, name='url_field', default='http://example.com/1') - cls.cf_url.save() - cls.cf_url.content_types.set([content_type]) - - # JSON custom field - cls.cf_json = CustomField(type=CustomFieldTypeChoices.TYPE_JSON, name='json_field', default='{"x": "y"}') - cls.cf_json.save() - cls.cf_json.content_types.set([content_type]) - - # Select custom field - cls.cf_select = CustomField(type=CustomFieldTypeChoices.TYPE_SELECT, name='choice_field', choices=['Foo', 'Bar', 'Baz']) - cls.cf_select.default = 'Foo' - cls.cf_select.save() - cls.cf_select.content_types.set([content_type]) - - # Create some sites - cls.sites = ( + # Create some sites *after* creating the custom fields. This ensures that + # default values are not set for the assigned objects. + sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2'), ) - Site.objects.bulk_create(cls.sites) + Site.objects.bulk_create(sites) # Assign custom field values for site 2 - cls.sites[1].custom_field_data = { - cls.cf_text.name: 'bar', - cls.cf_longtext.name: 'DEF', - cls.cf_integer.name: 456, - cls.cf_boolean.name: True, - cls.cf_date.name: '2020-01-02', - cls.cf_url.name: 'http://example.com/2', - cls.cf_json.name: '{"foo": 1, "bar": 2}', - cls.cf_select.name: 'Bar', + sites[1].custom_field_data = { + custom_fields[0].name: 'bar', + custom_fields[1].name: 'DEF', + custom_fields[2].name: 456, + custom_fields[3].name: True, + custom_fields[4].name: '2020-01-02', + custom_fields[5].name: 'http://example.com/2', + custom_fields[6].name: '{"foo": 1, "bar": 2}', + custom_fields[7].name: 'Bar', + custom_fields[8].name: vlans[1].pk, } - cls.sites[1].save() + sites[1].save() def test_get_single_object_without_custom_field_data(self): """ Validate that custom fields are present on an object even if it has no values defined. """ - url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[0].pk}) + site1 = Site.objects.get(name='Site 1') + url = reverse('dcim-api:site-detail', kwargs={'pk': site1.pk}) self.add_permissions('dcim.view_site') response = self.client.get(url, **self.header) - self.assertEqual(response.data['name'], self.sites[0].name) + self.assertEqual(response.data['name'], site1.name) self.assertEqual(response.data['custom_fields'], { 'text_field': None, 'longtext_field': None, @@ -280,18 +272,20 @@ class CustomFieldAPITest(APITestCase): 'url_field': None, 'json_field': None, 'choice_field': None, + 'object_field': None, }) def test_get_single_object_with_custom_field_data(self): """ Validate that custom fields are present and correctly set for an object with values defined. """ - site2_cfvs = self.sites[1].custom_field_data - url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[1].pk}) + site2 = Site.objects.get(name='Site 2') + site2_cfvs = site2.custom_field_data + url = reverse('dcim-api:site-detail', kwargs={'pk': site2.pk}) self.add_permissions('dcim.view_site') response = self.client.get(url, **self.header) - self.assertEqual(response.data['name'], self.sites[1].name) + self.assertEqual(response.data['name'], site2.name) self.assertEqual(response.data['custom_fields']['text_field'], site2_cfvs['text_field']) self.assertEqual(response.data['custom_fields']['longtext_field'], site2_cfvs['longtext_field']) self.assertEqual(response.data['custom_fields']['number_field'], site2_cfvs['number_field']) @@ -300,11 +294,15 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response.data['custom_fields']['url_field'], site2_cfvs['url_field']) self.assertEqual(response.data['custom_fields']['json_field'], site2_cfvs['json_field']) self.assertEqual(response.data['custom_fields']['choice_field'], site2_cfvs['choice_field']) + self.assertEqual(response.data['custom_fields']['object_field']['id'], site2_cfvs['object_field']) def test_create_single_object_with_defaults(self): """ Create a new site with no specified custom field values and check that it received the default values. """ + cf_defaults = { + cf.name: cf.default for cf in CustomField.objects.all() + } data = { 'name': 'Site 3', 'slug': 'site-3', @@ -317,25 +315,27 @@ class CustomFieldAPITest(APITestCase): # Validate response data response_cf = response.data['custom_fields'] - self.assertEqual(response_cf['text_field'], self.cf_text.default) - self.assertEqual(response_cf['longtext_field'], self.cf_longtext.default) - self.assertEqual(response_cf['number_field'], self.cf_integer.default) - self.assertEqual(response_cf['boolean_field'], self.cf_boolean.default) - self.assertEqual(response_cf['date_field'], self.cf_date.default) - self.assertEqual(response_cf['url_field'], self.cf_url.default) - self.assertEqual(response_cf['json_field'], self.cf_json.default) - self.assertEqual(response_cf['choice_field'], self.cf_select.default) + self.assertEqual(response_cf['text_field'], cf_defaults['text_field']) + self.assertEqual(response_cf['longtext_field'], cf_defaults['longtext_field']) + self.assertEqual(response_cf['number_field'], cf_defaults['number_field']) + self.assertEqual(response_cf['boolean_field'], cf_defaults['boolean_field']) + self.assertEqual(response_cf['date_field'], cf_defaults['date_field']) + self.assertEqual(response_cf['url_field'], cf_defaults['url_field']) + self.assertEqual(response_cf['json_field'], cf_defaults['json_field']) + self.assertEqual(response_cf['choice_field'], cf_defaults['choice_field']) + self.assertEqual(response_cf['object_field']['id'], cf_defaults['object_field']) # Validate database data site = Site.objects.get(pk=response.data['id']) - self.assertEqual(site.custom_field_data['text_field'], self.cf_text.default) - self.assertEqual(site.custom_field_data['longtext_field'], self.cf_longtext.default) - self.assertEqual(site.custom_field_data['number_field'], self.cf_integer.default) - self.assertEqual(site.custom_field_data['boolean_field'], self.cf_boolean.default) - self.assertEqual(str(site.custom_field_data['date_field']), self.cf_date.default) - self.assertEqual(site.custom_field_data['url_field'], self.cf_url.default) - self.assertEqual(site.custom_field_data['json_field'], self.cf_json.default) - self.assertEqual(site.custom_field_data['choice_field'], self.cf_select.default) + self.assertEqual(site.custom_field_data['text_field'], cf_defaults['text_field']) + self.assertEqual(site.custom_field_data['longtext_field'], cf_defaults['longtext_field']) + self.assertEqual(site.custom_field_data['number_field'], cf_defaults['number_field']) + self.assertEqual(site.custom_field_data['boolean_field'], cf_defaults['boolean_field']) + self.assertEqual(str(site.custom_field_data['date_field']), cf_defaults['date_field']) + self.assertEqual(site.custom_field_data['url_field'], cf_defaults['url_field']) + self.assertEqual(site.custom_field_data['json_field'], cf_defaults['json_field']) + self.assertEqual(site.custom_field_data['choice_field'], cf_defaults['choice_field']) + self.assertEqual(site.custom_field_data['object_field'], cf_defaults['object_field']) def test_create_single_object_with_values(self): """ @@ -353,6 +353,7 @@ class CustomFieldAPITest(APITestCase): 'url_field': 'http://example.com/2', 'json_field': '{"foo": 1, "bar": 2}', 'choice_field': 'Bar', + 'object_field': VLAN.objects.get(vid=2).pk, }, } url = reverse('dcim-api:site-list') @@ -372,6 +373,7 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['url_field'], data_cf['url_field']) self.assertEqual(response_cf['json_field'], data_cf['json_field']) self.assertEqual(response_cf['choice_field'], data_cf['choice_field']) + self.assertEqual(response_cf['object_field']['id'], data_cf['object_field']) # Validate database data site = Site.objects.get(pk=response.data['id']) @@ -383,12 +385,16 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(site.custom_field_data['url_field'], data_cf['url_field']) self.assertEqual(site.custom_field_data['json_field'], data_cf['json_field']) self.assertEqual(site.custom_field_data['choice_field'], data_cf['choice_field']) + self.assertEqual(site.custom_field_data['object_field'], data_cf['object_field']) def test_create_multiple_objects_with_defaults(self): """ - Create three news sites with no specified custom field values and check that each received + Create three new sites with no specified custom field values and check that each received the default custom field values. """ + cf_defaults = { + cf.name: cf.default for cf in CustomField.objects.all() + } data = ( { 'name': 'Site 3', @@ -414,25 +420,27 @@ class CustomFieldAPITest(APITestCase): # Validate response data response_cf = response.data[i]['custom_fields'] - self.assertEqual(response_cf['text_field'], self.cf_text.default) - self.assertEqual(response_cf['longtext_field'], self.cf_longtext.default) - self.assertEqual(response_cf['number_field'], self.cf_integer.default) - self.assertEqual(response_cf['boolean_field'], self.cf_boolean.default) - self.assertEqual(response_cf['date_field'], self.cf_date.default) - self.assertEqual(response_cf['url_field'], self.cf_url.default) - self.assertEqual(response_cf['json_field'], self.cf_json.default) - self.assertEqual(response_cf['choice_field'], self.cf_select.default) + self.assertEqual(response_cf['text_field'], cf_defaults['text_field']) + self.assertEqual(response_cf['longtext_field'], cf_defaults['longtext_field']) + self.assertEqual(response_cf['number_field'], cf_defaults['number_field']) + self.assertEqual(response_cf['boolean_field'], cf_defaults['boolean_field']) + self.assertEqual(response_cf['date_field'], cf_defaults['date_field']) + self.assertEqual(response_cf['url_field'], cf_defaults['url_field']) + self.assertEqual(response_cf['json_field'], cf_defaults['json_field']) + self.assertEqual(response_cf['choice_field'], cf_defaults['choice_field']) + self.assertEqual(response_cf['object_field']['id'], cf_defaults['object_field']) # Validate database data site = Site.objects.get(pk=response.data[i]['id']) - self.assertEqual(site.custom_field_data['text_field'], self.cf_text.default) - self.assertEqual(site.custom_field_data['longtext_field'], self.cf_longtext.default) - self.assertEqual(site.custom_field_data['number_field'], self.cf_integer.default) - self.assertEqual(site.custom_field_data['boolean_field'], self.cf_boolean.default) - self.assertEqual(str(site.custom_field_data['date_field']), self.cf_date.default) - self.assertEqual(site.custom_field_data['url_field'], self.cf_url.default) - self.assertEqual(site.custom_field_data['json_field'], self.cf_json.default) - self.assertEqual(site.custom_field_data['choice_field'], self.cf_select.default) + self.assertEqual(site.custom_field_data['text_field'], cf_defaults['text_field']) + self.assertEqual(site.custom_field_data['longtext_field'], cf_defaults['longtext_field']) + self.assertEqual(site.custom_field_data['number_field'], cf_defaults['number_field']) + self.assertEqual(site.custom_field_data['boolean_field'], cf_defaults['boolean_field']) + self.assertEqual(str(site.custom_field_data['date_field']), cf_defaults['date_field']) + self.assertEqual(site.custom_field_data['url_field'], cf_defaults['url_field']) + self.assertEqual(site.custom_field_data['json_field'], cf_defaults['json_field']) + self.assertEqual(site.custom_field_data['choice_field'], cf_defaults['choice_field']) + self.assertEqual(site.custom_field_data['object_field'], cf_defaults['object_field']) def test_create_multiple_objects_with_values(self): """ @@ -447,6 +455,7 @@ class CustomFieldAPITest(APITestCase): 'url_field': 'http://example.com/2', 'json_field': '{"foo": 1, "bar": 2}', 'choice_field': 'Bar', + 'object_field': VLAN.objects.get(vid=2).pk, } data = ( { @@ -501,15 +510,15 @@ class CustomFieldAPITest(APITestCase): Update an object with existing custom field values. Ensure that only the updated custom field values are modified. """ - site = self.sites[1] - original_cfvs = {**site.custom_field_data} + site2 = Site.objects.get(name='Site 2') + original_cfvs = {**site2.custom_field_data} data = { 'custom_fields': { 'text_field': 'ABCD', 'number_field': 1234, }, } - url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[1].pk}) + url = reverse('dcim-api:site-detail', kwargs={'pk': site2.pk}) self.add_permissions('dcim.change_site') response = self.client.patch(url, data, format='json', **self.header) @@ -527,23 +536,25 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['choice_field'], original_cfvs['choice_field']) # Validate database data - site.refresh_from_db() - self.assertEqual(site.custom_field_data['text_field'], data['custom_fields']['text_field']) - self.assertEqual(site.custom_field_data['number_field'], data['custom_fields']['number_field']) - self.assertEqual(site.custom_field_data['longtext_field'], original_cfvs['longtext_field']) - self.assertEqual(site.custom_field_data['boolean_field'], original_cfvs['boolean_field']) - self.assertEqual(site.custom_field_data['date_field'], original_cfvs['date_field']) - self.assertEqual(site.custom_field_data['url_field'], original_cfvs['url_field']) - self.assertEqual(site.custom_field_data['json_field'], original_cfvs['json_field']) - self.assertEqual(site.custom_field_data['choice_field'], original_cfvs['choice_field']) + site2.refresh_from_db() + self.assertEqual(site2.custom_field_data['text_field'], data['custom_fields']['text_field']) + self.assertEqual(site2.custom_field_data['number_field'], data['custom_fields']['number_field']) + self.assertEqual(site2.custom_field_data['longtext_field'], original_cfvs['longtext_field']) + self.assertEqual(site2.custom_field_data['boolean_field'], original_cfvs['boolean_field']) + self.assertEqual(site2.custom_field_data['date_field'], original_cfvs['date_field']) + self.assertEqual(site2.custom_field_data['url_field'], original_cfvs['url_field']) + self.assertEqual(site2.custom_field_data['json_field'], original_cfvs['json_field']) + self.assertEqual(site2.custom_field_data['choice_field'], original_cfvs['choice_field']) def test_minimum_maximum_values_validation(self): - url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[1].pk}) + site2 = Site.objects.get(name='Site 2') + url = reverse('dcim-api:site-detail', kwargs={'pk': site2.pk}) self.add_permissions('dcim.change_site') - self.cf_integer.validation_minimum = 10 - self.cf_integer.validation_maximum = 20 - self.cf_integer.save() + cf_integer = CustomField.objects.get(name='number_field') + cf_integer.validation_minimum = 10 + cf_integer.validation_maximum = 20 + cf_integer.save() data = {'custom_fields': {'number_field': 9}} response = self.client.patch(url, data, format='json', **self.header) @@ -558,11 +569,13 @@ class CustomFieldAPITest(APITestCase): self.assertHttpStatus(response, status.HTTP_200_OK) def test_regex_validation(self): - url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[1].pk}) + site2 = Site.objects.get(name='Site 2') + url = reverse('dcim-api:site-detail', kwargs={'pk': site2.pk}) self.add_permissions('dcim.change_site') - self.cf_text.validation_regex = r'^[A-Z]{3}$' # Three uppercase letters - self.cf_text.save() + cf_text = CustomField.objects.get(name='text_field') + cf_text.validation_regex = r'^[A-Z]{3}$' # Three uppercase letters + cf_text.save() data = {'custom_fields': {'text_field': 'ABC123'}} response = self.client.patch(url, data, format='json', **self.header) diff --git a/netbox/extras/tests/test_forms.py b/netbox/extras/tests/test_forms.py index cf28a46e756..e8b16d7ab82 100644 --- a/netbox/extras/tests/test_forms.py +++ b/netbox/extras/tests/test_forms.py @@ -38,10 +38,20 @@ class CustomFieldModelFormTest(TestCase): cf_select = CustomField.objects.create(name='select', type=CustomFieldTypeChoices.TYPE_SELECT, choices=CHOICES) cf_select.content_types.set([obj_type]) - cf_multiselect = CustomField.objects.create(name='multiselect', type=CustomFieldTypeChoices.TYPE_MULTISELECT, - choices=CHOICES) + cf_multiselect = CustomField.objects.create( + name='multiselect', + type=CustomFieldTypeChoices.TYPE_MULTISELECT, + choices=CHOICES + ) cf_multiselect.content_types.set([obj_type]) + cf_object = CustomField.objects.create( + name='object', + type=CustomFieldTypeChoices.TYPE_OBJECT, + object_type=ContentType.objects.get_for_model(Site) + ) + cf_object.content_types.set([obj_type]) + def test_empty_values(self): """ Test that empty custom field values are stored as null diff --git a/netbox/netbox/models.py b/netbox/netbox/models.py index 91240ee9096..3e6ebd8b22d 100644 --- a/netbox/netbox/models.py +++ b/netbox/netbox/models.py @@ -1,5 +1,4 @@ import logging -from collections import OrderedDict from django.contrib.contenttypes.fields import GenericRelation from django.core.serializers.json import DjangoJSONEncoder @@ -99,16 +98,20 @@ class CustomFieldsMixin(models.Model): """ from extras.models import CustomField - fields = CustomField.objects.get_for_model(self) - return OrderedDict([ - (field, self.custom_field_data.get(field.name)) for field in fields - ]) + data = {} + for field in CustomField.objects.get_for_model(self): + value = self.custom_field_data.get(field.name) + data[field] = field.deserialize(value) + + return data def clean(self): super().clean() from extras.models import CustomField - custom_fields = {cf.name: cf for cf in CustomField.objects.get_for_model(self)} + custom_fields = { + cf.name: cf for cf in CustomField.objects.get_for_model(self) + } # Validate all field values for field_name, value in self.custom_field_data.items(): diff --git a/netbox/templates/inc/panels/custom_fields.html b/netbox/templates/inc/panels/custom_fields.html index b48a43f1c22..46636504eaf 100644 --- a/netbox/templates/inc/panels/custom_fields.html +++ b/netbox/templates/inc/panels/custom_fields.html @@ -24,6 +24,8 @@
    {{ value|render_json }}
    {% elif field.type == 'multiselect' and value %} {{ value|join:", " }} + {% elif field.type == 'object' and value %} + {{ value }} {% elif value is not None %} {{ value }} {% elif field.required %} From 954d81147e7d65ad099fc122ab2ea790b0eb0e0b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 4 Jan 2022 17:07:37 -0500 Subject: [PATCH 063/271] Reindex migrations --- ...{0068_custom_object_field.py => 0069_custom_object_field.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename netbox/extras/migrations/{0068_custom_object_field.py => 0069_custom_object_field.py} (89%) diff --git a/netbox/extras/migrations/0068_custom_object_field.py b/netbox/extras/migrations/0069_custom_object_field.py similarity index 89% rename from netbox/extras/migrations/0068_custom_object_field.py rename to netbox/extras/migrations/0069_custom_object_field.py index 0fa50a84d6e..720e21edc8e 100644 --- a/netbox/extras/migrations/0068_custom_object_field.py +++ b/netbox/extras/migrations/0069_custom_object_field.py @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ ('contenttypes', '0002_remove_content_type_name'), - ('extras', '0067_configcontext_cluster_types'), + ('extras', '0068_configcontext_cluster_types'), ] operations = [ From 88ac0f5d3409d0727aef5518c3632cd6b9383732 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Wed, 5 Jan 2022 11:31:00 -0600 Subject: [PATCH 064/271] Work on #6221 - Make templatetags safe for consumption when using plugins and update ButtonColumn to use viewname helper. --- netbox/utilities/tables.py | 7 ++++--- netbox/utilities/templatetags/helpers.py | 9 ++++++--- netbox/utilities/utils.py | 10 ++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index 9000af11087..82f25ebafea 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -216,18 +216,19 @@ class ButtonsColumn(tables.TemplateColumn): attrs = {'td': {'class': 'text-end text-nowrap noprint'}} # Note that braces are escaped to allow for string formatting prior to template rendering template_code = """ + {{% load helpers %}} {{% if "changelog" in buttons %}} - + {{% endif %}} {{% if "edit" in buttons and perms.{app_label}.change_{model_name} %}} - + {{% endif %}} {{% if "delete" in buttons and perms.{app_label}.delete_{model_name} %}} - + {{% endif %}} diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index 0e45cb581c3..be7dc97d1e0 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/netbox/utilities/templatetags/helpers.py @@ -16,9 +16,10 @@ from django.utils.safestring import mark_safe from markdown import markdown from netbox.config import get_config +from netbox.settings import PLUGINS from utilities.forms import get_selected_values, TableConfigForm from utilities.markdown import StrikethroughExtension -from utilities.utils import foreground_color +from utilities.utils import foreground_color, resolve_namespace register = template.Library() @@ -115,7 +116,8 @@ def viewname(model, action): """ Return the view name for the given model and action. Does not perform any validation. """ - return f'{model._meta.app_label}:{model._meta.model_name}_{action}' + namespace = resolve_namespace(model) + return f'{namespace}:{model._meta.model_name}_{action}' @register.filter() @@ -123,7 +125,8 @@ def validated_viewname(model, action): """ Return the view name for the given model and action if valid, or None if invalid. """ - viewname = f'{model._meta.app_label}:{model._meta.model_name}_{action}' + namespace = resolve_namespace(model) + viewname = f'{namespace}:{model._meta.model_name}_{action}' try: # Validate and return the view name. We don't return the actual URL yet because many of the templates # are written to pass a name to {% url %}. diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 444b8752309..bf2b1638c68 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -13,10 +13,20 @@ from jinja2.sandbox import SandboxedEnvironment from mptt.models import MPTTModel from dcim.choices import CableLengthUnitChoices +from extras.plugins import PluginConfig from extras.utils import is_taggable from utilities.constants import HTTP_REQUEST_META_SAFE_COPY +def resolve_namespace(instance): + """ + Get the appropriate namepsace for the app based on whether it is a Plugin or base application + """ + if isinstance(instance._meta.app_config, PluginConfig): + return f'plugins:{instance._meta.app_label}' + return f'{instance._meta.app_label}' + + def csv_format(data): """ Encapsulate any data which contains a comma within double quotes. From 271b7adeb830eaafa6bb117c49aee3ceff7b1adc Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 5 Jan 2022 17:05:54 -0500 Subject: [PATCH 065/271] Extend to support the assignment of multiple objects per field --- netbox/extras/api/customfields.py | 3 ++ netbox/extras/choices.py | 4 +- netbox/extras/models/customfields.py | 27 +++++++++--- netbox/extras/tests/test_customfields.py | 42 +++++++++++++++++++ .../templates/inc/panels/custom_fields.html | 16 +++++-- 5 files changed, 82 insertions(+), 10 deletions(-) diff --git a/netbox/extras/api/customfields.py b/netbox/extras/api/customfields.py index f2f4b69a6fa..fd6e1f55027 100644 --- a/netbox/extras/api/customfields.py +++ b/netbox/extras/api/customfields.py @@ -53,6 +53,9 @@ class CustomFieldsDataField(Field): if value is not None and cf.type == CustomFieldTypeChoices.TYPE_OBJECT: serializer = get_serializer_for_model(cf.object_type.model_class(), prefix='Nested') value = serializer(value, context=self.parent.context).data + elif value is not None and cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: + serializer = get_serializer_for_model(cf.object_type.model_class(), prefix='Nested') + value = serializer(value, many=True, context=self.parent.context).data data[cf.name] = value return data diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index 5c18f2705ef..0632c2b1ffa 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -17,6 +17,7 @@ class CustomFieldTypeChoices(ChoiceSet): TYPE_SELECT = 'select' TYPE_MULTISELECT = 'multiselect' TYPE_OBJECT = 'object' + TYPE_MULTIOBJECT = 'multiobject' CHOICES = ( (TYPE_TEXT, 'Text'), @@ -28,7 +29,8 @@ class CustomFieldTypeChoices(ChoiceSet): (TYPE_JSON, 'JSON'), (TYPE_SELECT, 'Selection'), (TYPE_MULTISELECT, 'Multiple selection'), - (TYPE_OBJECT, 'NetBox object'), + (TYPE_OBJECT, 'Object'), + (TYPE_MULTIOBJECT, 'Multiple objects'), ) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index fa65cbdee65..99c4838576d 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -16,8 +16,8 @@ from extras.utils import FeatureQuery, extras_features from netbox.models import ChangeLoggedModel from utilities import filters from utilities.forms import ( - CSVChoiceField, DatePicker, DynamicModelChoiceField, LaxURLField, StaticSelectMultiple, StaticSelect, - add_blank_choice, + CSVChoiceField, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField, LaxURLField, + StaticSelectMultiple, StaticSelect, add_blank_choice, ) from utilities.querysets import RestrictedQuerySet from utilities.validators import validate_regex @@ -61,7 +61,6 @@ class CustomField(ChangeLoggedModel): null=True, help_text='The type of NetBox object this field maps to (for object fields)' ) - name = models.CharField( max_length=50, unique=True, @@ -247,17 +246,26 @@ class CustomField(ChangeLoggedModel): """ Prepare a value for storage as JSON data. """ - if self.type == CustomFieldTypeChoices.TYPE_OBJECT and value is not None: + if value is None: + return value + if self.type == CustomFieldTypeChoices.TYPE_OBJECT: return value.pk + if self.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: + return [obj.pk for obj in value] return value def deserialize(self, value): """ Convert JSON data to a Python object suitable for the field type. """ - if self.type == CustomFieldTypeChoices.TYPE_OBJECT and value is not None: + if value is None: + return value + if self.type == CustomFieldTypeChoices.TYPE_OBJECT: model = self.object_type.model_class() return model.objects.filter(pk=value).first() + if self.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: + model = self.object_type.model_class() + return model.objects.filter(pk__in=value) return value def to_form_field(self, set_initial=True, enforce_required=True, for_csv_import=False): @@ -335,6 +343,15 @@ class CustomField(ChangeLoggedModel): initial=initial ) + # Multiple objects + elif self.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: + model = self.object_type.model_class() + field = DynamicModelMultipleChoiceField( + queryset=model.objects.all(), + required=required, + initial=initial + ) + # Text else: if self.type == CustomFieldTypeChoices.TYPE_LONGTEXT: diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index df803ce1b8c..657c597f2e4 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -206,6 +206,9 @@ class CustomFieldAPITest(APITestCase): vlans = ( VLAN(name='VLAN 1', vid=1), VLAN(name='VLAN 2', vid=2), + VLAN(name='VLAN 3', vid=3), + VLAN(name='VLAN 4', vid=4), + VLAN(name='VLAN 5', vid=5), ) VLAN.objects.bulk_create(vlans) @@ -226,6 +229,12 @@ class CustomFieldAPITest(APITestCase): object_type=ContentType.objects.get_for_model(VLAN), default=vlans[0].pk, ), + CustomField( + type=CustomFieldTypeChoices.TYPE_MULTIOBJECT, + name='multiobject_field', + object_type=ContentType.objects.get_for_model(VLAN), + default=[vlans[0].pk, vlans[1].pk], + ), ) for cf in custom_fields: cf.save() @@ -250,6 +259,7 @@ class CustomFieldAPITest(APITestCase): custom_fields[6].name: '{"foo": 1, "bar": 2}', custom_fields[7].name: 'Bar', custom_fields[8].name: vlans[1].pk, + custom_fields[9].name: [vlans[2].pk, vlans[3].pk], } sites[1].save() @@ -273,6 +283,7 @@ class CustomFieldAPITest(APITestCase): 'json_field': None, 'choice_field': None, 'object_field': None, + 'multiobject_field': None, }) def test_get_single_object_with_custom_field_data(self): @@ -295,6 +306,10 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response.data['custom_fields']['json_field'], site2_cfvs['json_field']) self.assertEqual(response.data['custom_fields']['choice_field'], site2_cfvs['choice_field']) self.assertEqual(response.data['custom_fields']['object_field']['id'], site2_cfvs['object_field']) + self.assertEqual( + [obj['id'] for obj in response.data['custom_fields']['multiobject_field']], + site2_cfvs['multiobject_field'] + ) def test_create_single_object_with_defaults(self): """ @@ -324,6 +339,10 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['json_field'], cf_defaults['json_field']) self.assertEqual(response_cf['choice_field'], cf_defaults['choice_field']) self.assertEqual(response_cf['object_field']['id'], cf_defaults['object_field']) + self.assertEqual( + [obj['id'] for obj in response.data['custom_fields']['multiobject_field']], + cf_defaults['multiobject_field'] + ) # Validate database data site = Site.objects.get(pk=response.data['id']) @@ -336,6 +355,7 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(site.custom_field_data['json_field'], cf_defaults['json_field']) self.assertEqual(site.custom_field_data['choice_field'], cf_defaults['choice_field']) self.assertEqual(site.custom_field_data['object_field'], cf_defaults['object_field']) + self.assertEqual(site.custom_field_data['multiobject_field'], cf_defaults['multiobject_field']) def test_create_single_object_with_values(self): """ @@ -354,6 +374,7 @@ class CustomFieldAPITest(APITestCase): 'json_field': '{"foo": 1, "bar": 2}', 'choice_field': 'Bar', 'object_field': VLAN.objects.get(vid=2).pk, + 'multiobject_field': list(VLAN.objects.filter(vid__in=[3, 4]).values_list('pk', flat=True)), }, } url = reverse('dcim-api:site-list') @@ -374,6 +395,10 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['json_field'], data_cf['json_field']) self.assertEqual(response_cf['choice_field'], data_cf['choice_field']) self.assertEqual(response_cf['object_field']['id'], data_cf['object_field']) + self.assertEqual( + [obj['id'] for obj in response_cf['multiobject_field']], + data_cf['multiobject_field'] + ) # Validate database data site = Site.objects.get(pk=response.data['id']) @@ -386,6 +411,7 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(site.custom_field_data['json_field'], data_cf['json_field']) self.assertEqual(site.custom_field_data['choice_field'], data_cf['choice_field']) self.assertEqual(site.custom_field_data['object_field'], data_cf['object_field']) + self.assertEqual(site.custom_field_data['multiobject_field'], data_cf['multiobject_field']) def test_create_multiple_objects_with_defaults(self): """ @@ -429,6 +455,10 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['json_field'], cf_defaults['json_field']) self.assertEqual(response_cf['choice_field'], cf_defaults['choice_field']) self.assertEqual(response_cf['object_field']['id'], cf_defaults['object_field']) + self.assertEqual( + [obj['id'] for obj in response_cf['multiobject_field']], + cf_defaults['multiobject_field'] + ) # Validate database data site = Site.objects.get(pk=response.data[i]['id']) @@ -441,6 +471,7 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(site.custom_field_data['json_field'], cf_defaults['json_field']) self.assertEqual(site.custom_field_data['choice_field'], cf_defaults['choice_field']) self.assertEqual(site.custom_field_data['object_field'], cf_defaults['object_field']) + self.assertEqual(site.custom_field_data['multiobject_field'], cf_defaults['multiobject_field']) def test_create_multiple_objects_with_values(self): """ @@ -456,6 +487,7 @@ class CustomFieldAPITest(APITestCase): 'json_field': '{"foo": 1, "bar": 2}', 'choice_field': 'Bar', 'object_field': VLAN.objects.get(vid=2).pk, + 'multiobject_field': list(VLAN.objects.filter(vid__in=[3, 4]).values_list('pk', flat=True)), } data = ( { @@ -493,6 +525,10 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['url_field'], custom_field_data['url_field']) self.assertEqual(response_cf['json_field'], custom_field_data['json_field']) self.assertEqual(response_cf['choice_field'], custom_field_data['choice_field']) + self.assertEqual( + [obj['id'] for obj in response_cf['multiobject_field']], + custom_field_data['multiobject_field'] + ) # Validate database data site = Site.objects.get(pk=response.data[i]['id']) @@ -504,6 +540,7 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(site.custom_field_data['url_field'], custom_field_data['url_field']) self.assertEqual(site.custom_field_data['json_field'], custom_field_data['json_field']) self.assertEqual(site.custom_field_data['choice_field'], custom_field_data['choice_field']) + self.assertEqual(site.custom_field_data['multiobject_field'], custom_field_data['multiobject_field']) def test_update_single_object_with_values(self): """ @@ -534,6 +571,10 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['url_field'], original_cfvs['url_field']) self.assertEqual(response_cf['json_field'], original_cfvs['json_field']) self.assertEqual(response_cf['choice_field'], original_cfvs['choice_field']) + self.assertEqual( + [obj['id'] for obj in response_cf['multiobject_field']], + original_cfvs['multiobject_field'] + ) # Validate database data site2.refresh_from_db() @@ -545,6 +586,7 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(site2.custom_field_data['url_field'], original_cfvs['url_field']) self.assertEqual(site2.custom_field_data['json_field'], original_cfvs['json_field']) self.assertEqual(site2.custom_field_data['choice_field'], original_cfvs['choice_field']) + self.assertEqual(site2.custom_field_data['multiobject_field'], original_cfvs['multiobject_field']) def test_minimum_maximum_values_validation(self): site2 = Site.objects.get(name='Site 2') diff --git a/netbox/templates/inc/panels/custom_fields.html b/netbox/templates/inc/panels/custom_fields.html index 46636504eaf..c8838fa80c6 100644 --- a/netbox/templates/inc/panels/custom_fields.html +++ b/netbox/templates/inc/panels/custom_fields.html @@ -3,14 +3,14 @@ {% with custom_fields=object.get_custom_fields %} {% if custom_fields %}
    -
    - Custom Fields -
    +
    Custom Fields
    {% for field, value in custom_fields.items %} - + + + + +
    {{ field }} + {{ field }} + {% if field.type == 'longtext' and value %} {{ value|render_markdown }} @@ -26,6 +26,14 @@ {{ value|join:", " }} {% elif field.type == 'object' and value %} {{ value }} + {% elif field.type == 'multiobject' and value %} + {% if value %} +
      + {% for obj in value %} +
    • {{ obj }}
    • + {% endfor %} +
    + {% endif %} {% elif value is not None %} {{ value }} {% elif field.required %} From 85c06372ffe04f0fbb4ac6c05394bc1f819785d0 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 5 Jan 2022 21:04:44 -0500 Subject: [PATCH 066/271] Fix bulk editing for custom object fields --- netbox/netbox/views/generic/bulk_views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 6f21a6879a3..d76bc598dd4 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -285,7 +285,7 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): return get_permission_for_model(self.queryset.model, 'change') def _update_objects(self, form, request): - custom_fields = form.custom_fields if hasattr(form, 'custom_fields') else [] + custom_fields = getattr(form, 'custom_fields', []) standard_fields = [ field for field in form.fields if field not in custom_fields + ['pk'] ] @@ -327,7 +327,7 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): if name in form.nullable_fields and name in nullified_fields: obj.custom_field_data[name] = None elif name in form.changed_data: - obj.custom_field_data[name] = form.cleaned_data[name] + obj.custom_field_data[name] = form.fields[name].prepare_value(form.cleaned_data[name]) obj.full_clean() obj.save() From 7aa1fabbd7f4117242d2bdc564fd4dee31182edb Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 5 Jan 2022 21:21:23 -0500 Subject: [PATCH 067/271] Fix tests --- netbox/extras/models/customfields.py | 2 +- netbox/extras/tests/test_forms.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 99c4838576d..851680d8e5a 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -251,7 +251,7 @@ class CustomField(ChangeLoggedModel): if self.type == CustomFieldTypeChoices.TYPE_OBJECT: return value.pk if self.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: - return [obj.pk for obj in value] + return [obj.pk for obj in value] or None return value def deserialize(self, value): diff --git a/netbox/extras/tests/test_forms.py b/netbox/extras/tests/test_forms.py index e8b16d7ab82..1ec50b7ddd2 100644 --- a/netbox/extras/tests/test_forms.py +++ b/netbox/extras/tests/test_forms.py @@ -52,6 +52,13 @@ class CustomFieldModelFormTest(TestCase): ) cf_object.content_types.set([obj_type]) + cf_multiobject = CustomField.objects.create( + name='multiobject', + type=CustomFieldTypeChoices.TYPE_MULTIOBJECT, + object_type=ContentType.objects.get_for_model(Site) + ) + cf_multiobject.content_types.set([obj_type]) + def test_empty_values(self): """ Test that empty custom field values are stored as null From 1e80cc6db5dbbc7314519c2014d282f7dc3d85df Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 6 Jan 2022 13:24:37 -0500 Subject: [PATCH 068/271] Clean up & extend custom field tests --- netbox/extras/tests/test_customfields.py | 382 ++++++++++++++++------- 1 file changed, 270 insertions(+), 112 deletions(-) diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index 657c597f2e4..9191c1c5b15 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -15,7 +15,8 @@ from virtualization.models import VirtualMachine class CustomFieldTest(TestCase): - def setUp(self): + @classmethod + def setUpTestData(cls): Site.objects.bulk_create([ Site(name='Site A', slug='site-a'), @@ -23,137 +24,294 @@ class CustomFieldTest(TestCase): Site(name='Site C', slug='site-c'), ]) - def test_simple_fields(self): - DATA = ( - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_TEXT, - }, - 'value': 'Foobar!', - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_LONGTEXT, - }, - 'value': 'Text with **Markdown**', - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_INTEGER, - }, - 'value': 0, - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_INTEGER, - 'validation_minimum': 1, - 'validation_maximum': 100, - }, - 'value': 42, - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_INTEGER, - 'validation_minimum': -100, - 'validation_maximum': -1, - }, - 'value': -42, - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_BOOLEAN, - }, - 'value': True, - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_BOOLEAN, - }, - 'value': False, - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_DATE, - }, - 'value': '2016-06-23', - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_URL, - }, - 'value': 'http://example.com/', - }, - { - 'field': { - 'type': CustomFieldTypeChoices.TYPE_JSON, - }, - 'value': '{"foo": 1, "bar": 2}', - }, + cls.object_type = ContentType.objects.get_for_model(Site) + + def test_text_field(self): + value = 'Foobar!' + + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='text_field', + type=CustomFieldTypeChoices.TYPE_TEXT, + required=False ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) - obj_type = ContentType.objects.get_for_model(Site) + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) - for data in DATA: + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) - # Create a custom field - cf = CustomField(name='my_field', required=False, **data['field']) - cf.save() - cf.content_types.set([obj_type]) + def test_longtext_field(self): + value = 'A' * 256 - # Check that the field has a null initial value - site = Site.objects.first() - self.assertIsNone(site.custom_field_data[cf.name]) + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='longtext_field', + type=CustomFieldTypeChoices.TYPE_LONGTEXT, + required=False + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) - # Assign a value to the first Site - site.custom_field_data[cf.name] = data['value'] - site.save() + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) - # Retrieve the stored value - site.refresh_from_db() - self.assertEqual(site.custom_field_data[cf.name], data['value']) + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) - # Delete the stored value - site.custom_field_data.pop(cf.name) - site.save() - site.refresh_from_db() - self.assertIsNone(site.custom_field_data.get(cf.name)) + def test_integer_field(self): - # Delete the custom field - cf.delete() + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='integer_field', + type=CustomFieldTypeChoices.TYPE_INTEGER, + required=False + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) + + for value in (123456, 0, -123456): + + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) + + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) + + def test_boolean_field(self): + + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='boolean_field', + type=CustomFieldTypeChoices.TYPE_INTEGER, + required=False + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) + + for value in (True, False): + + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) + + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) + + def test_date_field(self): + value = '2016-06-23' + + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='date_field', + type=CustomFieldTypeChoices.TYPE_TEXT, + required=False + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) + + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) + + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) + + def test_url_field(self): + value = 'http://example.com/' + + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='url_field', + type=CustomFieldTypeChoices.TYPE_URL, + required=False + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) + + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) + + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) + + def test_json_field(self): + value = '{"foo": 1, "bar": 2}' + + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='json_field', + type=CustomFieldTypeChoices.TYPE_JSON, + required=False + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) + + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) + + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) def test_select_field(self): - obj_type = ContentType.objects.get_for_model(Site) + CHOICES = ('Option A', 'Option B', 'Option C') + value = CHOICES[1] - # Create a custom field - cf = CustomField( + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='select_field', type=CustomFieldTypeChoices.TYPE_SELECT, - name='my_field', required=False, - choices=['Option A', 'Option B', 'Option C'] + choices=CHOICES ) - cf.save() - cf.content_types.set([obj_type]) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) - # Check that the field has a null initial value - site = Site.objects.first() - self.assertIsNone(site.custom_field_data[cf.name]) + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) - # Assign a value to the first Site - site.custom_field_data[cf.name] = 'Option A' - site.save() + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) - # Retrieve the stored value - site.refresh_from_db() - self.assertEqual(site.custom_field_data[cf.name], 'Option A') + def test_multiselect_field(self): + CHOICES = ['Option A', 'Option B', 'Option C'] + value = [CHOICES[1], CHOICES[2]] - # Delete the stored value - site.custom_field_data.pop(cf.name) - site.save() - site.refresh_from_db() - self.assertIsNone(site.custom_field_data.get(cf.name)) + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='multiselect_field', + type=CustomFieldTypeChoices.TYPE_MULTISELECT, + required=False, + choices=CHOICES + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) - # Delete the custom field - cf.delete() + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) + + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) + + def test_object_field(self): + value = VLAN.objects.create(name='VLAN 1', vid=1).pk + + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='object_field', + type=CustomFieldTypeChoices.TYPE_OBJECT, + required=False + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) + + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) + + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) + + def test_multiobject_field(self): + vlans = ( + VLAN(name='VLAN 1', vid=1), + VLAN(name='VLAN 2', vid=2), + VLAN(name='VLAN 3', vid=3), + ) + VLAN.objects.bulk_create(vlans) + value = [vlan.pk for vlan in vlans] + + # Create a custom field & check that initial value is null + cf = CustomField.objects.create( + name='object_field', + type=CustomFieldTypeChoices.TYPE_MULTIOBJECT, + required=False + ) + cf.content_types.set([self.object_type]) + instance = Site.objects.first() + self.assertIsNone(instance.custom_field_data[cf.name]) + + # Assign a value and check that it is saved + instance.custom_field_data[cf.name] = value + instance.save() + instance.refresh_from_db() + self.assertEqual(instance.custom_field_data[cf.name], value) + + # Delete the stored value and check that it is now null + instance.custom_field_data.pop(cf.name) + instance.save() + instance.refresh_from_db() + self.assertIsNone(instance.custom_field_data.get(cf.name)) def test_rename_customfield(self): obj_type = ContentType.objects.get_for_model(Site) From bfc695434c8daf2642bee6e5fd2e400aecd31b9c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 6 Jan 2022 13:43:40 -0500 Subject: [PATCH 069/271] Add object_type validation --- netbox/extras/models/customfields.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 851680d8e5a..00c68939d1f 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -242,6 +242,17 @@ class CustomField(ChangeLoggedModel): 'default': f"The specified default value ({self.default}) is not listed as an available choice." }) + # Object fields must define an object_type; other fields must not + if self.type in (CustomFieldTypeChoices.TYPE_OBJECT, CustomFieldTypeChoices.TYPE_MULTIOBJECT): + if not self.object_type: + raise ValidationError({ + 'object_type': "Object fields must define an object type." + }) + elif self.object_type: + raise ValidationError({ + 'object_type': f"{self.get_type_display()} fields may not define an object type." + }) + def serialize(self, value): """ Prepare a value for storage as JSON data. From 3002382edc77ad8872940dd3e3b24bae0fea407b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 6 Jan 2022 13:44:21 -0500 Subject: [PATCH 070/271] Documentation and changelog for #7006 --- docs/models/extras/customfield.md | 6 ++++++ docs/release-notes/version-3.2.md | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/docs/models/extras/customfield.md b/docs/models/extras/customfield.md index e3462a6a7ec..da73816b68f 100644 --- a/docs/models/extras/customfield.md +++ b/docs/models/extras/customfield.md @@ -19,6 +19,8 @@ Custom fields may be created by navigating to Customization > Custom Fields. Net * JSON: Arbitrary data stored in JSON format * Selection: A selection of one of several pre-defined custom choices * Multiple selection: A selection field which supports the assignment of multiple values +* Object: A single NetBox object of the type defined by `object_type` +* Multiple object: One or more NetBox objects of the type defined by `object_type` Each custom field must have a name. This should be a simple database-friendly string (e.g. `tps_report`) and may contain only alphanumeric characters and underscores. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form. @@ -41,3 +43,7 @@ NetBox supports limited custom validation for custom field values. Following are Each custom selection field must have at least two choices. These are specified as a comma-separated list. Choices appear in forms in the order they are listed. Note that choice values are saved exactly as they appear, so it's best to avoid superfluous punctuation or symbols where possible. If a default value is specified for a selection field, it must exactly match one of the provided choices. The value of a multiple selection field will always return a list, even if only one value is selected. + +### Custom Object Fields + +An object or multi-object custom field can be used to refer to a particular NetBox object or objects as the "value" for a custom field. These custom fields must define an `object_type`, which determines the type of object to which custom field instances point. diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index d2702cfdaab..6240016cfbe 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -22,6 +22,12 @@ A new REST API endpoint has been added at `/api/ipam/vlan-groups//available- A new model has been introduced to represent function roles for inventory items, similar to device roles. The assignment of roles to inventory items is optional. +#### Custom Object Fields ([#7006](https://github.com/netbox-community/netbox/issues/7006)) + +Two new types of custom field have been added: object and multi-object. These can be used to associate objects with other objects in NetBox. For example, you might create a custom field named `primary_site` on the tenant model so that a particular site can be associated with each tenant as its primary. The multi-object custom field type allows for the assignment of one or more objects of the same type. + +Custom field object assignment is fully supported in the REST API, and functions similarly to normal foreign key relations. Nested representations are provided for each custom field object. + #### Modules & Module Types ([#7844](https://github.com/netbox-community/netbox/issues/7844)) Several new models have been added to support field-replaceable device modules, such as those within a chassis-based switch or router. Similar to devices, each module is instantiated from a user-defined module type, and can have components associated with it. These components become available to the parent device once the module has been installed within a module bay. This makes it very convenient to replicate the addition and deletion of device components as modules are installed and removed. @@ -96,6 +102,8 @@ Inventory item templates can be arranged hierarchically within a device type, an * Removed the `asn`, `contact_name`, `contact_phone`, and `contact_email` fields * extras.ConfigContext * Add `cluster_types` field +* extras.CustomField + * Added `object_type` field * ipam.VLANGroup * Added the `/availables-vlans/` endpoint * Added the `min_vid` and `max_vid` fields From 58f7eb319faad9f135afbd86e060eb2e2ebf574e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 6 Jan 2022 16:53:24 -0500 Subject: [PATCH 071/271] Initial work on #7679 --- netbox/circuits/tables.py | 4 +-- netbox/dcim/tables/devices.py | 8 +++--- netbox/dcim/tables/devicetypes.py | 5 ++-- netbox/dcim/tables/racks.py | 6 ++-- netbox/dcim/tables/sites.py | 7 +++-- netbox/extras/tables.py | 8 ++---- netbox/ipam/tables/fhrp.py | 7 ++--- netbox/ipam/tables/ip.py | 14 ++++----- netbox/ipam/tables/vlans.py | 12 +++++--- netbox/tenancy/tables.py | 13 ++++----- netbox/utilities/tables.py | 48 +++++++++++++++++++++++++++++++ netbox/virtualization/tables.py | 8 +++--- netbox/wireless/tables.py | 4 +-- 13 files changed, 96 insertions(+), 48 deletions(-) diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 32c40f26985..59ef073d347 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -2,7 +2,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor from tenancy.tables import TenantColumn -from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, MarkdownColumn, TagColumn, ToggleColumn +from utilities.tables import ActionsColumn, BaseTable, ChoiceFieldColumn, MarkdownColumn, TagColumn, ToggleColumn from .models import * @@ -88,7 +88,7 @@ class CircuitTypeTable(BaseTable): circuit_count = tables.Column( verbose_name='Circuits' ) - actions = ButtonsColumn(CircuitType) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = CircuitType diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 0c3a5f6a1f7..21da569a759 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -7,7 +7,7 @@ from dcim.models import ( ) from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, + ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, TemplateColumn, ToggleColumn, ) from .template_code import * @@ -94,7 +94,7 @@ class DeviceRoleTable(BaseTable): tags = TagColumn( url_name='dcim:devicerole_list' ) - actions = ButtonsColumn(DeviceRole) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = DeviceRole @@ -127,7 +127,7 @@ class PlatformTable(BaseTable): tags = TagColumn( url_name='dcim:platform_list' ) - actions = ButtonsColumn(Platform) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = Platform @@ -839,7 +839,7 @@ class InventoryItemRoleTable(BaseTable): tags = TagColumn( url_name='dcim:inventoryitemrole_list' ) - actions = ButtonsColumn(InventoryItemRole) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = InventoryItemRole diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 525c6903075..df27a366f4a 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -6,7 +6,8 @@ from dcim.models import ( InventoryItemTemplate, Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, ) from utilities.tables import ( - BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, + ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, + ToggleColumn, ) from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS @@ -48,7 +49,7 @@ class ManufacturerTable(BaseTable): tags = TagColumn( url_name='dcim:manufacturer_list' ) - actions = ButtonsColumn(Manufacturer) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = Manufacturer diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index 14bbe358912..27ddb6f3155 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -4,7 +4,7 @@ from django_tables2.utils import Accessor from dcim.models import Rack, RackReservation, RackRole from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, + ActionsColumn, BaseTable, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, UtilizationColumn, ) @@ -27,7 +27,7 @@ class RackRoleTable(BaseTable): tags = TagColumn( url_name='dcim:rackrole_list' ) - actions = ButtonsColumn(RackRole) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = RackRole @@ -121,7 +121,7 @@ class RackReservationTable(BaseTable): tags = TagColumn( url_name='dcim:rackreservation_list' ) - actions = ButtonsColumn(RackReservation) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = RackReservation diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index ceca41c86b8..5b39e31ebd4 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -3,7 +3,8 @@ import django_tables2 as tables from dcim.models import Location, Region, Site, SiteGroup from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, + ActionsColumn, BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, + TagColumn, ToggleColumn, ) from .template_code import LOCATION_ELEVATIONS @@ -32,7 +33,7 @@ class RegionTable(BaseTable): tags = TagColumn( url_name='dcim:region_list' ) - actions = ButtonsColumn(Region) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = Region @@ -57,7 +58,7 @@ class SiteGroupTable(BaseTable): tags = TagColumn( url_name='dcim:sitegroup_list' ) - actions = ButtonsColumn(SiteGroup) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = SiteGroup diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index 62317e6366a..defef465fc7 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -2,7 +2,7 @@ import django_tables2 as tables from django.conf import settings from utilities.tables import ( - BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ContentTypeColumn, ContentTypesColumn, + ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, ColorColumn, ContentTypeColumn, ContentTypesColumn, MarkdownColumn, ToggleColumn, ) from .models import * @@ -152,7 +152,7 @@ class TagTable(BaseTable): linkify=True ) color = ColorColumn() - actions = ButtonsColumn(Tag) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = Tag @@ -233,9 +233,7 @@ class ObjectJournalTable(BaseTable): comments = tables.TemplateColumn( template_code='{% load helpers %}{{ value|render_markdown|truncatewords_html:50 }}' ) - actions = ButtonsColumn( - model=JournalEntry - ) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = JournalEntry diff --git a/netbox/ipam/tables/fhrp.py b/netbox/ipam/tables/fhrp.py index 94bc50b93ee..ce472cb1ae5 100644 --- a/netbox/ipam/tables/fhrp.py +++ b/netbox/ipam/tables/fhrp.py @@ -1,6 +1,6 @@ import django_tables2 as tables -from utilities.tables import BaseTable, ButtonsColumn, MarkdownColumn, TagColumn, ToggleColumn +from utilities.tables import ActionsColumn, BaseTable, MarkdownColumn, TagColumn, ToggleColumn from ipam.models import * __all__ = ( @@ -58,9 +58,8 @@ class FHRPGroupAssignmentTable(BaseTable): group = tables.Column( linkify=True ) - actions = ButtonsColumn( - model=FHRPGroupAssignment, - buttons=('edit', 'delete', 'foo') + actions = ActionsColumn( + actions=('edit', 'delete') ) class Meta(BaseTable.Meta): diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index 3fddbf48e52..cf81fe722d1 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -4,8 +4,8 @@ from django_tables2.utils import Accessor from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn, - ToggleColumn, UtilizationColumn, + ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ToggleColumn, + UtilizationColumn, ) from ipam.models import * @@ -89,7 +89,7 @@ class RIRTable(BaseTable): tags = TagColumn( url_name='ipam:rir_list' ) - actions = ButtonsColumn(RIR) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = RIR @@ -111,7 +111,7 @@ class ASNTable(BaseTable): url_params={'asn_id': 'pk'}, verbose_name='Sites' ) - actions = ButtonsColumn(ASN) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = ASN @@ -173,7 +173,7 @@ class RoleTable(BaseTable): tags = TagColumn( url_name='ipam:role_list' ) - actions = ButtonsColumn(Role) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = Role @@ -405,9 +405,7 @@ class AssignedIPAddressesTable(BaseTable): ) status = ChoiceFieldColumn() tenant = TenantColumn() - actions = ButtonsColumn( - model=IPAddress - ) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = IPAddress diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index ca8d22552e0..f1a67c698a6 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -5,8 +5,8 @@ from django_tables2.utils import Accessor from dcim.models import Interface from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn, - TemplateColumn, ToggleColumn, + ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, + TagColumn, TemplateColumn, ToggleColumn, ) from virtualization.models import VMInterface from ipam.models import * @@ -153,7 +153,9 @@ class VLANDevicesTable(VLANMembersTable): device = tables.Column( linkify=True ) - actions = ButtonsColumn(Interface, buttons=['edit']) + actions = ActionsColumn( + actions=('edit',) + ) class Meta(BaseTable.Meta): model = Interface @@ -165,7 +167,9 @@ class VLANVirtualMachinesTable(VLANMembersTable): virtual_machine = tables.Column( linkify=True ) - actions = ButtonsColumn(VMInterface, buttons=['edit']) + actions = ActionsColumn( + actions=('edit',) + ) class Meta(BaseTable.Meta): model = VMInterface diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index 0ae1139bffb..b74b525283c 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from utilities.tables import ( - BaseTable, ButtonsColumn, ContentTypeColumn, LinkedCountColumn, linkify_phone, MarkdownColumn, MPTTColumn, + ActionsColumn, BaseTable, ContentTypeColumn, LinkedCountColumn, linkify_phone, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, ) from .models import * @@ -59,7 +59,7 @@ class TenantGroupTable(BaseTable): tags = TagColumn( url_name='tenancy:tenantgroup_list' ) - actions = ButtonsColumn(TenantGroup) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = TenantGroup @@ -103,7 +103,7 @@ class ContactGroupTable(BaseTable): tags = TagColumn( url_name='tenancy:contactgroup_list' ) - actions = ButtonsColumn(ContactGroup) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = ContactGroup @@ -116,7 +116,7 @@ class ContactRoleTable(BaseTable): name = tables.Column( linkify=True ) - actions = ButtonsColumn(ContactRole) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = ContactRole @@ -164,9 +164,8 @@ class ContactAssignmentTable(BaseTable): role = tables.Column( linkify=True ) - actions = ButtonsColumn( - model=ContactAssignment, - buttons=('edit', 'delete') + actions = ActionsColumn( + actions=('edit', 'delete') ) class Meta(BaseTable.Meta): diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index 9000af11087..15cbb77c817 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -1,3 +1,5 @@ +from collections import namedtuple + import django_tables2 as tables from django.conf import settings from django.contrib.auth.models import AnonymousUser @@ -205,6 +207,52 @@ class TemplateColumn(tables.TemplateColumn): return ret +ActionsMenuItem = namedtuple('ActionsMenuItem', ['title', 'icon']) + + +class ActionsColumn(tables.Column): + attrs = {'td': {'class': 'text-end noprint'}} + empty_values = () + _actions = { + 'edit': ActionsMenuItem('Edit', 'pencil'), + 'delete': ActionsMenuItem('Delete', 'trash-can-outline'), + 'changelog': ActionsMenuItem('Changelog', 'history'), + } + + def __init__(self, *args, actions=('edit', 'delete', 'changelog'), **kwargs): + super().__init__(*args, **kwargs) + + # Determine which actions to enable + self.actions = { + name: self._actions[name] for name in actions + } + + def header(self): + return '' + + def render(self, record, table, **kwargs): + if not self.actions: + return '' + + model = table.Meta.model + viewname_base = f'{model._meta.app_label}:{model._meta.model_name}' + request = getattr(table, 'context', {}).get('request') + url_appendix = f'?return_url={request.path}' if request else '' + + menu = '' + + return mark_safe(menu) + + class ButtonsColumn(tables.TemplateColumn): """ Render edit, delete, and changelog buttons for an object. diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index 818b09d339f..f04d2825e9a 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -2,8 +2,8 @@ import django_tables2 as tables from dcim.tables.devices import BaseInterfaceTable from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, - ToggleColumn, + ActionsColumn, BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, + TagColumn, ToggleColumn, ) from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -40,7 +40,7 @@ class ClusterTypeTable(BaseTable): tags = TagColumn( url_name='virtualization:clustertype_list' ) - actions = ButtonsColumn(ClusterType) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = ClusterType @@ -63,7 +63,7 @@ class ClusterGroupTable(BaseTable): tags = TagColumn( url_name='virtualization:clustergroup_list' ) - actions = ButtonsColumn(ClusterGroup) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = ClusterGroup diff --git a/netbox/wireless/tables.py b/netbox/wireless/tables.py index 4f47ee7f9fc..b16b31db871 100644 --- a/netbox/wireless/tables.py +++ b/netbox/wireless/tables.py @@ -2,7 +2,7 @@ import django_tables2 as tables from dcim.models import Interface from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn, + ActionsColumn, BaseTable, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn, ) from .models import * @@ -26,7 +26,7 @@ class WirelessLANGroupTable(BaseTable): tags = TagColumn( url_name='wireless:wirelesslangroup_list' ) - actions = ButtonsColumn(WirelessLANGroup) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = WirelessLANGroup From 00a8fd654eb4eab47972c3ad7ca2b5bc6752d3e4 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 7 Jan 2022 09:12:48 -0500 Subject: [PATCH 072/271] Refactor table utilities --- netbox/utilities/tables/__init__.py | 30 +++ .../{tables.py => tables/columns.py} | 188 ++---------------- netbox/utilities/tables/tables.py | 138 +++++++++++++ 3 files changed, 188 insertions(+), 168 deletions(-) create mode 100644 netbox/utilities/tables/__init__.py rename netbox/utilities/{tables.py => tables/columns.py} (68%) create mode 100644 netbox/utilities/tables/tables.py diff --git a/netbox/utilities/tables/__init__.py b/netbox/utilities/tables/__init__.py new file mode 100644 index 00000000000..37dd75144d6 --- /dev/null +++ b/netbox/utilities/tables/__init__.py @@ -0,0 +1,30 @@ +from django_tables2 import RequestConfig + +from utilities.paginator import EnhancedPaginator, get_paginate_count +from .columns import * +from .tables import * + + +# +# Pagination +# + +def paginate_table(table, request): + """ + Paginate a table given a request context. + """ + paginate = { + 'paginator_class': EnhancedPaginator, + 'per_page': get_paginate_count(request) + } + RequestConfig(request, paginate).configure(table) + + +# +# Callables +# + +def linkify_phone(value): + if value is None: + return None + return f"tel:{value}" diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables/columns.py similarity index 68% rename from netbox/utilities/tables.py rename to netbox/utilities/tables/columns.py index 15cbb77c817..177f3bd5b9a 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables/columns.py @@ -2,150 +2,33 @@ from collections import namedtuple import django_tables2 as tables from django.conf import settings -from django.contrib.auth.models import AnonymousUser -from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import FieldDoesNotExist -from django.db.models.fields.related import RelatedField from django.urls import reverse from django.utils.safestring import mark_safe -from django_tables2 import RequestConfig -from django_tables2.data import TableQuerysetData from django_tables2.utils import Accessor from extras.choices import CustomFieldTypeChoices -from extras.models import CustomField, CustomLink -from .utils import content_type_identifier, content_type_name -from .paginator import EnhancedPaginator, get_paginate_count +from utilities.utils import content_type_identifier, content_type_name +__all__ = ( + 'ActionsColumn', + 'BooleanColumn', + 'ButtonsColumn', + 'ChoiceFieldColumn', + 'ColorColumn', + 'ColoredLabelColumn', + 'ContentTypeColumn', + 'ContentTypesColumn', + 'CustomFieldColumn', + 'CustomLinkColumn', + 'LinkedCountColumn', + 'MarkdownColumn', + 'MPTTColumn', + 'TagColumn', + 'TemplateColumn', + 'ToggleColumn', + 'UtilizationColumn', +) -class BaseTable(tables.Table): - """ - Default table for object lists - - :param user: Personalize table display for the given user (optional). Has no effect if AnonymousUser is passed. - """ - id = tables.Column( - linkify=True, - verbose_name='ID' - ) - - class Meta: - attrs = { - 'class': 'table table-hover object-list', - } - - def __init__(self, *args, user=None, extra_columns=None, **kwargs): - if extra_columns is None: - extra_columns = [] - - # Add custom field columns - obj_type = ContentType.objects.get_for_model(self._meta.model) - cf_columns = [ - (f'cf_{cf.name}', CustomFieldColumn(cf)) for cf in CustomField.objects.filter(content_types=obj_type) - ] - cl_columns = [ - (f'cl_{cl.name}', CustomLinkColumn(cl)) for cl in CustomLink.objects.filter(content_type=obj_type) - ] - extra_columns.extend([*cf_columns, *cl_columns]) - - super().__init__(*args, extra_columns=extra_columns, **kwargs) - - # Set default empty_text if none was provided - if self.empty_text is None: - self.empty_text = f"No {self._meta.model._meta.verbose_name_plural} found" - - # Hide non-default columns - default_columns = getattr(self.Meta, 'default_columns', list()) - if default_columns: - for column in self.columns: - if column.name not in default_columns: - self.columns.hide(column.name) - - # Apply custom column ordering for user - if user is not None and not isinstance(user, AnonymousUser): - selected_columns = user.config.get(f"tables.{self.__class__.__name__}.columns") - if selected_columns: - - # Show only persistent or selected columns - for name, column in self.columns.items(): - if name in ['pk', 'actions', *selected_columns]: - self.columns.show(name) - else: - self.columns.hide(name) - - # Rearrange the sequence to list selected columns first, followed by all remaining columns - # TODO: There's probably a more clever way to accomplish this - self.sequence = [ - *[c for c in selected_columns if c in self.columns.names()], - *[c for c in self.columns.names() if c not in selected_columns] - ] - - # PK column should always come first - if 'pk' in self.sequence: - self.sequence.remove('pk') - self.sequence.insert(0, 'pk') - - # Actions column should always come last - if 'actions' in self.sequence: - self.sequence.remove('actions') - self.sequence.append('actions') - - # Dynamically update the table's QuerySet to ensure related fields are pre-fetched - if isinstance(self.data, TableQuerysetData): - - prefetch_fields = [] - for column in self.columns: - if column.visible: - model = getattr(self.Meta, 'model') - accessor = column.accessor - prefetch_path = [] - for field_name in accessor.split(accessor.SEPARATOR): - try: - field = model._meta.get_field(field_name) - except FieldDoesNotExist: - break - if isinstance(field, RelatedField): - # Follow ForeignKeys to the related model - prefetch_path.append(field_name) - model = field.remote_field.model - elif isinstance(field, GenericForeignKey): - # Can't prefetch beyond a GenericForeignKey - prefetch_path.append(field_name) - break - if prefetch_path: - prefetch_fields.append('__'.join(prefetch_path)) - self.data.data = self.data.data.prefetch_related(None).prefetch_related(*prefetch_fields) - - def _get_columns(self, visible=True): - columns = [] - for name, column in self.columns.items(): - if column.visible == visible and name not in ['pk', 'actions']: - columns.append((name, column.verbose_name)) - return columns - - @property - def available_columns(self): - return self._get_columns(visible=False) - - @property - def selected_columns(self): - return self._get_columns(visible=True) - - @property - def objects_count(self): - """ - Return the total number of real objects represented by the Table. This is useful when dealing with - prefixes/IP addresses/etc., where some table rows may represent available address space. - """ - if not hasattr(self, '_objects_count'): - self._objects_count = sum(1 for obj in self.data if hasattr(obj, 'pk')) - return self._objects_count - - -# -# Table columns -# class ToggleColumn(tables.CheckBoxColumn): """ @@ -557,34 +440,3 @@ class MarkdownColumn(tables.TemplateColumn): def value(self, value): return value - - -# -# Pagination -# - -def paginate_table(table, request): - """ - Paginate a table given a request context. - """ - paginate = { - 'paginator_class': EnhancedPaginator, - 'per_page': get_paginate_count(request) - } - RequestConfig(request, paginate).configure(table) - - -# -# Callables -# - -def linkify_email(value): - if value is None: - return None - return f"mailto:{value}" - - -def linkify_phone(value): - if value is None: - return None - return f"tel:{value}" diff --git a/netbox/utilities/tables/tables.py b/netbox/utilities/tables/tables.py new file mode 100644 index 00000000000..a1880059590 --- /dev/null +++ b/netbox/utilities/tables/tables.py @@ -0,0 +1,138 @@ +import django_tables2 as tables +from django.contrib.auth.models import AnonymousUser +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import FieldDoesNotExist +from django.db.models.fields.related import RelatedField +from django_tables2.data import TableQuerysetData + +from extras.models import CustomField, CustomLink +from . import columns + +__all__ = ( + 'BaseTable', +) + + +class BaseTable(tables.Table): + """ + Default table for object lists + + :param user: Personalize table display for the given user (optional). Has no effect if AnonymousUser is passed. + """ + id = tables.Column( + linkify=True, + verbose_name='ID' + ) + + class Meta: + attrs = { + 'class': 'table table-hover object-list', + } + + def __init__(self, *args, user=None, extra_columns=None, **kwargs): + if extra_columns is None: + extra_columns = [] + + # Add custom field columns + obj_type = ContentType.objects.get_for_model(self._meta.model) + cf_columns = [ + (f'cf_{cf.name}', columns.CustomFieldColumn(cf)) for cf in CustomField.objects.filter(content_types=obj_type) + ] + cl_columns = [ + (f'cl_{cl.name}', columns.CustomLinkColumn(cl)) for cl in CustomLink.objects.filter(content_type=obj_type) + ] + extra_columns.extend([*cf_columns, *cl_columns]) + + super().__init__(*args, extra_columns=extra_columns, **kwargs) + + # Set default empty_text if none was provided + if self.empty_text is None: + self.empty_text = f"No {self._meta.model._meta.verbose_name_plural} found" + + # Hide non-default columns + default_columns = getattr(self.Meta, 'default_columns', list()) + if default_columns: + for column in self.columns: + if column.name not in default_columns: + self.columns.hide(column.name) + + # Apply custom column ordering for user + if user is not None and not isinstance(user, AnonymousUser): + selected_columns = user.config.get(f"tables.{self.__class__.__name__}.columns") + if selected_columns: + + # Show only persistent or selected columns + for name, column in self.columns.items(): + if name in ['pk', 'actions', *selected_columns]: + self.columns.show(name) + else: + self.columns.hide(name) + + # Rearrange the sequence to list selected columns first, followed by all remaining columns + # TODO: There's probably a more clever way to accomplish this + self.sequence = [ + *[c for c in selected_columns if c in self.columns.names()], + *[c for c in self.columns.names() if c not in selected_columns] + ] + + # PK column should always come first + if 'pk' in self.sequence: + self.sequence.remove('pk') + self.sequence.insert(0, 'pk') + + # Actions column should always come last + if 'actions' in self.sequence: + self.sequence.remove('actions') + self.sequence.append('actions') + + # Dynamically update the table's QuerySet to ensure related fields are pre-fetched + if isinstance(self.data, TableQuerysetData): + + prefetch_fields = [] + for column in self.columns: + if column.visible: + model = getattr(self.Meta, 'model') + accessor = column.accessor + prefetch_path = [] + for field_name in accessor.split(accessor.SEPARATOR): + try: + field = model._meta.get_field(field_name) + except FieldDoesNotExist: + break + if isinstance(field, RelatedField): + # Follow ForeignKeys to the related model + prefetch_path.append(field_name) + model = field.remote_field.model + elif isinstance(field, GenericForeignKey): + # Can't prefetch beyond a GenericForeignKey + prefetch_path.append(field_name) + break + if prefetch_path: + prefetch_fields.append('__'.join(prefetch_path)) + self.data.data = self.data.data.prefetch_related(None).prefetch_related(*prefetch_fields) + + def _get_columns(self, visible=True): + columns = [] + for name, column in self.columns.items(): + if column.visible == visible and name not in ['pk', 'actions']: + columns.append((name, column.verbose_name)) + return columns + + @property + def available_columns(self): + return self._get_columns(visible=False) + + @property + def selected_columns(self): + return self._get_columns(visible=True) + + @property + def objects_count(self): + """ + Return the total number of real objects represented by the Table. This is useful when dealing with + prefixes/IP addresses/etc., where some table rows may represent available address space. + """ + if not hasattr(self, '_objects_count'): + self._objects_count = sum(1 for obj in self.data if hasattr(obj, 'pk')) + return self._objects_count From 6d48ce4a253f687b1b26d147da8f482a50054d5b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 7 Jan 2022 10:36:58 -0500 Subject: [PATCH 073/271] Always include actions as a default column --- netbox/circuits/tables.py | 5 ++--- netbox/dcim/tables/devices.py | 29 +++++++++++------------------ netbox/dcim/tables/devicetypes.py | 3 +-- netbox/dcim/tables/racks.py | 12 ++++-------- netbox/dcim/tables/sites.py | 12 +++++------- netbox/extras/tables.py | 8 +++----- netbox/ipam/tables/ip.py | 15 +++++---------- netbox/ipam/tables/vlans.py | 2 +- netbox/tenancy/tables.py | 11 ++++------- netbox/utilities/tables/columns.py | 3 ++- netbox/utilities/tables/tables.py | 12 ++++++------ netbox/virtualization/tables.py | 15 ++++++--------- netbox/wireless/tables.py | 7 ++----- 13 files changed, 52 insertions(+), 82 deletions(-) diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 59ef073d347..c99bec8bcf8 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -2,7 +2,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor from tenancy.tables import TenantColumn -from utilities.tables import ActionsColumn, BaseTable, ChoiceFieldColumn, MarkdownColumn, TagColumn, ToggleColumn +from utilities.tables import BaseTable, ChoiceFieldColumn, MarkdownColumn, TagColumn, ToggleColumn from .models import * @@ -88,12 +88,11 @@ class CircuitTypeTable(BaseTable): circuit_count = tables.Column( verbose_name='Circuits' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = CircuitType fields = ('pk', 'id', 'name', 'circuit_count', 'description', 'slug', 'tags', 'actions') - default_columns = ('pk', 'name', 'circuit_count', 'description', 'slug', 'actions') + default_columns = ('pk', 'name', 'circuit_count', 'description', 'slug') # diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 21da569a759..f21bc3204c1 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -94,7 +94,6 @@ class DeviceRoleTable(BaseTable): tags = TagColumn( url_name='dcim:devicerole_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = DeviceRole @@ -102,7 +101,7 @@ class DeviceRoleTable(BaseTable): 'pk', 'id', 'name', 'device_count', 'vm_count', 'color', 'vm_role', 'description', 'slug', 'tags', 'actions', ) - default_columns = ('pk', 'name', 'device_count', 'vm_count', 'color', 'vm_role', 'description', 'actions') + default_columns = ('pk', 'name', 'device_count', 'vm_count', 'color', 'vm_role', 'description') # @@ -127,7 +126,6 @@ class PlatformTable(BaseTable): tags = TagColumn( url_name='dcim:platform_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = Platform @@ -136,7 +134,7 @@ class PlatformTable(BaseTable): 'description', 'tags', 'actions', ) default_columns = ( - 'pk', 'name', 'manufacturer', 'device_count', 'vm_count', 'napalm_driver', 'description', 'actions', + 'pk', 'name', 'manufacturer', 'device_count', 'vm_count', 'napalm_driver', 'description', ) @@ -336,7 +334,7 @@ class DeviceConsolePortTable(ConsolePortTable): 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions' ) - default_columns = ('pk', 'name', 'label', 'type', 'speed', 'description', 'cable', 'connection', 'actions') + default_columns = ('pk', 'name', 'label', 'type', 'speed', 'description', 'cable', 'connection') row_attrs = { 'class': get_cabletermination_row_class } @@ -381,7 +379,7 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable): 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions', ) - default_columns = ('pk', 'name', 'label', 'type', 'speed', 'description', 'cable', 'connection', 'actions') + default_columns = ('pk', 'name', 'label', 'type', 'speed', 'description', 'cable', 'connection') row_attrs = { 'class': get_cabletermination_row_class } @@ -428,7 +426,6 @@ class DevicePowerPortTable(PowerPortTable): ) default_columns = ( 'pk', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'cable', 'connection', - 'actions', ) row_attrs = { 'class': get_cabletermination_row_class @@ -477,7 +474,7 @@ class DevicePowerOutletTable(PowerOutletTable): 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions', ) default_columns = ( - 'pk', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', 'cable', 'connection', 'actions', + 'pk', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', 'cable', 'connection', ) row_attrs = { 'class': get_cabletermination_row_class @@ -572,7 +569,7 @@ class DeviceInterfaceTable(InterfaceTable): order_by = ('name',) default_columns = ( 'pk', 'name', 'label', 'enabled', 'type', 'parent', 'lag', 'mtu', 'mode', 'description', 'ip_addresses', - 'cable', 'connection', 'actions', + 'cable', 'connection', ) row_attrs = { 'class': get_interface_row_class, @@ -631,7 +628,6 @@ class DeviceFrontPortTable(FrontPortTable): ) default_columns = ( 'pk', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'cable', 'link_peer', - 'actions', ) row_attrs = { 'class': get_cabletermination_row_class @@ -679,7 +675,7 @@ class DeviceRearPortTable(RearPortTable): 'cable', 'cable_color', 'link_peer', 'tags', 'actions', ) default_columns = ( - 'pk', 'name', 'label', 'type', 'positions', 'description', 'cable', 'link_peer', 'actions', + 'pk', 'name', 'label', 'type', 'positions', 'description', 'cable', 'link_peer', ) row_attrs = { 'class': get_cabletermination_row_class @@ -728,9 +724,7 @@ class DeviceDeviceBayTable(DeviceBayTable): fields = ( 'pk', 'id', 'name', 'label', 'status', 'installed_device', 'description', 'tags', 'actions', ) - default_columns = ( - 'pk', 'name', 'label', 'status', 'installed_device', 'description', 'actions', - ) + default_columns = ('pk', 'name', 'label', 'status', 'installed_device', 'description') class ModuleBayTable(DeviceComponentTable): @@ -764,7 +758,7 @@ class DeviceModuleBayTable(ModuleBayTable): class Meta(DeviceComponentTable.Meta): model = ModuleBay fields = ('pk', 'id', 'name', 'label', 'description', 'installed_module', 'tags', 'actions') - default_columns = ('pk', 'name', 'label', 'description', 'installed_module', 'actions') + default_columns = ('pk', 'name', 'label', 'description', 'installed_module') class InventoryItemTable(DeviceComponentTable): @@ -821,7 +815,7 @@ class DeviceInventoryItemTable(InventoryItemTable): 'description', 'discovered', 'tags', 'actions', ) default_columns = ( - 'pk', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'component', 'actions', + 'pk', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'component', ) @@ -839,14 +833,13 @@ class InventoryItemRoleTable(BaseTable): tags = TagColumn( url_name='dcim:inventoryitemrole_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = InventoryItemRole fields = ( 'pk', 'id', 'name', 'inventoryitem_count', 'color', 'description', 'slug', 'tags', 'actions', ) - default_columns = ('pk', 'name', 'inventoryitem_count', 'color', 'description', 'actions') + default_columns = ('pk', 'name', 'inventoryitem_count', 'color', 'description') # diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index df27a366f4a..29fa4d4debb 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -49,7 +49,6 @@ class ManufacturerTable(BaseTable): tags = TagColumn( url_name='dcim:manufacturer_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = Manufacturer @@ -58,7 +57,7 @@ class ManufacturerTable(BaseTable): 'actions', ) default_columns = ( - 'pk', 'name', 'devicetype_count', 'inventoryitem_count', 'platform_count', 'description', 'slug', 'actions', + 'pk', 'name', 'devicetype_count', 'inventoryitem_count', 'platform_count', 'description', 'slug', ) diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index 27ddb6f3155..565966a399c 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -4,8 +4,8 @@ from django_tables2.utils import Accessor from dcim.models import Rack, RackReservation, RackRole from tenancy.tables import TenantColumn from utilities.tables import ( - ActionsColumn, BaseTable, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, - TagColumn, ToggleColumn, UtilizationColumn, + BaseTable, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, + ToggleColumn, UtilizationColumn, ) __all__ = ( @@ -27,12 +27,11 @@ class RackRoleTable(BaseTable): tags = TagColumn( url_name='dcim:rackrole_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = RackRole fields = ('pk', 'id', 'name', 'rack_count', 'color', 'description', 'slug', 'tags', 'actions') - default_columns = ('pk', 'name', 'rack_count', 'color', 'description', 'actions') + default_columns = ('pk', 'name', 'rack_count', 'color', 'description') # @@ -121,7 +120,6 @@ class RackReservationTable(BaseTable): tags = TagColumn( url_name='dcim:rackreservation_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = RackReservation @@ -129,6 +127,4 @@ class RackReservationTable(BaseTable): 'pk', 'id', 'reservation', 'site', 'rack', 'unit_list', 'user', 'created', 'tenant', 'description', 'tags', 'actions', ) - default_columns = ( - 'pk', 'reservation', 'site', 'rack', 'unit_list', 'user', 'description', 'actions', - ) + default_columns = ('pk', 'reservation', 'site', 'rack', 'unit_list', 'user', 'description') diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 5b39e31ebd4..23ffabae214 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -3,8 +3,7 @@ import django_tables2 as tables from dcim.models import Location, Region, Site, SiteGroup from tenancy.tables import TenantColumn from utilities.tables import ( - ActionsColumn, BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, - TagColumn, ToggleColumn, + BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, ) from .template_code import LOCATION_ELEVATIONS @@ -33,12 +32,11 @@ class RegionTable(BaseTable): tags = TagColumn( url_name='dcim:region_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = Region fields = ('pk', 'id', 'name', 'slug', 'site_count', 'description', 'tags', 'actions') - default_columns = ('pk', 'name', 'site_count', 'description', 'actions') + default_columns = ('pk', 'name', 'site_count', 'description') # @@ -58,12 +56,11 @@ class SiteGroupTable(BaseTable): tags = TagColumn( url_name='dcim:sitegroup_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = SiteGroup fields = ('pk', 'id', 'name', 'slug', 'site_count', 'description', 'tags', 'actions') - default_columns = ('pk', 'name', 'site_count', 'description', 'actions') + default_columns = ('pk', 'name', 'site_count', 'description') # @@ -99,6 +96,7 @@ class SiteTable(BaseTable): fields = ( 'pk', 'id', 'name', 'slug', 'status', 'facility', 'region', 'group', 'tenant', 'asn_count', 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', 'tags', + 'actions', ) default_columns = ('pk', 'name', 'status', 'facility', 'region', 'group', 'tenant', 'description') @@ -140,4 +138,4 @@ class LocationTable(BaseTable): 'pk', 'id', 'name', 'site', 'tenant', 'rack_count', 'device_count', 'description', 'slug', 'tags', 'actions', ) - default_columns = ('pk', 'name', 'site', 'tenant', 'rack_count', 'device_count', 'description', 'actions') + default_columns = ('pk', 'name', 'site', 'tenant', 'rack_count', 'device_count', 'description') diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index defef465fc7..e30bc690741 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -152,12 +152,11 @@ class TagTable(BaseTable): linkify=True ) color = ColorColumn() - actions = ActionsColumn() class Meta(BaseTable.Meta): model = Tag fields = ('pk', 'id', 'name', 'items', 'slug', 'color', 'description', 'actions') - default_columns = ('pk', 'name', 'items', 'slug', 'color', 'description', 'actions') + default_columns = ('pk', 'name', 'items', 'slug', 'color', 'description') class TaggedItemTable(BaseTable): @@ -215,6 +214,7 @@ class ObjectChangeTable(BaseTable): template_code=OBJECTCHANGE_REQUEST_ID, verbose_name='Request ID' ) + actions = ActionsColumn(actions=()) class Meta(BaseTable.Meta): model = ObjectChange @@ -233,7 +233,6 @@ class ObjectJournalTable(BaseTable): comments = tables.TemplateColumn( template_code='{% load helpers %}{{ value|render_markdown|truncatewords_html:50 }}' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = JournalEntry @@ -259,6 +258,5 @@ class JournalEntryTable(ObjectJournalTable): 'comments', 'actions' ) default_columns = ( - 'pk', 'created', 'created_by', 'assigned_object_type', 'assigned_object', 'kind', - 'comments', 'actions' + 'pk', 'created', 'created_by', 'assigned_object_type', 'assigned_object', 'kind', 'comments' ) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index cf81fe722d1..9914fb22b74 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -2,12 +2,11 @@ import django_tables2 as tables from django.utils.safestring import mark_safe from django_tables2.utils import Accessor +from ipam.models import * from tenancy.tables import TenantColumn from utilities.tables import ( - ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ToggleColumn, - UtilizationColumn, + BaseTable, BooleanColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ToggleColumn, UtilizationColumn, ) -from ipam.models import * __all__ = ( 'AggregateTable', @@ -89,12 +88,11 @@ class RIRTable(BaseTable): tags = TagColumn( url_name='ipam:rir_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = RIR fields = ('pk', 'id', 'name', 'slug', 'is_private', 'aggregate_count', 'description', 'tags', 'actions') - default_columns = ('pk', 'name', 'is_private', 'aggregate_count', 'description', 'actions') + default_columns = ('pk', 'name', 'is_private', 'aggregate_count', 'description') # @@ -111,12 +109,11 @@ class ASNTable(BaseTable): url_params={'asn_id': 'pk'}, verbose_name='Sites' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = ASN fields = ('pk', 'asn', 'rir', 'site_count', 'tenant', 'description', 'actions') - default_columns = ('pk', 'asn', 'rir', 'site_count', 'sites', 'tenant', 'actions') + default_columns = ('pk', 'asn', 'rir', 'site_count', 'sites', 'tenant') # @@ -173,12 +170,11 @@ class RoleTable(BaseTable): tags = TagColumn( url_name='ipam:role_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = Role fields = ('pk', 'id', 'name', 'slug', 'prefix_count', 'vlan_count', 'description', 'weight', 'tags', 'actions') - default_columns = ('pk', 'name', 'prefix_count', 'vlan_count', 'description', 'actions') + default_columns = ('pk', 'name', 'prefix_count', 'vlan_count', 'description') # @@ -405,7 +401,6 @@ class AssignedIPAddressesTable(BaseTable): ) status = ChoiceFieldColumn() tenant = TenantColumn() - actions = ActionsColumn() class Meta(BaseTable.Meta): model = IPAddress diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index f1a67c698a6..1470b3d1abf 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -88,7 +88,7 @@ class VLANGroupTable(BaseTable): 'pk', 'id', 'name', 'scope_type', 'scope', 'min_vid', 'max_vid', 'vlan_count', 'slug', 'description', 'tags', 'actions', ) - default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description', 'actions') + default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description') # diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index b74b525283c..72878ef298e 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -59,12 +59,11 @@ class TenantGroupTable(BaseTable): tags = TagColumn( url_name='tenancy:tenantgroup_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = TenantGroup fields = ('pk', 'id', 'name', 'tenant_count', 'description', 'slug', 'tags', 'actions') - default_columns = ('pk', 'name', 'tenant_count', 'description', 'actions') + default_columns = ('pk', 'name', 'tenant_count', 'description') class TenantTable(BaseTable): @@ -103,12 +102,11 @@ class ContactGroupTable(BaseTable): tags = TagColumn( url_name='tenancy:contactgroup_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = ContactGroup fields = ('pk', 'name', 'contact_count', 'description', 'slug', 'tags', 'actions') - default_columns = ('pk', 'name', 'contact_count', 'description', 'actions') + default_columns = ('pk', 'name', 'contact_count', 'description') class ContactRoleTable(BaseTable): @@ -116,12 +114,11 @@ class ContactRoleTable(BaseTable): name = tables.Column( linkify=True ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = ContactRole fields = ('pk', 'name', 'description', 'slug', 'actions') - default_columns = ('pk', 'name', 'description', 'actions') + default_columns = ('pk', 'name', 'description') class ContactTable(BaseTable): @@ -171,4 +168,4 @@ class ContactAssignmentTable(BaseTable): class Meta(BaseTable.Meta): model = ContactAssignment fields = ('pk', 'content_type', 'object', 'contact', 'role', 'priority', 'actions') - default_columns = ('pk', 'content_type', 'object', 'contact', 'role', 'priority', 'actions') + default_columns = ('pk', 'content_type', 'object', 'contact', 'role', 'priority') diff --git a/netbox/utilities/tables/columns.py b/netbox/utilities/tables/columns.py index 177f3bd5b9a..468d81ab73f 100644 --- a/netbox/utilities/tables/columns.py +++ b/netbox/utilities/tables/columns.py @@ -114,7 +114,8 @@ class ActionsColumn(tables.Column): return '' def render(self, record, table, **kwargs): - if not self.actions: + # Skip dummy records (e.g. available VLANs) or those with no actions + if not hasattr(record, 'pk') or not self.actions: return '' model = table.Meta.model diff --git a/netbox/utilities/tables/tables.py b/netbox/utilities/tables/tables.py index a1880059590..6c3b5695991 100644 --- a/netbox/utilities/tables/tables.py +++ b/netbox/utilities/tables/tables.py @@ -24,6 +24,7 @@ class BaseTable(tables.Table): linkify=True, verbose_name='ID' ) + actions = columns.ActionsColumn() class Meta: attrs = { @@ -50,12 +51,11 @@ class BaseTable(tables.Table): if self.empty_text is None: self.empty_text = f"No {self._meta.model._meta.verbose_name_plural} found" - # Hide non-default columns - default_columns = getattr(self.Meta, 'default_columns', list()) - if default_columns: - for column in self.columns: - if column.name not in default_columns: - self.columns.hide(column.name) + # Hide non-default columns (except for actions) + default_columns = [*getattr(self.Meta, 'default_columns', self.Meta.fields), 'actions'] + for column in self.columns: + if column.name not in default_columns: + self.columns.hide(column.name) # Apply custom column ordering for user if user is not None and not isinstance(user, AnonymousUser): diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index f04d2825e9a..65f9f12576e 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -1,9 +1,10 @@ import django_tables2 as tables + from dcim.tables.devices import BaseInterfaceTable from tenancy.tables import TenantColumn from utilities.tables import ( - ActionsColumn, BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, - TagColumn, ToggleColumn, + BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, + ToggleColumn, ) from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -40,12 +41,11 @@ class ClusterTypeTable(BaseTable): tags = TagColumn( url_name='virtualization:clustertype_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = ClusterType fields = ('pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions') - default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions') + default_columns = ('pk', 'name', 'cluster_count', 'description') # @@ -63,12 +63,11 @@ class ClusterGroupTable(BaseTable): tags = TagColumn( url_name='virtualization:clustergroup_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = ClusterGroup fields = ('pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions') - default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions') + default_columns = ('pk', 'name', 'cluster_count', 'description') # @@ -196,9 +195,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions', ) - default_columns = ( - 'pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses', 'actions', - ) + default_columns = ('pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses') row_attrs = { 'data-name': lambda record: record.name, } diff --git a/netbox/wireless/tables.py b/netbox/wireless/tables.py index b16b31db871..67d46f248f4 100644 --- a/netbox/wireless/tables.py +++ b/netbox/wireless/tables.py @@ -1,9 +1,7 @@ import django_tables2 as tables from dcim.models import Interface -from utilities.tables import ( - ActionsColumn, BaseTable, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn, -) +from utilities.tables import BaseTable, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn from .models import * __all__ = ( @@ -26,12 +24,11 @@ class WirelessLANGroupTable(BaseTable): tags = TagColumn( url_name='wireless:wirelesslangroup_list' ) - actions = ActionsColumn() class Meta(BaseTable.Meta): model = WirelessLANGroup fields = ('pk', 'name', 'wirelesslan_count', 'description', 'slug', 'tags', 'actions') - default_columns = ('pk', 'name', 'wirelesslan_count', 'description', 'actions') + default_columns = ('pk', 'name', 'wirelesslan_count', 'description') class WirelessLANTable(BaseTable): From ededa69e4ab12379e360fc1ce8ab204d6379ac42 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 7 Jan 2022 10:53:00 -0500 Subject: [PATCH 074/271] Only show relevant links for user permissions --- netbox/utilities/tables/columns.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/netbox/utilities/tables/columns.py b/netbox/utilities/tables/columns.py index 468d81ab73f..90505f2da28 100644 --- a/netbox/utilities/tables/columns.py +++ b/netbox/utilities/tables/columns.py @@ -90,16 +90,16 @@ class TemplateColumn(tables.TemplateColumn): return ret -ActionsMenuItem = namedtuple('ActionsMenuItem', ['title', 'icon']) +ActionsMenuItem = namedtuple('ActionsMenuItem', ['title', 'icon', 'permission']) class ActionsColumn(tables.Column): attrs = {'td': {'class': 'text-end noprint'}} empty_values = () _actions = { - 'edit': ActionsMenuItem('Edit', 'pencil'), - 'delete': ActionsMenuItem('Delete', 'trash-can-outline'), - 'changelog': ActionsMenuItem('Changelog', 'history'), + 'edit': ActionsMenuItem('Edit', 'pencil', 'change'), + 'delete': ActionsMenuItem('Delete', 'trash-can-outline', 'delete'), + 'changelog': ActionsMenuItem('Changelog', 'history', None), } def __init__(self, *args, actions=('edit', 'delete', 'changelog'), **kwargs): @@ -123,16 +123,21 @@ class ActionsColumn(tables.Column): request = getattr(table, 'context', {}).get('request') url_appendix = f'?return_url={request.path}' if request else '' - menu = '' + if not links: + return '' + + menu = f'' return mark_safe(menu) From 1024adca72570f58ac899850c5ca66bf782ee528 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 7 Jan 2022 11:00:35 -0500 Subject: [PATCH 075/271] Exclude actions column from export --- netbox/netbox/views/generic/object_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 607501a9b36..d8850391bfe 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -203,7 +203,7 @@ class ObjectListView(ObjectPermissionRequiredMixin, View): :param table: The Table instance to export :param columns: A list of specific columns to include. If not specified, all columns will be exported. """ - exclude_columns = {'pk'} + exclude_columns = {'pk', 'actions'} if columns: all_columns = [col_name for col_name, _ in table.selected_columns + table.available_columns] exclude_columns.update({ From bff7400de4503b8f25938680572e28c634f09ed4 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 7 Jan 2022 11:23:04 -0500 Subject: [PATCH 076/271] Convert ActionsMenuItem to dataclass --- netbox/utilities/tables/columns.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/netbox/utilities/tables/columns.py b/netbox/utilities/tables/columns.py index 90505f2da28..df9db357fce 100644 --- a/netbox/utilities/tables/columns.py +++ b/netbox/utilities/tables/columns.py @@ -1,4 +1,6 @@ from collections import namedtuple +from dataclasses import dataclass +from typing import Optional import django_tables2 as tables from django.conf import settings @@ -90,16 +92,20 @@ class TemplateColumn(tables.TemplateColumn): return ret -ActionsMenuItem = namedtuple('ActionsMenuItem', ['title', 'icon', 'permission']) +@dataclass +class ActionsItem: + title: str + icon: str + permission: Optional[str] = None class ActionsColumn(tables.Column): attrs = {'td': {'class': 'text-end noprint'}} empty_values = () _actions = { - 'edit': ActionsMenuItem('Edit', 'pencil', 'change'), - 'delete': ActionsMenuItem('Delete', 'trash-can-outline', 'delete'), - 'changelog': ActionsMenuItem('Changelog', 'history', None), + 'edit': ActionsItem('Edit', 'pencil', 'change'), + 'delete': ActionsItem('Delete', 'trash-can-outline', 'delete'), + 'changelog': ActionsItem('Changelog', 'history'), } def __init__(self, *args, actions=('edit', 'delete', 'changelog'), **kwargs): From 8b07fbc5544a7435f4178811f4927a7f606b6aaf Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 7 Jan 2022 11:56:18 -0500 Subject: [PATCH 077/271] Allow passing additional columns & specifying a sequence --- netbox/extras/tables.py | 2 +- netbox/ipam/tables/fhrp.py | 2 +- netbox/ipam/tables/vlans.py | 4 ++-- netbox/tenancy/tables.py | 2 +- netbox/utilities/tables/columns.py | 10 +++++++--- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index e30bc690741..071caa354e5 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -214,7 +214,7 @@ class ObjectChangeTable(BaseTable): template_code=OBJECTCHANGE_REQUEST_ID, verbose_name='Request ID' ) - actions = ActionsColumn(actions=()) + actions = ActionsColumn(sequence=()) class Meta(BaseTable.Meta): model = ObjectChange diff --git a/netbox/ipam/tables/fhrp.py b/netbox/ipam/tables/fhrp.py index ce472cb1ae5..a691b945b21 100644 --- a/netbox/ipam/tables/fhrp.py +++ b/netbox/ipam/tables/fhrp.py @@ -59,7 +59,7 @@ class FHRPGroupAssignmentTable(BaseTable): linkify=True ) actions = ActionsColumn( - actions=('edit', 'delete') + sequence=('edit', 'delete') ) class Meta(BaseTable.Meta): diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index 1470b3d1abf..1379ad10556 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -154,7 +154,7 @@ class VLANDevicesTable(VLANMembersTable): linkify=True ) actions = ActionsColumn( - actions=('edit',) + sequence=('edit',) ) class Meta(BaseTable.Meta): @@ -168,7 +168,7 @@ class VLANVirtualMachinesTable(VLANMembersTable): linkify=True ) actions = ActionsColumn( - actions=('edit',) + sequence=('edit',) ) class Meta(BaseTable.Meta): diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index 72878ef298e..f15e67eab5b 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -162,7 +162,7 @@ class ContactAssignmentTable(BaseTable): linkify=True ) actions = ActionsColumn( - actions=('edit', 'delete') + sequence=('edit', 'delete') ) class Meta(BaseTable.Meta): diff --git a/netbox/utilities/tables/columns.py b/netbox/utilities/tables/columns.py index df9db357fce..e601bd0ccf2 100644 --- a/netbox/utilities/tables/columns.py +++ b/netbox/utilities/tables/columns.py @@ -102,18 +102,22 @@ class ActionsItem: class ActionsColumn(tables.Column): attrs = {'td': {'class': 'text-end noprint'}} empty_values = () - _actions = { + actions = { 'edit': ActionsItem('Edit', 'pencil', 'change'), 'delete': ActionsItem('Delete', 'trash-can-outline', 'delete'), 'changelog': ActionsItem('Changelog', 'history'), } - def __init__(self, *args, actions=('edit', 'delete', 'changelog'), **kwargs): + def __init__(self, *args, extra_actions=None, sequence=('edit', 'delete', 'changelog'), **kwargs): super().__init__(*args, **kwargs) + # Add/update any extra actions passed + if extra_actions: + self.actions.update(extra_actions) + # Determine which actions to enable self.actions = { - name: self._actions[name] for name in actions + name: self.actions[name] for name in sequence } def header(self): From 3e277de82d5c8e08878f416a3a888f0497942c3a Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 7 Jan 2022 14:57:43 -0500 Subject: [PATCH 078/271] Closes #7852: Enable assigning interfaces to VRFs --- docs/models/dcim/interface.md | 2 +- docs/release-notes/version-3.2.md | 3 ++- netbox/dcim/api/serializers.py | 7 +++++-- netbox/dcim/api/views.py | 2 +- netbox/dcim/filtersets.py | 13 +++++++++++- netbox/dcim/forms/bulk_edit.py | 12 ++++++++--- netbox/dcim/forms/bulk_import.py | 9 +++++++- netbox/dcim/forms/filtersets.py | 10 +++++++-- netbox/dcim/forms/models.py | 11 +++++++--- netbox/dcim/migrations/0149_interface_vrf.py | 20 ++++++++++++++++++ netbox/dcim/models/device_components.py | 8 +++++++ netbox/dcim/tables/devices.py | 5 ++++- netbox/dcim/tests/test_api.py | 12 ++++++++++- netbox/dcim/tests/test_filtersets.py | 22 ++++++++++++++++---- netbox/dcim/tests/test_views.py | 20 +++++++++++++----- netbox/templates/dcim/interface.html | 10 +++++++++ netbox/templates/dcim/interface_edit.html | 1 + 17 files changed, 141 insertions(+), 26 deletions(-) create mode 100644 netbox/dcim/migrations/0149_interface_vrf.py diff --git a/docs/models/dcim/interface.md b/docs/models/dcim/interface.md index 585674de1ac..7fa52fa9fab 100644 --- a/docs/models/dcim/interface.md +++ b/docs/models/dcim/interface.md @@ -1,6 +1,6 @@ ## Interfaces -Interfaces in NetBox represent network interfaces used to exchange data with connected devices. On modern networks, these are most commonly Ethernet, but other types are supported as well. Each interface must be assigned a type, and may optionally be assigned a MAC address, MTU, and IEEE 802.1Q mode (tagged or access). Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management). +Interfaces in NetBox represent network interfaces used to exchange data with connected devices. On modern networks, these are most commonly Ethernet, but other types are supported as well. Each interface must be assigned a type, and may optionally be assigned a MAC address, MTU, and IEEE 802.1Q mode (tagged or access). Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management). Additionally, each interface may optionally be assigned to a VRF. !!! note Although devices and virtual machines both can have interfaces, a separate model is used for each. Thus, device interfaces have some properties that are not present on virtual machine interfaces and vice versa. diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 6240016cfbe..5ec7b5a8228 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -61,6 +61,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * [#7759](https://github.com/netbox-community/netbox/issues/7759) - Improved the user preferences form * [#7784](https://github.com/netbox-community/netbox/issues/7784) - Support cluster type assignment for config contexts * [#7846](https://github.com/netbox-community/netbox/issues/7846) - Enable associating inventory items with device components +* [#7852](https://github.com/netbox-community/netbox/issues/7852) - Enable assigning interfaces to VRFs * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group ### Other Changes @@ -88,7 +89,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * dcim.FrontPort * Added `module` field * dcim.Interface - * Added `module` field + * Added `module` and `vrf` fields * dcim.InventoryItem * Added `component_type`, `component_id`, and `role` fields * Added read-only `component` field diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 3bc369a640a..4d863823185 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -6,7 +6,9 @@ from timezone_field.rest_framework import TimeZoneSerializerField from dcim.choices import * from dcim.constants import * from dcim.models import * -from ipam.api.nested_serializers import NestedASNSerializer, NestedIPAddressSerializer, NestedVLANSerializer +from ipam.api.nested_serializers import ( + NestedASNSerializer, NestedIPAddressSerializer, NestedVLANSerializer, NestedVRFSerializer, +) from ipam.models import ASN, VLAN from netbox.api import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.serializers import ( @@ -728,6 +730,7 @@ class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con required=False, many=True ) + vrf = NestedVRFSerializer(required=False, allow_null=True) cable = NestedCableSerializer(read_only=True) wireless_link = NestedWirelessLinkSerializer(read_only=True) wireless_lans = SerializedPKRelatedField( @@ -745,7 +748,7 @@ class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', 'mtu', 'mac_address', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', - 'cable', 'wireless_link', 'link_peer', 'link_peer_type', 'wireless_lans', 'connected_endpoint', + 'cable', 'wireless_link', 'link_peer', 'link_peer_type', 'wireless_lans', 'vrf', 'connected_endpoint', 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied', ] diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 31c1fd1d083..edba03b601b 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -583,7 +583,7 @@ class PowerOutletViewSet(PathEndpointMixin, ModelViewSet): class InterfaceViewSet(PathEndpointMixin, ModelViewSet): queryset = Interface.objects.prefetch_related( 'device', 'module__module_bay', 'parent', 'bridge', 'lag', '_path__destination', 'cable', '_link_peer', - 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'ip_addresses', 'fhrp_group_assignments', 'tags' + 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'vrf', 'ip_addresses', 'fhrp_group_assignments', 'tags' ) serializer_class = serializers.InterfaceSerializer filterset_class = filtersets.InterfaceFilterSet diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 9069ab25ca7..10483612011 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -3,7 +3,7 @@ from django.contrib.auth.models import User from extras.filters import TagFilter from extras.filtersets import LocalConfigContextFilterSet -from ipam.models import ASN +from ipam.models import ASN, VRF from netbox.filtersets import ( BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet, ) @@ -1217,6 +1217,17 @@ class InterfaceFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableT rf_channel = django_filters.MultipleChoiceFilter( choices=WirelessChannelChoices ) + vrf_id = django_filters.ModelMultipleChoiceFilter( + field_name='vrf', + queryset=VRF.objects.all(), + label='VRF', + ) + vrf = django_filters.ModelMultipleChoiceFilter( + field_name='vrf__rd', + queryset=VRF.objects.all(), + to_field_name='rd', + label='VRF (RD)', + ) class Meta: model = Interface diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 3cd8ec35e77..69fa6eb3afd 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -7,7 +7,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm -from ipam.models import VLAN, ASN +from ipam.models import ASN, VLAN, VRF from tenancy.models import Tenant from utilities.forms import ( add_blank_choice, BulkEditForm, BulkEditNullBooleanSelect, ColorField, CommentField, DynamicModelChoiceField, @@ -1061,7 +1061,8 @@ class InterfaceBulkEditForm( required=False, query_params={ 'type': 'lag', - } + }, + label='LAG' ) mgmt_only = forms.NullBooleanField( required=False, @@ -1080,11 +1081,16 @@ class InterfaceBulkEditForm( queryset=VLAN.objects.all(), required=False ) + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) class Meta: nullable_fields = [ 'label', 'parent', 'bridge', 'lag', 'mac_address', 'wwn', 'mtu', 'description', 'mode', 'rf_channel', - 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', + 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'vrf', ] def __init__(self, *args, **kwargs): diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 1297fc98024..fce98f7cb2e 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -8,6 +8,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from extras.forms import CustomFieldModelCSVForm +from ipam.models import VRF from tenancy.models import Tenant from utilities.forms import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVTypedChoiceField, SlugField from virtualization.models import Cluster @@ -622,6 +623,12 @@ class InterfaceCSVForm(CustomFieldModelCSVForm): required=False, help_text='IEEE 802.1Q operational mode (for L2 interfaces)' ) + vrf = CSVModelChoiceField( + queryset=VRF.objects.all(), + required=False, + to_field_name='rd', + help_text='Assigned VRF' + ) rf_role = CSVChoiceField( choices=WirelessRoleChoices, required=False, @@ -632,7 +639,7 @@ class InterfaceCSVForm(CustomFieldModelCSVForm): model = Interface fields = ( 'device', 'name', 'label', 'parent', 'bridge', 'lag', 'type', 'enabled', 'mark_connected', 'mac_address', - 'wwn', 'mtu', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', + 'wwn', 'mtu', 'mgmt_only', 'description', 'mode', 'vrf', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', ) diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index eb303512226..c231f56df64 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -6,7 +6,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from extras.forms import CustomFieldModelFilterForm, LocalConfigContextFilterForm -from ipam.models import ASN +from ipam.models import ASN, VRF from tenancy.forms import TenancyFilterForm from utilities.forms import ( APISelectMultiple, add_blank_choice, ColorField, DynamicModelMultipleChoiceField, FilterForm, StaticSelect, @@ -920,7 +920,8 @@ class InterfaceFilterForm(DeviceComponentFilterForm): model = Interface field_groups = [ ['q', 'tag'], - ['name', 'label', 'kind', 'type', 'enabled', 'mgmt_only', 'mac_address', 'wwn'], + ['name', 'label', 'kind', 'type', 'enabled', 'mgmt_only'], + ['vrf_id', 'mac_address', 'wwn'], ['rf_role', 'rf_channel', 'rf_channel_width', 'tx_power'], ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], ] @@ -980,6 +981,11 @@ class InterfaceFilterForm(DeviceComponentFilterForm): min_value=0, max_value=127 ) + vrf_id = DynamicModelMultipleChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) tag = TagFilterField(model) diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 65b7d46a8fe..80165957443 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -9,7 +9,7 @@ from dcim.constants import * from dcim.models import * from extras.forms import CustomFieldModelForm from extras.models import Tag -from ipam.models import IPAddress, VLAN, VLANGroup, ASN +from ipam.models import ASN, IPAddress, VLAN, VLANGroup, VRF from tenancy.forms import TenancyForm from utilities.forms import ( APISelect, add_blank_choice, BootstrapMixin, ClearableFileInput, CommentField, ContentTypeChoiceField, @@ -1261,6 +1261,11 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): 'available_on_device': '$device', } ) + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1271,11 +1276,11 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): fields = [ 'device', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', - 'rf_channel_width', 'tx_power', 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'tags', + 'rf_channel_width', 'tx_power', 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', ] fieldsets = ( ('Interface', ('device', 'name', 'type', 'label', 'description', 'tags')), - ('Addressing', ('mac_address', 'wwn')), + ('Addressing', ('vrf', 'mac_address', 'wwn')), ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), ('Related Interfaces', ('parent', 'bridge', 'lag')), ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')), diff --git a/netbox/dcim/migrations/0149_interface_vrf.py b/netbox/dcim/migrations/0149_interface_vrf.py new file mode 100644 index 00000000000..224671f5b60 --- /dev/null +++ b/netbox/dcim/migrations/0149_interface_vrf.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.11 on 2022-01-07 18:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0054_vlangroup_min_max_vids'), + ('dcim', '0148_inventoryitem_templates'), + ] + + operations = [ + migrations.AddField( + model_name='interface', + name='vrf', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='interfaces', to='ipam.vrf'), + ), + ] diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index cdfaa7c89ec..916161ced50 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -616,6 +616,14 @@ class Interface(ModularComponentModel, BaseInterface, LinkTermination, PathEndpo blank=True, verbose_name='Tagged VLANs' ) + vrf = models.ForeignKey( + to='ipam.VRF', + on_delete=models.SET_NULL, + related_name='interfaces', + null=True, + blank=True, + verbose_name='VRF' + ) ip_addresses = GenericRelation( to='ipam.IPAddress', content_type_field='assigned_object_type', diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 0c3a5f6a1f7..b8963eae72f 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -521,6 +521,9 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi orderable=False, verbose_name='Wireless LANs' ) + vrf = tables.Column( + linkify=True + ) tags = TagColumn( url_name='dcim:interface_list' ) @@ -531,7 +534,7 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', - 'link_peer', 'connection', 'tags', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', + 'link_peer', 'connection', 'tags', 'vrf', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', ) default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description') diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 0c9b918dff1..1c6f536939a 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -6,7 +6,7 @@ from rest_framework import status from dcim.choices import * from dcim.constants import * from dcim.models import * -from ipam.models import ASN, RIR, VLAN +from ipam.models import ASN, RIR, VLAN, VRF from utilities.testing import APITestCase, APIViewTestCases, create_test_device from virtualization.models import Cluster, ClusterType from wireless.models import WirelessLAN @@ -1424,6 +1424,13 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase ) WirelessLAN.objects.bulk_create(wireless_lans) + vrfs = ( + VRF(name='VRF 1'), + VRF(name='VRF 2'), + VRF(name='VRF 3'), + ) + VRF.objects.bulk_create(vrfs) + cls.create_data = [ { 'device': device.pk, @@ -1431,6 +1438,7 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase 'type': '1000base-t', 'mode': InterfaceModeChoices.MODE_TAGGED, 'tx_power': 10, + 'vrf': vrfs[0].pk, 'tagged_vlans': [vlans[0].pk, vlans[1].pk], 'untagged_vlan': vlans[2].pk, 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], @@ -1442,6 +1450,7 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase 'mode': InterfaceModeChoices.MODE_TAGGED, 'bridge': interfaces[0].pk, 'tx_power': 10, + 'vrf': vrfs[1].pk, 'tagged_vlans': [vlans[0].pk, vlans[1].pk], 'untagged_vlan': vlans[2].pk, 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], @@ -1453,6 +1462,7 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase 'mode': InterfaceModeChoices.MODE_TAGGED, 'parent': interfaces[1].pk, 'tx_power': 10, + 'vrf': vrfs[2].pk, 'tagged_vlans': [vlans[0].pk, vlans[1].pk], 'untagged_vlan': vlans[2].pk, 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 2973e46e711..7b2e350091c 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -4,7 +4,7 @@ from django.test import TestCase from dcim.choices import * from dcim.filtersets import * from dcim.models import * -from ipam.models import ASN, IPAddress, RIR +from ipam.models import ASN, IPAddress, RIR, VRF from tenancy.models import Tenant, TenantGroup from utilities.choices import ColorChoices from utilities.testing import ChangeLoggedFilterSetTests, create_test_device @@ -2370,15 +2370,22 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): ) Device.objects.bulk_create(devices) + vrfs = ( + VRF(name='VRF 1', rd='65000:1'), + VRF(name='VRF 2', rd='65000:2'), + VRF(name='VRF 3', rd='65000:3'), + ) + VRF.objects.bulk_create(vrfs) + # VirtualChassis assignment for filtering virtual_chassis = VirtualChassis.objects.create(master=devices[0]) Device.objects.filter(pk=devices[0].pk).update(virtual_chassis=virtual_chassis, vc_position=1, vc_priority=1) Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=virtual_chassis, vc_position=2, vc_priority=2) interfaces = ( - Interface(device=devices[0], name='Interface 1', label='A', type=InterfaceTypeChoices.TYPE_1GE_SFP, enabled=True, mgmt_only=True, mtu=100, mode=InterfaceModeChoices.MODE_ACCESS, mac_address='00-00-00-00-00-01', description='First'), - Interface(device=devices[1], name='Interface 2', label='B', type=InterfaceTypeChoices.TYPE_1GE_GBIC, enabled=True, mgmt_only=True, mtu=200, mode=InterfaceModeChoices.MODE_TAGGED, mac_address='00-00-00-00-00-02', description='Second'), - Interface(device=devices[2], name='Interface 3', label='C', type=InterfaceTypeChoices.TYPE_1GE_FIXED, enabled=False, mgmt_only=False, mtu=300, mode=InterfaceModeChoices.MODE_TAGGED_ALL, mac_address='00-00-00-00-00-03', description='Third'), + Interface(device=devices[0], name='Interface 1', label='A', type=InterfaceTypeChoices.TYPE_1GE_SFP, enabled=True, mgmt_only=True, mtu=100, mode=InterfaceModeChoices.MODE_ACCESS, mac_address='00-00-00-00-00-01', description='First', vrf=vrfs[0]), + Interface(device=devices[1], name='Interface 2', label='B', type=InterfaceTypeChoices.TYPE_1GE_GBIC, enabled=True, mgmt_only=True, mtu=200, mode=InterfaceModeChoices.MODE_TAGGED, mac_address='00-00-00-00-00-02', description='Second', vrf=vrfs[1]), + Interface(device=devices[2], name='Interface 3', label='C', type=InterfaceTypeChoices.TYPE_1GE_FIXED, enabled=False, mgmt_only=False, mtu=300, mode=InterfaceModeChoices.MODE_TAGGED_ALL, mac_address='00-00-00-00-00-03', description='Third', vrf=vrfs[2]), Interface(device=devices[3], name='Interface 4', label='D', type=InterfaceTypeChoices.TYPE_OTHER, enabled=True, mgmt_only=True, tx_power=40), Interface(device=devices[3], name='Interface 5', label='E', type=InterfaceTypeChoices.TYPE_OTHER, enabled=True, mgmt_only=True, tx_power=40), Interface(device=devices[3], name='Interface 6', label='F', type=InterfaceTypeChoices.TYPE_OTHER, enabled=False, mgmt_only=False, tx_power=40), @@ -2550,6 +2557,13 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'tx_power': [40]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + def test_vrf(self): + vrfs = VRF.objects.all()[:2] + params = {'vrf_id': [vrfs[0].pk, vrfs[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'vrf': [vrfs[0].rd, vrfs[1].rd]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class FrontPortTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = FrontPort.objects.all() diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 8f7cb606b89..1b39285d4cd 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -11,7 +11,7 @@ from netaddr import EUI from dcim.choices import * from dcim.constants import * from dcim.models import * -from ipam.models import ASN, RIR, VLAN +from ipam.models import ASN, RIR, VLAN, VRF from tenancy.models import Tenant from utilities.testing import ViewTestCases, create_tags, create_test_device from wireless.models import WirelessLAN @@ -2105,6 +2105,13 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): ) WirelessLAN.objects.bulk_create(wireless_lans) + vrfs = ( + VRF(name='VRF 1'), + VRF(name='VRF 2'), + VRF(name='VRF 3'), + ) + VRF.objects.bulk_create(vrfs) + tags = create_tags('Alpha', 'Bravo', 'Charlie') cls.form_data = { @@ -2124,6 +2131,7 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'untagged_vlan': vlans[0].pk, 'tagged_vlans': [v.pk for v in vlans[1:4]], 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], + 'vrf': vrfs[0].pk, 'tags': [t.pk for t in tags], } @@ -2143,6 +2151,7 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'untagged_vlan': vlans[0].pk, 'tagged_vlans': [v.pk for v in vlans[1:4]], 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], + 'vrf': vrfs[0].pk, 'tags': [t.pk for t in tags], } @@ -2159,13 +2168,14 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'tx_power': 10, 'untagged_vlan': vlans[0].pk, 'tagged_vlans': [v.pk for v in vlans[1:4]], + 'vrf': vrfs[1].pk, } cls.csv_data = ( - "device,name,type", - "Device 1,Interface 4,1000base-t", - "Device 1,Interface 5,1000base-t", - "Device 1,Interface 6,1000base-t", + f"device,name,type,vrf.pk", + f"Device 1,Interface 4,1000base-t,{vrfs[0].pk}", + f"Device 1,Interface 5,1000base-t,{vrfs[0].pk}", + f"Device 1,Interface 6,1000base-t,{vrfs[0].pk}", ) @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index 8959379a8d5..bc961199293 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -108,6 +108,16 @@
    802.1Q Mode {{ object.get_mode_display|placeholder }}
    VRF + {% if object.vrf %} + {{ object.vrf }} + {% else %} + None + {% endif %} +
    diff --git a/netbox/templates/dcim/interface_edit.html b/netbox/templates/dcim/interface_edit.html index a5f68663328..f41e5ced634 100644 --- a/netbox/templates/dcim/interface_edit.html +++ b/netbox/templates/dcim/interface_edit.html @@ -25,6 +25,7 @@
    Addressing
    + {% render_field form.vrf %} {% render_field form.mac_address %} {% render_field form.wwn %}
    From 0f58faaddbfce5eef16e9ecc56bdf1528769e21c Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Sat, 8 Jan 2022 12:25:30 -0600 Subject: [PATCH 079/271] #7853 - Initial work on Speed/Duplex. TODO: Documentation, Tests, Form order --- netbox/dcim/api/serializers.py | 3 ++- netbox/dcim/choices.py | 13 +++++++++++ netbox/dcim/filtersets.py | 2 ++ netbox/dcim/forms/bulk_create.py | 4 ++-- netbox/dcim/forms/bulk_edit.py | 11 ++++++--- netbox/dcim/forms/bulk_import.py | 6 ++++- netbox/dcim/forms/filtersets.py | 14 +++++++++-- netbox/dcim/forms/models.py | 7 +++--- .../migrations/0150_interface_speed_duplex.py | 23 +++++++++++++++++++ netbox/dcim/models/device_components.py | 12 ++++++++++ netbox/templates/dcim/interface.html | 8 +++++++ netbox/templates/dcim/interface_edit.html | 2 ++ 12 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 netbox/dcim/migrations/0150_interface_speed_duplex.py diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 4d863823185..7663737960b 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -721,6 +721,7 @@ class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con bridge = NestedInterfaceSerializer(required=False, allow_null=True) lag = NestedInterfaceSerializer(required=False, allow_null=True) mode = ChoiceField(choices=InterfaceModeChoices, allow_blank=True, required=False) + duplex = ChoiceField(choices=InterfaceDuplexChoices, allow_blank=True, required=False) rf_role = ChoiceField(choices=WirelessRoleChoices, required=False, allow_null=True) rf_channel = ChoiceField(choices=WirelessChannelChoices, required=False) untagged_vlan = NestedVLANSerializer(required=False, allow_null=True) @@ -746,7 +747,7 @@ class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, Con model = Interface fields = [ 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', - 'mtu', 'mac_address', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', + 'mtu', 'mac_address', 'speed', 'duplex', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'wireless_link', 'link_peer', 'link_peer_type', 'wireless_lans', 'vrf', 'connected_endpoint', 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 368ee1336ce..fa158c7500f 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -943,6 +943,19 @@ class InterfaceTypeChoices(ChoiceSet): ) +class InterfaceDuplexChoices(ChoiceSet): + + DUPLEX_HALF = 'half' + DUPLEX_FULL = 'full' + DUPLEX_AUTO = 'auto' + + CHOICES = ( + (DUPLEX_HALF, 'Half'), + (DUPLEX_FULL, 'Full'), + (DUPLEX_AUTO, 'Auto'), + ) + + class InterfaceModeChoices(ChoiceSet): MODE_ACCESS = 'access' diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 10483612011..8a83a8a6b93 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1196,6 +1196,8 @@ class InterfaceFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableT queryset=Interface.objects.all(), label='LAG interface (ID)', ) + speed = MultiValueNumberFilter() + duplex = django_filters.CharFilter() mac_address = MultiValueMACAddressFilter() wwn = MultiValueWWNFilter() tag = TagFilter() diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py index 02c8feb4b0b..4d73fcc2a44 100644 --- a/netbox/dcim/forms/bulk_create.py +++ b/netbox/dcim/forms/bulk_create.py @@ -72,12 +72,12 @@ class PowerOutletBulkCreateForm( class InterfaceBulkCreateForm( - form_from_model(Interface, ['type', 'enabled', 'mtu', 'mgmt_only', 'mark_connected']), + form_from_model(Interface, ['type', 'enabled', 'speed', 'duplex', 'mtu', 'mgmt_only', 'mark_connected']), DeviceBulkAddComponentForm ): model = Interface field_order = ( - 'name_pattern', 'label_pattern', 'type', 'enabled', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'tags', + 'name_pattern', 'label_pattern', 'type', 'enabled', 'speed', 'duplex', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'tags', ) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 69fa6eb3afd..3d73ada47fd 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -11,7 +11,7 @@ from ipam.models import ASN, VLAN, VRF from tenancy.models import Tenant from utilities.forms import ( add_blank_choice, BulkEditForm, BulkEditNullBooleanSelect, ColorField, CommentField, DynamicModelChoiceField, - DynamicModelMultipleChoiceField, form_from_model, SmallTextarea, StaticSelect, + DynamicModelMultipleChoiceField, form_from_model, SmallTextarea, StaticSelect, SelectSpeedWidget, ) __all__ = ( @@ -1028,7 +1028,7 @@ class PowerOutletBulkEditForm( class InterfaceBulkEditForm( form_from_model(Interface, [ - 'label', 'type', 'parent', 'bridge', 'lag', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected', + 'label', 'type', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', ]), AddRemoveTagsForm, @@ -1064,6 +1064,11 @@ class InterfaceBulkEditForm( }, label='LAG' ) + speed = forms.IntegerField( + required=False, + widget=SelectSpeedWidget(attrs={'readonly': None}), + label='Speed' + ) mgmt_only = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect, @@ -1089,7 +1094,7 @@ class InterfaceBulkEditForm( class Meta: nullable_fields = [ - 'label', 'parent', 'bridge', 'lag', 'mac_address', 'wwn', 'mtu', 'description', 'mode', 'rf_channel', + 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'description', 'mode', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'vrf', ] diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index fce98f7cb2e..ef8d790828b 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -618,6 +618,10 @@ class InterfaceCSVForm(CustomFieldModelCSVForm): choices=InterfaceTypeChoices, help_text='Physical medium' ) + duplex = CSVChoiceField( + choices=InterfaceDuplexChoices, + help_text='Duplex' + ) mode = CSVChoiceField( choices=InterfaceModeChoices, required=False, @@ -638,7 +642,7 @@ class InterfaceCSVForm(CustomFieldModelCSVForm): class Meta: model = Interface fields = ( - 'device', 'name', 'label', 'parent', 'bridge', 'lag', 'type', 'enabled', 'mark_connected', 'mac_address', + 'device', 'name', 'label', 'parent', 'bridge', 'lag', 'type', 'speed', 'duplex', 'enabled', 'mark_connected', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'description', 'mode', 'vrf', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', ) diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index c231f56df64..188a5f242ce 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -10,7 +10,7 @@ from ipam.models import ASN, VRF from tenancy.forms import TenancyFilterForm from utilities.forms import ( APISelectMultiple, add_blank_choice, ColorField, DynamicModelMultipleChoiceField, FilterForm, StaticSelect, - StaticSelectMultiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, + StaticSelectMultiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, SelectSpeedWidget, ) from wireless.choices import * @@ -920,7 +920,7 @@ class InterfaceFilterForm(DeviceComponentFilterForm): model = Interface field_groups = [ ['q', 'tag'], - ['name', 'label', 'kind', 'type', 'enabled', 'mgmt_only'], + ['name', 'label', 'kind', 'type', 'speed', 'duplex', 'enabled', 'mgmt_only'], ['vrf_id', 'mac_address', 'wwn'], ['rf_role', 'rf_channel', 'rf_channel_width', 'tx_power'], ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], @@ -935,6 +935,16 @@ class InterfaceFilterForm(DeviceComponentFilterForm): required=False, widget=StaticSelectMultiple() ) + speed = forms.IntegerField( + required=False, + label='Select Speed', + widget=SelectSpeedWidget(attrs={'readonly': None}) + ) + duplex = forms.ChoiceField( + choices=InterfaceDuplexChoices, + required=False, + label='Select Duplex' + ) enabled = forms.NullBooleanField( required=False, widget=StaticSelect( diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 80165957443..07fa07e12dc 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -14,7 +14,7 @@ from tenancy.forms import TenancyForm from utilities.forms import ( APISelect, add_blank_choice, BootstrapMixin, ClearableFileInput, CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SelectWithPK, SmallTextarea, - SlugField, StaticSelect, + SlugField, StaticSelect, SelectSpeedWidget, ) from virtualization.models import Cluster, ClusterGroup from wireless.models import WirelessLAN, WirelessLANGroup @@ -1274,12 +1274,12 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): class Meta: model = Interface fields = [ - 'device', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', 'mac_address', 'wwn', 'mtu', + 'device', 'name', 'label', 'type', 'speed', 'duplex', 'enabled', 'parent', 'bridge', 'lag', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', ] fieldsets = ( - ('Interface', ('device', 'name', 'type', 'label', 'description', 'tags')), + ('Interface', ('device', 'name', 'type', 'speed', 'duplex', 'label', 'description', 'tags')), ('Addressing', ('vrf', 'mac_address', 'wwn')), ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), ('Related Interfaces', ('parent', 'bridge', 'lag')), @@ -1295,6 +1295,7 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): 'mode': StaticSelect(), 'rf_role': StaticSelect(), 'rf_channel': StaticSelect(), + 'speed': SelectSpeedWidget(attrs={'readonly': None}), } labels = { 'mode': '802.1Q Mode', diff --git a/netbox/dcim/migrations/0150_interface_speed_duplex.py b/netbox/dcim/migrations/0150_interface_speed_duplex.py new file mode 100644 index 00000000000..f9517107a34 --- /dev/null +++ b/netbox/dcim/migrations/0150_interface_speed_duplex.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.10 on 2022-01-08 18:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0149_interface_vrf'), + ] + + operations = [ + migrations.AddField( + model_name='interface', + name='duplex', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='interface', + name='speed', + field=models.PositiveIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 916161ced50..d876e77556b 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -551,6 +551,18 @@ class Interface(ModularComponentModel, BaseInterface, LinkTermination, PathEndpo verbose_name='Management only', help_text='This interface is used only for out-of-band management' ) + speed = models.PositiveIntegerField( + verbose_name='Speed', + blank=True, + null=True + ) + duplex = models.CharField( + verbose_name='Duplex', + max_length=50, + blank=True, + null=True, + choices=InterfaceDuplexChoices + ) wwn = WWNField( null=True, blank=True, diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index bc961199293..bf81a33f27e 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -46,6 +46,14 @@ Type {{ object.get_type_display }} + + Speed + {{ object.speed|humanize_speed|placeholder }} + + + Duplex + {{ object.get_duplex_display }} + Enabled {% checkmark object.enabled %} diff --git a/netbox/templates/dcim/interface_edit.html b/netbox/templates/dcim/interface_edit.html index f41e5ced634..e45cdd685c7 100644 --- a/netbox/templates/dcim/interface_edit.html +++ b/netbox/templates/dcim/interface_edit.html @@ -16,6 +16,8 @@ {% endif %} {% render_field form.name %} {% render_field form.type %} + {% render_field form.speed %} + {% render_field form.duplex %} {% render_field form.label %} {% render_field form.description %} {% render_field form.tags %} From aed23d61fc752bc6a913759995ff1d57707e1602 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 11:17:40 -0500 Subject: [PATCH 080/271] Replace ButtonsColumn with ActionsColumn --- netbox/dcim/tables/devices.py | 61 ++++++------------ netbox/dcim/tables/devicetypes.py | 67 +++++++++----------- netbox/dcim/tables/sites.py | 9 ++- netbox/dcim/tables/template_code.py | 6 +- netbox/ipam/tables/vlans.py | 11 ++-- netbox/utilities/tables/columns.py | 89 ++++++++------------------- netbox/utilities/tests/test_tables.py | 3 +- netbox/virtualization/tables.py | 9 ++- 8 files changed, 90 insertions(+), 165 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index f21bc3204c1..1241143b758 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -7,7 +7,7 @@ from dcim.models import ( ) from tenancy.tables import TenantColumn from utilities.tables import ( - ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, + ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, TemplateColumn, ToggleColumn, ) from .template_code import * @@ -322,10 +322,8 @@ class DeviceConsolePortTable(ConsolePortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ButtonsColumn( - model=ConsolePort, - buttons=('edit', 'delete'), - prepend_template=CONSOLEPORT_BUTTONS + actions = ActionsColumn( + extra_buttons=CONSOLEPORT_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -367,10 +365,8 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ButtonsColumn( - model=ConsoleServerPort, - buttons=('edit', 'delete'), - prepend_template=CONSOLESERVERPORT_BUTTONS + actions = ActionsColumn( + extra_buttons=CONSOLESERVERPORT_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -412,10 +408,8 @@ class DevicePowerPortTable(PowerPortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ButtonsColumn( - model=PowerPort, - buttons=('edit', 'delete'), - prepend_template=POWERPORT_BUTTONS + actions = ActionsColumn( + extra_buttons=POWERPORT_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -461,10 +455,8 @@ class DevicePowerOutletTable(PowerOutletTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ButtonsColumn( - model=PowerOutlet, - buttons=('edit', 'delete'), - prepend_template=POWEROUTLET_BUTTONS + actions = ActionsColumn( + extra_buttons=POWEROUTLET_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -551,10 +543,8 @@ class DeviceInterfaceTable(InterfaceTable): linkify=True, verbose_name='LAG' ) - actions = ButtonsColumn( - model=Interface, - buttons=('edit', 'delete'), - prepend_template=INTERFACE_BUTTONS + actions = ActionsColumn( + extra_buttons=INTERFACE_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -614,10 +604,8 @@ class DeviceFrontPortTable(FrontPortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ButtonsColumn( - model=FrontPort, - buttons=('edit', 'delete'), - prepend_template=FRONTPORT_BUTTONS + actions = ActionsColumn( + extra_buttons=FRONTPORT_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -662,10 +650,8 @@ class DeviceRearPortTable(RearPortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ButtonsColumn( - model=RearPort, - buttons=('edit', 'delete'), - prepend_template=REARPORT_BUTTONS + actions = ActionsColumn( + extra_buttons=REARPORT_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -713,10 +699,8 @@ class DeviceDeviceBayTable(DeviceBayTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ButtonsColumn( - model=DeviceBay, - buttons=('edit', 'delete'), - prepend_template=DEVICEBAY_BUTTONS + actions = ActionsColumn( + extra_buttons=DEVICEBAY_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -749,10 +733,8 @@ class ModuleBayTable(DeviceComponentTable): class DeviceModuleBayTable(ModuleBayTable): - actions = ButtonsColumn( - model=DeviceBay, - buttons=('edit', 'delete'), - prepend_template=MODULEBAY_BUTTONS + actions = ActionsColumn( + extra_buttons=MODULEBAY_BUTTONS ) class Meta(DeviceComponentTable.Meta): @@ -803,10 +785,7 @@ class DeviceInventoryItemTable(InventoryItemTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ButtonsColumn( - model=InventoryItem, - buttons=('edit', 'delete') - ) + actions = ActionsColumn() class Meta(BaseTable.Meta): model = InventoryItem diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 29fa4d4debb..ecec67f7dfb 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -6,8 +6,7 @@ from dcim.models import ( InventoryItemTemplate, Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, ) from utilities.tables import ( - ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, - ToggleColumn, + ActionsColumn, BaseTable, BooleanColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, ) from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS @@ -113,10 +112,9 @@ class ComponentTemplateTable(BaseTable): class ConsolePortTemplateTable(ComponentTemplateTable): - actions = ButtonsColumn( - model=ConsolePortTemplate, - buttons=('edit', 'delete'), - prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS + actions = ActionsColumn( + sequence=('edit', 'delete'), + extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -126,10 +124,9 @@ class ConsolePortTemplateTable(ComponentTemplateTable): class ConsoleServerPortTemplateTable(ComponentTemplateTable): - actions = ButtonsColumn( - model=ConsoleServerPortTemplate, - buttons=('edit', 'delete'), - prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS + actions = ActionsColumn( + sequence=('edit', 'delete'), + extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -139,10 +136,9 @@ class ConsoleServerPortTemplateTable(ComponentTemplateTable): class PowerPortTemplateTable(ComponentTemplateTable): - actions = ButtonsColumn( - model=PowerPortTemplate, - buttons=('edit', 'delete'), - prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS + actions = ActionsColumn( + sequence=('edit', 'delete'), + extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -152,10 +148,9 @@ class PowerPortTemplateTable(ComponentTemplateTable): class PowerOutletTemplateTable(ComponentTemplateTable): - actions = ButtonsColumn( - model=PowerOutletTemplate, - buttons=('edit', 'delete'), - prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS + actions = ActionsColumn( + sequence=('edit', 'delete'), + extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -168,10 +163,9 @@ class InterfaceTemplateTable(ComponentTemplateTable): mgmt_only = BooleanColumn( verbose_name='Management Only' ) - actions = ButtonsColumn( - model=InterfaceTemplate, - buttons=('edit', 'delete'), - prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS + actions = ActionsColumn( + sequence=('edit', 'delete'), + extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -185,10 +179,9 @@ class FrontPortTemplateTable(ComponentTemplateTable): verbose_name='Position' ) color = ColorColumn() - actions = ButtonsColumn( - model=FrontPortTemplate, - buttons=('edit', 'delete'), - prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS + actions = ActionsColumn( + sequence=('edit', 'delete'), + extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -199,10 +192,9 @@ class FrontPortTemplateTable(ComponentTemplateTable): class RearPortTemplateTable(ComponentTemplateTable): color = ColorColumn() - actions = ButtonsColumn( - model=RearPortTemplate, - buttons=('edit', 'delete'), - prepend_template=MODULAR_COMPONENT_TEMPLATE_BUTTONS + actions = ActionsColumn( + sequence=('edit', 'delete'), + extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) class Meta(ComponentTemplateTable.Meta): @@ -212,9 +204,8 @@ class RearPortTemplateTable(ComponentTemplateTable): class ModuleBayTemplateTable(ComponentTemplateTable): - actions = ButtonsColumn( - model=ModuleBayTemplate, - buttons=('edit', 'delete') + actions = ActionsColumn( + sequence=('edit', 'delete') ) class Meta(ComponentTemplateTable.Meta): @@ -224,9 +215,8 @@ class ModuleBayTemplateTable(ComponentTemplateTable): class DeviceBayTemplateTable(ComponentTemplateTable): - actions = ButtonsColumn( - model=DeviceBayTemplate, - buttons=('edit', 'delete') + actions = ActionsColumn( + sequence=('edit', 'delete') ) class Meta(ComponentTemplateTable.Meta): @@ -236,9 +226,8 @@ class DeviceBayTemplateTable(ComponentTemplateTable): class InventoryItemTemplateTable(ComponentTemplateTable): - actions = ButtonsColumn( - model=InventoryItemTemplate, - buttons=('edit', 'delete') + actions = ActionsColumn( + sequence=('edit', 'delete') ) role = tables.Column( linkify=True diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 23ffabae214..98c5e3fd398 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -3,9 +3,9 @@ import django_tables2 as tables from dcim.models import Location, Region, Site, SiteGroup from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, + ActionsColumn, BaseTable, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, ) -from .template_code import LOCATION_ELEVATIONS +from .template_code import LOCATION_BUTTONS __all__ = ( 'LocationTable', @@ -127,9 +127,8 @@ class LocationTable(BaseTable): tags = TagColumn( url_name='dcim:location_list' ) - actions = ButtonsColumn( - model=Location, - prepend_template=LOCATION_ELEVATIONS + actions = ActionsColumn( + extra_buttons=LOCATION_BUTTONS ) class Meta(BaseTable.Meta): diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 2b6c02b8295..a1baeb33646 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -87,7 +87,7 @@ POWERFEED_CABLETERMINATION = """ {{ value }} """ -LOCATION_ELEVATIONS = """ +LOCATION_BUTTONS = """ @@ -99,8 +99,8 @@ LOCATION_ELEVATIONS = """ MODULAR_COMPONENT_TEMPLATE_BUTTONS = """ {% load helpers %} -{% if perms.dcim.add_invnetoryitemtemplate %} - +{% if perms.dcim.add_inventoryitemtemplate %} + {% endif %} diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index 1379ad10556..3454ddff42d 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -5,8 +5,8 @@ from django_tables2.utils import Accessor from dcim.models import Interface from tenancy.tables import TenantColumn from utilities.tables import ( - ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, - TagColumn, TemplateColumn, ToggleColumn, + ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn, + TemplateColumn, ToggleColumn, ) from virtualization.models import VMInterface from ipam.models import * @@ -38,7 +38,7 @@ VLAN_PREFIXES = """ {% endfor %} """ -VLANGROUP_ADD_VLAN = """ +VLANGROUP_BUTTONS = """ {% with next_vid=record.get_next_available_vid %} {% if next_vid and perms.ipam.add_vlan %} @@ -77,9 +77,8 @@ class VLANGroupTable(BaseTable): tags = TagColumn( url_name='ipam:vlangroup_list' ) - actions = ButtonsColumn( - model=VLANGroup, - prepend_template=VLANGROUP_ADD_VLAN + actions = ActionsColumn( + extra_buttons=VLANGROUP_BUTTONS ) class Meta(BaseTable.Meta): diff --git a/netbox/utilities/tables/columns.py b/netbox/utilities/tables/columns.py index e601bd0ccf2..a319fc7ad98 100644 --- a/netbox/utilities/tables/columns.py +++ b/netbox/utilities/tables/columns.py @@ -1,9 +1,10 @@ -from collections import namedtuple from dataclasses import dataclass from typing import Optional import django_tables2 as tables from django.conf import settings +from django.contrib.auth.models import AnonymousUser +from django.template import Context, Template from django.urls import reverse from django.utils.safestring import mark_safe from django_tables2.utils import Accessor @@ -14,7 +15,6 @@ from utilities.utils import content_type_identifier, content_type_name __all__ = ( 'ActionsColumn', 'BooleanColumn', - 'ButtonsColumn', 'ChoiceFieldColumn', 'ColorColumn', 'ColoredLabelColumn', @@ -100,7 +100,14 @@ class ActionsItem: class ActionsColumn(tables.Column): - attrs = {'td': {'class': 'text-end noprint'}} + """ + A dropdown menu which provides edit, delete, and changelog links for an object. Can optionally include + additional buttons rendered from a template string. + + :param sequence: The ordered list of dropdown menu items to include + :param extra_buttons: A Django template string which renders additional buttons preceding the actions dropdown + """ + attrs = {'td': {'class': 'text-end text-nowrap noprint'}} empty_values = () actions = { 'edit': ActionsItem('Edit', 'pencil', 'change'), @@ -108,12 +115,10 @@ class ActionsColumn(tables.Column): 'changelog': ActionsItem('Changelog', 'history'), } - def __init__(self, *args, extra_actions=None, sequence=('edit', 'delete', 'changelog'), **kwargs): + def __init__(self, *args, sequence=('edit', 'delete', 'changelog'), extra_buttons='', **kwargs): super().__init__(*args, **kwargs) - # Add/update any extra actions passed - if extra_actions: - self.actions.update(extra_actions) + self.extra_buttons = extra_buttons # Determine which actions to enable self.actions = { @@ -134,9 +139,10 @@ class ActionsColumn(tables.Column): url_appendix = f'?return_url={request.path}' if request else '' links = [] + user = getattr(request, 'user', AnonymousUser()) for action, attrs in self.actions.items(): permission = f'{model._meta.app_label}.{attrs.permission}_{model._meta.model_name}' - if attrs.permission is None or request.user.has_perm(permission): + if attrs.permission is None or user.has_perm(permission): url = reverse(f'{viewname_base}_{action}', kwargs={'pk': record.pk}) links.append(f'
  • ' f' {attrs.title}
  • ') @@ -144,68 +150,21 @@ class ActionsColumn(tables.Column): if not links: return '' - menu = f'' + f'' + + # Render any extra buttons from template code + if self.extra_buttons: + template = Template(self.extra_buttons) + context = getattr(table, "context", Context()) + context.update({'record': record}) + menu = template.render(context) + menu return mark_safe(menu) -class ButtonsColumn(tables.TemplateColumn): - """ - Render edit, delete, and changelog buttons for an object. - - :param model: Model class to use for calculating URL view names - :param prepend_content: Additional template content to render in the column (optional) - """ - buttons = ('changelog', 'edit', 'delete') - attrs = {'td': {'class': 'text-end text-nowrap noprint'}} - # Note that braces are escaped to allow for string formatting prior to template rendering - template_code = """ - {{% if "changelog" in buttons %}} - - - - {{% endif %}} - {{% if "edit" in buttons and perms.{app_label}.change_{model_name} %}} - - - - {{% endif %}} - {{% if "delete" in buttons and perms.{app_label}.delete_{model_name} %}} - - - - {{% endif %}} - """ - - def __init__(self, model, *args, buttons=None, prepend_template=None, **kwargs): - if prepend_template: - prepend_template = prepend_template.replace('{', '{{') - prepend_template = prepend_template.replace('}', '}}') - self.template_code = prepend_template + self.template_code - - template_code = self.template_code.format( - app_label=model._meta.app_label, - model_name=model._meta.model_name, - buttons=buttons - ) - - super().__init__(template_code=template_code, *args, **kwargs) - - # Exclude from export by default - if 'exclude_from_export' not in kwargs: - self.exclude_from_export = True - - self.extra_context.update({ - 'buttons': buttons or self.buttons, - }) - - def header(self): - return '' - - class ChoiceFieldColumn(tables.Column): """ Render a ChoiceField value inside a indicating a particular CSS class. This is useful for displaying colored diff --git a/netbox/utilities/tests/test_tables.py b/netbox/utilities/tests/test_tables.py index 119587ff880..55a5e4cc73d 100644 --- a/netbox/utilities/tests/test_tables.py +++ b/netbox/utilities/tests/test_tables.py @@ -30,7 +30,8 @@ class TagColumnTest(TestCase): def test_tagcolumn(self): template = Template('{% load render_table from django_tables2 %}{% render_table table %}') + table = TagColumnTable(Site.objects.all(), orderable=False) context = Context({ - 'table': TagColumnTable(Site.objects.all(), orderable=False) + 'table': table }) template.render(context) diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index 65f9f12576e..0588f51a5c5 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -3,7 +3,7 @@ import django_tables2 as tables from dcim.tables.devices import BaseInterfaceTable from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, + ActionsColumn, BaseTable, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, ) from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -183,10 +183,9 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): bridge = tables.Column( linkify=True ) - actions = ButtonsColumn( - model=VMInterface, - buttons=('edit', 'delete'), - prepend_template=VMINTERFACE_BUTTONS + actions = ActionsColumn( + sequence=('edit', 'delete'), + extra_buttons=VMINTERFACE_BUTTONS ) class Meta(BaseTable.Meta): From 94c116617a67ac7b8c72b877f7506c367f05b0f6 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 11:20:06 -0500 Subject: [PATCH 081/271] Changelog for #7679 --- docs/release-notes/version-3.2.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 6240016cfbe..d85ad17e2a7 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -57,6 +57,7 @@ Inventory item templates can be arranged hierarchically within a device type, an ### Enhancements * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation +* [#7679](https://github.com/netbox-community/netbox/issues/7679) - Add actions menu to all object tables * [#7681](https://github.com/netbox-community/netbox/issues/7681) - Add `service_id` field for provider networks * [#7759](https://github.com/netbox-community/netbox/issues/7759) - Improved the user preferences form * [#7784](https://github.com/netbox-community/netbox/issues/7784) - Support cluster type assignment for config contexts From 72e17914e20845161ac41791c4af2b88d63dbe8e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 12:11:37 -0500 Subject: [PATCH 082/271] Closes #8296: Allow disabling custom links --- docs/models/extras/customlink.md | 2 +- docs/release-notes/version-3.2.md | 3 +++ netbox/extras/api/serializers.py | 2 +- netbox/extras/filtersets.py | 4 +++- netbox/extras/forms/bulk_edit.py | 4 ++++ netbox/extras/forms/bulk_import.py | 3 ++- netbox/extras/forms/filtersets.py | 12 +++++++++--- netbox/extras/forms/models.py | 2 +- .../migrations/0070_customlink_enabled.py | 18 ++++++++++++++++++ netbox/extras/models/models.py | 3 +++ netbox/extras/tables.py | 5 +++-- netbox/extras/templatetags/custom_links.py | 2 +- netbox/extras/tests/test_api.py | 7 +++++++ netbox/extras/tests/test_filtersets.py | 9 +++++++++ netbox/extras/tests/test_views.py | 16 +++++++++------- netbox/templates/extras/customlink.html | 4 ++++ netbox/utilities/tables/tables.py | 19 ++++++++++--------- 17 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 netbox/extras/migrations/0070_customlink_enabled.py diff --git a/docs/models/extras/customlink.md b/docs/models/extras/customlink.md index 7fd510841aa..96ff0bbf7e4 100644 --- a/docs/models/extras/customlink.md +++ b/docs/models/extras/customlink.md @@ -15,7 +15,7 @@ When viewing a device named Router4, this link would render as: View NMS ``` -Custom links appear as buttons in the top right corner of the page. Numeric weighting can be used to influence the ordering of links. +Custom links appear as buttons in the top right corner of the page. Numeric weighting can be used to influence the ordering of links, and each link can be enabled or disabled individually. !!! warning Custom links rely on user-created code to generate arbitrary HTML output, which may be dangerous. Only grant permission to create or modify custom links to trusted users. diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index e0ef639fa90..31025bb853c 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -64,6 +64,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * [#7846](https://github.com/netbox-community/netbox/issues/7846) - Enable associating inventory items with device components * [#7852](https://github.com/netbox-community/netbox/issues/7852) - Enable assigning interfaces to VRFs * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group +* [#8296](https://github.com/netbox-community/netbox/issues/8296) - Allow disabling custom links ### Other Changes @@ -106,6 +107,8 @@ Inventory item templates can be arranged hierarchically within a device type, an * Add `cluster_types` field * extras.CustomField * Added `object_type` field +* extras.CustomLink + * Added `enabled` field * ipam.VLANGroup * Added the `/availables-vlans/` endpoint * Added the `min_vid` and `max_vid` fields diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index fa0e5189f00..6279ea2b7af 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -101,7 +101,7 @@ class CustomLinkSerializer(ValidatedModelSerializer): class Meta: model = CustomLink fields = [ - 'id', 'url', 'display', 'content_type', 'name', 'link_text', 'link_url', 'weight', 'group_name', + 'id', 'url', 'display', 'content_type', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', 'button_class', 'new_window', ] diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index bf25ff76c42..a839e2dd353 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -82,7 +82,9 @@ class CustomLinkFilterSet(BaseFilterSet): class Meta: model = CustomLink - fields = ['id', 'content_type', 'name', 'link_text', 'link_url', 'weight', 'group_name', 'new_window'] + fields = [ + 'id', 'content_type', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', 'new_window', + ] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 1b87256a5be..56b51c89404 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -47,6 +47,10 @@ class CustomLinkBulkEditForm(BulkEditForm): limit_choices_to=FeatureQuery('custom_fields'), required=False ) + enabled = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) new_window = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect() diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 9f44494e030..fa6d8af5512 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -51,7 +51,8 @@ class CustomLinkCSVForm(CSVModelForm): class Meta: model = CustomLink fields = ( - 'name', 'content_type', 'weight', 'group_name', 'button_class', 'new_window', 'link_text', 'link_url', + 'name', 'content_type', 'enabled', 'weight', 'group_name', 'button_class', 'new_window', 'link_text', + 'link_url', ) diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 388cd1e60ef..330bb91e349 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -58,15 +58,18 @@ class CustomFieldFilterForm(FilterForm): class CustomLinkFilterForm(FilterForm): field_groups = [ ['q'], - ['content_type', 'weight', 'new_window'], + ['content_type', 'enabled', 'new_window', 'weight'], ] content_type = ContentTypeChoiceField( queryset=ContentType.objects.all(), limit_choices_to=FeatureQuery('custom_fields'), required=False ) - weight = forms.IntegerField( - required=False + enabled = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) ) new_window = forms.NullBooleanField( required=False, @@ -74,6 +77,9 @@ class CustomLinkFilterForm(FilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + weight = forms.IntegerField( + required=False + ) class ExportTemplateFilterForm(FilterForm): diff --git a/netbox/extras/forms/models.py b/netbox/extras/forms/models.py index 55e58a7f21d..ca2c6b90063 100644 --- a/netbox/extras/forms/models.py +++ b/netbox/extras/forms/models.py @@ -53,7 +53,7 @@ class CustomLinkForm(BootstrapMixin, forms.ModelForm): model = CustomLink fields = '__all__' fieldsets = ( - ('Custom Link', ('name', 'content_type', 'weight', 'group_name', 'button_class', 'new_window')), + ('Custom Link', ('name', 'content_type', 'weight', 'group_name', 'button_class', 'enabled', 'new_window')), ('Templates', ('link_text', 'link_url')), ) widgets = { diff --git a/netbox/extras/migrations/0070_customlink_enabled.py b/netbox/extras/migrations/0070_customlink_enabled.py new file mode 100644 index 00000000000..839a4dba5c2 --- /dev/null +++ b/netbox/extras/migrations/0070_customlink_enabled.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.11 on 2022-01-10 16:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0069_custom_object_field'), + ] + + operations = [ + migrations.AddField( + model_name='customlink', + name='enabled', + field=models.BooleanField(default=True), + ), + ] diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index ac3a23410d9..3612b2a6fae 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -192,6 +192,9 @@ class CustomLink(ChangeLoggedModel): max_length=100, unique=True ) + enabled = models.BooleanField( + default=True + ) link_text = models.CharField( max_length=500, help_text="Jinja2 template code for link text" diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index 071caa354e5..adfccb575da 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -73,15 +73,16 @@ class CustomLinkTable(BaseTable): linkify=True ) content_type = ContentTypeColumn() + enabled = BooleanColumn() new_window = BooleanColumn() class Meta(BaseTable.Meta): model = CustomLink fields = ( - 'pk', 'id', 'name', 'content_type', 'link_text', 'link_url', 'weight', 'group_name', + 'pk', 'id', 'name', 'content_type', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', 'button_class', 'new_window', ) - default_columns = ('pk', 'name', 'content_type', 'group_name', 'button_class', 'new_window') + default_columns = ('pk', 'name', 'content_type', 'enabled', 'group_name', 'button_class', 'new_window') # diff --git a/netbox/extras/templatetags/custom_links.py b/netbox/extras/templatetags/custom_links.py index 32ec966b35c..dd546733884 100644 --- a/netbox/extras/templatetags/custom_links.py +++ b/netbox/extras/templatetags/custom_links.py @@ -36,7 +36,7 @@ def custom_links(context, obj): Render all applicable links for the given object. """ content_type = ContentType.objects.get_for_model(obj) - custom_links = CustomLink.objects.filter(content_type=content_type) + custom_links = CustomLink.objects.filter(content_type=content_type, enabled=True) if not custom_links: return '' diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index d15b57e4376..d790eff7187 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -139,24 +139,28 @@ class CustomLinkTest(APIViewTestCases.APIViewTestCase): { 'content_type': 'dcim.site', 'name': 'Custom Link 4', + 'enabled': True, 'link_text': 'Link 4', 'link_url': 'http://example.com/?4', }, { 'content_type': 'dcim.site', 'name': 'Custom Link 5', + 'enabled': True, 'link_text': 'Link 5', 'link_url': 'http://example.com/?5', }, { 'content_type': 'dcim.site', 'name': 'Custom Link 6', + 'enabled': False, 'link_text': 'Link 6', 'link_url': 'http://example.com/?6', }, ] bulk_update_data = { 'new_window': True, + 'enabled': False, } @classmethod @@ -167,18 +171,21 @@ class CustomLinkTest(APIViewTestCases.APIViewTestCase): CustomLink( content_type=site_ct, name='Custom Link 1', + enabled=True, link_text='Link 1', link_url='http://example.com/?1', ), CustomLink( content_type=site_ct, name='Custom Link 2', + enabled=True, link_text='Link 2', link_url='http://example.com/?2', ), CustomLink( content_type=site_ct, name='Custom Link 3', + enabled=False, link_text='Link 3', link_url='http://example.com/?3', ), diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index a5f77afa9f7..3a08055cb5f 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -100,6 +100,7 @@ class CustomLinkTestCase(TestCase, BaseFilterSetTests): CustomLink( name='Custom Link 1', content_type=content_types[0], + enabled=True, weight=100, new_window=False, link_text='Link 1', @@ -108,6 +109,7 @@ class CustomLinkTestCase(TestCase, BaseFilterSetTests): CustomLink( name='Custom Link 2', content_type=content_types[1], + enabled=True, weight=200, new_window=False, link_text='Link 1', @@ -116,6 +118,7 @@ class CustomLinkTestCase(TestCase, BaseFilterSetTests): CustomLink( name='Custom Link 3', content_type=content_types[2], + enabled=False, weight=300, new_window=True, link_text='Link 1', @@ -136,6 +139,12 @@ class CustomLinkTestCase(TestCase, BaseFilterSetTests): params = {'weight': [100, 200]} 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_new_window(self): params = {'new_window': False} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index 34d5cb67e27..ea3a952d61b 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -59,14 +59,15 @@ class CustomLinkTestCase(ViewTestCases.PrimaryObjectViewTestCase): site_ct = ContentType.objects.get_for_model(Site) CustomLink.objects.bulk_create(( - CustomLink(name='Custom Link 1', content_type=site_ct, link_text='Link 1', link_url='http://example.com/?1'), - CustomLink(name='Custom Link 2', content_type=site_ct, link_text='Link 2', link_url='http://example.com/?2'), - CustomLink(name='Custom Link 3', content_type=site_ct, link_text='Link 3', link_url='http://example.com/?3'), + CustomLink(name='Custom Link 1', content_type=site_ct, enabled=True, link_text='Link 1', link_url='http://example.com/?1'), + CustomLink(name='Custom Link 2', content_type=site_ct, enabled=True, link_text='Link 2', link_url='http://example.com/?2'), + CustomLink(name='Custom Link 3', content_type=site_ct, enabled=False, link_text='Link 3', link_url='http://example.com/?3'), )) cls.form_data = { 'name': 'Custom Link X', 'content_type': site_ct.pk, + 'enabled': False, 'weight': 100, 'button_class': CustomLinkButtonClassChoices.DEFAULT, 'link_text': 'Link X', @@ -74,14 +75,15 @@ class CustomLinkTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "name,content_type,weight,button_class,link_text,link_url", - "Custom Link 4,dcim.site,100,blue,Link 4,http://exmaple.com/?4", - "Custom Link 5,dcim.site,100,blue,Link 5,http://exmaple.com/?5", - "Custom Link 6,dcim.site,100,blue,Link 6,http://exmaple.com/?6", + "name,content_type,enabled,weight,button_class,link_text,link_url", + "Custom Link 4,dcim.site,True,100,blue,Link 4,http://exmaple.com/?4", + "Custom Link 5,dcim.site,True,100,blue,Link 5,http://exmaple.com/?5", + "Custom Link 6,dcim.site,False,100,blue,Link 6,http://exmaple.com/?6", ) cls.bulk_edit_data = { 'button_class': CustomLinkButtonClassChoices.CYAN, + 'enabled': False, 'weight': 200, } diff --git a/netbox/templates/extras/customlink.html b/netbox/templates/extras/customlink.html index ebf50882c9a..1f386618298 100644 --- a/netbox/templates/extras/customlink.html +++ b/netbox/templates/extras/customlink.html @@ -19,6 +19,10 @@ Content Type {{ object.content_type }} + + Enabled + {% checkmark object.enabled %} + Group Name {{ object.group_name|placeholder }} diff --git a/netbox/utilities/tables/tables.py b/netbox/utilities/tables/tables.py index 6c3b5695991..d1915569e7b 100644 --- a/netbox/utilities/tables/tables.py +++ b/netbox/utilities/tables/tables.py @@ -35,15 +35,16 @@ class BaseTable(tables.Table): if extra_columns is None: extra_columns = [] - # Add custom field columns - obj_type = ContentType.objects.get_for_model(self._meta.model) - cf_columns = [ - (f'cf_{cf.name}', columns.CustomFieldColumn(cf)) for cf in CustomField.objects.filter(content_types=obj_type) - ] - cl_columns = [ - (f'cl_{cl.name}', columns.CustomLinkColumn(cl)) for cl in CustomLink.objects.filter(content_type=obj_type) - ] - extra_columns.extend([*cf_columns, *cl_columns]) + # Add custom field & custom link columns + content_type = ContentType.objects.get_for_model(self._meta.model) + custom_fields = CustomField.objects.filter(content_types=content_type) + extra_columns.extend([ + (f'cf_{cf.name}', columns.CustomFieldColumn(cf)) for cf in custom_fields + ]) + custom_links = CustomLink.objects.filter(content_type=content_type, enabled=True) + extra_columns.extend([ + (f'cl_{cl.name}', columns.CustomLinkColumn(cl)) for cl in custom_links + ]) super().__init__(*args, extra_columns=extra_columns, **kwargs) From 21e0e6e4959e1f0b791be342b16cf1e2aa48f693 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 14:03:07 -0500 Subject: [PATCH 083/271] Closes #6954: Remember users' table ordering preferences --- docs/development/user-preferences.md | 13 +++++----- docs/release-notes/version-3.2.md | 1 + netbox/circuits/views.py | 8 +++--- netbox/dcim/views.py | 16 ++++++------ netbox/extras/views.py | 8 +++--- netbox/ipam/views.py | 12 ++++----- netbox/netbox/views/generic/object_views.py | 7 +++--- netbox/tenancy/views.py | 10 ++++---- netbox/users/tests/test_preferences.py | 27 ++++++++++++++++++++- netbox/utilities/tables/__init__.py | 19 +++++++++++---- netbox/virtualization/views.py | 6 ++--- netbox/wireless/views.py | 6 ++--- 12 files changed, 84 insertions(+), 49 deletions(-) diff --git a/docs/development/user-preferences.md b/docs/development/user-preferences.md index a707eb6ad29..622fbb4b9b4 100644 --- a/docs/development/user-preferences.md +++ b/docs/development/user-preferences.md @@ -4,9 +4,10 @@ The `users.UserConfig` model holds individual preferences for each user in the f ## Available Preferences -| Name | Description | -|-------------------------|-------------| -| data_format | Preferred format when rendering raw data (JSON or YAML) | -| pagination.per_page | The number of items to display per page of a paginated table | -| tables.${table}.columns | The ordered list of columns to display when viewing the table | -| ui.colormode | Light or dark mode in the user interface | +| Name | Description | +|--------------------------|---------------------------------------------------------------| +| data_format | Preferred format when rendering raw data (JSON or YAML) | +| pagination.per_page | The number of items to display per page of a paginated table | +| tables.${table}.columns | The ordered list of columns to display when viewing the table | +| tables.${table}.ordering | A list of column names by which the table should be ordered | +| ui.colormode | Light or dark mode in the user interface | diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 31025bb853c..a2bc5988ed8 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -56,6 +56,7 @@ Inventory item templates can be arranged hierarchically within a device type, an ### Enhancements +* [#6954](https://github.com/netbox-community/netbox/issues/6954) - Remember users' table ordering preferences * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation * [#7679](https://github.com/netbox-community/netbox/issues/7679) - Add actions menu to all object tables * [#7681](https://github.com/netbox-community/netbox/issues/7681) - Add `service_id` field for provider networks diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 2f1addab104..97e985dcded 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -5,7 +5,7 @@ from django.shortcuts import get_object_or_404, redirect, render from netbox.views import generic from utilities.forms import ConfirmationForm -from utilities.tables import paginate_table +from utilities.tables import configure_table from utilities.utils import count_related from . import filtersets, forms, tables from .choices import CircuitTerminationSideChoices @@ -35,7 +35,7 @@ class ProviderView(generic.ObjectView): 'type', 'tenant', 'terminations__site' ) circuits_table = tables.CircuitTable(circuits, exclude=('provider',)) - paginate_table(circuits_table, request) + configure_table(circuits_table, request) return { 'circuits_table': circuits_table, @@ -96,7 +96,7 @@ class ProviderNetworkView(generic.ObjectView): 'type', 'tenant', 'terminations__site' ) circuits_table = tables.CircuitTable(circuits) - paginate_table(circuits_table, request) + configure_table(circuits_table, request) return { 'circuits_table': circuits_table, @@ -150,7 +150,7 @@ class CircuitTypeView(generic.ObjectView): def get_extra_context(self, request, instance): circuits = Circuit.objects.restrict(request.user, 'view').filter(type=instance) circuits_table = tables.CircuitTable(circuits, exclude=('type',)) - paginate_table(circuits_table, request) + configure_table(circuits_table, request) return { 'circuits_table': circuits_table, diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index e6412453954..a85fc7438d9 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -20,7 +20,7 @@ from netbox.views import generic from utilities.forms import ConfirmationForm from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.permissions import get_permission_for_model -from utilities.tables import paginate_table +from utilities.tables import configure_table from utilities.utils import count_related from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin from virtualization.models import VirtualMachine @@ -165,7 +165,7 @@ class RegionView(generic.ObjectView): region=instance ) sites_table = tables.SiteTable(sites, exclude=('region',)) - paginate_table(sites_table, request) + configure_table(sites_table, request) return { 'child_regions_table': child_regions_table, @@ -250,7 +250,7 @@ class SiteGroupView(generic.ObjectView): group=instance ) sites_table = tables.SiteTable(sites, exclude=('group',)) - paginate_table(sites_table, request) + configure_table(sites_table, request) return { 'child_groups_table': child_groups_table, @@ -422,7 +422,7 @@ class LocationView(generic.ObjectView): cumulative=True ).filter(pk__in=location_ids).exclude(pk=instance.pk) child_locations_table = tables.LocationTable(child_locations) - paginate_table(child_locations_table, request) + configure_table(child_locations_table, request) return { 'rack_count': rack_count, @@ -493,7 +493,7 @@ class RackRoleView(generic.ObjectView): ) racks_table = tables.RackTable(racks, exclude=('role', 'get_utilization', 'get_power_utilization')) - paginate_table(racks_table, request) + configure_table(racks_table, request) return { 'racks_table': racks_table, @@ -743,7 +743,7 @@ class ManufacturerView(generic.ObjectView): ) devicetypes_table = tables.DeviceTypeTable(devicetypes, exclude=('manufacturer',)) - paginate_table(devicetypes_table, request) + configure_table(devicetypes_table, request) return { 'devicetypes_table': devicetypes_table, @@ -1439,7 +1439,7 @@ class DeviceRoleView(generic.ObjectView): device_role=instance ) devices_table = tables.DeviceTable(devices, exclude=('device_role',)) - paginate_table(devices_table, request) + configure_table(devices_table, request) return { 'devices_table': devices_table, @@ -1503,7 +1503,7 @@ class PlatformView(generic.ObjectView): platform=instance ) devices_table = tables.DeviceTable(devices, exclude=('platform',)) - paginate_table(devices_table, request) + configure_table(devices_table, request) return { 'devices_table': devices_table, diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 0df4d690557..59f922d82b3 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -11,7 +11,7 @@ from rq import Worker from netbox.views import generic from utilities.forms import ConfirmationForm from utilities.htmx import is_htmx -from utilities.tables import paginate_table +from utilities.tables import configure_table from utilities.utils import copy_safe_request, count_related, normalize_querydict, shallow_compare_dict from utilities.views import ContentTypePermissionRequiredMixin from . import filtersets, forms, tables @@ -215,7 +215,7 @@ class TagView(generic.ObjectView): data=tagged_items, orderable=False ) - paginate_table(taggeditem_table, request) + configure_table(taggeditem_table, request) object_types = [ { @@ -451,7 +451,7 @@ class ObjectChangeLogView(View): data=objectchanges, orderable=False ) - paginate_table(objectchanges_table, request) + configure_table(objectchanges_table, request) # Default to using "/.html" as the template, if it exists. Otherwise, # fall back to using base.html. @@ -571,7 +571,7 @@ class ObjectJournalView(View): assigned_object_id=obj.pk ) journalentry_table = tables.ObjectJournalTable(journalentries) - paginate_table(journalentry_table, request) + configure_table(journalentry_table, request) if request.user.has_perm('extras.add_journalentry'): form = forms.JournalEntryForm( diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 1f20e886f6b..23d6eb2a732 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -8,7 +8,7 @@ from dcim.filtersets import InterfaceFilterSet from dcim.models import Interface, Site from dcim.tables import SiteTable from netbox.views import generic -from utilities.tables import paginate_table +from utilities.tables import configure_table from utilities.utils import count_related from virtualization.filtersets import VMInterfaceFilterSet from virtualization.models import VMInterface @@ -161,7 +161,7 @@ class RIRView(generic.ObjectView): rir=instance ) aggregates_table = tables.AggregateTable(aggregates, exclude=('rir', 'utilization')) - paginate_table(aggregates_table, request) + configure_table(aggregates_table, request) return { 'aggregates_table': aggregates_table, @@ -219,7 +219,7 @@ class ASNView(generic.ObjectView): def get_extra_context(self, request, instance): sites = instance.sites.restrict(request.user, 'view') sites_table = SiteTable(sites) - paginate_table(sites_table, request) + configure_table(sites_table, request) return { 'sites_table': sites_table, @@ -356,7 +356,7 @@ class RoleView(generic.ObjectView): ) prefixes_table = tables.PrefixTable(prefixes, exclude=('role', 'utilization')) - paginate_table(prefixes_table, request) + configure_table(prefixes_table, request) return { 'prefixes_table': prefixes_table, @@ -664,7 +664,7 @@ class IPAddressView(generic.ObjectView): vrf=instance.vrf, address__net_contained_or_equal=str(instance.address) ) related_ips_table = tables.IPAddressTable(related_ips, orderable=False) - paginate_table(related_ips_table, request) + configure_table(related_ips_table, request) return { 'parent_prefixes_table': parent_prefixes_table, @@ -800,7 +800,7 @@ class VLANGroupView(generic.ObjectView): vlans_table = tables.VLANTable(vlans, exclude=('site', 'group', 'prefixes')) if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'): vlans_table.columns.show('pk') - paginate_table(vlans_table, request) + configure_table(vlans_table, request) # Compile permissions list for rendering the object table permissions = { diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index d8850391bfe..f5e31580140 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -15,7 +15,6 @@ from django.utils.safestring import mark_safe from django.views.generic import View from django_tables2.export import TableExport -from dcim.forms.object_create import ComponentCreateForm from extras.models import ExportTemplate from extras.signals import clear_webhooks from utilities.error_handlers import handle_protectederror @@ -23,7 +22,7 @@ from utilities.exceptions import AbortTransaction, PermissionsViolation from utilities.forms import ConfirmationForm, ImportForm, restrict_form_fields from utilities.htmx import is_htmx from utilities.permissions import get_permission_for_model -from utilities.tables import paginate_table +from utilities.tables import configure_table from utilities.utils import normalize_querydict, prepare_cloned_fields from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin @@ -135,7 +134,7 @@ class ObjectChildrenView(ObjectView): # Determine whether to display bulk action checkboxes if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']): table.columns.show('pk') - paginate_table(table, request) + configure_table(table, request) # If this is an HTMX request, return only the rendered table HTML if is_htmx(request): @@ -284,7 +283,7 @@ class ObjectListView(ObjectPermissionRequiredMixin, View): # Render the objects table table = self.get_table(request, permissions) - paginate_table(table, request) + configure_table(table, request) # If this is an HTMX request, return only the rendered table HTML if is_htmx(request): diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index b41af62eef5..d634292eca9 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -6,7 +6,7 @@ from circuits.models import Circuit from dcim.models import Site, Rack, Device, RackReservation from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF from netbox.views import generic -from utilities.tables import paginate_table +from utilities.tables import configure_table from utilities.utils import count_related from virtualization.models import VirtualMachine, Cluster from . import filtersets, forms, tables @@ -38,7 +38,7 @@ class TenantGroupView(generic.ObjectView): group=instance ) tenants_table = tables.TenantTable(tenants, exclude=('group',)) - paginate_table(tenants_table, request) + configure_table(tenants_table, request) return { 'tenants_table': tenants_table, @@ -184,7 +184,7 @@ class ContactGroupView(generic.ObjectView): group=instance ) contacts_table = tables.ContactTable(contacts, exclude=('group',)) - paginate_table(contacts_table, request) + configure_table(contacts_table, request) return { 'child_groups_table': child_groups_table, @@ -251,7 +251,7 @@ class ContactRoleView(generic.ObjectView): ) contacts_table = tables.ContactAssignmentTable(contact_assignments) contacts_table.columns.hide('role') - paginate_table(contacts_table, request) + configure_table(contacts_table, request) return { 'contacts_table': contacts_table, @@ -308,7 +308,7 @@ class ContactView(generic.ObjectView): ) assignments_table = tables.ContactAssignmentTable(contact_assignments) assignments_table.columns.hide('contact') - paginate_table(assignments_table, request) + configure_table(assignments_table, request) return { 'assignments_table': assignments_table, diff --git a/netbox/users/tests/test_preferences.py b/netbox/users/tests/test_preferences.py index 23e94e8efe8..035ca6840af 100644 --- a/netbox/users/tests/test_preferences.py +++ b/netbox/users/tests/test_preferences.py @@ -1,7 +1,13 @@ from django.contrib.auth.models import User -from django.test import override_settings, TestCase +from django.test import override_settings +from django.test.client import RequestFactory +from django.urls import reverse +from dcim.models import Site +from dcim.tables import SiteTable from users.preferences import UserPreference +from utilities.tables import configure_table +from utilities.testing import TestCase DEFAULT_USER_PREFERENCES = { @@ -12,6 +18,7 @@ DEFAULT_USER_PREFERENCES = { class UserPreferencesTest(TestCase): + user_permissions = ['dcim.view_site'] def test_userpreference(self): CHOICES = ( @@ -37,3 +44,21 @@ class UserPreferencesTest(TestCase): userconfig = user.config self.assertEqual(userconfig.data, DEFAULT_USER_PREFERENCES) + + def test_table_ordering(self): + url = reverse('dcim:site_list') + response = self.client.get(f"{url}?sort=status") + self.assertEqual(response.status_code, 200) + + # Check that table ordering preference has been recorded + self.user.refresh_from_db() + ordering = self.user.config.get(f'tables.SiteTable.ordering') + self.assertEqual(ordering, ['status']) + + # Check that a recorded preference is honored by default + self.user.config.set(f'tables.SiteTable.ordering', ['-status'], commit=True) + table = SiteTable(Site.objects.all()) + request = RequestFactory().get(url) + request.user = self.user + configure_table(table, request) + self.assertEqual(table.order_by, ('-status',)) diff --git a/netbox/utilities/tables/__init__.py b/netbox/utilities/tables/__init__.py index 37dd75144d6..25fa9529605 100644 --- a/netbox/utilities/tables/__init__.py +++ b/netbox/utilities/tables/__init__.py @@ -5,14 +5,23 @@ from .columns import * from .tables import * -# -# Pagination -# - -def paginate_table(table, request): +def configure_table(table, request): """ Paginate a table given a request context. """ + # Save ordering preference + if request.user.is_authenticated: + table_name = table.__class__.__name__ + if table.prefixed_order_by_field in request.GET: + # If an ordering has been specified as a query parameter, save it as the + # user's preferred ordering for this table. + ordering = request.GET.getlist(table.prefixed_order_by_field) + request.user.config.set(f'tables.{table_name}.ordering', ordering, commit=True) + elif ordering := request.user.config.get(f'tables.{table_name}.ordering'): + # If no ordering has been specified, set the preferred ordering (if any). + table.order_by = ordering + + # Paginate the table results paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 742d6d9ea34..0fc8c9bf74a 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -11,7 +11,7 @@ from extras.views import ObjectConfigContextView from ipam.models import IPAddress, Service from ipam.tables import AssignedIPAddressesTable, InterfaceVLANTable from netbox.views import generic -from utilities.tables import paginate_table +from utilities.tables import configure_table from utilities.utils import count_related from . import filtersets, forms, tables from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -41,7 +41,7 @@ class ClusterTypeView(generic.ObjectView): vm_count=count_related(VirtualMachine, 'cluster') ) clusters_table = tables.ClusterTable(clusters, exclude=('type',)) - paginate_table(clusters_table, request) + configure_table(clusters_table, request) return { 'clusters_table': clusters_table, @@ -103,7 +103,7 @@ class ClusterGroupView(generic.ObjectView): vm_count=count_related(VirtualMachine, 'cluster') ) clusters_table = tables.ClusterTable(clusters, exclude=('group',)) - paginate_table(clusters_table, request) + configure_table(clusters_table, request) return { 'clusters_table': clusters_table, diff --git a/netbox/wireless/views.py b/netbox/wireless/views.py index dd1e760bbab..443cf8eef02 100644 --- a/netbox/wireless/views.py +++ b/netbox/wireless/views.py @@ -1,6 +1,6 @@ from dcim.models import Interface from netbox.views import generic -from utilities.tables import paginate_table +from utilities.tables import configure_table from utilities.utils import count_related from . import filtersets, forms, tables from .models import * @@ -31,7 +31,7 @@ class WirelessLANGroupView(generic.ObjectView): group=instance ) wirelesslans_table = tables.WirelessLANTable(wirelesslans, exclude=('group',)) - paginate_table(wirelesslans_table, request) + configure_table(wirelesslans_table, request) return { 'wirelesslans_table': wirelesslans_table, @@ -99,7 +99,7 @@ class WirelessLANView(generic.ObjectView): wireless_lans=instance ) interfaces_table = tables.WirelessLANInterfacesTable(attached_interfaces) - paginate_table(interfaces_table, request) + configure_table(interfaces_table, request) return { 'interfaces_table': interfaces_table, From ff396b595370a3901eb9c605756c7328ba2785fe Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 14:27:52 -0500 Subject: [PATCH 084/271] Fix CSV import test & form cleanup --- netbox/dcim/forms/bulk_import.py | 1 + netbox/dcim/forms/models.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index ef8d790828b..acce43be03e 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -620,6 +620,7 @@ class InterfaceCSVForm(CustomFieldModelCSVForm): ) duplex = CSVChoiceField( choices=InterfaceDuplexChoices, + required=False, help_text='Duplex' ) mode = CSVChoiceField( diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 07fa07e12dc..378a567fc57 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1292,10 +1292,11 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): widgets = { 'device': forms.HiddenInput(), 'type': StaticSelect(), + 'speed': SelectSpeedWidget(), + 'duplex': StaticSelect(), 'mode': StaticSelect(), 'rf_role': StaticSelect(), 'rf_channel': StaticSelect(), - 'speed': SelectSpeedWidget(attrs={'readonly': None}), } labels = { 'mode': '802.1Q Mode', From 5cbc978cad63447af7f964989c2b742b9eb4e884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20R=C3=B8dvand?= Date: Wed, 12 Jan 2022 21:58:19 +0100 Subject: [PATCH 085/271] Render the payload_url of the Webhook with Jinja2 - Update markdown documentation - Expand on the help text for the Webhook model --- docs/models/extras/webhook.md | 6 +++--- netbox/extras/models/models.py | 9 ++++++++- netbox/extras/webhooks_worker.py | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/models/extras/webhook.md b/docs/models/extras/webhook.md index c7165733647..e256a66f44b 100644 --- a/docs/models/extras/webhook.md +++ b/docs/models/extras/webhook.md @@ -3,7 +3,7 @@ A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are managed under Logging > Webhooks. !!! warning - Webhooks support the inclusion of user-submitted code to generate custom headers and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users. + Webhooks support the inclusion of user-submitted code to generate URL, custom headers and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users. ## Configuration @@ -12,7 +12,7 @@ A webhook is a mechanism for conveying to some external system a change that too * **Enabled** - If unchecked, the webhook will be inactive. * **Events** - A webhook may trigger on any combination of create, update, and delete events. At least one event type must be selected. * **HTTP method** - The type of HTTP request to send. Options include `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`. -* **URL** - The fuly-qualified URL of the request to be sent. This may specify a destination port number if needed. +* **URL** - The fully-qualified URL of the request to be sent. This may specify a destination port number if needed. Jinja2 templating is supported for this field. * **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`) * **Additional headers** - Any additional headers to include with the request (optional). Add one header per line in the format `Name: Value`. Jinja2 templating is supported for this field (see below). * **Body template** - The content of the request being sent (optional). Jinja2 templating is supported for this field (see below). If blank, NetBox will populate the request body with a raw dump of the webhook context. (If the HTTP cotent type is set to `application/json`, this will be formatted as a JSON object.) @@ -23,7 +23,7 @@ A webhook is a mechanism for conveying to some external system a change that too ## Jinja2 Template Support -[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands. +[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `URL`, `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands. For example, you might create a NetBox webhook to [trigger a Slack message](https://api.slack.com/messaging/webhooks) any time an IP address is created. You can accomplish this using the following configuration: diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 3612b2a6fae..ab877b99e71 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -68,7 +68,8 @@ class Webhook(ChangeLoggedModel): payload_url = models.CharField( max_length=500, verbose_name='URL', - help_text="A POST will be sent to this URL when the webhook is called." + help_text='This URL will be called using the HTTP method defined when the webhook is called. ' + 'Jinja2 template processing is supported with the same context as the request body.' ) enabled = models.BooleanField( default=True @@ -176,6 +177,12 @@ class Webhook(ChangeLoggedModel): else: return json.dumps(context, cls=JSONEncoder) + def render_payload_url(self, context): + """ + Render the payload URL. + """ + return render_jinja2(self.payload_url, context) + @extras_features('webhooks', 'export_templates') class CustomLink(ChangeLoggedModel): diff --git a/netbox/extras/webhooks_worker.py b/netbox/extras/webhooks_worker.py index 1f0a66b8aba..7e89651823e 100644 --- a/netbox/extras/webhooks_worker.py +++ b/netbox/extras/webhooks_worker.py @@ -67,7 +67,7 @@ def process_webhook(webhook, model_name, event, data, snapshots, timestamp, user # Prepare the HTTP request params = { 'method': webhook.http_method, - 'url': webhook.payload_url, + 'url': webhook.render_payload_url(context), 'headers': headers, 'data': body.encode('utf8'), } From 97e7ef9a3fde70450bff97c3b43798c090a21d71 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 12 Jan 2022 16:42:28 -0500 Subject: [PATCH 086/271] Introduce ServiceTemplate --- docs/core-functionality/services.md | 1 + docs/models/ipam/servicetemplate.md | 3 + netbox/ipam/api/nested_serializers.py | 9 +++ netbox/ipam/api/serializers.py | 12 +++ netbox/ipam/api/urls.py | 1 + netbox/ipam/api/views.py | 8 +- netbox/ipam/filtersets.py | 23 ++++++ netbox/ipam/forms/bulk_edit.py | 12 ++- netbox/ipam/forms/bulk_import.py | 12 +++ netbox/ipam/forms/filtersets.py | 9 ++- netbox/ipam/forms/models.py | 22 ++++++ netbox/ipam/graphql/schema.py | 3 + netbox/ipam/graphql/types.py | 9 +++ .../ipam/migrations/0055_servicetemplate.py | 33 +++++++++ netbox/ipam/models/__init__.py | 1 + netbox/ipam/models/services.py | 74 ++++++++++++------- netbox/ipam/tables/services.py | 26 +++++-- netbox/ipam/tests/test_api.py | 35 +++++++++ netbox/ipam/tests/test_filtersets.py | 29 ++++++++ netbox/ipam/tests/test_views.py | 35 +++++++++ netbox/ipam/urls.py | 12 +++ netbox/ipam/views.py | 51 ++++++++++++- netbox/netbox/navigation_menu.py | 1 + netbox/templates/ipam/servicetemplate.html | 46 ++++++++++++ 24 files changed, 427 insertions(+), 40 deletions(-) create mode 100644 docs/models/ipam/servicetemplate.md create mode 100644 netbox/ipam/migrations/0055_servicetemplate.py create mode 100644 netbox/templates/ipam/servicetemplate.html diff --git a/docs/core-functionality/services.md b/docs/core-functionality/services.md index 2e7aaf65a3a..316c7fe0004 100644 --- a/docs/core-functionality/services.md +++ b/docs/core-functionality/services.md @@ -1,3 +1,4 @@ # Service Mapping +{!models/ipam/servicetemplate.md!} {!models/ipam/service.md!} diff --git a/docs/models/ipam/servicetemplate.md b/docs/models/ipam/servicetemplate.md new file mode 100644 index 00000000000..7fed4021113 --- /dev/null +++ b/docs/models/ipam/servicetemplate.md @@ -0,0 +1,3 @@ +# Service Templates + +Service templates can be used to instantiate services on devices and virtual machines. A template defines a name, protocol, and port number(s), and may optionally include a description. Services can be instantiated from templates and applied to devices and/or virtual machines, and may be associated with specific IP addresses. diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 1eb66743b33..5f9e0904955 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -15,6 +15,7 @@ __all__ = [ 'NestedRoleSerializer', 'NestedRouteTargetSerializer', 'NestedServiceSerializer', + 'NestedServiceTemplateSerializer', 'NestedVLANGroupSerializer', 'NestedVLANSerializer', 'NestedVRFSerializer', @@ -175,6 +176,14 @@ class NestedIPAddressSerializer(WritableNestedSerializer): # Services # +class NestedServiceTemplateSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') + + class Meta: + model = models.ServiceTemplate + fields = ['id', 'url', 'display', 'name', 'protocol', 'ports'] + + class NestedServiceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index c028a3d5d8b..f71d3958aca 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -403,6 +403,18 @@ class AvailableIPSerializer(serializers.Serializer): # Services # +class ServiceTemplateSerializer(PrimaryModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') + protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) + + class Meta: + model = ServiceTemplate + fields = [ + 'id', 'url', 'display', 'name', 'ports', 'protocol', 'description', 'tags', 'custom_fields', 'created', + 'last_updated', + ] + + class ServiceSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') device = NestedDeviceSerializer(required=False, allow_null=True) diff --git a/netbox/ipam/api/urls.py b/netbox/ipam/api/urls.py index 3d69e258e1f..8a68db9bea7 100644 --- a/netbox/ipam/api/urls.py +++ b/netbox/ipam/api/urls.py @@ -42,6 +42,7 @@ router.register('vlan-groups', views.VLANGroupViewSet) router.register('vlans', views.VLANViewSet) # Services +router.register('service-templates', views.ServiceTemplateViewSet) router.register('services', views.ServiceViewSet) app_name = 'ipam-api' diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index de415cd8174..357937855d7 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -140,7 +140,13 @@ class VLANViewSet(CustomFieldModelViewSet): filterset_class = filtersets.VLANFilterSet -class ServiceViewSet(ModelViewSet): +class ServiceTemplateViewSet(CustomFieldModelViewSet): + queryset = ServiceTemplate.objects.prefetch_related('tags') + serializer_class = serializers.ServiceTemplateSerializer + filterset_class = filtersets.ServiceTemplateFilterSet + + +class ServiceViewSet(CustomFieldModelViewSet): queryset = Service.objects.prefetch_related( 'device', 'virtual_machine', 'tags', 'ipaddresses' ) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 8a10a7b2479..52e4499c7e7 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -29,6 +29,7 @@ __all__ = ( 'RoleFilterSet', 'RouteTargetFilterSet', 'ServiceFilterSet', + 'ServiceTemplateFilterSet', 'VLANFilterSet', 'VLANGroupFilterSet', 'VRFFilterSet', @@ -854,6 +855,28 @@ class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet): return queryset.get_for_virtualmachine(value) +class ServiceTemplateFilterSet(PrimaryModelFilterSet): + q = django_filters.CharFilter( + method='search', + label='Search', + ) + port = NumericArrayFilter( + field_name='ports', + lookup_expr='contains' + ) + tag = TagFilter() + + class Meta: + model = ServiceTemplate + fields = ['id', 'name', 'protocol'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + qs_filter = Q(name__icontains=value) | Q(description__icontains=value) + return queryset.filter(qs_filter) + + class ServiceFilterSet(PrimaryModelFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 1e25a10903f..308a467d149 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -23,6 +23,7 @@ __all__ = ( 'RoleBulkEditForm', 'RouteTargetBulkEditForm', 'ServiceBulkEditForm', + 'ServiceTemplateBulkEditForm', 'VLANBulkEditForm', 'VLANGroupBulkEditForm', 'VRFBulkEditForm', @@ -433,9 +434,9 @@ class VLANBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class ServiceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ServiceTemplateBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): pk = forms.ModelMultipleChoiceField( - queryset=Service.objects.all(), + queryset=ServiceTemplate.objects.all(), widget=forms.MultipleHiddenInput() ) protocol = forms.ChoiceField( @@ -459,3 +460,10 @@ class ServiceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = [ 'description', ] + + +class ServiceBulkEditForm(ServiceTemplateBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Service.objects.all(), + widget=forms.MultipleHiddenInput() + ) diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index a4fdaa3ae5e..1ae977fe5fb 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -21,6 +21,7 @@ __all__ = ( 'RoleCSVForm', 'RouteTargetCSVForm', 'ServiceCSVForm', + 'ServiceTemplateCSVForm', 'VLANCSVForm', 'VLANGroupCSVForm', 'VRFCSVForm', @@ -392,6 +393,17 @@ class VLANCSVForm(CustomFieldModelCSVForm): } +class ServiceTemplateCSVForm(CustomFieldModelCSVForm): + protocol = CSVChoiceField( + choices=ServiceProtocolChoices, + help_text='IP protocol' + ) + + class Meta: + model = ServiceTemplate + fields = ('name', 'protocol', 'ports', 'description') + + class ServiceCSVForm(CustomFieldModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index df95bdd053c..9bfb1df104f 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -24,6 +24,7 @@ __all__ = ( 'RoleFilterForm', 'RouteTargetFilterForm', 'ServiceFilterForm', + 'ServiceTemplateFilterForm', 'VLANFilterForm', 'VLANGroupFilterForm', 'VRFFilterForm', @@ -447,8 +448,8 @@ class VLANFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class ServiceFilterForm(CustomFieldModelFilterForm): - model = Service +class ServiceTemplateFilterForm(CustomFieldModelFilterForm): + model = ServiceTemplate field_groups = ( ('q', 'tag'), ('protocol', 'port'), @@ -462,3 +463,7 @@ class ServiceFilterForm(CustomFieldModelFilterForm): required=False, ) tag = TagFilterField(model) + + +class ServiceFilterForm(ServiceTemplateFilterForm): + model = Service diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py index cef87724522..9aabd4d5492 100644 --- a/netbox/ipam/forms/models.py +++ b/netbox/ipam/forms/models.py @@ -31,6 +31,7 @@ __all__ = ( 'RoleForm', 'RouteTargetForm', 'ServiceForm', + 'ServiceTemplateForm', 'VLANForm', 'VLANGroupForm', 'VRFForm', @@ -815,6 +816,27 @@ class VLANForm(TenancyForm, CustomFieldModelForm): } +class ServiceTemplateForm(CustomFieldModelForm): + ports = NumericArrayField( + base_field=forms.IntegerField( + min_value=SERVICE_PORT_MIN, + max_value=SERVICE_PORT_MAX + ), + help_text="Comma-separated list of one or more port numbers. A range may be specified using a hyphen." + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = ServiceTemplate + fields = ('name', 'protocol', 'ports', 'description', 'tags') + widgets = { + 'protocol': StaticSelect(), + } + + class ServiceForm(CustomFieldModelForm): device = DynamicModelChoiceField( queryset=Device.objects.all(), diff --git a/netbox/ipam/graphql/schema.py b/netbox/ipam/graphql/schema.py index 9609d14349f..f466c1857af 100644 --- a/netbox/ipam/graphql/schema.py +++ b/netbox/ipam/graphql/schema.py @@ -32,6 +32,9 @@ class IPAMQuery(graphene.ObjectType): service = ObjectField(ServiceType) service_list = ObjectListField(ServiceType) + service_template = ObjectField(ServiceTemplateType) + service_template_list = ObjectListField(ServiceTemplateType) + fhrp_group = ObjectField(FHRPGroupType) fhrp_group_list = ObjectListField(FHRPGroupType) diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index d9aec66b36a..8dd122a0c28 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/graphql/types.py @@ -16,6 +16,7 @@ __all__ = ( 'RoleType', 'RouteTargetType', 'ServiceType', + 'ServiceTemplateType', 'VLANType', 'VLANGroupType', 'VRFType', @@ -120,6 +121,14 @@ class ServiceType(PrimaryObjectType): filterset_class = filtersets.ServiceFilterSet +class ServiceTemplateType(PrimaryObjectType): + + class Meta: + model = models.ServiceTemplate + fields = '__all__' + filterset_class = filtersets.ServiceTemplateFilterSet + + class VLANType(PrimaryObjectType): class Meta: diff --git a/netbox/ipam/migrations/0055_servicetemplate.py b/netbox/ipam/migrations/0055_servicetemplate.py new file mode 100644 index 00000000000..738317907a9 --- /dev/null +++ b/netbox/ipam/migrations/0055_servicetemplate.py @@ -0,0 +1,33 @@ +import django.contrib.postgres.fields +import django.core.serializers.json +import django.core.validators +from django.db import migrations, models +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0070_customlink_enabled'), + ('ipam', '0054_vlangroup_min_max_vids'), + ] + + operations = [ + migrations.CreateModel( + name='ServiceTemplate', + fields=[ + ('created', models.DateField(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=django.core.serializers.json.DjangoJSONEncoder)), + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('protocol', models.CharField(max_length=50)), + ('ports', django.contrib.postgres.fields.ArrayField(base_field=models.PositiveIntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(65535)]), size=None)), + ('description', models.CharField(blank=True, max_length=200)), + ('name', models.CharField(max_length=100, unique=True)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'ordering': ('name',), + }, + ), + ] diff --git a/netbox/ipam/models/__init__.py b/netbox/ipam/models/__init__.py index ab0e4b6caa6..1857b7d666b 100644 --- a/netbox/ipam/models/__init__.py +++ b/netbox/ipam/models/__init__.py @@ -16,6 +16,7 @@ __all__ = ( 'Role', 'RouteTarget', 'Service', + 'ServiceTemplate', 'VLAN', 'VLANGroup', 'VRF', diff --git a/netbox/ipam/models/services.py b/netbox/ipam/models/services.py index 5c1ebb9ddd1..43f8353bc63 100644 --- a/netbox/ipam/models/services.py +++ b/netbox/ipam/models/services.py @@ -13,11 +13,59 @@ from utilities.utils import array_to_string __all__ = ( 'Service', + 'ServiceTemplate', ) +class ServiceBase(models.Model): + protocol = models.CharField( + max_length=50, + choices=ServiceProtocolChoices + ) + ports = ArrayField( + base_field=models.PositiveIntegerField( + validators=[ + MinValueValidator(SERVICE_PORT_MIN), + MaxValueValidator(SERVICE_PORT_MAX) + ] + ), + verbose_name='Port numbers' + ) + description = models.CharField( + max_length=200, + blank=True + ) + + class Meta: + abstract = True + + def __str__(self): + return f'{self.name} ({self.get_protocol_display()}/{self.port_list})' + + @property + def port_list(self): + return array_to_string(self.ports) + + @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class Service(PrimaryModel): +class ServiceTemplate(ServiceBase, PrimaryModel): + """ + A template for a Service to be applied to a device or virtual machine. + """ + name = models.CharField( + max_length=100, + unique=True + ) + + class Meta: + ordering = ('name',) + + def get_absolute_url(self): + return reverse('ipam:servicetemplate', args=[self.pk]) + + +@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') +class Service(ServiceBase, PrimaryModel): """ A Service represents a layer-four service (e.g. HTTP or SSH) running on a Device or VirtualMachine. A Service may optionally be tied to one or more specific IPAddresses belonging to its parent. @@ -40,36 +88,16 @@ class Service(PrimaryModel): name = models.CharField( max_length=100 ) - protocol = models.CharField( - max_length=50, - choices=ServiceProtocolChoices - ) - ports = ArrayField( - base_field=models.PositiveIntegerField( - validators=[ - MinValueValidator(SERVICE_PORT_MIN), - MaxValueValidator(SERVICE_PORT_MAX) - ] - ), - verbose_name='Port numbers' - ) ipaddresses = models.ManyToManyField( to='ipam.IPAddress', related_name='services', blank=True, verbose_name='IP addresses' ) - description = models.CharField( - max_length=200, - blank=True - ) class Meta: ordering = ('protocol', 'ports', 'pk') # (protocol, port) may be non-unique - def __str__(self): - return f'{self.name} ({self.get_protocol_display()}/{self.port_list})' - def get_absolute_url(self): return reverse('ipam:service', args=[self.pk]) @@ -85,7 +113,3 @@ class Service(PrimaryModel): raise ValidationError("A service cannot be associated with both a device and a virtual machine.") if not self.device and not self.virtual_machine: raise ValidationError("A service must be associated with either a device or a virtual machine.") - - @property - def port_list(self): - return array_to_string(self.ports) diff --git a/netbox/ipam/tables/services.py b/netbox/ipam/tables/services.py index ff6b766f7a9..783cb353777 100644 --- a/netbox/ipam/tables/services.py +++ b/netbox/ipam/tables/services.py @@ -5,12 +5,27 @@ from ipam.models import * __all__ = ( 'ServiceTable', + 'ServiceTemplateTable', ) -# -# Services -# +class ServiceTemplateTable(BaseTable): + pk = ToggleColumn() + name = tables.Column( + linkify=True + ) + ports = tables.Column( + accessor=tables.A('port_list') + ) + tags = TagColumn( + url_name='ipam:servicetemplate_list' + ) + + class Meta(BaseTable.Meta): + model = ServiceTemplate + fields = ('pk', 'id', 'name', 'protocol', 'ports', 'description', 'tags') + default_columns = ('pk', 'name', 'protocol', 'ports', 'description') + class ServiceTable(BaseTable): pk = ToggleColumn() @@ -21,9 +36,8 @@ class ServiceTable(BaseTable): linkify=True, order_by=('device', 'virtual_machine') ) - ports = tables.TemplateColumn( - template_code='{{ record.port_list }}', - verbose_name='Ports' + ports = tables.Column( + accessor=tables.A('port_list') ) tags = TagColumn( url_name='ipam:service_list' diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index dfbf1a97198..d99de6d2071 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -832,6 +832,41 @@ class VLANTest(APIViewTestCases.APIViewTestCase): self.assertTrue(content['detail'].startswith('Unable to delete object.')) +class ServiceTemplateTest(APIViewTestCases.APIViewTestCase): + model = ServiceTemplate + brief_fields = ['display', 'id', 'name', 'ports', 'protocol', 'url'] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + service_templates = ( + ServiceTemplate(name='Service Template 1', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1, 2]), + ServiceTemplate(name='Service Template 2', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[3, 4]), + ServiceTemplate(name='Service Template 3', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[5, 6]), + ) + ServiceTemplate.objects.bulk_create(service_templates) + + cls.create_data = [ + { + 'name': 'Service Template 4', + 'protocol': ServiceProtocolChoices.PROTOCOL_TCP, + 'ports': [7, 8], + }, + { + 'name': 'Service Template 5', + 'protocol': ServiceProtocolChoices.PROTOCOL_TCP, + 'ports': [9, 10], + }, + { + 'name': 'Service Template 6', + 'protocol': ServiceProtocolChoices.PROTOCOL_TCP, + 'ports': [11, 12], + }, + ] + + class ServiceTest(APIViewTestCases.APIViewTestCase): model = Service brief_fields = ['display', 'id', 'name', 'ports', 'protocol', 'url'] diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index 773737deab2..d673628af30 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -1307,6 +1307,35 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) # 5 scoped + 1 global +class ServiceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = ServiceTemplate.objects.all() + filterset = ServiceTemplateFilterSet + + @classmethod + def setUpTestData(cls): + service_templates = ( + ServiceTemplate(name='Service Template 1', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1001]), + ServiceTemplate(name='Service Template 2', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1002]), + ServiceTemplate(name='Service Template 3', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[1003]), + ServiceTemplate(name='Service Template 4', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[2001]), + ServiceTemplate(name='Service Template 5', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[2002]), + ServiceTemplate(name='Service Template 6', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[2003]), + ) + ServiceTemplate.objects.bulk_create(service_templates) + + def test_name(self): + params = {'name': ['Service Template 1', 'Service Template 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_protocol(self): + params = {'protocol': ServiceProtocolChoices.PROTOCOL_TCP} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_port(self): + params = {'port': '1001'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = Service.objects.all() filterset = ServiceFilterSet diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index 80088eb7366..928a8b1c8f0 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -641,6 +641,41 @@ class VLANTestCase(ViewTestCases.PrimaryObjectViewTestCase): } +class ServiceTemplateTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = ServiceTemplate + + @classmethod + def setUpTestData(cls): + ServiceTemplate.objects.bulk_create([ + ServiceTemplate(name='Service Template 1', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[101]), + ServiceTemplate(name='Service Template 2', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[102]), + ServiceTemplate(name='Service Template 3', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[103]), + ]) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Service Template X', + 'protocol': ServiceProtocolChoices.PROTOCOL_UDP, + 'ports': '104,105', + 'description': 'A new service template', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,protocol,ports,description", + "Service Template 4,tcp,1,First service template", + "Service Template 5,tcp,2,Second service template", + "Service Template 6,tcp,3,Third service template", + ) + + cls.bulk_edit_data = { + 'protocol': ServiceProtocolChoices.PROTOCOL_UDP, + 'ports': '106,107', + 'description': 'New description', + } + + class ServiceTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = Service diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index a9f42025331..fe8cfd150f2 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -162,6 +162,18 @@ urlpatterns = [ path('vlans//changelog/', ObjectChangeLogView.as_view(), name='vlan_changelog', kwargs={'model': VLAN}), path('vlans//journal/', ObjectJournalView.as_view(), name='vlan_journal', kwargs={'model': VLAN}), + # Service templates + path('service-templates/', views.ServiceTemplateListView.as_view(), name='servicetemplate_list'), + path('service-templates/add/', views.ServiceTemplateEditView.as_view(), name='servicetemplate_add'), + path('service-templates/import/', views.ServiceTemplateBulkImportView.as_view(), name='servicetemplate_import'), + path('service-templates/edit/', views.ServiceTemplateBulkEditView.as_view(), name='servicetemplate_bulk_edit'), + path('service-templates/delete/', views.ServiceTemplateBulkDeleteView.as_view(), name='servicetemplate_bulk_delete'), + path('service-templates//', views.ServiceTemplateView.as_view(), name='servicetemplate'), + path('service-templates//edit/', views.ServiceTemplateEditView.as_view(), name='servicetemplate_edit'), + path('service-templates//delete/', views.ServiceTemplateDeleteView.as_view(), name='servicetemplate_delete'), + path('service-templates//changelog/', ObjectChangeLogView.as_view(), name='servicetemplate_changelog', kwargs={'model': ServiceTemplate}), + path('service-templates//journal/', ObjectJournalView.as_view(), name='servicetemplate_journal', kwargs={'model': ServiceTemplate}), + # Services path('services/', views.ServiceListView.as_view(), name='service_list'), path('services/add/', views.ServiceEditView.as_view(), name='service_add'), diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 39706e9ccae..f5aa0a7d7d7 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1028,6 +1028,49 @@ class VLANBulkDeleteView(generic.BulkDeleteView): table = tables.VLANTable +# +# Service templates +# + +class ServiceTemplateListView(generic.ObjectListView): + queryset = ServiceTemplate.objects.all() + filterset = filtersets.ServiceTemplateFilterSet + filterset_form = forms.ServiceTemplateFilterForm + table = tables.ServiceTemplateTable + + +class ServiceTemplateView(generic.ObjectView): + queryset = ServiceTemplate.objects.all() + + +class ServiceTemplateEditView(generic.ObjectEditView): + queryset = ServiceTemplate.objects.all() + model_form = forms.ServiceTemplateForm + + +class ServiceTemplateDeleteView(generic.ObjectDeleteView): + queryset = ServiceTemplate.objects.all() + + +class ServiceTemplateBulkImportView(generic.BulkImportView): + queryset = ServiceTemplate.objects.all() + model_form = forms.ServiceTemplateCSVForm + table = tables.ServiceTemplateTable + + +class ServiceTemplateBulkEditView(generic.BulkEditView): + queryset = ServiceTemplate.objects.all() + filterset = filtersets.ServiceTemplateFilterSet + table = tables.ServiceTemplateTable + form = forms.ServiceTemplateBulkEditForm + + +class ServiceTemplateBulkDeleteView(generic.BulkDeleteView): + queryset = ServiceTemplate.objects.all() + filterset = filtersets.ServiceTemplateFilterSet + table = tables.ServiceTemplateTable + + # # Services # @@ -1050,16 +1093,16 @@ class ServiceEditView(generic.ObjectEditView): template_name = 'ipam/service_edit.html' +class ServiceDeleteView(generic.ObjectDeleteView): + queryset = Service.objects.all() + + class ServiceBulkImportView(generic.BulkImportView): queryset = Service.objects.all() model_form = forms.ServiceCSVForm table = tables.ServiceTable -class ServiceDeleteView(generic.ObjectDeleteView): - queryset = Service.objects.all() - - class ServiceBulkEditView(generic.BulkEditView): queryset = Service.objects.prefetch_related('device', 'virtual_machine') filterset = filtersets.ServiceFilterSet diff --git a/netbox/netbox/navigation_menu.py b/netbox/netbox/navigation_menu.py index dc83d02f96a..85d86a47acd 100644 --- a/netbox/netbox/navigation_menu.py +++ b/netbox/netbox/navigation_menu.py @@ -264,6 +264,7 @@ IPAM_MENU = Menu( label='Other', items=( get_model_item('ipam', 'fhrpgroup', 'FHRP Groups'), + get_model_item('ipam', 'servicetemplate', 'Service Templates'), get_model_item('ipam', 'service', 'Services'), ), ), diff --git a/netbox/templates/ipam/servicetemplate.html b/netbox/templates/ipam/servicetemplate.html new file mode 100644 index 00000000000..6e2aacb3442 --- /dev/null +++ b/netbox/templates/ipam/servicetemplate.html @@ -0,0 +1,46 @@ +{% extends 'generic/object.html' %} +{% load buttons %} +{% load helpers %} +{% load perms %} +{% load plugins %} + +{% block content %} +
    +
    +
    +
    Service Template
    +
    + + + + + + + + + + + + + + + + + +
    Name{{ object.name }}
    Protocol{{ object.get_protocol_display }}
    Ports{{ object.port_list }}
    Description{{ object.description|placeholder }}
    +
    +
    + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} From b07a7ba9bc78256164439d17ce10a1f22ea3dac4 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 12 Jan 2022 17:07:54 -0500 Subject: [PATCH 087/271] Fix display of custom object fields within tables --- netbox/utilities/tables/columns.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/netbox/utilities/tables/columns.py b/netbox/utilities/tables/columns.py index a751725757f..24c22ec0cd5 100644 --- a/netbox/utilities/tables/columns.py +++ b/netbox/utilities/tables/columns.py @@ -324,7 +324,10 @@ class CustomFieldColumn(tables.Column): # Linkify custom URLs return mark_safe(f'{value}') if value is not None: - return value + obj = self.customfield.deserialize(value) + if hasattr(obj, 'get_absolute_url'): + return mark_safe(f'{obj}') + return obj return self.default From bb5ded203937bea67cca23511640587961aac769 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 13 Jan 2022 10:32:42 -0500 Subject: [PATCH 088/271] Enable creating services from templates in the UI --- netbox/ipam/forms/models.py | 34 +++++++++++ netbox/ipam/urls.py | 2 +- netbox/ipam/views.py | 6 ++ netbox/templates/ipam/service_create.html | 74 +++++++++++++++++++++++ 4 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 netbox/templates/ipam/service_create.html diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py index 9aabd4d5492..34c67773f19 100644 --- a/netbox/ipam/forms/models.py +++ b/netbox/ipam/forms/models.py @@ -31,6 +31,7 @@ __all__ = ( 'RoleForm', 'RouteTargetForm', 'ServiceForm', + 'ServiceCreateForm', 'ServiceTemplateForm', 'VLANForm', 'VLANGroupForm', @@ -880,3 +881,36 @@ class ServiceForm(CustomFieldModelForm): 'protocol': StaticSelect(), 'ipaddresses': StaticSelectMultiple(), } + + +class ServiceCreateForm(ServiceForm): + service_template = DynamicModelChoiceField( + queryset=ServiceTemplate.objects.all(), + required=False + ) + + class Meta(ServiceForm.Meta): + fields = [ + 'device', 'virtual_machine', 'service_template', 'name', 'protocol', 'ports', 'ipaddresses', 'description', + 'tags', + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Fields which may be populated from a ServiceTemplate are not required + for field in ('name', 'protocol', 'ports'): + self.fields[field].required = False + del(self.fields[field].widget.attrs['required']) + + def clean(self): + if self.cleaned_data['service_template']: + # Create a new Service from the specified template + service_template = self.cleaned_data['service_template'] + self.cleaned_data['name'] = service_template.name + self.cleaned_data['protocol'] = service_template.protocol + self.cleaned_data['ports'] = service_template.ports + if not self.cleaned_data['description']: + self.cleaned_data['description'] = service_template.description + elif not all(self.cleaned_data[f] for f in ('name', 'protocol', 'ports')): + raise forms.ValidationError("Must specify name, protocol, and port(s) if not using a service template.") diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index fe8cfd150f2..0a4eddc6cba 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -176,7 +176,7 @@ urlpatterns = [ # Services path('services/', views.ServiceListView.as_view(), name='service_list'), - path('services/add/', views.ServiceEditView.as_view(), name='service_add'), + path('services/add/', views.ServiceCreateView.as_view(), name='service_add'), path('services/import/', views.ServiceBulkImportView.as_view(), name='service_import'), path('services/edit/', views.ServiceBulkEditView.as_view(), name='service_bulk_edit'), path('services/delete/', views.ServiceBulkDeleteView.as_view(), name='service_bulk_delete'), diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index f5aa0a7d7d7..35d5cf50214 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1087,6 +1087,12 @@ class ServiceView(generic.ObjectView): queryset = Service.objects.prefetch_related('ipaddresses') +class ServiceCreateView(generic.ObjectEditView): + queryset = Service.objects.all() + model_form = forms.ServiceCreateForm + template_name = 'ipam/service_create.html' + + class ServiceEditView(generic.ObjectEditView): queryset = Service.objects.prefetch_related('ipaddresses') model_form = forms.ServiceForm diff --git a/netbox/templates/ipam/service_create.html b/netbox/templates/ipam/service_create.html new file mode 100644 index 00000000000..022821bcf4f --- /dev/null +++ b/netbox/templates/ipam/service_create.html @@ -0,0 +1,74 @@ +{% extends 'generic/object_edit.html' %} +{% load form_helpers %} + +{% block form %} +
    +
    +
    Service
    +
    + + {# Device/VM selection #} +
    +
    + +
    +
    +
    +
    + {% render_field form.device %} +
    +
    + {% render_field form.virtual_machine %} +
    +
    + + {# Template or custom #} +
    +
    + +
    +
    +
    +
    + {% render_field form.service_template %} +
    +
    + {% render_field form.name %} + {% render_field form.protocol %} + {% render_field form.ports %} +
    +
    + {% render_field form.ipaddresses %} + {% render_field form.description %} + {% render_field form.tags %} +
    + + {% if form.custom_fields %} +
    +
    Custom Fields
    +
    + {% render_custom_fields form %} + {% endif %} +{% endblock %} From 5b851a2d094cf2fe85fa94750900fee3b0254cf0 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 13 Jan 2022 10:48:08 -0500 Subject: [PATCH 089/271] Changelog for #1591 --- docs/release-notes/version-3.2.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index a2bc5988ed8..b82dce917c5 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -14,6 +14,10 @@ ### New Features +#### Service Templates ([#1591](https://github.com/netbox-community/netbox/issues/1591)) + +A new service template model has been introduced to assist in standardizing the definition and application of layer four services to devices and virtual machines. As an alternative to manually defining a name, protocol, and port(s) each time a service is created, a user now has the option of selecting a pre-defined template from which these values will be populated. + #### Automatic Provisioning of Next Available VLANs ([#2658](https://github.com/netbox-community/netbox/issues/2658)) A new REST API endpoint has been added at `/api/ipam/vlan-groups//available-vlans/`. A GET request to this endpoint will return a list of available VLANs within the group. A POST request can be made to this endpoint specifying the name(s) of one or more VLANs to create within the group, and their VLAN IDs will be assigned automatically. @@ -83,6 +87,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * `/api/dcim/module-bays/` * `/api/dcim/module-bay-templates/` * `/api/dcim/module-types/` + * `/api/extras/service-templates/` * circuits.ProviderNetwork * Added `service_id` field * dcim.ConsolePort From 707aad234eaca214557832fa29652fd90c635a39 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 13 Jan 2022 11:27:29 -0500 Subject: [PATCH 090/271] Add view test for creating service from template --- netbox/ipam/tests/test_views.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index 928a8b1c8f0..16439f45323 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -719,3 +719,29 @@ class ServiceTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'ports': '106,107', 'description': 'New description', } + + def test_create_from_template(self): + self.add_permissions('ipam.add_service') + + device = Device.objects.first() + service_template = ServiceTemplate.objects.create( + name='HTTP', + protocol=ServiceProtocolChoices.PROTOCOL_TCP, + ports=[80], + description='Hypertext transfer protocol' + ) + + request = { + 'path': self._get_url('add'), + 'data': { + 'device': device.pk, + 'service_template': service_template.pk, + }, + } + self.assertHttpStatus(self.client.post(**request), 302) + instance = self._get_queryset().order_by('pk').last() + self.assertEqual(instance.device, device) + self.assertEqual(instance.name, service_template.name) + self.assertEqual(instance.protocol, service_template.protocol) + self.assertEqual(instance.ports, service_template.ports) + self.assertEqual(instance.description, service_template.description) From b21b6238cf7392b20c348474f4e4d84510cf5651 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 13 Jan 2022 11:52:06 -0500 Subject: [PATCH 091/271] Fix test permissions --- netbox/ipam/tests/test_views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index 16439f45323..672cfbe082b 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -720,6 +720,7 @@ class ServiceTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'description': 'New description', } + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_create_from_template(self): self.add_permissions('ipam.add_service') From 7767692394c25fb050193d67afa8546caffcd1e7 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 13 Jan 2022 12:10:25 -0500 Subject: [PATCH 092/271] Changelog for #8295 --- docs/release-notes/version-3.2.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index b82dce917c5..dec5843dc19 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -69,6 +69,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * [#7846](https://github.com/netbox-community/netbox/issues/7846) - Enable associating inventory items with device components * [#7852](https://github.com/netbox-community/netbox/issues/7852) - Enable assigning interfaces to VRFs * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group +* [#8295](https://github.com/netbox-community/netbox/issues/8295) - Webhook URLs can now be templatized * [#8296](https://github.com/netbox-community/netbox/issues/8296) - Allow disabling custom links ### Other Changes From 3e3880823b6f2fb528cd64c00acb863f17e96bae Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 17 Jan 2022 11:12:54 -0500 Subject: [PATCH 093/271] Merge v3.1.6 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- base_requirements.txt | 4 -- docs/plugins/development.md | 3 + docs/release-notes/version-3.1.md | 12 +++- netbox/circuits/api/serializers.py | 2 +- netbox/circuits/tables.py | 12 ++-- netbox/dcim/api/serializers.py | 14 +++-- netbox/dcim/forms/filtersets.py | 2 +- netbox/dcim/svg.py | 7 ++- netbox/dcim/tables/cables.py | 2 +- netbox/dcim/tables/devices.py | 31 ++++++---- netbox/dcim/tables/devicetypes.py | 4 +- netbox/dcim/tables/power.py | 4 +- netbox/dcim/tables/racks.py | 12 ++-- netbox/dcim/tables/sites.py | 12 ++-- netbox/extras/api/serializers.py | 13 +++-- netbox/extras/forms/customfields.py | 63 ++++++++++----------- netbox/extras/tables.py | 12 ++-- netbox/ipam/models/ip.py | 21 ++++++- netbox/ipam/tables/fhrp.py | 2 +- netbox/ipam/tables/ip.py | 27 ++++++--- netbox/ipam/tables/services.py | 5 +- netbox/ipam/tables/vlans.py | 7 ++- netbox/ipam/tables/vrfs.py | 5 +- netbox/netbox/views/generic/bulk_views.py | 2 +- netbox/templates/inc/filter_list.html | 6 +- netbox/templates/ipam/asn.html | 2 +- netbox/tenancy/tables.py | 17 ++++-- netbox/utilities/forms/forms.py | 14 ++--- netbox/virtualization/tables.py | 19 +++++-- netbox/wireless/tables.py | 8 ++- requirements.txt | 6 +- 33 files changed, 225 insertions(+), 129 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 594f23f9ae8..16182af640b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.1.5 + placeholder: v3.1.6 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index b1193ae02da..0be999b1696 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.1.5 + placeholder: v3.1.6 validations: required: true - type: dropdown diff --git a/base_requirements.txt b/base_requirements.txt index cbc893aa9c4..aaa9c7f441e 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -98,10 +98,6 @@ psycopg2-binary # https://github.com/yaml/pyyaml PyYAML -# In-memory key/value store used for caching and queuing -# https://github.com/andymccurdy/redis-py -redis - # Social authentication framework # https://github.com/python-social-auth/social-core social-auth-core[all] diff --git a/docs/plugins/development.md b/docs/plugins/development.md index d20f73cb67b..d488cad6b54 100644 --- a/docs/plugins/development.md +++ b/docs/plugins/development.md @@ -1,5 +1,8 @@ # Plugin Development +!!! info "Help Improve the NetBox Plugins Framework!" + We're looking for volunteers to help improve NetBox's plugins framework. If you have experience developing plugins, we'd love to hear from you! You can find more information about this initiative [here](https://github.com/netbox-community/netbox/discussions/8338). + This documentation covers the development of custom plugins for NetBox. Plugins are essentially self-contained [Django apps](https://docs.djangoproject.com/en/stable/) which integrate with NetBox to provide custom functionality. Since the development of Django apps is already very well-documented, we'll only be covering the aspects that are specific to NetBox. Plugins can do a lot, including: diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 898d7743747..c42837b246c 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -1,16 +1,23 @@ # NetBox v3.1 -## v3.1.6 (FUTURE) +## v3.1.7 (FUTURE) + +--- + +## v3.1.6 (2022-01-17) ### Enhancements * [#8246](https://github.com/netbox-community/netbox/issues/8246) - Show human-friendly values for commit rates in circuits table * [#8262](https://github.com/netbox-community/netbox/issues/8262) - Add cable count to tenant stats * [#8265](https://github.com/netbox-community/netbox/issues/8265) - Add Stackwise-n interface types +* [#8293](https://github.com/netbox-community/netbox/issues/8293) - Show 4-byte ASNs in ASDOT notation * [#8302](https://github.com/netbox-community/netbox/issues/8302) - Linkify role column in device & VM tables +* [#8337](https://github.com/netbox-community/netbox/issues/8337) - Enable sorting object tables by created & updated times ### Bug Fixes +* [#8279](https://github.com/netbox-community/netbox/issues/8279) - Fix display of virtual chassis members in rack elevations * [#8285](https://github.com/netbox-community/netbox/issues/8285) - Fix `cluster_count` under tenant REST API serializer * [#8287](https://github.com/netbox-community/netbox/issues/8287) - Correct label in export template form * [#8301](https://github.com/netbox-community/netbox/issues/8301) - Fix delete button for various object children views @@ -19,6 +26,9 @@ * [#8314](https://github.com/netbox-community/netbox/issues/8314) - Prevent custom fields with default values from appearing as applied filters erroneously * [#8317](https://github.com/netbox-community/netbox/issues/8317) - Fix CSV import of multi-select custom field values * [#8319](https://github.com/netbox-community/netbox/issues/8319) - Custom URL fields should honor `ALLOWED_URL_SCHEMES` config parameter +* [#8342](https://github.com/netbox-community/netbox/issues/8342) - Restore `created` & `last_updated` fields missing from several REST API serializers +* [#8357](https://github.com/netbox-community/netbox/issues/8357) - Add missing tags field to location filter form +* [#8358](https://github.com/netbox-community/netbox/issues/8358) - Fix inconsistent styling of custom fields on filter & bulk edit forms --- diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index 7a827d547f1..90767d0812b 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -100,5 +100,5 @@ class CircuitTerminationSerializer(ValidatedModelSerializer, LinkTerminationSeri fields = [ 'id', 'url', 'display', 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'mark_connected', 'cable', 'link_peer', 'link_peer_type', - '_occupied', + '_occupied', 'created', 'last_updated', ] diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 69fe3cf1faf..b5fdc54406d 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -66,7 +66,7 @@ class ProviderTable(BaseTable): model = Provider fields = ( 'pk', 'id', 'name', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'circuit_count', - 'comments', 'tags', + 'comments', 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'asn', 'account', 'circuit_count') @@ -90,7 +90,9 @@ class ProviderNetworkTable(BaseTable): class Meta(BaseTable.Meta): model = ProviderNetwork - fields = ('pk', 'id', 'name', 'provider', 'service_id', 'description', 'comments', 'tags') + fields = ( + 'pk', 'id', 'name', 'provider', 'service_id', 'description', 'comments', 'created', 'last_updated', 'tags', + ) default_columns = ('pk', 'name', 'provider', 'service_id', 'description') @@ -112,7 +114,9 @@ class CircuitTypeTable(BaseTable): class Meta(BaseTable.Meta): model = CircuitType - fields = ('pk', 'id', 'name', 'circuit_count', 'description', 'slug', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'circuit_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'circuit_count', 'description', 'slug') @@ -149,7 +153,7 @@ class CircuitTable(BaseTable): model = Circuit fields = ( 'pk', 'id', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'install_date', - 'commit_rate', 'description', 'comments', 'tags', + 'commit_rate', 'description', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'description', diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 4d863823185..527c1e9485c 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -221,7 +221,7 @@ class RackReservationSerializer(PrimaryModelSerializer): class Meta: model = RackReservation fields = [ - 'id', 'url', 'display', 'rack', 'units', 'created', 'user', 'tenant', 'description', 'tags', + 'id', 'url', 'display', 'rack', 'units', 'created', 'last_updated', 'user', 'tenant', 'description', 'tags', 'custom_fields', ] @@ -913,7 +913,7 @@ class CableSerializer(PrimaryModelSerializer): fields = [ 'id', 'url', 'display', 'termination_a_type', 'termination_a_id', 'termination_a', 'termination_b_type', 'termination_b_id', 'termination_b', 'type', 'status', 'tenant', 'label', 'color', 'length', 'length_unit', - 'tags', 'custom_fields', + 'tags', 'custom_fields', 'created', 'last_updated', ] def _get_termination(self, obj, side): @@ -1007,7 +1007,10 @@ class VirtualChassisSerializer(PrimaryModelSerializer): class Meta: model = VirtualChassis - fields = ['id', 'url', 'display', 'name', 'domain', 'master', 'tags', 'custom_fields', 'member_count'] + fields = [ + 'id', 'url', 'display', 'name', 'domain', 'master', 'tags', 'custom_fields', 'member_count', + 'created', 'last_updated', + ] # @@ -1026,7 +1029,10 @@ class PowerPanelSerializer(PrimaryModelSerializer): class Meta: model = PowerPanel - fields = ['id', 'url', 'display', 'site', 'location', 'name', 'tags', 'custom_fields', 'powerfeed_count'] + fields = [ + 'id', 'url', 'display', 'site', 'location', 'name', 'tags', 'custom_fields', 'powerfeed_count', + 'created', 'last_updated', + ] class PowerFeedSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer): diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index f84b42aa170..6c192f4620c 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -157,7 +157,7 @@ class SiteFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): class LocationFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): model = Location field_groups = [ - ['q'], + ['q', 'tag'], ['region_id', 'site_group_id', 'site_id', 'parent_id'], ['tenant_group_id', 'tenant_id'], ] diff --git a/netbox/dcim/svg.py b/netbox/dcim/svg.py index e19e8fa2f54..1058d838546 100644 --- a/netbox/dcim/svg.py +++ b/netbox/dcim/svg.py @@ -19,7 +19,12 @@ __all__ = ( def get_device_name(device): - return device.name or str(device.device_type) + if device.virtual_chassis: + return f'{device.virtual_chassis.name}:{device.vc_position}' + elif device.name: + return device.name + else: + return str(device.device_type) class RackElevationSVG: diff --git a/netbox/dcim/tables/cables.py b/netbox/dcim/tables/cables.py index 9b912894be4..bea2c0adf66 100644 --- a/netbox/dcim/tables/cables.py +++ b/netbox/dcim/tables/cables.py @@ -56,7 +56,7 @@ class CableTable(BaseTable): model = Cable fields = ( 'pk', 'id', 'label', 'termination_a_parent', 'termination_a', 'termination_b_parent', 'termination_b', - 'status', 'type', 'tenant', 'color', 'length', 'tags', + 'status', 'type', 'tenant', 'color', 'length', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'id', 'label', 'termination_a_parent', 'termination_a', 'termination_b_parent', 'termination_b', diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 7bfa09c216e..f5ca4918772 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -99,7 +99,7 @@ class DeviceRoleTable(BaseTable): model = DeviceRole fields = ( 'pk', 'id', 'name', 'device_count', 'vm_count', 'color', 'vm_role', 'description', 'slug', 'tags', - 'actions', + 'actions', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device_count', 'vm_count', 'color', 'vm_role', 'description') @@ -131,7 +131,7 @@ class PlatformTable(BaseTable): model = Platform fields = ( 'pk', 'id', 'name', 'manufacturer', 'device_count', 'vm_count', 'slug', 'napalm_driver', 'napalm_args', - 'description', 'tags', 'actions', + 'description', 'tags', 'actions', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'manufacturer', 'device_count', 'vm_count', 'napalm_driver', 'description', @@ -205,7 +205,8 @@ class DeviceTable(BaseTable): fields = ( 'pk', 'id', 'name', 'status', 'tenant', 'device_role', 'manufacturer', 'device_type', 'platform', 'serial', 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'primary_ip', 'airflow', 'primary_ip4', - 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'comments', 'tags', + 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'comments', 'tags', 'created', + 'last_updated', ) default_columns = ( 'pk', 'name', 'status', 'tenant', 'site', 'location', 'rack', 'device_role', 'manufacturer', 'device_type', @@ -311,7 +312,7 @@ class ConsolePortTable(ModularDeviceComponentTable, PathEndpointTable): model = ConsolePort fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'speed', 'description', - 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', + 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'speed', 'description') @@ -353,7 +354,7 @@ class ConsoleServerPortTable(ModularDeviceComponentTable, PathEndpointTable): model = ConsoleServerPort fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'speed', 'description', - 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', + 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'speed', 'description') @@ -396,7 +397,8 @@ class PowerPortTable(ModularDeviceComponentTable, PathEndpointTable): model = PowerPort fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'description', 'mark_connected', - 'maximum_draw', 'allocated_draw', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', + 'maximum_draw', 'allocated_draw', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'created', + 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description') @@ -444,7 +446,8 @@ class PowerOutletTable(ModularDeviceComponentTable, PathEndpointTable): model = PowerOutlet fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'description', 'power_port', - 'feed_leg', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', + 'feed_leg', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'created', + 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'power_port', 'feed_leg', 'description') @@ -524,6 +527,7 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vrf', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', + 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description') @@ -594,6 +598,7 @@ class FrontPortTable(ModularDeviceComponentTable, CableTerminationTable): fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', + 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'device', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', @@ -641,7 +646,7 @@ class RearPortTable(ModularDeviceComponentTable, CableTerminationTable): model = RearPort fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'type', 'color', 'positions', 'description', - 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', + 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'color', 'description') @@ -691,7 +696,11 @@ class DeviceBayTable(DeviceComponentTable): class Meta(DeviceComponentTable.Meta): model = DeviceBay - fields = ('pk', 'id', 'name', 'device', 'label', 'status', 'installed_device', 'description', 'tags') + fields = ( + 'pk', 'id', 'name', 'device', 'label', 'status', 'installed_device', 'description', 'tags', + 'created', 'last_updated', + ) + default_columns = ('pk', 'name', 'device', 'label', 'status', 'installed_device', 'description') @@ -774,7 +783,7 @@ class InventoryItemTable(DeviceComponentTable): model = InventoryItem fields = ( 'pk', 'id', 'name', 'device', 'component', 'label', 'role', 'manufacturer', 'part_id', 'serial', - 'asset_tag', 'description', 'discovered', 'tags', + 'asset_tag', 'description', 'discovered', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'device', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', @@ -847,5 +856,5 @@ class VirtualChassisTable(BaseTable): class Meta(BaseTable.Meta): model = VirtualChassis - fields = ('pk', 'id', 'name', 'domain', 'master', 'member_count', 'tags') + fields = ('pk', 'id', 'name', 'domain', 'master', 'member_count', 'tags', 'created', 'last_updated',) default_columns = ('pk', 'name', 'domain', 'master', 'member_count') diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index ecec67f7dfb..93832d70686 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -53,7 +53,7 @@ class ManufacturerTable(BaseTable): model = Manufacturer fields = ( 'pk', 'id', 'name', 'devicetype_count', 'inventoryitem_count', 'platform_count', 'description', 'slug', - 'actions', + 'actions', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'devicetype_count', 'inventoryitem_count', 'platform_count', 'description', 'slug', @@ -87,7 +87,7 @@ class DeviceTypeTable(BaseTable): model = DeviceType fields = ( 'pk', 'id', 'model', 'manufacturer', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', - 'airflow', 'comments', 'instance_count', 'tags', + 'airflow', 'comments', 'instance_count', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'instance_count', diff --git a/netbox/dcim/tables/power.py b/netbox/dcim/tables/power.py index ac58b64de9a..c1ea8a34c22 100644 --- a/netbox/dcim/tables/power.py +++ b/netbox/dcim/tables/power.py @@ -33,7 +33,7 @@ class PowerPanelTable(BaseTable): class Meta(BaseTable.Meta): model = PowerPanel - fields = ('pk', 'id', 'name', 'site', 'location', 'powerfeed_count', 'tags') + fields = ('pk', 'id', 'name', 'site', 'location', 'powerfeed_count', 'tags', 'created', 'last_updated',) default_columns = ('pk', 'name', 'site', 'location', 'powerfeed_count') @@ -72,7 +72,7 @@ class PowerFeedTable(CableTerminationTable): fields = ( 'pk', 'id', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', 'max_utilization', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'available_power', - 'comments', 'tags', + 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', 'cable', diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index 565966a399c..55c6f9ba8f8 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -30,7 +30,10 @@ class RackRoleTable(BaseTable): class Meta(BaseTable.Meta): model = RackRole - fields = ('pk', 'id', 'name', 'rack_count', 'color', 'description', 'slug', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'rack_count', 'color', 'description', 'slug', 'tags', 'actions', 'created', + 'last_updated', + ) default_columns = ('pk', 'name', 'rack_count', 'color', 'description') @@ -86,8 +89,9 @@ class RackTable(BaseTable): class Meta(BaseTable.Meta): model = Rack fields = ( - 'pk', 'id', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'serial', 'asset_tag', 'type', - 'width', 'outer_width', 'outer_depth', 'u_height', 'comments', 'device_count', 'get_utilization', 'get_power_utilization', 'tags', + 'pk', 'id', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'serial', 'asset_tag', + 'type', 'width', 'outer_width', 'outer_depth', 'u_height', 'comments', 'device_count', 'get_utilization', + 'get_power_utilization', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'u_height', 'device_count', @@ -125,6 +129,6 @@ class RackReservationTable(BaseTable): model = RackReservation fields = ( 'pk', 'id', 'reservation', 'site', 'rack', 'unit_list', 'user', 'created', 'tenant', 'description', 'tags', - 'actions', + 'actions', 'created', 'last_updated', ) default_columns = ('pk', 'reservation', 'site', 'rack', 'unit_list', 'user', 'description') diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 98c5e3fd398..32bf000ef8a 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -35,7 +35,9 @@ class RegionTable(BaseTable): class Meta(BaseTable.Meta): model = Region - fields = ('pk', 'id', 'name', 'slug', 'site_count', 'description', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'slug', 'site_count', 'description', 'tags', 'created', 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'site_count', 'description') @@ -59,7 +61,9 @@ class SiteGroupTable(BaseTable): class Meta(BaseTable.Meta): model = SiteGroup - fields = ('pk', 'id', 'name', 'slug', 'site_count', 'description', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'slug', 'site_count', 'description', 'tags', 'created', 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'site_count', 'description') @@ -96,7 +100,7 @@ class SiteTable(BaseTable): fields = ( 'pk', 'id', 'name', 'slug', 'status', 'facility', 'region', 'group', 'tenant', 'asn_count', 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', 'tags', - 'actions', + 'created', 'last_updated', 'actions', ) default_columns = ('pk', 'name', 'status', 'facility', 'region', 'group', 'tenant', 'description') @@ -135,6 +139,6 @@ class LocationTable(BaseTable): model = Location fields = ( 'pk', 'id', 'name', 'site', 'tenant', 'rack_count', 'device_count', 'description', 'slug', 'tags', - 'actions', + 'actions', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'site', 'tenant', 'rack_count', 'device_count', 'description') diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 6279ea2b7af..79fab4a9058 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -63,7 +63,7 @@ class WebhookSerializer(ValidatedModelSerializer): fields = [ 'id', 'url', 'display', 'content_types', 'name', 'type_create', 'type_update', 'type_delete', 'payload_url', 'enabled', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', - 'conditions', 'ssl_verification', 'ca_file_path', + 'conditions', 'ssl_verification', 'ca_file_path', 'created', 'last_updated', ] @@ -84,7 +84,8 @@ class CustomFieldSerializer(ValidatedModelSerializer): model = CustomField fields = [ 'id', 'url', 'display', 'content_types', 'type', 'name', 'label', 'description', 'required', 'filter_logic', - 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', 'choices', + 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', 'choices', 'created', + 'last_updated', ] @@ -102,7 +103,7 @@ class CustomLinkSerializer(ValidatedModelSerializer): model = CustomLink fields = [ 'id', 'url', 'display', 'content_type', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', - 'button_class', 'new_window', + 'button_class', 'new_window', 'created', 'last_updated', ] @@ -120,7 +121,7 @@ class ExportTemplateSerializer(ValidatedModelSerializer): model = ExportTemplate fields = [ 'id', 'url', 'display', 'content_type', 'name', 'description', 'template_code', 'mime_type', - 'file_extension', 'as_attachment', + 'file_extension', 'as_attachment', 'created', 'last_updated', ] @@ -134,7 +135,9 @@ class TagSerializer(ValidatedModelSerializer): class Meta: model = Tag - fields = ['id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tagged_items'] + fields = [ + 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tagged_items', 'created', 'last_updated', + ] # diff --git a/netbox/extras/forms/customfields.py b/netbox/extras/forms/customfields.py index 0a2299945f9..8912d03651d 100644 --- a/netbox/extras/forms/customfields.py +++ b/netbox/extras/forms/customfields.py @@ -4,7 +4,7 @@ from django.db.models import Q from extras.choices import * from extras.models import * -from utilities.forms import BootstrapMixin, BulkEditForm, CSVModelForm, FilterForm +from utilities.forms import BootstrapMixin, BulkEditBaseForm, CSVModelForm __all__ = ( 'CustomFieldModelCSVForm', @@ -34,6 +34,9 @@ class CustomFieldsMixin: raise NotImplementedError(f"{self.__class__.__name__} must specify a model class.") return ContentType.objects.get_for_model(self.model) + def _get_custom_fields(self, content_type): + return CustomField.objects.filter(content_types=content_type) + def _get_form_field(self, customfield): return customfield.to_form_field() @@ -41,10 +44,7 @@ class CustomFieldsMixin: """ Append form fields for all CustomFields assigned to this object type. """ - content_type = self._get_content_type() - - # Append form fields; assign initial values if modifying and existing object - for customfield in CustomField.objects.filter(content_types=content_type): + for customfield in self._get_custom_fields(self._get_content_type()): field_name = f'cf_{customfield.name}' self.fields[field_name] = self._get_form_field(customfield) @@ -89,40 +89,37 @@ class CustomFieldModelCSVForm(CSVModelForm, CustomFieldModelForm): return customfield.to_form_field(for_csv_import=True) -class CustomFieldModelBulkEditForm(BulkEditForm): +class CustomFieldModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditBaseForm): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def _get_form_field(self, customfield): + return customfield.to_form_field(set_initial=False, enforce_required=False) - self.custom_fields = [] - self.obj_type = ContentType.objects.get_for_model(self.model) - - # Add all applicable CustomFields to the form - custom_fields = CustomField.objects.filter(content_types=self.obj_type) - for cf in custom_fields: + def _append_customfield_fields(self): + """ + Append form fields for all CustomFields assigned to this object type. + """ + for customfield in self._get_custom_fields(self._get_content_type()): # Annotate non-required custom fields as nullable - if not cf.required: - self.nullable_fields.append(cf.name) - self.fields[cf.name] = cf.to_form_field(set_initial=False, enforce_required=False) - # Annotate this as a custom field - self.custom_fields.append(cf.name) + if not customfield.required: + self.nullable_fields.append(customfield.name) + + self.fields[customfield.name] = self._get_form_field(customfield) + + # Annotate the field in the list of CustomField form fields + self.custom_fields[customfield.name] = customfield -class CustomFieldModelFilterForm(FilterForm): +class CustomFieldModelFilterForm(BootstrapMixin, CustomFieldsMixin, forms.Form): + q = forms.CharField( + required=False, + label='Search' + ) - def __init__(self, *args, **kwargs): - - self.obj_type = ContentType.objects.get_for_model(self.model) - - super().__init__(*args, **kwargs) - - # Add all applicable CustomFields to the form - self.custom_field_filters = [] - custom_fields = CustomField.objects.filter(content_types=self.obj_type).exclude( + def _get_custom_fields(self, content_type): + return CustomField.objects.filter(content_types=content_type).exclude( Q(filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED) | Q(type=CustomFieldTypeChoices.TYPE_JSON) ) - for cf in custom_fields: - field_name = f'cf_{cf.name}' - self.fields[field_name] = cf.to_form_field(set_initial=False, enforce_required=False) - self.custom_field_filters.append(field_name) + + def _get_form_field(self, customfield): + return customfield.to_form_field(set_initial=False, enforce_required=False) diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index adfccb575da..7d60518b267 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -58,7 +58,7 @@ class CustomFieldTable(BaseTable): model = CustomField fields = ( 'pk', 'id', 'name', 'content_types', 'label', 'type', 'required', 'weight', 'default', - 'description', 'filter_logic', 'choices', + 'description', 'filter_logic', 'choices', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'content_types', 'label', 'type', 'required', 'description') @@ -80,7 +80,7 @@ class CustomLinkTable(BaseTable): model = CustomLink fields = ( 'pk', 'id', 'name', 'content_type', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', - 'button_class', 'new_window', + 'button_class', 'new_window', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'content_type', 'enabled', 'group_name', 'button_class', 'new_window') @@ -101,6 +101,7 @@ class ExportTemplateTable(BaseTable): model = ExportTemplate fields = ( 'pk', 'id', 'name', 'content_type', 'description', 'mime_type', 'file_extension', 'as_attachment', + 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'content_type', 'description', 'mime_type', 'file_extension', 'as_attachment', @@ -135,7 +136,7 @@ class WebhookTable(BaseTable): model = Webhook fields = ( 'pk', 'id', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete', 'http_method', - 'payload_url', 'secret', 'ssl_validation', 'ca_file_path', + 'payload_url', 'secret', 'ssl_validation', 'ca_file_path', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete', 'http_method', @@ -156,7 +157,7 @@ class TagTable(BaseTable): class Meta(BaseTable.Meta): model = Tag - fields = ('pk', 'id', 'name', 'items', 'slug', 'color', 'description', 'actions') + fields = ('pk', 'id', 'name', 'items', 'slug', 'color', 'description', 'created', 'last_updated', 'actions') default_columns = ('pk', 'name', 'items', 'slug', 'color', 'description') @@ -193,7 +194,8 @@ class ConfigContextTable(BaseTable): model = ConfigContext fields = ( 'pk', 'id', 'name', 'weight', 'is_active', 'description', 'regions', 'sites', 'roles', - 'platforms', 'cluster_types', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', + 'platforms', 'cluster_types', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'created', + 'last_updated', ) default_columns = ('pk', 'name', 'weight', 'is_active', 'description') diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 13ae0f54f5d..9d6fb5edc2e 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -125,11 +125,30 @@ class ASN(PrimaryModel): verbose_name_plural = 'ASNs' def __str__(self): - return f'AS{self.asn}' + return f'AS{self.asn_with_asdot}' def get_absolute_url(self): return reverse('ipam:asn', args=[self.pk]) + @property + def asn_asdot(self): + """ + Return ASDOT notation for AS numbers greater than 16 bits. + """ + if self.asn > 65535: + return f'{self.asn // 65536}.{self.asn % 65536}' + return self.asn + + @property + def asn_with_asdot(self): + """ + Return both plain and ASDOT notation, where applicable. + """ + if self.asn > 65535: + return f'{self.asn} ({self.asn // 65536}.{self.asn % 65536})' + else: + return self.asn + @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Aggregate(GetAvailablePrefixesMixin, PrimaryModel): diff --git a/netbox/ipam/tables/fhrp.py b/netbox/ipam/tables/fhrp.py index a691b945b21..f9119126c46 100644 --- a/netbox/ipam/tables/fhrp.py +++ b/netbox/ipam/tables/fhrp.py @@ -38,7 +38,7 @@ class FHRPGroupTable(BaseTable): model = FHRPGroup fields = ( 'pk', 'group_id', 'protocol', 'auth_type', 'auth_key', 'description', 'ip_addresses', 'interface_count', - 'tags', + 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'group_id', 'protocol', 'auth_type', 'description', 'ip_addresses', 'interface_count') diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index 9914fb22b74..b2e4ef958db 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -91,7 +91,10 @@ class RIRTable(BaseTable): class Meta(BaseTable.Meta): model = RIR - fields = ('pk', 'id', 'name', 'slug', 'is_private', 'aggregate_count', 'description', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'slug', 'is_private', 'aggregate_count', 'description', 'tags', 'created', + 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'is_private', 'aggregate_count', 'description') @@ -102,8 +105,10 @@ class RIRTable(BaseTable): class ASNTable(BaseTable): pk = ToggleColumn() asn = tables.Column( + accessor=tables.A('asn_asdot'), linkify=True ) + site_count = LinkedCountColumn( viewname='dcim:site_list', url_params={'asn_id': 'pk'}, @@ -112,7 +117,7 @@ class ASNTable(BaseTable): class Meta(BaseTable.Meta): model = ASN - fields = ('pk', 'asn', 'rir', 'site_count', 'tenant', 'description', 'actions') + fields = ('pk', 'asn', 'rir', 'site_count', 'tenant', 'description', 'created', 'last_updated', 'actions') default_columns = ('pk', 'asn', 'rir', 'site_count', 'sites', 'tenant') @@ -144,7 +149,10 @@ class AggregateTable(BaseTable): class Meta(BaseTable.Meta): model = Aggregate - fields = ('pk', 'id', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description', 'tags') + fields = ( + 'pk', 'id', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description', 'tags', + 'created', 'last_updated', + ) default_columns = ('pk', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description') @@ -173,7 +181,10 @@ class RoleTable(BaseTable): class Meta(BaseTable.Meta): model = Role - fields = ('pk', 'id', 'name', 'slug', 'prefix_count', 'vlan_count', 'description', 'weight', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'slug', 'prefix_count', 'vlan_count', 'description', 'weight', 'tags', 'created', + 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'prefix_count', 'vlan_count', 'description') @@ -260,8 +271,8 @@ class PrefixTable(BaseTable): class Meta(BaseTable.Meta): model = Prefix fields = ( - 'pk', 'id', 'prefix', 'prefix_flat', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', 'vlan_group', - 'vlan', 'role', 'is_pool', 'mark_utilized', 'description', 'tags', + 'pk', 'id', 'prefix', 'prefix_flat', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', + 'vlan_group', 'vlan', 'role', 'is_pool', 'mark_utilized', 'description', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'prefix', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', 'vlan', 'role', 'description', @@ -302,7 +313,7 @@ class IPRangeTable(BaseTable): model = IPRange fields = ( 'pk', 'id', 'start_address', 'end_address', 'size', 'vrf', 'status', 'role', 'tenant', 'description', - 'utilization', 'tags', + 'utilization', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'start_address', 'end_address', 'size', 'vrf', 'status', 'role', 'tenant', 'description', @@ -360,7 +371,7 @@ class IPAddressTable(BaseTable): model = IPAddress fields = ( 'pk', 'id', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'assigned', 'dns_name', 'description', - 'tags', + 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'assigned', 'dns_name', 'description', diff --git a/netbox/ipam/tables/services.py b/netbox/ipam/tables/services.py index 783cb353777..5c3e14b2c29 100644 --- a/netbox/ipam/tables/services.py +++ b/netbox/ipam/tables/services.py @@ -45,5 +45,8 @@ class ServiceTable(BaseTable): class Meta(BaseTable.Meta): model = Service - fields = ('pk', 'id', 'name', 'parent', 'protocol', 'ports', 'ipaddresses', 'description', 'tags') + fields = ( + 'pk', 'id', 'name', 'parent', 'protocol', 'ports', 'ipaddresses', 'description', 'tags', 'created', + 'last_updated', + ) default_columns = ('pk', 'name', 'parent', 'protocol', 'ports', 'description') diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index 3454ddff42d..d387e24dddb 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -85,7 +85,7 @@ class VLANGroupTable(BaseTable): model = VLANGroup fields = ( 'pk', 'id', 'name', 'scope_type', 'scope', 'min_vid', 'max_vid', 'vlan_count', 'slug', 'description', - 'tags', 'actions', + 'tags', 'created', 'last_updated', 'actions', ) default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description') @@ -127,7 +127,10 @@ class VLANTable(BaseTable): class Meta(BaseTable.Meta): model = VLAN - fields = ('pk', 'id', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags') + fields = ( + 'pk', 'id', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags', + 'created', 'last_updated', + ) default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description') row_attrs = { 'class': lambda record: 'success' if not isinstance(record, VLAN) else '', diff --git a/netbox/ipam/tables/vrfs.py b/netbox/ipam/tables/vrfs.py index 1264368f464..e71fb1fa4be 100644 --- a/netbox/ipam/tables/vrfs.py +++ b/netbox/ipam/tables/vrfs.py @@ -47,7 +47,8 @@ class VRFTable(BaseTable): class Meta(BaseTable.Meta): model = VRF fields = ( - 'pk', 'id', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tags', + 'pk', 'id', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', + 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'rd', 'tenant', 'description') @@ -68,5 +69,5 @@ class RouteTargetTable(BaseTable): class Meta(BaseTable.Meta): model = RouteTarget - fields = ('pk', 'id', 'name', 'tenant', 'description', 'tags') + fields = ('pk', 'id', 'name', 'tenant', 'description', 'tags', 'created', 'last_updated',) default_columns = ('pk', 'name', 'tenant', 'description') diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index d76bc598dd4..e9b213a9596 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -287,7 +287,7 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): def _update_objects(self, form, request): custom_fields = getattr(form, 'custom_fields', []) standard_fields = [ - field for field in form.fields if field not in custom_fields + ['pk'] + field for field in form.fields if field not in list(custom_fields) + ['pk'] ] nullified_fields = request.POST.getlist('_nullify') updated_objects = [] diff --git a/netbox/templates/inc/filter_list.html b/netbox/templates/inc/filter_list.html index 1e73fedb2d3..e6a1e6a28ed 100644 --- a/netbox/templates/inc/filter_list.html +++ b/netbox/templates/inc/filter_list.html @@ -24,17 +24,17 @@ {% else %} {# List all non-customfield filters as declared in the form class #} {% for field in filter_form.visible_fields %} - {% if not filter_form.custom_field_filters or field.name not in filter_form.custom_field_filters %} + {% if not filter_form.custom_fields or field.name not in filter_form.custom_fields %}
    {% render_field field %}
    {% endif %} {% endfor %} {% endif %} - {% if filter_form.custom_field_filters %} + {% if filter_form.custom_fields %} {# List all custom field filters #}
    - {% for name in filter_form.custom_field_filters %} + {% for name in filter_form.custom_fields %}
    {% with field=filter_form|get_item:name %} {% render_field field %} diff --git a/netbox/templates/ipam/asn.html b/netbox/templates/ipam/asn.html index 53afd5ebbac..4a1ecda0dca 100644 --- a/netbox/templates/ipam/asn.html +++ b/netbox/templates/ipam/asn.html @@ -18,7 +18,7 @@ - + diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index f15e67eab5b..55a0591b586 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -62,7 +62,9 @@ class TenantGroupTable(BaseTable): class Meta(BaseTable.Meta): model = TenantGroup - fields = ('pk', 'id', 'name', 'tenant_count', 'description', 'slug', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'tenant_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'tenant_count', 'description') @@ -81,7 +83,7 @@ class TenantTable(BaseTable): class Meta(BaseTable.Meta): model = Tenant - fields = ('pk', 'id', 'name', 'slug', 'group', 'description', 'comments', 'tags') + fields = ('pk', 'id', 'name', 'slug', 'group', 'description', 'comments', 'tags', 'created', 'last_updated',) default_columns = ('pk', 'name', 'group', 'description') @@ -105,7 +107,9 @@ class ContactGroupTable(BaseTable): class Meta(BaseTable.Meta): model = ContactGroup - fields = ('pk', 'name', 'contact_count', 'description', 'slug', 'tags', 'actions') + fields = ( + 'pk', 'name', 'contact_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'contact_count', 'description') @@ -117,7 +121,7 @@ class ContactRoleTable(BaseTable): class Meta(BaseTable.Meta): model = ContactRole - fields = ('pk', 'name', 'description', 'slug', 'actions') + fields = ('pk', 'name', 'description', 'slug', 'created', 'last_updated', 'actions') default_columns = ('pk', 'name', 'description') @@ -142,7 +146,10 @@ class ContactTable(BaseTable): class Meta(BaseTable.Meta): model = Contact - fields = ('pk', 'name', 'group', 'title', 'phone', 'email', 'address', 'comments', 'assignment_count', 'tags') + fields = ( + 'pk', 'name', 'group', 'title', 'phone', 'email', 'address', 'comments', 'assignment_count', 'tags', + 'created', 'last_updated', + ) default_columns = ('pk', 'name', 'group', 'assignment_count', 'title', 'phone', 'email') diff --git a/netbox/utilities/forms/forms.py b/netbox/utilities/forms/forms.py index 87fa4ae33d4..88f837b2b0d 100644 --- a/netbox/utilities/forms/forms.py +++ b/netbox/utilities/forms/forms.py @@ -3,7 +3,6 @@ import re import yaml from django import forms -from django.utils.translation import gettext as _ from .widgets import APISelect, APISelectMultiple, ClearableFileInput, StaticSelect @@ -11,6 +10,7 @@ from .widgets import APISelect, APISelectMultiple, ClearableFileInput, StaticSel __all__ = ( 'BootstrapMixin', 'BulkEditForm', + 'BulkEditBaseForm', 'BulkRenameForm', 'ConfirmationForm', 'CSVModelForm', @@ -75,11 +75,10 @@ class ConfirmationForm(BootstrapMixin, ReturnURLForm): confirm = forms.BooleanField(required=True, widget=forms.HiddenInput(), initial=True) -class BulkEditForm(BootstrapMixin, forms.Form): +class BulkEditBaseForm(forms.Form): """ Base form for editing multiple objects in bulk """ - def __init__(self, model, *args, **kwargs): super().__init__(*args, **kwargs) self.model = model @@ -90,6 +89,10 @@ class BulkEditForm(BootstrapMixin, forms.Form): self.nullable_fields = self.Meta.nullable_fields +class BulkEditForm(BootstrapMixin, BulkEditBaseForm): + pass + + class BulkRenameForm(BootstrapMixin, forms.Form): """ An extendable form to be used for renaming objects in bulk. @@ -185,10 +188,7 @@ class FilterForm(BootstrapMixin, forms.Form): """ q = forms.CharField( required=False, - widget=forms.TextInput( - attrs={'placeholder': _('All fields')} - ), - label=_('Search') + label='Search' ) diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index 1920c1140b6..517f0a4b81f 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -44,7 +44,9 @@ class ClusterTypeTable(BaseTable): class Meta(BaseTable.Meta): model = ClusterType - fields = ('pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'created', 'last_updated', 'tags', 'actions', + ) default_columns = ('pk', 'name', 'cluster_count', 'description') @@ -66,7 +68,9 @@ class ClusterGroupTable(BaseTable): class Meta(BaseTable.Meta): model = ClusterGroup - fields = ('pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions') + fields = ( + 'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'created', 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'cluster_count', 'description') @@ -108,7 +112,10 @@ class ClusterTable(BaseTable): class Meta(BaseTable.Meta): model = Cluster - fields = ('pk', 'id', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'tags') + fields = ( + 'pk', 'id', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'tags', + 'created', 'last_updated', + ) default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count') @@ -149,8 +156,8 @@ class VirtualMachineTable(BaseTable): class Meta(BaseTable.Meta): model = VirtualMachine fields = ( - 'pk', 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'primary_ip4', - 'primary_ip6', 'primary_ip', 'comments', 'tags', + 'pk', 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', + 'primary_ip4', 'primary_ip6', 'primary_ip', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip', @@ -177,7 +184,7 @@ class VMInterfaceTable(BaseInterfaceTable): model = VMInterface fields = ( 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', + 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description') diff --git a/netbox/wireless/tables.py b/netbox/wireless/tables.py index 67d46f248f4..650d91554d3 100644 --- a/netbox/wireless/tables.py +++ b/netbox/wireless/tables.py @@ -27,7 +27,9 @@ class WirelessLANGroupTable(BaseTable): class Meta(BaseTable.Meta): model = WirelessLANGroup - fields = ('pk', 'name', 'wirelesslan_count', 'description', 'slug', 'tags', 'actions') + fields = ( + 'pk', 'name', 'wirelesslan_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', + ) default_columns = ('pk', 'name', 'wirelesslan_count', 'description') @@ -50,7 +52,7 @@ class WirelessLANTable(BaseTable): model = WirelessLAN fields = ( 'pk', 'ssid', 'group', 'description', 'vlan', 'interface_count', 'auth_type', 'auth_cipher', 'auth_psk', - 'tags', + 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'ssid', 'group', 'description', 'vlan', 'auth_type', 'interface_count') @@ -99,7 +101,7 @@ class WirelessLinkTable(BaseTable): model = WirelessLink fields = ( 'pk', 'id', 'status', 'device_a', 'interface_a', 'device_b', 'interface_b', 'ssid', 'description', - 'auth_type', 'auth_cipher', 'auth_psk', 'tags', + 'auth_type', 'auth_cipher', 'auth_psk', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'id', 'status', 'device_a', 'interface_a', 'device_b', 'interface_b', 'ssid', 'auth_type', diff --git a/requirements.txt b/requirements.txt index e0148e74eb5..83c1b9f2e18 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ Django==3.2.11 -django-cors-headers==3.10.1 +django-cors-headers==3.11.0 django-debug-toolbar==3.2.4 django-filter==21.1 django-graphiql-debug-toolbar==0.2.0 @@ -10,7 +10,7 @@ django-redis==5.2.0 django-rq==2.5.1 django-tables2==2.4.1 django-taggit==2.0.0 -django-timezone-field==4.2.1 +django-timezone-field==4.2.3 djangorestframework==3.12.4 drf-yasg[validation]==1.20.0 graphene_django==2.15.0 @@ -18,7 +18,7 @@ gunicorn==20.1.0 Jinja2==3.0.3 Markdown==3.3.6 markdown-include==0.6.0 -mkdocs-material==8.1.4 +mkdocs-material==8.1.7 netaddr==0.8.0 Pillow==8.4.0 psycopg2-binary==2.9.3 From 3fcae36cf15c141a59001b7057933e0bbe9b428f Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 18 Jan 2022 16:57:54 -0500 Subject: [PATCH 094/271] Closes #8307: Add data_type indicator to REST API serializer for custom fields --- docs/release-notes/version-3.2.md | 1 + netbox/extras/api/serializers.py | 19 ++++- netbox/extras/tests/test_customfields.py | 95 +++++++++++++++++++----- 3 files changed, 93 insertions(+), 22 deletions(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index dec5843dc19..09701f800dd 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -71,6 +71,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group * [#8295](https://github.com/netbox-community/netbox/issues/8295) - Webhook URLs can now be templatized * [#8296](https://github.com/netbox-community/netbox/issues/8296) - Allow disabling custom links +* [#8307](https://github.com/netbox-community/netbox/issues/8307) - Add `data_type` indicator to REST API serializer for custom fields ### Other Changes diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 79fab4a9058..36b307b397a 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -79,15 +79,28 @@ class CustomFieldSerializer(ValidatedModelSerializer): ) type = ChoiceField(choices=CustomFieldTypeChoices) filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices, required=False) + data_type = serializers.SerializerMethodField() class Meta: model = CustomField fields = [ - 'id', 'url', 'display', 'content_types', 'type', 'name', 'label', 'description', 'required', 'filter_logic', - 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', 'choices', 'created', - 'last_updated', + 'id', 'url', 'display', 'content_types', 'type', 'data_type', 'name', 'label', 'description', 'required', + 'filter_logic', 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', + 'choices', 'created', 'last_updated', ] + def get_data_type(self, obj): + types = CustomFieldTypeChoices + if obj.type == types.TYPE_INTEGER: + return 'integer' + if obj.type == types.TYPE_BOOLEAN: + return 'boolean' + if obj.type in (types.TYPE_JSON, types.TYPE_OBJECT): + return 'object' + if obj.type in (types.TYPE_MULTISELECT, types.TYPE_MULTIOBJECT): + return 'array' + return 'string' + # # Custom links diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index 1a1fc13a831..3a5fe3ac92a 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -378,9 +378,22 @@ class CustomFieldAPITest(APITestCase): CustomField(type=CustomFieldTypeChoices.TYPE_DATE, name='date_field', default='2020-01-01'), CustomField(type=CustomFieldTypeChoices.TYPE_URL, name='url_field', default='http://example.com/1'), CustomField(type=CustomFieldTypeChoices.TYPE_JSON, name='json_field', default='{"x": "y"}'), - CustomField(type=CustomFieldTypeChoices.TYPE_SELECT, name='choice_field', default='Foo', choices=( - 'Foo', 'Bar', 'Baz' - )), + CustomField( + type=CustomFieldTypeChoices.TYPE_SELECT, + name='select_field', + default='Foo', + choices=( + 'Foo', 'Bar', 'Baz' + ) + ), + CustomField( + type=CustomFieldTypeChoices.TYPE_MULTISELECT, + name='multiselect_field', + default=['Foo'], + choices=( + 'Foo', 'Bar', 'Baz' + ) + ), CustomField( type=CustomFieldTypeChoices.TYPE_OBJECT, name='object_field', @@ -416,11 +429,37 @@ class CustomFieldAPITest(APITestCase): custom_fields[5].name: 'http://example.com/2', custom_fields[6].name: '{"foo": 1, "bar": 2}', custom_fields[7].name: 'Bar', - custom_fields[8].name: vlans[1].pk, - custom_fields[9].name: [vlans[2].pk, vlans[3].pk], + custom_fields[8].name: ['Bar', 'Baz'], + custom_fields[9].name: vlans[1].pk, + custom_fields[10].name: [vlans[2].pk, vlans[3].pk], } sites[1].save() + def test_get_custom_fields(self): + TYPES = { + CustomFieldTypeChoices.TYPE_TEXT: 'string', + CustomFieldTypeChoices.TYPE_LONGTEXT: 'string', + CustomFieldTypeChoices.TYPE_INTEGER: 'integer', + CustomFieldTypeChoices.TYPE_BOOLEAN: 'boolean', + CustomFieldTypeChoices.TYPE_DATE: 'string', + CustomFieldTypeChoices.TYPE_URL: 'string', + CustomFieldTypeChoices.TYPE_JSON: 'object', + CustomFieldTypeChoices.TYPE_SELECT: 'string', + CustomFieldTypeChoices.TYPE_MULTISELECT: 'array', + CustomFieldTypeChoices.TYPE_OBJECT: 'object', + CustomFieldTypeChoices.TYPE_MULTIOBJECT: 'array', + } + + self.add_permissions('extras.view_customfield') + url = reverse('extras-api:customfield-list') + response = self.client.get(url, **self.header) + self.assertEqual(response.data['count'], len(TYPES)) + + # Validate data types + for customfield in response.data['results']: + cf_type = customfield['type']['value'] + self.assertEqual(customfield['data_type'], TYPES[cf_type]) + def test_get_single_object_without_custom_field_data(self): """ Validate that custom fields are present on an object even if it has no values defined. @@ -439,7 +478,8 @@ class CustomFieldAPITest(APITestCase): 'date_field': None, 'url_field': None, 'json_field': None, - 'choice_field': None, + 'select_field': None, + 'multiselect_field': None, 'object_field': None, 'multiobject_field': None, }) @@ -462,7 +502,8 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response.data['custom_fields']['date_field'], site2_cfvs['date_field']) self.assertEqual(response.data['custom_fields']['url_field'], site2_cfvs['url_field']) self.assertEqual(response.data['custom_fields']['json_field'], site2_cfvs['json_field']) - self.assertEqual(response.data['custom_fields']['choice_field'], site2_cfvs['choice_field']) + self.assertEqual(response.data['custom_fields']['select_field'], site2_cfvs['select_field']) + self.assertEqual(response.data['custom_fields']['multiselect_field'], site2_cfvs['multiselect_field']) self.assertEqual(response.data['custom_fields']['object_field']['id'], site2_cfvs['object_field']) self.assertEqual( [obj['id'] for obj in response.data['custom_fields']['multiobject_field']], @@ -495,7 +536,8 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['date_field'], cf_defaults['date_field']) self.assertEqual(response_cf['url_field'], cf_defaults['url_field']) self.assertEqual(response_cf['json_field'], cf_defaults['json_field']) - self.assertEqual(response_cf['choice_field'], cf_defaults['choice_field']) + self.assertEqual(response_cf['select_field'], cf_defaults['select_field']) + self.assertEqual(response_cf['multiselect_field'], cf_defaults['multiselect_field']) self.assertEqual(response_cf['object_field']['id'], cf_defaults['object_field']) self.assertEqual( [obj['id'] for obj in response.data['custom_fields']['multiobject_field']], @@ -511,7 +553,8 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(str(site.custom_field_data['date_field']), cf_defaults['date_field']) self.assertEqual(site.custom_field_data['url_field'], cf_defaults['url_field']) self.assertEqual(site.custom_field_data['json_field'], cf_defaults['json_field']) - self.assertEqual(site.custom_field_data['choice_field'], cf_defaults['choice_field']) + self.assertEqual(site.custom_field_data['select_field'], cf_defaults['select_field']) + self.assertEqual(site.custom_field_data['multiselect_field'], cf_defaults['multiselect_field']) self.assertEqual(site.custom_field_data['object_field'], cf_defaults['object_field']) self.assertEqual(site.custom_field_data['multiobject_field'], cf_defaults['multiobject_field']) @@ -530,7 +573,8 @@ class CustomFieldAPITest(APITestCase): 'date_field': '2020-01-02', 'url_field': 'http://example.com/2', 'json_field': '{"foo": 1, "bar": 2}', - 'choice_field': 'Bar', + 'select_field': 'Bar', + 'multiselect_field': ['Bar', 'Baz'], 'object_field': VLAN.objects.get(vid=2).pk, 'multiobject_field': list(VLAN.objects.filter(vid__in=[3, 4]).values_list('pk', flat=True)), }, @@ -551,7 +595,8 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['date_field'], data_cf['date_field']) self.assertEqual(response_cf['url_field'], data_cf['url_field']) self.assertEqual(response_cf['json_field'], data_cf['json_field']) - self.assertEqual(response_cf['choice_field'], data_cf['choice_field']) + self.assertEqual(response_cf['select_field'], data_cf['select_field']) + self.assertEqual(response_cf['multiselect_field'], data_cf['multiselect_field']) self.assertEqual(response_cf['object_field']['id'], data_cf['object_field']) self.assertEqual( [obj['id'] for obj in response_cf['multiobject_field']], @@ -567,7 +612,8 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(str(site.custom_field_data['date_field']), data_cf['date_field']) self.assertEqual(site.custom_field_data['url_field'], data_cf['url_field']) self.assertEqual(site.custom_field_data['json_field'], data_cf['json_field']) - self.assertEqual(site.custom_field_data['choice_field'], data_cf['choice_field']) + self.assertEqual(site.custom_field_data['select_field'], data_cf['select_field']) + self.assertEqual(site.custom_field_data['multiselect_field'], data_cf['multiselect_field']) self.assertEqual(site.custom_field_data['object_field'], data_cf['object_field']) self.assertEqual(site.custom_field_data['multiobject_field'], data_cf['multiobject_field']) @@ -611,7 +657,8 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['date_field'], cf_defaults['date_field']) self.assertEqual(response_cf['url_field'], cf_defaults['url_field']) self.assertEqual(response_cf['json_field'], cf_defaults['json_field']) - self.assertEqual(response_cf['choice_field'], cf_defaults['choice_field']) + self.assertEqual(response_cf['select_field'], cf_defaults['select_field']) + self.assertEqual(response_cf['multiselect_field'], cf_defaults['multiselect_field']) self.assertEqual(response_cf['object_field']['id'], cf_defaults['object_field']) self.assertEqual( [obj['id'] for obj in response_cf['multiobject_field']], @@ -627,7 +674,8 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(str(site.custom_field_data['date_field']), cf_defaults['date_field']) self.assertEqual(site.custom_field_data['url_field'], cf_defaults['url_field']) self.assertEqual(site.custom_field_data['json_field'], cf_defaults['json_field']) - self.assertEqual(site.custom_field_data['choice_field'], cf_defaults['choice_field']) + self.assertEqual(site.custom_field_data['select_field'], cf_defaults['select_field']) + self.assertEqual(site.custom_field_data['multiselect_field'], cf_defaults['multiselect_field']) self.assertEqual(site.custom_field_data['object_field'], cf_defaults['object_field']) self.assertEqual(site.custom_field_data['multiobject_field'], cf_defaults['multiobject_field']) @@ -643,7 +691,8 @@ class CustomFieldAPITest(APITestCase): 'date_field': '2020-01-02', 'url_field': 'http://example.com/2', 'json_field': '{"foo": 1, "bar": 2}', - 'choice_field': 'Bar', + 'select_field': 'Bar', + 'multiselect_field': ['Bar', 'Baz'], 'object_field': VLAN.objects.get(vid=2).pk, 'multiobject_field': list(VLAN.objects.filter(vid__in=[3, 4]).values_list('pk', flat=True)), } @@ -682,7 +731,9 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['date_field'], custom_field_data['date_field']) self.assertEqual(response_cf['url_field'], custom_field_data['url_field']) self.assertEqual(response_cf['json_field'], custom_field_data['json_field']) - self.assertEqual(response_cf['choice_field'], custom_field_data['choice_field']) + self.assertEqual(response_cf['select_field'], custom_field_data['select_field']) + self.assertEqual(response_cf['multiselect_field'], custom_field_data['multiselect_field']) + self.assertEqual(response_cf['object_field']['id'], custom_field_data['object_field']) self.assertEqual( [obj['id'] for obj in response_cf['multiobject_field']], custom_field_data['multiobject_field'] @@ -697,7 +748,9 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(str(site.custom_field_data['date_field']), custom_field_data['date_field']) self.assertEqual(site.custom_field_data['url_field'], custom_field_data['url_field']) self.assertEqual(site.custom_field_data['json_field'], custom_field_data['json_field']) - self.assertEqual(site.custom_field_data['choice_field'], custom_field_data['choice_field']) + self.assertEqual(site.custom_field_data['select_field'], custom_field_data['select_field']) + self.assertEqual(site.custom_field_data['multiselect_field'], custom_field_data['multiselect_field']) + self.assertEqual(site.custom_field_data['object_field'], custom_field_data['object_field']) self.assertEqual(site.custom_field_data['multiobject_field'], custom_field_data['multiobject_field']) def test_update_single_object_with_values(self): @@ -728,7 +781,9 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(response_cf['date_field'], original_cfvs['date_field']) self.assertEqual(response_cf['url_field'], original_cfvs['url_field']) self.assertEqual(response_cf['json_field'], original_cfvs['json_field']) - self.assertEqual(response_cf['choice_field'], original_cfvs['choice_field']) + self.assertEqual(response_cf['select_field'], original_cfvs['select_field']) + self.assertEqual(response_cf['multiselect_field'], original_cfvs['multiselect_field']) + self.assertEqual(response_cf['object_field']['id'], original_cfvs['object_field']) self.assertEqual( [obj['id'] for obj in response_cf['multiobject_field']], original_cfvs['multiobject_field'] @@ -743,7 +798,9 @@ class CustomFieldAPITest(APITestCase): self.assertEqual(site2.custom_field_data['date_field'], original_cfvs['date_field']) self.assertEqual(site2.custom_field_data['url_field'], original_cfvs['url_field']) self.assertEqual(site2.custom_field_data['json_field'], original_cfvs['json_field']) - self.assertEqual(site2.custom_field_data['choice_field'], original_cfvs['choice_field']) + self.assertEqual(site2.custom_field_data['select_field'], original_cfvs['select_field']) + self.assertEqual(site2.custom_field_data['multiselect_field'], original_cfvs['multiselect_field']) + self.assertEqual(site2.custom_field_data['object_field'], original_cfvs['object_field']) self.assertEqual(site2.custom_field_data['multiobject_field'], original_cfvs['multiobject_field']) def test_minimum_maximum_values_validation(self): From bf6345aa90afd5ee5c7a59ae6fd1d4ad73509803 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 19 Jan 2022 09:14:38 -0500 Subject: [PATCH 095/271] Closes #5429: Enable toggling the placement of table paginators --- docs/development/user-preferences.md | 1 + docs/release-notes/version-3.2.md | 1 + netbox/netbox/preferences.py | 10 ++++++++++ netbox/templates/htmx/table.html | 12 ++++++++++-- netbox/users/forms.py | 1 + 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/docs/development/user-preferences.md b/docs/development/user-preferences.md index 622fbb4b9b4..ceb5321a9df 100644 --- a/docs/development/user-preferences.md +++ b/docs/development/user-preferences.md @@ -8,6 +8,7 @@ The `users.UserConfig` model holds individual preferences for each user in the f |--------------------------|---------------------------------------------------------------| | data_format | Preferred format when rendering raw data (JSON or YAML) | | pagination.per_page | The number of items to display per page of a paginated table | +| pagination.placement | Where to display the paginator controls relative to the table | | tables.${table}.columns | The ordered list of columns to display when viewing the table | | tables.${table}.ordering | A list of column names by which the table should be ordered | | ui.colormode | Light or dark mode in the user interface | diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 09701f800dd..432d6fafcbb 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -60,6 +60,7 @@ Inventory item templates can be arranged hierarchically within a device type, an ### Enhancements +* [#5429](https://github.com/netbox-community/netbox/issues/5429) - Enable toggling the placement of table paginators * [#6954](https://github.com/netbox-community/netbox/issues/6954) - Remember users' table ordering preferences * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation * [#7679](https://github.com/netbox-community/netbox/issues/7679) - Add actions menu to all object tables diff --git a/netbox/netbox/preferences.py b/netbox/netbox/preferences.py index 4cad8cf247b..aec8bc7527a 100644 --- a/netbox/netbox/preferences.py +++ b/netbox/netbox/preferences.py @@ -26,6 +26,16 @@ PREFERENCES = { description='The number of objects to display per page', coerce=lambda x: int(x) ), + 'pagination.placement': UserPreference( + label='Paginator placement', + choices=( + ('bottom', 'Bottom'), + ('top', 'Top'), + ('both', 'Both'), + ), + description='Where the paginator controls will be displayed relative to a table', + default='bottom' + ), # Miscellaneous 'data_format': UserPreference( diff --git a/netbox/templates/htmx/table.html b/netbox/templates/htmx/table.html index c5d0ac46be0..6f168ac52d6 100644 --- a/netbox/templates/htmx/table.html +++ b/netbox/templates/htmx/table.html @@ -1,5 +1,13 @@ {# Render an HTMX-enabled table with paginator #} +{% load helpers %} {% load render_table from django_tables2 %} -{% render_table table 'inc/table_htmx.html' %} -{% include 'inc/paginator_htmx.html' with paginator=table.paginator page=table.page %} +{% with preferences|get_key:"pagination.placement" as paginator_placement %} + {% if paginator_placement == 'top' or paginator_placement == 'both' %} + {% include 'inc/paginator_htmx.html' with paginator=table.paginator page=table.page %} + {% endif %} + {% render_table table 'inc/table_htmx.html' %} + {% if paginator_placement != 'top' %} + {% include 'inc/paginator_htmx.html' with paginator=table.paginator page=table.page %} + {% endif %} +{% endwith %} diff --git a/netbox/users/forms.py b/netbox/users/forms.py index 70e300a8c42..5a99adc5afa 100644 --- a/netbox/users/forms.py +++ b/netbox/users/forms.py @@ -47,6 +47,7 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMe fieldsets = ( ('User Interface', ( 'pagination.per_page', + 'pagination.placement', 'ui.colormode', )), ('Miscellaneous', ( From c7825e391cabbdcc7616e78d70313957fee38b25 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 19 Jan 2022 14:46:50 -0500 Subject: [PATCH 096/271] Designate feature mixin classes & employ class_prepared signal to register features --- netbox/extras/utils.py | 23 ++- netbox/netbox/models/__init__.py | 129 +++++++++++++ .../netbox/{models.py => models/features.py} | 171 ++++++------------ 3 files changed, 198 insertions(+), 125 deletions(-) create mode 100644 netbox/netbox/models/__init__.py rename netbox/netbox/{models.py => models/features.py} (57%) diff --git a/netbox/extras/utils.py b/netbox/extras/utils.py index ace49cce586..16749ad5da7 100644 --- a/netbox/extras/utils.py +++ b/netbox/extras/utils.py @@ -57,21 +57,24 @@ class FeatureQuery: return query +def register_features(model, features): + if 'model_features' not in registry: + registry['model_features'] = { + f: collections.defaultdict(list) for f in EXTRAS_FEATURES + } + for feature in features: + if feature not in EXTRAS_FEATURES: + raise ValueError(f"{feature} is not a valid extras feature!") + app_label, model_name = model._meta.label_lower.split('.') + registry['model_features'][feature][app_label].append(model_name) + + def extras_features(*features): """ Decorator used to register extras provided features to a model """ def wrapper(model_class): # Initialize the model_features store if not already defined - if 'model_features' not in registry: - registry['model_features'] = { - f: collections.defaultdict(list) for f in EXTRAS_FEATURES - } - for feature in features: - if feature in EXTRAS_FEATURES: - app_label, model_name = model_class._meta.label_lower.split('.') - registry['model_features'][feature][app_label].append(model_name) - else: - raise ValueError('{} is not a valid extras feature!'.format(feature)) + register_features(model_class, features) return model_class return wrapper diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py new file mode 100644 index 00000000000..e715cf32973 --- /dev/null +++ b/netbox/netbox/models/__init__.py @@ -0,0 +1,129 @@ +from django.contrib.contenttypes.fields import GenericRelation +from django.core.validators import ValidationError +from django.db import models +from mptt.models import MPTTModel, TreeForeignKey + +from utilities.mptt import TreeManager +from utilities.querysets import RestrictedQuerySet +from netbox.models.features import * + +__all__ = ( + 'BigIDModel', + 'ChangeLoggedModel', + 'NestedGroupModel', + 'OrganizationalModel', + 'PrimaryModel', +) + + +# +# Base model classes +# + +class BigIDModel(models.Model): + """ + Abstract base model for all data objects. Ensures the use of a 64-bit PK. + """ + id = models.BigAutoField( + primary_key=True + ) + + class Meta: + abstract = True + + +class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, BigIDModel): + """ + Base model for all objects which support change logging. + """ + objects = RestrictedQuerySet.as_manager() + + class Meta: + abstract = True + + +class PrimaryModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel): + """ + Primary models represent real objects within the infrastructure being modeled. + """ + journal_entries = GenericRelation( + to='extras.JournalEntry', + object_id_field='assigned_object_id', + content_type_field='assigned_object_type' + ) + + objects = RestrictedQuerySet.as_manager() + + class Meta: + abstract = True + + +class NestedGroupModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel, MPTTModel): + """ + Base model for objects which are used to form a hierarchy (regions, locations, etc.). These models nest + recursively using MPTT. Within each parent, each child instance must have a unique name. + """ + parent = TreeForeignKey( + to='self', + on_delete=models.CASCADE, + related_name='children', + blank=True, + null=True, + db_index=True + ) + name = models.CharField( + max_length=100 + ) + description = models.CharField( + max_length=200, + blank=True + ) + + objects = TreeManager() + + class Meta: + abstract = True + + class MPTTMeta: + order_insertion_by = ('name',) + + def __str__(self): + return self.name + + def clean(self): + super().clean() + + # An MPTT model cannot be its own parent + if self.pk and self.parent_id == self.pk: + raise ValidationError({ + "parent": "Cannot assign self as parent." + }) + + +class OrganizationalModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel): + """ + Organizational models are those which are used solely to categorize and qualify other objects, and do not convey + any real information about the infrastructure being modeled (for example, functional device roles). Organizational + models provide the following standard attributes: + - Unique name + - Unique slug (automatically derived from name) + - Optional description + """ + name = models.CharField( + max_length=100, + unique=True + ) + slug = models.SlugField( + max_length=100, + unique=True + ) + description = models.CharField( + max_length=200, + blank=True + ) + + objects = RestrictedQuerySet.as_manager() + + class Meta: + abstract = True + ordering = ('name',) diff --git a/netbox/netbox/models.py b/netbox/netbox/models/features.py similarity index 57% rename from netbox/netbox/models.py rename to netbox/netbox/models/features.py index 3e6ebd8b22d..99f8c00b7d1 100644 --- a/netbox/netbox/models.py +++ b/netbox/netbox/models/features.py @@ -1,34 +1,37 @@ import logging -from django.contrib.contenttypes.fields import GenericRelation +from django.db.models.signals import class_prepared +from django.dispatch import receiver + from django.core.serializers.json import DjangoJSONEncoder from django.core.validators import ValidationError from django.db import models -from mptt.models import MPTTModel, TreeForeignKey from taggit.managers import TaggableManager from extras.choices import ObjectChangeActionChoices +from extras.utils import register_features from netbox.signals import post_clean -from utilities.mptt import TreeManager -from utilities.querysets import RestrictedQuerySet from utilities.utils import serialize_object __all__ = ( - 'BigIDModel', - 'ChangeLoggedModel', - 'NestedGroupModel', - 'OrganizationalModel', - 'PrimaryModel', + 'ChangeLoggingMixin', + 'CustomFieldsMixin', + 'CustomLinksMixin', + 'CustomValidationMixin', + 'ExportTemplatesMixin', + 'JobResultsMixin', + 'TagsMixin', + 'WebhooksMixin', ) # -# Mixins +# Feature mixins # class ChangeLoggingMixin(models.Model): """ - Provides change logging support. + Provides change logging support for a model. Adds the `created` and `last_updated` fields. """ created = models.DateField( auto_now_add=True, @@ -74,7 +77,7 @@ class ChangeLoggingMixin(models.Model): class CustomFieldsMixin(models.Model): """ - Provides support for custom fields. + Enables support for custom fields. """ custom_field_data = models.JSONField( encoder=DjangoJSONEncoder, @@ -128,6 +131,14 @@ class CustomFieldsMixin(models.Model): raise ValidationError(f"Missing required custom field '{cf.name}'.") +class CustomLinksMixin(models.Model): + """ + Enables support for custom links. + """ + class Meta: + abstract = True + + class CustomValidationMixin(models.Model): """ Enables user-configured validation rules for built-in models by extending the clean() method. @@ -142,9 +153,25 @@ class CustomValidationMixin(models.Model): post_clean.send(sender=self.__class__, instance=self) +class ExportTemplatesMixin(models.Model): + """ + Enables support for export templates. + """ + class Meta: + abstract = True + + +class JobResultsMixin(models.Model): + """ + Enable the assignment of JobResults to a model. + """ + class Meta: + abstract = True + + class TagsMixin(models.Model): """ - Enable the assignment of Tags. + Enable the assignment of Tags to a model. """ tags = TaggableManager( through='extras.TaggedItem' @@ -154,113 +181,27 @@ class TagsMixin(models.Model): abstract = True -# -# Base model classes - -class BigIDModel(models.Model): +class WebhooksMixin(models.Model): """ - Abstract base model for all data objects. Ensures the use of a 64-bit PK. + Enables support for webhooks. """ - id = models.BigAutoField( - primary_key=True - ) - class Meta: abstract = True -class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, BigIDModel): - """ - Base model for all objects which support change logging. - """ - objects = RestrictedQuerySet.as_manager() - - class Meta: - abstract = True +FEATURES_MAP = ( + ('custom_fields', CustomFieldsMixin), + ('custom_links', CustomLinksMixin), + ('export_templates', ExportTemplatesMixin), + ('job_results', JobResultsMixin), + ('tags', TagsMixin), + ('webhooks', WebhooksMixin), +) -class PrimaryModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel): - """ - Primary models represent real objects within the infrastructure being modeled. - """ - journal_entries = GenericRelation( - to='extras.JournalEntry', - object_id_field='assigned_object_id', - content_type_field='assigned_object_type' - ) - - objects = RestrictedQuerySet.as_manager() - - class Meta: - abstract = True - - -class NestedGroupModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel, MPTTModel): - """ - Base model for objects which are used to form a hierarchy (regions, locations, etc.). These models nest - recursively using MPTT. Within each parent, each child instance must have a unique name. - """ - parent = TreeForeignKey( - to='self', - on_delete=models.CASCADE, - related_name='children', - blank=True, - null=True, - db_index=True - ) - name = models.CharField( - max_length=100 - ) - description = models.CharField( - max_length=200, - blank=True - ) - - objects = TreeManager() - - class Meta: - abstract = True - - class MPTTMeta: - order_insertion_by = ('name',) - - def __str__(self): - return self.name - - def clean(self): - super().clean() - - # An MPTT model cannot be its own parent - if self.pk and self.parent_id == self.pk: - raise ValidationError({ - "parent": "Cannot assign self as parent." - }) - - -class OrganizationalModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel): - """ - Organizational models are those which are used solely to categorize and qualify other objects, and do not convey - any real information about the infrastructure being modeled (for example, functional device roles). Organizational - models provide the following standard attributes: - - Unique name - - Unique slug (automatically derived from name) - - Optional description - """ - name = models.CharField( - max_length=100, - unique=True - ) - slug = models.SlugField( - max_length=100, - unique=True - ) - description = models.CharField( - max_length=200, - blank=True - ) - - objects = RestrictedQuerySet.as_manager() - - class Meta: - abstract = True - ordering = ('name',) +@receiver(class_prepared) +def _register_features(sender, **kwargs): + features = { + feature for feature, cls in FEATURES_MAP if issubclass(sender, cls) + } + register_features(sender, features) From cdae0c2bef3f5cfe81acf0bf3927ed5d98a3650d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 19 Jan 2022 15:16:10 -0500 Subject: [PATCH 097/271] Remove extras_features() decorator --- netbox/circuits/models/circuits.py | 7 ++---- netbox/circuits/models/providers.py | 3 --- netbox/dcim/models/cables.py | 2 -- .../dcim/models/device_component_templates.py | 16 +++--------- netbox/dcim/models/device_components.py | 12 --------- netbox/dcim/models/devices.py | 9 ------- netbox/dcim/models/power.py | 3 --- netbox/dcim/models/racks.py | 4 --- netbox/dcim/models/sites.py | 6 ----- netbox/extras/constants.py | 1 + netbox/extras/models/configcontexts.py | 5 ++-- netbox/extras/models/customfields.py | 6 ++--- netbox/extras/models/models.py | 24 +++++++----------- netbox/extras/models/tags.py | 5 ++-- netbox/extras/utils.py | 11 -------- netbox/ipam/models/fhrp.py | 6 ++--- netbox/ipam/models/ip.py | 8 ------ netbox/ipam/models/services.py | 3 --- netbox/ipam/models/vlans.py | 3 --- netbox/ipam/models/vrfs.py | 3 --- netbox/netbox/models/__init__.py | 25 +++++++++++-------- netbox/netbox/models/features.py | 17 +++++++++++++ netbox/tenancy/models/contacts.py | 8 ++---- netbox/tenancy/models/tenants.py | 3 --- netbox/virtualization/models.py | 7 ------ netbox/wireless/models.py | 4 --- 26 files changed, 58 insertions(+), 143 deletions(-) diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 013aef55752..e697caa0a28 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -5,8 +5,8 @@ from django.urls import reverse from circuits.choices import * from dcim.models import LinkTermination -from extras.utils import extras_features from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel +from netbox.models.features import WebhooksMixin __all__ = ( 'Circuit', @@ -15,7 +15,6 @@ __all__ = ( ) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class CircuitType(OrganizationalModel): """ Circuits can be organized by their functional role. For example, a user might wish to define CircuitTypes named @@ -44,7 +43,6 @@ class CircuitType(OrganizationalModel): return reverse('circuits:circuittype', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Circuit(PrimaryModel): """ A communications circuit connects two points. Each Circuit belongs to a Provider; Providers may have multiple @@ -138,8 +136,7 @@ class Circuit(PrimaryModel): return CircuitStatusChoices.colors.get(self.status, 'secondary') -@extras_features('webhooks') -class CircuitTermination(ChangeLoggedModel, LinkTermination): +class CircuitTermination(WebhooksMixin, ChangeLoggedModel, LinkTermination): circuit = models.ForeignKey( to='circuits.Circuit', on_delete=models.CASCADE, diff --git a/netbox/circuits/models/providers.py b/netbox/circuits/models/providers.py index 153e241a734..8fd52c5874c 100644 --- a/netbox/circuits/models/providers.py +++ b/netbox/circuits/models/providers.py @@ -3,7 +3,6 @@ from django.db import models from django.urls import reverse from dcim.fields import ASNField -from extras.utils import extras_features from netbox.models import PrimaryModel __all__ = ( @@ -12,7 +11,6 @@ __all__ = ( ) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Provider(PrimaryModel): """ Each Circuit belongs to a Provider. This is usually a telecommunications company or similar organization. This model @@ -72,7 +70,6 @@ class Provider(PrimaryModel): return reverse('circuits:provider', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ProviderNetwork(PrimaryModel): """ This represents a provider network which exists outside of NetBox, the details of which are unknown or diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 12fe9103608..18bf6589595 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -11,7 +11,6 @@ from dcim.choices import * from dcim.constants import * from dcim.fields import PathField from dcim.utils import decompile_path_node, object_to_path_node, path_node_to_object -from extras.utils import extras_features from netbox.models import BigIDModel, PrimaryModel from utilities.fields import ColorField from utilities.utils import to_meters @@ -29,7 +28,6 @@ __all__ = ( # Cables # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Cable(PrimaryModel): """ A physical connection between two endpoints. diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index b3ede828225..72ac9df40cb 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -1,4 +1,4 @@ -from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation +from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.validators import MaxValueValidator, MinValueValidator @@ -7,8 +7,8 @@ from mptt.models import MPTTModel, TreeForeignKey from dcim.choices import * from dcim.constants import * -from extras.utils import extras_features from netbox.models import ChangeLoggedModel +from netbox.models.features import WebhooksMixin from utilities.fields import ColorField, NaturalOrderingField from utilities.mptt import TreeManager from utilities.ordering import naturalize_interface @@ -32,7 +32,7 @@ __all__ = ( ) -class ComponentTemplateModel(ChangeLoggedModel): +class ComponentTemplateModel(WebhooksMixin, ChangeLoggedModel): device_type = models.ForeignKey( to='dcim.DeviceType', on_delete=models.CASCADE, @@ -135,7 +135,6 @@ class ModularComponentTemplateModel(ComponentTemplateModel): return self.name -@extras_features('webhooks') class ConsolePortTemplate(ModularComponentTemplateModel): """ A template for a ConsolePort to be created for a new Device. @@ -164,7 +163,6 @@ class ConsolePortTemplate(ModularComponentTemplateModel): ) -@extras_features('webhooks') class ConsoleServerPortTemplate(ModularComponentTemplateModel): """ A template for a ConsoleServerPort to be created for a new Device. @@ -193,7 +191,6 @@ class ConsoleServerPortTemplate(ModularComponentTemplateModel): ) -@extras_features('webhooks') class PowerPortTemplate(ModularComponentTemplateModel): """ A template for a PowerPort to be created for a new Device. @@ -245,7 +242,6 @@ class PowerPortTemplate(ModularComponentTemplateModel): }) -@extras_features('webhooks') class PowerOutletTemplate(ModularComponentTemplateModel): """ A template for a PowerOutlet to be created for a new Device. @@ -307,7 +303,6 @@ class PowerOutletTemplate(ModularComponentTemplateModel): ) -@extras_features('webhooks') class InterfaceTemplate(ModularComponentTemplateModel): """ A template for a physical data interface on a new Device. @@ -347,7 +342,6 @@ class InterfaceTemplate(ModularComponentTemplateModel): ) -@extras_features('webhooks') class FrontPortTemplate(ModularComponentTemplateModel): """ Template for a pass-through port on the front of a new Device. @@ -420,7 +414,6 @@ class FrontPortTemplate(ModularComponentTemplateModel): ) -@extras_features('webhooks') class RearPortTemplate(ModularComponentTemplateModel): """ Template for a pass-through port on the rear of a new Device. @@ -460,7 +453,6 @@ class RearPortTemplate(ModularComponentTemplateModel): ) -@extras_features('webhooks') class ModuleBayTemplate(ComponentTemplateModel): """ A template for a ModuleBay to be created for a new parent Device. @@ -486,7 +478,6 @@ class ModuleBayTemplate(ComponentTemplateModel): ) -@extras_features('webhooks') class DeviceBayTemplate(ComponentTemplateModel): """ A template for a DeviceBay to be created for a new parent Device. @@ -511,7 +502,6 @@ class DeviceBayTemplate(ComponentTemplateModel): ) -@extras_features('webhooks') class InventoryItemTemplate(MPTTModel, ComponentTemplateModel): """ A template for an InventoryItem to be created for a new parent Device. diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 916161ced50..c26b32575cd 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -11,7 +11,6 @@ from dcim.choices import * from dcim.constants import * from dcim.fields import MACAddressField, WWNField from dcim.svg import CableTraceSVG -from extras.utils import extras_features from netbox.models import OrganizationalModel, PrimaryModel from utilities.choices import ColorChoices from utilities.fields import ColorField, NaturalOrderingField @@ -254,7 +253,6 @@ class PathEndpoint(models.Model): # Console components # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ConsolePort(ModularComponentModel, LinkTermination, PathEndpoint): """ A physical console port within a Device. ConsolePorts connect to ConsoleServerPorts. @@ -282,7 +280,6 @@ class ConsolePort(ModularComponentModel, LinkTermination, PathEndpoint): return reverse('dcim:consoleport', kwargs={'pk': self.pk}) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ConsoleServerPort(ModularComponentModel, LinkTermination, PathEndpoint): """ A physical port within a Device (typically a designated console server) which provides access to ConsolePorts. @@ -314,7 +311,6 @@ class ConsoleServerPort(ModularComponentModel, LinkTermination, PathEndpoint): # Power components # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class PowerPort(ModularComponentModel, LinkTermination, PathEndpoint): """ A physical power supply (intake) port within a Device. PowerPorts connect to PowerOutlets. @@ -407,7 +403,6 @@ class PowerPort(ModularComponentModel, LinkTermination, PathEndpoint): } -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class PowerOutlet(ModularComponentModel, LinkTermination, PathEndpoint): """ A physical power outlet (output) within a Device which provides power to a PowerPort. @@ -522,7 +517,6 @@ class BaseInterface(models.Model): return self.fhrp_group_assignments.count() -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Interface(ModularComponentModel, BaseInterface, LinkTermination, PathEndpoint): """ A network interface within a Device. A physical Interface can connect to exactly one other Interface. @@ -793,7 +787,6 @@ class Interface(ModularComponentModel, BaseInterface, LinkTermination, PathEndpo # Pass-through ports # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class FrontPort(ModularComponentModel, LinkTermination): """ A pass-through port on the front of a Device. @@ -847,7 +840,6 @@ class FrontPort(ModularComponentModel, LinkTermination): }) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class RearPort(ModularComponentModel, LinkTermination): """ A pass-through port on the rear of a Device. @@ -891,7 +883,6 @@ class RearPort(ModularComponentModel, LinkTermination): # Bays # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ModuleBay(ComponentModel): """ An empty space within a Device which can house a child device @@ -912,7 +903,6 @@ class ModuleBay(ComponentModel): return reverse('dcim:modulebay', kwargs={'pk': self.pk}) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class DeviceBay(ComponentModel): """ An empty space within a Device which can house a child device @@ -963,7 +953,6 @@ class DeviceBay(ComponentModel): # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class InventoryItemRole(OrganizationalModel): """ Inventory items may optionally be assigned a functional role. @@ -994,7 +983,6 @@ class InventoryItemRole(OrganizationalModel): return reverse('dcim:inventoryitemrole', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class InventoryItem(MPTTModel, ComponentModel): """ An InventoryItem represents a serialized piece of hardware within a Device, such as a line card or power supply. diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 631f0c8c1db..f94c9757d13 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -13,7 +13,6 @@ from dcim.choices import * from dcim.constants import * from extras.models import ConfigContextModel from extras.querysets import ConfigContextModelQuerySet -from extras.utils import extras_features from netbox.config import ConfigItem from netbox.models import OrganizationalModel, PrimaryModel from utilities.choices import ColorChoices @@ -37,7 +36,6 @@ __all__ = ( # Device Types # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Manufacturer(OrganizationalModel): """ A Manufacturer represents a company which produces hardware devices; for example, Juniper or Dell. @@ -70,7 +68,6 @@ class Manufacturer(OrganizationalModel): return reverse('dcim:manufacturer', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class DeviceType(PrimaryModel): """ A DeviceType represents a particular make (Manufacturer) and model of device. It specifies rack height and depth, as @@ -353,7 +350,6 @@ class DeviceType(PrimaryModel): return self.subdevice_role == SubdeviceRoleChoices.ROLE_CHILD -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ModuleType(PrimaryModel): """ A ModuleType represents a hardware element that can be installed within a device and which houses additional @@ -487,7 +483,6 @@ class ModuleType(PrimaryModel): # Devices # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class DeviceRole(OrganizationalModel): """ Devices are organized by functional role; for example, "Core Switch" or "File Server". Each DeviceRole is assigned a @@ -525,7 +520,6 @@ class DeviceRole(OrganizationalModel): return reverse('dcim:devicerole', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Platform(OrganizationalModel): """ Platform refers to the software or firmware running on a Device. For example, "Cisco IOS-XR" or "Juniper Junos". @@ -575,7 +569,6 @@ class Platform(OrganizationalModel): return reverse('dcim:platform', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Device(PrimaryModel, ConfigContextModel): """ A Device represents a piece of physical hardware mounted within a Rack. Each Device is assigned a DeviceType, @@ -1012,7 +1005,6 @@ class Device(PrimaryModel, ConfigContextModel): return DeviceStatusChoices.colors.get(self.status, 'secondary') -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Module(PrimaryModel, ConfigContextModel): """ A Module represents a field-installable component within a Device which may itself hold multiple device components @@ -1095,7 +1087,6 @@ class Module(PrimaryModel, ConfigContextModel): # Virtual chassis # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class VirtualChassis(PrimaryModel): """ A collection of Devices which operate with a shared control plane (e.g. a switch stack). diff --git a/netbox/dcim/models/power.py b/netbox/dcim/models/power.py index e3146c16779..fe7f69df927 100644 --- a/netbox/dcim/models/power.py +++ b/netbox/dcim/models/power.py @@ -6,7 +6,6 @@ from django.urls import reverse from dcim.choices import * from dcim.constants import * -from extras.utils import extras_features from netbox.models import PrimaryModel from utilities.validators import ExclusionValidator from .device_components import LinkTermination, PathEndpoint @@ -21,7 +20,6 @@ __all__ = ( # Power # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class PowerPanel(PrimaryModel): """ A distribution point for electrical power; e.g. a data center RPP. @@ -68,7 +66,6 @@ class PowerPanel(PrimaryModel): ) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class PowerFeed(PrimaryModel, PathEndpoint, LinkTermination): """ An electrical circuit delivered from a PowerPanel. diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index c324d4cbaa9..1ebbbcba425 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -13,7 +13,6 @@ from django.urls import reverse from dcim.choices import * from dcim.constants import * from dcim.svg import RackElevationSVG -from extras.utils import extras_features from netbox.config import get_config from netbox.models import OrganizationalModel, PrimaryModel from utilities.choices import ColorChoices @@ -34,7 +33,6 @@ __all__ = ( # Racks # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class RackRole(OrganizationalModel): """ Racks can be organized by functional role, similar to Devices. @@ -65,7 +63,6 @@ class RackRole(OrganizationalModel): return reverse('dcim:rackrole', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Rack(PrimaryModel): """ Devices are housed within Racks. Each rack has a defined height measured in rack units, and a front and rear face. @@ -438,7 +435,6 @@ class Rack(PrimaryModel): return int(allocated_draw_total / available_power_total * 100) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class RackReservation(PrimaryModel): """ One or more reserved units within a Rack. diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index a712062246b..3756933acd8 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -7,8 +7,6 @@ from timezone_field import TimeZoneField from dcim.choices import * from dcim.constants import * -from dcim.fields import ASNField -from extras.utils import extras_features from netbox.models import NestedGroupModel, PrimaryModel from utilities.fields import NaturalOrderingField @@ -24,7 +22,6 @@ __all__ = ( # Regions # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Region(NestedGroupModel): """ A region represents a geographic collection of sites. For example, you might create regions representing countries, @@ -111,7 +108,6 @@ class Region(NestedGroupModel): # Site groups # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class SiteGroup(NestedGroupModel): """ A site group is an arbitrary grouping of sites. For example, you might have corporate sites and customer sites; and @@ -198,7 +194,6 @@ class SiteGroup(NestedGroupModel): # Sites # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Site(PrimaryModel): """ A Site represents a geographic location within a network; typically a building or campus. The optional facility @@ -322,7 +317,6 @@ class Site(PrimaryModel): # Locations # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Location(NestedGroupModel): """ A Location represents a subgroup of Racks and/or Devices within a Site. A Location may represent a building within a diff --git a/netbox/extras/constants.py b/netbox/extras/constants.py index 64cc82f630a..123eb0a45b3 100644 --- a/netbox/extras/constants.py +++ b/netbox/extras/constants.py @@ -7,6 +7,7 @@ EXTRAS_FEATURES = [ 'custom_links', 'export_templates', 'job_results', + 'journaling', 'tags', 'webhooks' ] diff --git a/netbox/extras/models/configcontexts.py b/netbox/extras/models/configcontexts.py index 2a14f143fc3..0dc5d57dba6 100644 --- a/netbox/extras/models/configcontexts.py +++ b/netbox/extras/models/configcontexts.py @@ -5,8 +5,8 @@ from django.db import models from django.urls import reverse from extras.querysets import ConfigContextQuerySet -from extras.utils import extras_features from netbox.models import ChangeLoggedModel +from netbox.models.features import WebhooksMixin from utilities.utils import deepmerge @@ -20,8 +20,7 @@ __all__ = ( # Config contexts # -@extras_features('webhooks') -class ConfigContext(ChangeLoggedModel): +class ConfigContext(WebhooksMixin, ChangeLoggedModel): """ A ConfigContext represents a set of arbitrary data available to any Device or VirtualMachine matching its assigned qualifiers (region, site, etc.). For example, the data stored in a ConfigContext assigned to site A and tenant B diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index c0f0403006c..923d8441319 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -12,8 +12,9 @@ from django.utils.html import escape from django.utils.safestring import mark_safe from extras.choices import * -from extras.utils import FeatureQuery, extras_features +from extras.utils import FeatureQuery from netbox.models import ChangeLoggedModel +from netbox.models.features import ExportTemplatesMixin, WebhooksMixin from utilities import filters from utilities.forms import ( CSVChoiceField, CSVMultipleChoiceField, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField, @@ -40,8 +41,7 @@ class CustomFieldManager(models.Manager.from_queryset(RestrictedQuerySet)): return self.get_queryset().filter(content_types=content_type) -@extras_features('webhooks', 'export_templates') -class CustomField(ChangeLoggedModel): +class CustomField(ExportTemplatesMixin, WebhooksMixin, ChangeLoggedModel): content_types = models.ManyToManyField( to=ContentType, related_name='custom_fields', diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index ab877b99e71..7189aed0392 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -17,8 +17,9 @@ from rest_framework.utils.encoders import JSONEncoder from extras.choices import * from extras.constants import * from extras.conditions import ConditionSet -from extras.utils import extras_features, FeatureQuery, image_upload +from extras.utils import FeatureQuery, image_upload from netbox.models import BigIDModel, ChangeLoggedModel +from netbox.models.features import ExportTemplatesMixin, JobResultsMixin, WebhooksMixin from utilities.querysets import RestrictedQuerySet from utilities.utils import render_jinja2 @@ -35,8 +36,7 @@ __all__ = ( ) -@extras_features('webhooks', 'export_templates') -class Webhook(ChangeLoggedModel): +class Webhook(ExportTemplatesMixin, WebhooksMixin, ChangeLoggedModel): """ A Webhook defines a request that will be sent to a remote application when an object is created, updated, and/or delete in NetBox. The request will contain a representation of the object, which the remote application can act on. @@ -184,8 +184,7 @@ class Webhook(ChangeLoggedModel): return render_jinja2(self.payload_url, context) -@extras_features('webhooks', 'export_templates') -class CustomLink(ChangeLoggedModel): +class CustomLink(ExportTemplatesMixin, WebhooksMixin, ChangeLoggedModel): """ A custom link to an external representation of a NetBox object. The link text and URL fields accept Jinja2 template code to be rendered with an object as context. @@ -258,8 +257,7 @@ class CustomLink(ChangeLoggedModel): } -@extras_features('webhooks', 'export_templates') -class ExportTemplate(ChangeLoggedModel): +class ExportTemplate(ExportTemplatesMixin, WebhooksMixin, ChangeLoggedModel): content_type = models.ForeignKey( to=ContentType, on_delete=models.CASCADE, @@ -345,8 +343,7 @@ class ExportTemplate(ChangeLoggedModel): return response -@extras_features('webhooks') -class ImageAttachment(ChangeLoggedModel): +class ImageAttachment(WebhooksMixin, ChangeLoggedModel): """ An uploaded image which is associated with an object. """ @@ -424,8 +421,7 @@ class ImageAttachment(ChangeLoggedModel): return super().to_objectchange(action, related_object=self.parent) -@extras_features('webhooks') -class JournalEntry(ChangeLoggedModel): +class JournalEntry(WebhooksMixin, ChangeLoggedModel): """ A historical remark concerning an object; collectively, these form an object's journal. The journal is used to preserve historical context around an object, and complements NetBox's built-in change logging. For example, you @@ -603,8 +599,7 @@ class ConfigRevision(models.Model): # Custom scripts & reports # -@extras_features('job_results') -class Script(models.Model): +class Script(JobResultsMixin, models.Model): """ Dummy model used to generate permissions for custom scripts. Does not exist in the database. """ @@ -616,8 +611,7 @@ class Script(models.Model): # Reports # -@extras_features('job_results') -class Report(models.Model): +class Report(JobResultsMixin, models.Model): """ Dummy model used to generate permissions for reports. Does not exist in the database. """ diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index 2925da6521d..df8446b9c1c 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -3,8 +3,8 @@ from django.urls import reverse from django.utils.text import slugify from taggit.models import TagBase, GenericTaggedItemBase -from extras.utils import extras_features from netbox.models import BigIDModel, ChangeLoggedModel +from netbox.models.features import ExportTemplatesMixin, WebhooksMixin from utilities.choices import ColorChoices from utilities.fields import ColorField @@ -13,8 +13,7 @@ from utilities.fields import ColorField # Tags # -@extras_features('webhooks', 'export_templates') -class Tag(ChangeLoggedModel, TagBase): +class Tag(ExportTemplatesMixin, WebhooksMixin, ChangeLoggedModel, TagBase): color = ColorField( default=ColorChoices.COLOR_GREY ) diff --git a/netbox/extras/utils.py b/netbox/extras/utils.py index 16749ad5da7..487ca3c0b48 100644 --- a/netbox/extras/utils.py +++ b/netbox/extras/utils.py @@ -67,14 +67,3 @@ def register_features(model, features): raise ValueError(f"{feature} is not a valid extras feature!") app_label, model_name = model._meta.label_lower.split('.') registry['model_features'][feature][app_label].append(model_name) - - -def extras_features(*features): - """ - Decorator used to register extras provided features to a model - """ - def wrapper(model_class): - # Initialize the model_features store if not already defined - register_features(model_class, features) - return model_class - return wrapper diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py index 9e721c65f6f..a0e575e4593 100644 --- a/netbox/ipam/models/fhrp.py +++ b/netbox/ipam/models/fhrp.py @@ -4,8 +4,8 @@ from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.urls import reverse -from extras.utils import extras_features from netbox.models import ChangeLoggedModel, PrimaryModel +from netbox.models.features import WebhooksMixin from ipam.choices import * from ipam.constants import * @@ -15,7 +15,6 @@ __all__ = ( ) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class FHRPGroup(PrimaryModel): """ A grouping of next hope resolution protocol (FHRP) peers. (For instance, VRRP or HSRP.) @@ -70,8 +69,7 @@ class FHRPGroup(PrimaryModel): return reverse('ipam:fhrpgroup', args=[self.pk]) -@extras_features('webhooks') -class FHRPGroupAssignment(ChangeLoggedModel): +class FHRPGroupAssignment(WebhooksMixin, ChangeLoggedModel): interface_type = models.ForeignKey( to=ContentType, on_delete=models.CASCADE diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 9d6fb5edc2e..44dd84525fc 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -9,7 +9,6 @@ from django.utils.functional import cached_property from dcim.fields import ASNField from dcim.models import Device -from extras.utils import extras_features from netbox.models import OrganizationalModel, PrimaryModel from ipam.choices import * from ipam.constants import * @@ -54,7 +53,6 @@ class GetAvailablePrefixesMixin: return available_prefixes.iter_cidrs()[0] -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class RIR(OrganizationalModel): """ A Regional Internet Registry (RIR) is responsible for the allocation of a large portion of the global IP address @@ -90,7 +88,6 @@ class RIR(OrganizationalModel): return reverse('ipam:rir', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ASN(PrimaryModel): """ An autonomous system (AS) number is typically used to represent an independent routing domain. A site can have @@ -150,7 +147,6 @@ class ASN(PrimaryModel): return self.asn -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Aggregate(GetAvailablePrefixesMixin, PrimaryModel): """ An aggregate exists at the root level of the IP address space hierarchy in NetBox. Aggregates are used to organize @@ -253,7 +249,6 @@ class Aggregate(GetAvailablePrefixesMixin, PrimaryModel): return min(utilization, 100) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Role(OrganizationalModel): """ A Role represents the functional role of a Prefix or VLAN; for example, "Customer," "Infrastructure," or @@ -285,7 +280,6 @@ class Role(OrganizationalModel): return reverse('ipam:role', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Prefix(GetAvailablePrefixesMixin, PrimaryModel): """ A Prefix represents an IPv4 or IPv6 network, including mask length. Prefixes can optionally be assigned to Sites and @@ -563,7 +557,6 @@ class Prefix(GetAvailablePrefixesMixin, PrimaryModel): return min(utilization, 100) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class IPRange(PrimaryModel): """ A range of IP addresses, defined by start and end addresses. @@ -759,7 +752,6 @@ class IPRange(PrimaryModel): return int(float(child_count) / self.size * 100) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class IPAddress(PrimaryModel): """ An IPAddress represents an individual IPv4 or IPv6 address and its mask. The mask length should match what is diff --git a/netbox/ipam/models/services.py b/netbox/ipam/models/services.py index 43f8353bc63..bd8030a0a3a 100644 --- a/netbox/ipam/models/services.py +++ b/netbox/ipam/models/services.py @@ -4,7 +4,6 @@ from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.urls import reverse -from extras.utils import extras_features from ipam.choices import * from ipam.constants import * from netbox.models import PrimaryModel @@ -47,7 +46,6 @@ class ServiceBase(models.Model): return array_to_string(self.ports) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ServiceTemplate(ServiceBase, PrimaryModel): """ A template for a Service to be applied to a device or virtual machine. @@ -64,7 +62,6 @@ class ServiceTemplate(ServiceBase, PrimaryModel): return reverse('ipam:servicetemplate', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Service(ServiceBase, PrimaryModel): """ A Service represents a layer-four service (e.g. HTTP or SSH) running on a Device or VirtualMachine. A Service may diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 31c8da2b6e8..f73571ea9a2 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -6,7 +6,6 @@ from django.db import models from django.urls import reverse from dcim.models import Interface -from extras.utils import extras_features from ipam.choices import * from ipam.constants import * from ipam.querysets import VLANQuerySet @@ -20,7 +19,6 @@ __all__ = ( ) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class VLANGroup(OrganizationalModel): """ A VLAN group is an arbitrary collection of VLANs within which VLAN IDs and names must be unique. @@ -118,7 +116,6 @@ class VLANGroup(OrganizationalModel): return None -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class VLAN(PrimaryModel): """ A VLAN is a distinct layer two forwarding domain identified by a 12-bit integer (1-4094). Each VLAN must be assigned diff --git a/netbox/ipam/models/vrfs.py b/netbox/ipam/models/vrfs.py index 11fab9c44f1..f1b2d682f06 100644 --- a/netbox/ipam/models/vrfs.py +++ b/netbox/ipam/models/vrfs.py @@ -1,7 +1,6 @@ from django.db import models from django.urls import reverse -from extras.utils import extras_features from ipam.constants import * from netbox.models import PrimaryModel @@ -12,7 +11,6 @@ __all__ = ( ) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class VRF(PrimaryModel): """ A virtual routing and forwarding (VRF) table represents a discrete layer three forwarding domain (e.g. a routing @@ -75,7 +73,6 @@ class VRF(PrimaryModel): return reverse('ipam:vrf', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class RouteTarget(PrimaryModel): """ A BGP extended community used to control the redistribution of routes among VRFs, as defined in RFC 4364. diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index e715cf32973..e38412221fa 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -1,4 +1,3 @@ -from django.contrib.contenttypes.fields import GenericRelation from django.core.validators import ValidationError from django.db import models from mptt.models import MPTTModel, TreeForeignKey @@ -20,6 +19,18 @@ __all__ = ( # Base model classes # +class BaseModel( + CustomFieldsMixin, + CustomLinksMixin, + ExportTemplatesMixin, + JournalingMixin, + TagsMixin, + WebhooksMixin, +): + class Meta: + abstract = True + + class BigIDModel(models.Model): """ Abstract base model for all data objects. Ensures the use of a 64-bit PK. @@ -42,23 +53,17 @@ class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, BigIDModel): abstract = True -class PrimaryModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel): +class PrimaryModel(BaseModel, ChangeLoggingMixin, CustomValidationMixin, BigIDModel): """ Primary models represent real objects within the infrastructure being modeled. """ - journal_entries = GenericRelation( - to='extras.JournalEntry', - object_id_field='assigned_object_id', - content_type_field='assigned_object_type' - ) - objects = RestrictedQuerySet.as_manager() class Meta: abstract = True -class NestedGroupModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel, MPTTModel): +class NestedGroupModel(BaseModel, ChangeLoggingMixin, CustomValidationMixin, BigIDModel, MPTTModel): """ Base model for objects which are used to form a hierarchy (regions, locations, etc.). These models nest recursively using MPTT. Within each parent, each child instance must have a unique name. @@ -100,7 +105,7 @@ class NestedGroupModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMi }) -class OrganizationalModel(ChangeLoggingMixin, CustomFieldsMixin, CustomValidationMixin, TagsMixin, BigIDModel): +class OrganizationalModel(BaseModel, ChangeLoggingMixin, CustomValidationMixin, BigIDModel): """ Organizational models are those which are used solely to categorize and qualify other objects, and do not convey any real information about the infrastructure being modeled (for example, functional device roles). Organizational diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 99f8c00b7d1..ed0e481adfc 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -1,5 +1,6 @@ import logging +from django.contrib.contenttypes.fields import GenericRelation from django.db.models.signals import class_prepared from django.dispatch import receiver @@ -20,6 +21,7 @@ __all__ = ( 'CustomValidationMixin', 'ExportTemplatesMixin', 'JobResultsMixin', + 'JournalingMixin', 'TagsMixin', 'WebhooksMixin', ) @@ -169,6 +171,20 @@ class JobResultsMixin(models.Model): abstract = True +class JournalingMixin(models.Model): + """ + Enables support for JournalEntry assignment. + """ + journal_entries = GenericRelation( + to='extras.JournalEntry', + object_id_field='assigned_object_id', + content_type_field='assigned_object_type' + ) + + class Meta: + abstract = True + + class TagsMixin(models.Model): """ Enable the assignment of Tags to a model. @@ -194,6 +210,7 @@ FEATURES_MAP = ( ('custom_links', CustomLinksMixin), ('export_templates', ExportTemplatesMixin), ('job_results', JobResultsMixin), + ('journaling', JournalingMixin), ('tags', TagsMixin), ('webhooks', WebhooksMixin), ) diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index 42a7ffe7d5a..ecc5990214a 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -4,8 +4,8 @@ from django.db import models from django.urls import reverse from mptt.models import TreeForeignKey -from extras.utils import extras_features from netbox.models import ChangeLoggedModel, NestedGroupModel, OrganizationalModel, PrimaryModel +from netbox.models.features import WebhooksMixin from tenancy.choices import * __all__ = ( @@ -16,7 +16,6 @@ __all__ = ( ) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ContactGroup(NestedGroupModel): """ An arbitrary collection of Contacts. @@ -50,7 +49,6 @@ class ContactGroup(NestedGroupModel): return reverse('tenancy:contactgroup', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ContactRole(OrganizationalModel): """ Functional role for a Contact assigned to an object. @@ -78,7 +76,6 @@ class ContactRole(OrganizationalModel): return reverse('tenancy:contactrole', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Contact(PrimaryModel): """ Contact information for a particular object(s) in NetBox. @@ -129,8 +126,7 @@ class Contact(PrimaryModel): return reverse('tenancy:contact', args=[self.pk]) -@extras_features('webhooks') -class ContactAssignment(ChangeLoggedModel): +class ContactAssignment(WebhooksMixin, ChangeLoggedModel): content_type = models.ForeignKey( to=ContentType, on_delete=models.CASCADE diff --git a/netbox/tenancy/models/tenants.py b/netbox/tenancy/models/tenants.py index d480f911261..9952a700daa 100644 --- a/netbox/tenancy/models/tenants.py +++ b/netbox/tenancy/models/tenants.py @@ -3,7 +3,6 @@ from django.db import models from django.urls import reverse from mptt.models import TreeForeignKey -from extras.utils import extras_features from netbox.models import NestedGroupModel, PrimaryModel __all__ = ( @@ -12,7 +11,6 @@ __all__ = ( ) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class TenantGroup(NestedGroupModel): """ An arbitrary collection of Tenants. @@ -45,7 +43,6 @@ class TenantGroup(NestedGroupModel): return reverse('tenancy:tenantgroup', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Tenant(PrimaryModel): """ A Tenant represents an organization served by the NetBox owner. This is typically a customer or an internal diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index b1971512728..d2f513f0be9 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -7,7 +7,6 @@ from django.urls import reverse from dcim.models import BaseInterface, Device from extras.models import ConfigContextModel from extras.querysets import ConfigContextModelQuerySet -from extras.utils import extras_features from netbox.config import get_config from netbox.models import OrganizationalModel, PrimaryModel from utilities.fields import NaturalOrderingField @@ -15,7 +14,6 @@ from utilities.ordering import naturalize_interface from utilities.query_functions import CollateAsChar from .choices import * - __all__ = ( 'Cluster', 'ClusterGroup', @@ -29,7 +27,6 @@ __all__ = ( # Cluster types # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ClusterType(OrganizationalModel): """ A type of Cluster. @@ -61,7 +58,6 @@ class ClusterType(OrganizationalModel): # Cluster groups # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ClusterGroup(OrganizationalModel): """ An organizational group of Clusters. @@ -104,7 +100,6 @@ class ClusterGroup(OrganizationalModel): # Clusters # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class Cluster(PrimaryModel): """ A cluster of VirtualMachines. Each Cluster may optionally be associated with one or more Devices. @@ -188,7 +183,6 @@ class Cluster(PrimaryModel): # Virtual machines # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class VirtualMachine(PrimaryModel, ConfigContextModel): """ A virtual machine which runs inside a Cluster. @@ -351,7 +345,6 @@ class VirtualMachine(PrimaryModel, ConfigContextModel): # Interfaces # -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class VMInterface(PrimaryModel, BaseInterface): virtual_machine = models.ForeignKey( to='virtualization.VirtualMachine', diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index 2fcfc97aade..843462ec652 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -5,7 +5,6 @@ from mptt.models import MPTTModel, TreeForeignKey from dcim.choices import LinkStatusChoices from dcim.constants import WIRELESS_IFACE_TYPES -from extras.utils import extras_features from netbox.models import BigIDModel, NestedGroupModel, PrimaryModel from .choices import * from .constants import * @@ -41,7 +40,6 @@ class WirelessAuthenticationBase(models.Model): abstract = True -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class WirelessLANGroup(NestedGroupModel): """ A nested grouping of WirelessLANs @@ -81,7 +79,6 @@ class WirelessLANGroup(NestedGroupModel): return reverse('wireless:wirelesslangroup', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class WirelessLAN(WirelessAuthenticationBase, PrimaryModel): """ A wireless network formed among an arbitrary number of access point and clients. @@ -120,7 +117,6 @@ class WirelessLAN(WirelessAuthenticationBase, PrimaryModel): return reverse('wireless:wirelesslan', args=[self.pk]) -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class WirelessLink(WirelessAuthenticationBase, PrimaryModel): """ A point-to-point connection between two wireless Interfaces. From 047bed2a865bcc69f0702ad9b06f664ab9ccc3c5 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 19 Jan 2022 15:22:28 -0500 Subject: [PATCH 098/271] Tweak registry initialization --- netbox/extras/registry.py | 13 +++++++++++-- netbox/extras/utils.py | 8 +------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/netbox/extras/registry.py b/netbox/extras/registry.py index cb58f5135a9..07fd4cc2426 100644 --- a/netbox/extras/registry.py +++ b/netbox/extras/registry.py @@ -1,3 +1,8 @@ +import collections + +from extras.constants import EXTRAS_FEATURES + + class Registry(dict): """ Central registry for registration of functionality. Once a store (key) is defined, it cannot be overwritten or @@ -7,15 +12,19 @@ class Registry(dict): try: return super().__getitem__(key) except KeyError: - raise KeyError("Invalid store: {}".format(key)) + raise KeyError(f"Invalid store: {key}") def __setitem__(self, key, value): if key in self: - raise KeyError("Store already set: {}".format(key)) + raise KeyError(f"Store already set: {key}") super().__setitem__(key, value) def __delitem__(self, key): raise TypeError("Cannot delete stores from registry") +# Initialize the global registry registry = Registry() +registry['model_features'] = { + feature: collections.defaultdict(set) for feature in EXTRAS_FEATURES +} diff --git a/netbox/extras/utils.py b/netbox/extras/utils.py index 487ca3c0b48..e1680782163 100644 --- a/netbox/extras/utils.py +++ b/netbox/extras/utils.py @@ -1,5 +1,3 @@ -import collections - from django.db.models import Q from django.utils.deconstruct import deconstructible from taggit.managers import _TaggableManager @@ -58,12 +56,8 @@ class FeatureQuery: def register_features(model, features): - if 'model_features' not in registry: - registry['model_features'] = { - f: collections.defaultdict(list) for f in EXTRAS_FEATURES - } for feature in features: if feature not in EXTRAS_FEATURES: raise ValueError(f"{feature} is not a valid extras feature!") app_label, model_name = model._meta.label_lower.split('.') - registry['model_features'][feature][app_label].append(model_name) + registry['model_features'][feature][app_label].add(model_name) From dd552264559c968c94a725c9558a4fd01cd039c4 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 19 Jan 2022 16:44:18 -0500 Subject: [PATCH 099/271] Draft documentation for model features --- docs/plugins/development/index.md | 3 ++ docs/plugins/development/model-features.md | 37 ++++++++++++++++++++++ mkdocs.yml | 18 ++++++++++- netbox/netbox/models/features.py | 24 +++++++++++--- 4 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 docs/plugins/development/index.md create mode 100644 docs/plugins/development/model-features.md diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md new file mode 100644 index 00000000000..31ce5fc2e97 --- /dev/null +++ b/docs/plugins/development/index.md @@ -0,0 +1,3 @@ +# Plugins Development + +TODO diff --git a/docs/plugins/development/model-features.md b/docs/plugins/development/model-features.md new file mode 100644 index 00000000000..83f9b420502 --- /dev/null +++ b/docs/plugins/development/model-features.md @@ -0,0 +1,37 @@ +# Model Features + +Plugin models can leverage certain NetBox features by inheriting from designated Python classes (documented below), defined in `netbox.models.features`. These classes perform two crucial functions: + +1. Apply any fields, methods, or attributes necessary to the operation of the feature +2. Register the model with NetBox as utilizing the feature + +For example, to enable support for tags in a plugin model, it should inherit from `TagsMixin`: + +```python +# models.py +from django.db.models import models +from netbox.models.features import TagsMixin + +class MyModel(TagsMixin, models.Model): + foo = models.CharField() + ... +``` + +This will ensure that TaggableManager is applied to the model, and that the model is registered with NetBox as taggable. + +!!! note + Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `features` module, they are not yet supported for use by plugins. + +::: netbox.models.features.CustomLinksMixin + +::: netbox.models.features.CustomFieldsMixin + +::: netbox.models.features.ExportTemplatesMixin + +::: netbox.models.features.JobResultsMixin + +::: netbox.models.features.JournalingMixin + +::: netbox.models.features.TagsMixin + +::: netbox.models.features.WebhooksMixin diff --git a/mkdocs.yml b/mkdocs.yml index f89bdaea7a3..764a04c86c9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,6 +16,19 @@ theme: toggle: icon: material/lightbulb name: Switch to Light Mode +plugins: + - mkdocstrings: + handlers: + python: + setup_commands: + - import os + - import django + - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "netbox.settings") + - django.setup() + rendering: + show_root_heading: true + show_root_full_path: false + show_root_toc_entry: false extra: social: - icon: fontawesome/brands/github @@ -84,7 +97,10 @@ nav: - Webhooks: 'additional-features/webhooks.md' - Plugins: - Using Plugins: 'plugins/index.md' - - Developing Plugins: 'plugins/development.md' + - Developing Plugins: + - Introduction: 'plugins/development/index.md' + - Model Features: 'plugins/development/model-features.md' + - Developing Plugins (Old): 'plugins/development.md' - Administration: - Authentication: 'administration/authentication.md' - Permissions: 'administration/permissions.md' diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index ed0e481adfc..7865e3c8a8a 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -93,13 +93,25 @@ class CustomFieldsMixin(models.Model): @property def cf(self): """ - Convenience wrapper for custom field data. + A pass-through convenience alias for accessing `custom_field_data` (read-only). + + ```python + >>> tenant = Tenant.objects.first() + >>> tenant.cf + {'cust_id': 'CYB01'} + ``` """ return self.custom_field_data def get_custom_fields(self): """ - Return a dictionary of custom fields for a single object in the form {: value}. + Return a dictionary of custom fields for a single object in the form `{field: value}`. + + ```python + >>> tenant = Tenant.objects.first() + >>> tenant.get_custom_fields() + {: 'CYB01'} + ``` """ from extras.models import CustomField @@ -165,7 +177,7 @@ class ExportTemplatesMixin(models.Model): class JobResultsMixin(models.Model): """ - Enable the assignment of JobResults to a model. + Enables support for job results. """ class Meta: abstract = True @@ -173,7 +185,8 @@ class JobResultsMixin(models.Model): class JournalingMixin(models.Model): """ - Enables support for JournalEntry assignment. + Enables support for object journaling. Adds a generic relation (`journal_entries`) + to NetBox's JournalEntry model. """ journal_entries = GenericRelation( to='extras.JournalEntry', @@ -187,7 +200,8 @@ class JournalingMixin(models.Model): class TagsMixin(models.Model): """ - Enable the assignment of Tags to a model. + Enables support for tag assignment. Assigned tags can be managed via the `tags` attribute, + which is a `TaggableManager` instance. """ tags = TaggableManager( through='extras.TaggedItem' From d104544d6f26f54d8982b385b7bf6aa31f86255d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 19 Jan 2022 16:52:00 -0500 Subject: [PATCH 100/271] Add mkdocstrings --- docs/requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index c8726f8e67c..b2e4e9a1b0a 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -5,3 +5,7 @@ markdown-include # MkDocs Material theme (for documentation build) # https://github.com/squidfunk/mkdocs-material mkdocs-material + +# Introspection for embedded code +# https://github.com/mkdocstrings/mkdocstrings +mkdocstrings From 196784474def8604dda5a74a13a9be29d2708dd9 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 19 Jan 2022 16:58:06 -0500 Subject: [PATCH 101/271] Update documentation requirements --- base_requirements.txt | 4 ++++ docs/requirements.txt | 11 ----------- requirements.txt | 1 + 3 files changed, 5 insertions(+), 11 deletions(-) delete mode 100644 docs/requirements.txt diff --git a/base_requirements.txt b/base_requirements.txt index aaa9c7f441e..7ceb344b00a 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -82,6 +82,10 @@ markdown-include # https://github.com/squidfunk/mkdocs-material mkdocs-material +# Introspection for embedded code +# https://github.com/mkdocstrings/mkdocstrings +mkdocstrings + # Library for manipulating IP prefixes and addresses # https://github.com/drkjam/netaddr netaddr diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index b2e4e9a1b0a..00000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,11 +0,0 @@ -# File inclusion plugin for Python-Markdown -# https://github.com/cmacmackin/markdown-include -markdown-include - -# MkDocs Material theme (for documentation build) -# https://github.com/squidfunk/mkdocs-material -mkdocs-material - -# Introspection for embedded code -# https://github.com/mkdocstrings/mkdocstrings -mkdocstrings diff --git a/requirements.txt b/requirements.txt index 83c1b9f2e18..a23be86379e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,6 +19,7 @@ Jinja2==3.0.3 Markdown==3.3.6 markdown-include==0.6.0 mkdocs-material==8.1.7 +mkdocstrings==0.17.0 netaddr==0.8.0 Pillow==8.4.0 psycopg2-binary==2.9.3 From b7682ca9e829102b636864b23eaff15eb4562544 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 20 Jan 2022 09:27:37 -0500 Subject: [PATCH 102/271] Fix documentation build --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 764a04c86c9..4fdf22f9723 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,6 +23,7 @@ plugins: setup_commands: - import os - import django + - os.chdir('netbox/') - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "netbox.settings") - django.setup() rendering: From 1a8f144f5c2ca9d307f8ab7829f595a539206e81 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 20 Jan 2022 10:53:00 -0500 Subject: [PATCH 103/271] Include custom validation in BaseModel --- docs/plugins/development/model-features.md | 46 ++++++++++++++++++---- mkdocs.yml | 1 + netbox/netbox/models/__init__.py | 7 ++-- netbox/netbox/models/features.py | 2 +- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/docs/plugins/development/model-features.md b/docs/plugins/development/model-features.md index 83f9b420502..7b70709d1d8 100644 --- a/docs/plugins/development/model-features.md +++ b/docs/plugins/development/model-features.md @@ -1,23 +1,51 @@ # Model Features -Plugin models can leverage certain NetBox features by inheriting from designated Python classes (documented below), defined in `netbox.models.features`. These classes perform two crucial functions: +## Enabling NetBox Features -1. Apply any fields, methods, or attributes necessary to the operation of the feature -2. Register the model with NetBox as utilizing the feature +Plugin models can leverage certain NetBox features by inheriting from NetBox's `BaseModel` class. This class extends the plugin model to enable numerous feature, including: -For example, to enable support for tags in a plugin model, it should inherit from `TagsMixin`: +* Custom fields +* Custom links +* Custom validation +* Export templates +* Job results +* Journaling +* Tags +* Webhooks + +This class performs two crucial functions: + +1. Apply any fields, methods, or attributes necessary to the operation of these features +2. Register the model with NetBox as utilizing these feature + +Simply subclass BaseModel when defining a model in your plugin: ```python # models.py -from django.db.models import models -from netbox.models.features import TagsMixin +from netbox.models import BaseModel -class MyModel(TagsMixin, models.Model): +class MyModel(BaseModel): foo = models.CharField() ... ``` -This will ensure that TaggableManager is applied to the model, and that the model is registered with NetBox as taggable. +## Enabling Features Individually + +If you prefer instead to enable only a subset of these features for a plugin model, NetBox provides a discrete "mix-in" class for each feature. You can subclass each of these individually when defining your model. (You will also need to inherit from Django's built-in `Model` class.) + +```python +# models.py +from django.db.models import models +from netbox.models.features import ExportTemplatesMixin, TagsMixin + +class MyModel(ExportTemplatesMixin, TagsMixin, models.Model): + foo = models.CharField() + ... +``` + +The example above will enable export templates and tags, but no other NetBox features. A complete list of available feature mixins is included below. (Inheriting all the available mixins is essentially the same as subclassing `BaseModel`.) + +## Feature Mixins Reference !!! note Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `features` module, they are not yet supported for use by plugins. @@ -26,6 +54,8 @@ This will ensure that TaggableManager is applied to the model, and that the mode ::: netbox.models.features.CustomFieldsMixin +::: netbox.models.features.CustomValidationMixin + ::: netbox.models.features.ExportTemplatesMixin ::: netbox.models.features.JobResultsMixin diff --git a/mkdocs.yml b/mkdocs.yml index 4fdf22f9723..585e6d76f64 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -27,6 +27,7 @@ plugins: - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "netbox.settings") - django.setup() rendering: + heading_level: 3 show_root_heading: true show_root_full_path: false show_root_toc_entry: false diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index e38412221fa..2db2e260240 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -22,6 +22,7 @@ __all__ = ( class BaseModel( CustomFieldsMixin, CustomLinksMixin, + CustomValidationMixin, ExportTemplatesMixin, JournalingMixin, TagsMixin, @@ -53,7 +54,7 @@ class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, BigIDModel): abstract = True -class PrimaryModel(BaseModel, ChangeLoggingMixin, CustomValidationMixin, BigIDModel): +class PrimaryModel(BaseModel, ChangeLoggingMixin, BigIDModel): """ Primary models represent real objects within the infrastructure being modeled. """ @@ -63,7 +64,7 @@ class PrimaryModel(BaseModel, ChangeLoggingMixin, CustomValidationMixin, BigIDMo abstract = True -class NestedGroupModel(BaseModel, ChangeLoggingMixin, CustomValidationMixin, BigIDModel, MPTTModel): +class NestedGroupModel(BaseModel, ChangeLoggingMixin, BigIDModel, MPTTModel): """ Base model for objects which are used to form a hierarchy (regions, locations, etc.). These models nest recursively using MPTT. Within each parent, each child instance must have a unique name. @@ -105,7 +106,7 @@ class NestedGroupModel(BaseModel, ChangeLoggingMixin, CustomValidationMixin, Big }) -class OrganizationalModel(BaseModel, ChangeLoggingMixin, CustomValidationMixin, BigIDModel): +class OrganizationalModel(BaseModel, ChangeLoggingMixin, BigIDModel): """ Organizational models are those which are used solely to categorize and qualify other objects, and do not convey any real information about the infrastructure being modeled (for example, functional device roles). Organizational diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 7865e3c8a8a..ce398045907 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -155,7 +155,7 @@ class CustomLinksMixin(models.Model): class CustomValidationMixin(models.Model): """ - Enables user-configured validation rules for built-in models by extending the clean() method. + Enables user-configured validation rules for models. """ class Meta: abstract = True From e6acae5f94485a2eb459e17a0ed008f76fcc7226 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 20 Jan 2022 11:41:00 -0500 Subject: [PATCH 104/271] Omit job results as a supported feature --- docs/plugins/development/model-features.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/plugins/development/model-features.md b/docs/plugins/development/model-features.md index 7b70709d1d8..35eb9389f21 100644 --- a/docs/plugins/development/model-features.md +++ b/docs/plugins/development/model-features.md @@ -8,7 +8,6 @@ Plugin models can leverage certain NetBox features by inheriting from NetBox's ` * Custom links * Custom validation * Export templates -* Job results * Journaling * Tags * Webhooks @@ -58,8 +57,6 @@ The example above will enable export templates and tags, but no other NetBox fea ::: netbox.models.features.ExportTemplatesMixin -::: netbox.models.features.JobResultsMixin - ::: netbox.models.features.JournalingMixin ::: netbox.models.features.TagsMixin From 5f8870d448e26e46eed31c09c1546550b43e4765 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 20 Jan 2022 13:58:11 -0600 Subject: [PATCH 105/271] #7853 - Change Duplex Filterset to allow multivalues --- netbox/dcim/filtersets.py | 4 +++- netbox/dcim/forms/filtersets.py | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 8a83a8a6b93..4dfb080bc03 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1197,7 +1197,9 @@ class InterfaceFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableT label='LAG interface (ID)', ) speed = MultiValueNumberFilter() - duplex = django_filters.CharFilter() + duplex = django_filters.MultipleChoiceFilter( + choices=InterfaceDuplexChoices + ) mac_address = MultiValueMACAddressFilter() wwn = MultiValueWWNFilter() tag = TagFilter() diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index ab7b9785a39..8868cdf787d 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -947,10 +947,11 @@ class InterfaceFilterForm(DeviceComponentFilterForm): label='Select Speed', widget=SelectSpeedWidget(attrs={'readonly': None}) ) - duplex = forms.ChoiceField( + duplex = forms.MultipleChoiceField( choices=InterfaceDuplexChoices, required=False, - label='Select Duplex' + label='Select Duplex', + widget=StaticSelectMultiple() ) enabled = forms.NullBooleanField( required=False, From 1a807416b849819758f59b3aafcacc9aad6488b8 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 20 Jan 2022 13:58:37 -0600 Subject: [PATCH 106/271] #7853 - Add columns to tables --- netbox/dcim/tables/devices.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index f5ca4918772..7b00a16e928 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -524,10 +524,10 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi model = Interface fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', - 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', - 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', - 'link_peer', 'connection', 'tags', 'vrf', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', - 'created', 'last_updated', + 'speed', 'duplex', 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', + 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', + 'wireless_lans', 'link_peer', 'connection', 'tags', 'vrf', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', + 'tagged_vlans', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description') From d0bfd7e19acead30eb943bd2e5089ac19cd67d63 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 20 Jan 2022 14:13:13 -0600 Subject: [PATCH 107/271] #7853 - Add tests --- netbox/dcim/tests/test_api.py | 4 ++++ netbox/dcim/tests/test_filtersets.py | 16 ++++++++++++---- netbox/dcim/tests/test_views.py | 6 ++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 1c6f536939a..4ab682d747b 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1442,6 +1442,8 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase 'tagged_vlans': [vlans[0].pk, vlans[1].pk], 'untagged_vlan': vlans[2].pk, 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], + 'speed': 1000000, + 'duplex': 'full' }, { 'device': device.pk, @@ -1454,6 +1456,8 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase 'tagged_vlans': [vlans[0].pk, vlans[1].pk], 'untagged_vlan': vlans[2].pk, 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], + 'speed': 100000, + 'duplex': 'half' }, { 'device': device.pk, diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 7b2e350091c..de4806498b4 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -2383,10 +2383,10 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=virtual_chassis, vc_position=2, vc_priority=2) interfaces = ( - Interface(device=devices[0], name='Interface 1', label='A', type=InterfaceTypeChoices.TYPE_1GE_SFP, enabled=True, mgmt_only=True, mtu=100, mode=InterfaceModeChoices.MODE_ACCESS, mac_address='00-00-00-00-00-01', description='First', vrf=vrfs[0]), - Interface(device=devices[1], name='Interface 2', label='B', type=InterfaceTypeChoices.TYPE_1GE_GBIC, enabled=True, mgmt_only=True, mtu=200, mode=InterfaceModeChoices.MODE_TAGGED, mac_address='00-00-00-00-00-02', description='Second', vrf=vrfs[1]), - Interface(device=devices[2], name='Interface 3', label='C', type=InterfaceTypeChoices.TYPE_1GE_FIXED, enabled=False, mgmt_only=False, mtu=300, mode=InterfaceModeChoices.MODE_TAGGED_ALL, mac_address='00-00-00-00-00-03', description='Third', vrf=vrfs[2]), - Interface(device=devices[3], name='Interface 4', label='D', type=InterfaceTypeChoices.TYPE_OTHER, enabled=True, mgmt_only=True, tx_power=40), + Interface(device=devices[0], name='Interface 1', label='A', type=InterfaceTypeChoices.TYPE_1GE_SFP, enabled=True, mgmt_only=True, mtu=100, mode=InterfaceModeChoices.MODE_ACCESS, mac_address='00-00-00-00-00-01', description='First', vrf=vrfs[0], speed=1000000, duplex='half'), + Interface(device=devices[1], name='Interface 2', label='B', type=InterfaceTypeChoices.TYPE_1GE_GBIC, enabled=True, mgmt_only=True, mtu=200, mode=InterfaceModeChoices.MODE_TAGGED, mac_address='00-00-00-00-00-02', description='Second', vrf=vrfs[1], speed=1000000, duplex='full'), + Interface(device=devices[2], name='Interface 3', label='C', type=InterfaceTypeChoices.TYPE_1GE_FIXED, enabled=False, mgmt_only=False, mtu=300, mode=InterfaceModeChoices.MODE_TAGGED_ALL, mac_address='00-00-00-00-00-03', description='Third', vrf=vrfs[2], speed=100000, duplex='half'), + Interface(device=devices[3], name='Interface 4', label='D', type=InterfaceTypeChoices.TYPE_OTHER, enabled=True, mgmt_only=True, tx_power=40, speed=100000, duplex='full'), Interface(device=devices[3], name='Interface 5', label='E', type=InterfaceTypeChoices.TYPE_OTHER, enabled=True, mgmt_only=True, tx_power=40), Interface(device=devices[3], name='Interface 6', label='F', type=InterfaceTypeChoices.TYPE_OTHER, enabled=False, mgmt_only=False, tx_power=40), Interface(device=devices[3], name='Interface 7', type=InterfaceTypeChoices.TYPE_80211AC, rf_role=WirelessRoleChoices.ROLE_AP, rf_channel=WirelessChannelChoices.CHANNEL_24G_1, rf_channel_frequency=2412, rf_channel_width=22), @@ -2423,6 +2423,14 @@ class InterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'mtu': [100, 200]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_speed(self): + params = {'speed': [1000000, 100000]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_duplex(self): + params = {'duplex': ['half', 'full']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + def test_mgmt_only(self): params = {'mgmt_only': 'true'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 1b39285d4cd..4afa8a9f4f2 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -2124,6 +2124,8 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'mac_address': EUI('01:02:03:04:05:06'), 'wwn': EUI('01:02:03:04:05:06:07:08', version=64), 'mtu': 65000, + 'speed': 1000000, + 'duplex': 'full', 'mgmt_only': True, 'description': 'A front port', 'mode': InterfaceModeChoices.MODE_TAGGED, @@ -2145,6 +2147,8 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'mac_address': EUI('01:02:03:04:05:06'), 'wwn': EUI('01:02:03:04:05:06:07:08', version=64), 'mtu': 2000, + 'speed': 100000, + 'duplex': 'half', 'mgmt_only': True, 'description': 'A front port', 'mode': InterfaceModeChoices.MODE_TAGGED, @@ -2162,6 +2166,8 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'mac_address': EUI('01:02:03:04:05:06'), 'wwn': EUI('01:02:03:04:05:06:07:08', version=64), 'mtu': 2000, + 'speed': 1000000, + 'duplex': 'full', 'mgmt_only': True, 'description': 'New description', 'mode': InterfaceModeChoices.MODE_TAGGED, From 54834c47f8870e7faabcd847c3270da0bd3d2884 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 20 Jan 2022 16:31:55 -0500 Subject: [PATCH 108/271] Refactor generic views; add plugins dev documentation --- docs/plugins/development/generic-views.md | 91 +++++++ mkdocs.yml | 1 + netbox/netbox/views/generic/base.py | 15 ++ netbox/netbox/views/generic/bulk_views.py | 225 +++++++++++++--- netbox/netbox/views/generic/object_views.py | 282 +++++--------------- 5 files changed, 360 insertions(+), 254 deletions(-) create mode 100644 docs/plugins/development/generic-views.md create mode 100644 netbox/netbox/views/generic/base.py diff --git a/docs/plugins/development/generic-views.md b/docs/plugins/development/generic-views.md new file mode 100644 index 00000000000..ced7e380779 --- /dev/null +++ b/docs/plugins/development/generic-views.md @@ -0,0 +1,91 @@ +# Generic Views + +NetBox provides several generic view classes to facilitate common operations, such as creating, viewing, modifying, and deleting objects. Plugins can subclass these views for their own use. + +| View Class | Description | +|------------|-------------| +| `ObjectView` | View a single object | +| `ObjectEditView` | Create or edit a single object | +| `ObjectDeleteView` | Delete a single object | +| `ObjectListView` | View a list of objects | +| `BulkImportView` | Import a set of new objects | +| `BulkEditView` | Edit multiple objects | +| `BulkDeleteView` | Delete multiple objects | + +### Example Usage + +```python +# views.py +from netbox.views.generic import ObjectEditView +from .models import Thing + +class ThingEditView(ObjectEditView): + queryset = Thing.objects.all() + template_name = 'myplugin/thing.html' + ... +``` + +## Generic Views Reference + +Below is the class definition for NetBox's base GenericView. The attributes and methods defined here are available on all generic views. + +::: netbox.views.generic.base.GenericView + rendering: + show_source: false + +!!! note + Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `views.generic` module, they are not yet supported for use by plugins. + +::: netbox.views.generic.ObjectView + selection: + members: + - get_object + - get_template_name + - get_extra_context + rendering: + show_source: false + +::: netbox.views.generic.ObjectEditView + selection: + members: + - get_object + - alter_object + rendering: + show_source: false + +::: netbox.views.generic.ObjectDeleteView + selection: + members: + - get_object + rendering: + show_source: false + +::: netbox.views.generic.ObjectListView + selection: + members: + - get_table + - get_extra_context + - export_yaml + - export_table + - export_template + rendering: + show_source: false + +::: netbox.views.generic.BulkImportView + selection: + members: false + rendering: + show_source: false + +::: netbox.views.generic.BulkEditView + selection: + members: false + rendering: + show_source: false + +::: netbox.views.generic.BulkDeleteView + selection: + members: + - get_form + rendering: + show_source: false diff --git a/mkdocs.yml b/mkdocs.yml index 585e6d76f64..c36d3f467c7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -102,6 +102,7 @@ nav: - Developing Plugins: - Introduction: 'plugins/development/index.md' - Model Features: 'plugins/development/model-features.md' + - Generic Views: 'plugins/development/generic-views.md' - Developing Plugins (Old): 'plugins/development.md' - Administration: - Authentication: 'administration/authentication.md' diff --git a/netbox/netbox/views/generic/base.py b/netbox/netbox/views/generic/base.py new file mode 100644 index 00000000000..3861a93aa17 --- /dev/null +++ b/netbox/netbox/views/generic/base.py @@ -0,0 +1,15 @@ +from django.views.generic import View + +from utilities.views import ObjectPermissionRequiredMixin + + +class GenericView(ObjectPermissionRequiredMixin, View): + """ + Base view class for reusable generic views. + + Attributes: + queryset: Django QuerySet from which the object(s) will be fetched + template_name: The name of the HTML template file to render + """ + queryset = None + template_name = None diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index e9b213a9596..c1ae2038eba 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -3,21 +3,27 @@ import re from copy import deepcopy from django.contrib import messages +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldDoesNotExist, ValidationError from django.db import transaction, IntegrityError from django.db.models import ManyToManyField, ProtectedError from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput, Textarea -from django.shortcuts import redirect, render -from django.views.generic import View +from django.http import HttpResponse +from django.shortcuts import get_object_or_404, redirect, render +from django_tables2.export import TableExport +from extras.models import ExportTemplate from extras.signals import clear_webhooks from utilities.error_handlers import handle_protectederror from utilities.exceptions import PermissionsViolation from utilities.forms import ( BootstrapMixin, BulkRenameForm, ConfirmationForm, CSVDataField, CSVFileField, restrict_form_fields, ) +from utilities.htmx import is_htmx from utilities.permissions import get_permission_for_model -from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin +from utilities.tables import configure_table +from utilities.views import GetReturnURLMixin +from .base import GenericView __all__ = ( 'BulkComponentCreateView', @@ -26,24 +32,181 @@ __all__ = ( 'BulkEditView', 'BulkImportView', 'BulkRenameView', + 'ObjectListView', ) -class BulkCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class ObjectListView(GenericView): + """ + Display multiple objects, all of the same type, as a table. + + Attributes: + filterset: A django-filter FilterSet that is applied to the queryset + filterset_form: The form class used to render filter options + table: The django-tables2 Table used to render the objects list + action_buttons: A list of buttons to include at the top of the page + """ + template_name = 'generic/object_list.html' + filterset = None + filterset_form = None + table = None + action_buttons = ('add', 'import', 'export') + + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'view') + + def get_table(self, request, permissions): + """ + Return the django-tables2 Table instance to be used for rendering the objects list. + + Args: + request: The current request + permissions: A dictionary mapping of the view, add, change, and delete permissions to booleans indicating + whether the user has each + """ + table = self.table(self.queryset, user=request.user) + if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']): + table.columns.show('pk') + + return table + + def get_extra_context(self, request): + """ + Return any additional context data for the template. + + Agrs: + request: The current request + """ + return {} + + def get(self, request): + """ + GET request handler. + + Args: + request: The current request + """ + model = self.queryset.model + content_type = ContentType.objects.get_for_model(model) + + if self.filterset: + self.queryset = self.filterset(request.GET, self.queryset).qs + + # Compile a dictionary indicating which permissions are available to the current user for this model + permissions = {} + for action in ('add', 'change', 'delete', 'view'): + perm_name = get_permission_for_model(model, action) + permissions[action] = request.user.has_perm(perm_name) + + if 'export' in request.GET: + + # Export the current table view + if request.GET['export'] == 'table': + table = self.get_table(request, permissions) + columns = [name for name, _ in table.selected_columns] + return self.export_table(table, columns) + + # Render an ExportTemplate + elif request.GET['export']: + template = get_object_or_404(ExportTemplate, content_type=content_type, name=request.GET['export']) + return self.export_template(template, request) + + # Check for YAML export support on the model + elif hasattr(model, 'to_yaml'): + response = HttpResponse(self.export_yaml(), content_type='text/yaml') + filename = 'netbox_{}.yaml'.format(self.queryset.model._meta.verbose_name_plural) + response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename) + return response + + # Fall back to default table/YAML export + else: + table = self.get_table(request, permissions) + return self.export_table(table) + + # Render the objects table + table = self.get_table(request, permissions) + configure_table(table, request) + + # If this is an HTMX request, return only the rendered table HTML + if is_htmx(request): + return render(request, 'htmx/table.html', { + 'table': table, + }) + + context = { + 'content_type': content_type, + 'table': table, + 'permissions': permissions, + 'action_buttons': self.action_buttons, + 'filter_form': self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None, + } + context.update(self.get_extra_context(request)) + + return render(request, self.template_name, context) + + # + # Export methods + # + + def export_yaml(self): + """ + Export the queryset of objects as concatenated YAML documents. + """ + yaml_data = [obj.to_yaml() for obj in self.queryset] + + return '---\n'.join(yaml_data) + + def export_table(self, table, columns=None, filename=None): + """ + Export all table data in CSV format. + + Args: + table: The Table instance to export + columns: A list of specific columns to include. If None, all columns will be exported. + filename: The name of the file attachment sent to the client. If None, will be determined automatically + from the queryset model name. + """ + exclude_columns = {'pk', 'actions'} + if columns: + all_columns = [col_name for col_name, _ in table.selected_columns + table.available_columns] + exclude_columns.update({ + col for col in all_columns if col not in columns + }) + exporter = TableExport( + export_format=TableExport.CSV, + table=table, + exclude_columns=exclude_columns + ) + return exporter.response( + filename=filename or f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv' + ) + + def export_template(self, template, request): + """ + Render an ExportTemplate using the current queryset. + + Args: + template: ExportTemplate instance + request: The current request + """ + try: + return template.render_to_response(self.queryset) + except Exception as e: + messages.error(request, f"There was an error rendering the selected export template ({template.name}): {e}") + return redirect(request.path) + + +class BulkCreateView(GetReturnURLMixin, GenericView): """ Create new objects in bulk. - queryset: Base queryset for the objects being created form: Form class which provides the `pattern` field model_form: The ModelForm used to create individual objects pattern_target: Name of the field to be evaluated as a pattern (if any) - template_name: The name of the template """ - queryset = None form = None model_form = None pattern_target = '' - template_name = None def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') @@ -135,20 +298,18 @@ class BulkCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) -class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class BulkImportView(GetReturnURLMixin, GenericView): """ Import objects in bulk (CSV format). - queryset: Base queryset for the model - model_form: The form used to create each imported object - table: The django-tables2 Table used to render the list of imported objects - template_name: The name of the template - widget_attrs: A dict of attributes to apply to the import widget (e.g. to require a session key) + Attributes: + model_form: The form used to create each imported object + table: The django-tables2 Table used to render the list of imported objects + widget_attrs: A dict of attributes to apply to the import widget (e.g. to require a session key) """ - queryset = None + template_name = 'generic/object_bulk_import.html' model_form = None table = None - template_name = 'generic/object_bulk_import.html' widget_attrs = {} def _import_form(self, *args, **kwargs): @@ -265,21 +426,19 @@ class BulkImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) -class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class BulkEditView(GetReturnURLMixin, GenericView): """ Edit objects in bulk. - queryset: Custom queryset to use when retrieving objects (e.g. to select related objects) - filterset: FilterSet to apply when deleting by QuerySet - table: The table used to display devices being edited - form: The form class used to edit objects in bulk - template_name: The name of the template + Attributes: + filterset: FilterSet to apply when deleting by QuerySet + table: The table used to display devices being edited + form: The form class used to edit objects in bulk """ - queryset = None + template_name = 'generic/object_bulk_edit.html' filterset = None table = None form = None - template_name = 'generic/object_bulk_edit.html' def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'change') @@ -422,14 +581,10 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) -class BulkRenameView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class BulkRenameView(GetReturnURLMixin, GenericView): """ An extendable view for renaming objects in bulk. - - queryset: QuerySet of objects being renamed - template_name: The name of the template """ - queryset = None template_name = 'generic/object_bulk_rename.html' def __init__(self, *args, **kwargs): @@ -513,21 +668,18 @@ class BulkRenameView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) -class BulkDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class BulkDeleteView(GetReturnURLMixin, GenericView): """ Delete objects in bulk. - queryset: Custom queryset to use when retrieving objects (e.g. to select related objects) filterset: FilterSet to apply when deleting by QuerySet table: The table used to display devices being deleted form: The form class used to delete objects in bulk - template_name: The name of the template """ - queryset = None + template_name = 'generic/object_bulk_delete.html' filterset = None table = None form = None - template_name = 'generic/object_bulk_delete.html' def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'delete') @@ -613,18 +765,17 @@ class BulkDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): # Device/VirtualMachine components # -class BulkComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class BulkComponentCreateView(GetReturnURLMixin, GenericView): """ Add one or more components (e.g. interfaces, console ports, etc.) to a set of Devices or VirtualMachines. """ + template_name = 'generic/object_bulk_add_component.html' parent_model = None parent_field = None form = None - queryset = None model_form = None filterset = None table = None - template_name = 'generic/object_bulk_add_component.html' def get_required_permission(self): return f'dcim.add_{self.queryset.model._meta.model_name}' diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index b6df5e3c2d8..79732572dc1 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -2,21 +2,16 @@ import logging from copy import deepcopy from django.contrib import messages -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.db import transaction from django.db.models import ProtectedError from django.forms.widgets import HiddenInput -from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.html import escape from django.utils.http import is_safe_url from django.utils.safestring import mark_safe -from django.views.generic import View -from django_tables2.export import TableExport -from extras.models import ExportTemplate from extras.signals import clear_webhooks from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortTransaction, PermissionsViolation @@ -25,7 +20,8 @@ from utilities.htmx import is_htmx from utilities.permissions import get_permission_for_model from utilities.tables import configure_table from utilities.utils import normalize_querydict, prepare_cloned_fields -from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin +from utilities.views import GetReturnURLMixin +from .base import GenericView __all__ = ( 'ComponentCreateView', @@ -33,27 +29,31 @@ __all__ = ( 'ObjectDeleteView', 'ObjectEditView', 'ObjectImportView', - 'ObjectListView', 'ObjectView', ) -class ObjectView(ObjectPermissionRequiredMixin, View): +class ObjectView(GenericView): """ Retrieve a single object for display. - queryset: The base queryset for retrieving the object - template_name: Name of the template to use + Note: If `template_name` is not specified, it will be determined automatically based on the queryset model. """ - queryset = None - template_name = None def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'view') + def get_object(self, **kwargs): + """ + Return the object being viewed, identified by the keyword arguments passed. If no matching object is found, + raise a 404 error. + """ + return get_object_or_404(self.queryset, **kwargs) + def get_template_name(self): """ - Return self.template_name if set. Otherwise, resolve the template path by model app_label and name. + Return self.template_name if defined. Otherwise, dynamically resolve the template name using the queryset + model's `app_label` and `model_name`. """ if self.template_name is not None: return self.template_name @@ -64,18 +64,20 @@ class ObjectView(ObjectPermissionRequiredMixin, View): """ Return any additional context data for the template. - :param request: The current request - :param instance: The object being viewed + Args: + request: The current request + instance: The object being viewed """ return {} - def get(self, request, *args, **kwargs): + def get(self, request, **kwargs): """ - GET request handler. *args and **kwargs are passed to identify the object being queried. + GET request handler. `*args` and `**kwargs` are passed to identify the object being queried. - :param request: The current request + Args: + request: The current request """ - instance = get_object_or_404(self.queryset, **kwargs) + instance = self.get_object(**kwargs) return render(request, self.get_template_name(), { 'object': instance, @@ -87,15 +89,12 @@ class ObjectChildrenView(ObjectView): """ Display a table of child objects associated with the parent object. - queryset: The base queryset for retrieving the *parent* object - table: Table class used to render child objects list - template_name: Name of the template to use + Attributes: + table: Table class used to render child objects list """ - queryset = None child_model = None table = None filterset = None - template_name = None def get_children(self, request, parent): """ @@ -110,9 +109,10 @@ class ObjectChildrenView(ObjectView): """ Provides a hook for subclassed views to modify data before initializing the table. - :param request: The current request - :param queryset: The filtered queryset of child objects - :param parent: The parent object + Args: + request: The current request + queryset: The filtered queryset of child objects + parent: The parent object """ return queryset @@ -120,7 +120,7 @@ class ObjectChildrenView(ObjectView): """ GET handler for rendering child objects. """ - instance = get_object_or_404(self.queryset, **kwargs) + instance = self.get_object(**kwargs) child_objects = self.get_children(request, instance) if self.filterset: @@ -152,171 +152,17 @@ class ObjectChildrenView(ObjectView): }) -class ObjectListView(ObjectPermissionRequiredMixin, View): - """ - List a series of objects. - - queryset: The queryset of objects to display. Note: Prefetching related objects is not necessary, as the - table will prefetch objects as needed depending on the columns being displayed. - filterset: A django-filter FilterSet that is applied to the queryset - filterset_form: The form used to render filter options - table: The django-tables2 Table used to render the objects list - template_name: The name of the template - action_buttons: A list of buttons to include at the top of the page - """ - queryset = None - filterset = None - filterset_form = None - table = None - template_name = 'generic/object_list.html' - action_buttons = ('add', 'import', 'export') - - def get_required_permission(self): - return get_permission_for_model(self.queryset.model, 'view') - - def get_table(self, request, permissions): - """ - Return the django-tables2 Table instance to be used for rendering the objects list. - - :param request: The current request - :param permissions: A dictionary mapping of the view, add, change, and delete permissions to booleans indicating - whether the user has each - """ - table = self.table(self.queryset, user=request.user) - if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']): - table.columns.show('pk') - - return table - - def export_yaml(self): - """ - Export the queryset of objects as concatenated YAML documents. - """ - yaml_data = [obj.to_yaml() for obj in self.queryset] - - return '---\n'.join(yaml_data) - - def export_table(self, table, columns=None): - """ - Export all table data in CSV format. - - :param table: The Table instance to export - :param columns: A list of specific columns to include. If not specified, all columns will be exported. - """ - exclude_columns = {'pk', 'actions'} - if columns: - all_columns = [col_name for col_name, _ in table.selected_columns + table.available_columns] - exclude_columns.update({ - col for col in all_columns if col not in columns - }) - exporter = TableExport( - export_format=TableExport.CSV, - table=table, - exclude_columns=exclude_columns - ) - return exporter.response( - filename=f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv' - ) - - def export_template(self, template, request): - """ - Render an ExportTemplate using the current queryset. - - :param template: ExportTemplate instance - :param request: The current request - """ - try: - return template.render_to_response(self.queryset) - except Exception as e: - messages.error(request, f"There was an error rendering the selected export template ({template.name}): {e}") - return redirect(request.path) - - def get_extra_context(self, request): - """ - Return any additional context data for the template. - - :param request: The current request - """ - return {} - - def get(self, request): - """ - GET request handler. - - :param request: The current request - """ - model = self.queryset.model - content_type = ContentType.objects.get_for_model(model) - - if self.filterset: - self.queryset = self.filterset(request.GET, self.queryset).qs - - # Compile a dictionary indicating which permissions are available to the current user for this model - permissions = {} - for action in ('add', 'change', 'delete', 'view'): - perm_name = get_permission_for_model(model, action) - permissions[action] = request.user.has_perm(perm_name) - - if 'export' in request.GET: - - # Export the current table view - if request.GET['export'] == 'table': - table = self.get_table(request, permissions) - columns = [name for name, _ in table.selected_columns] - return self.export_table(table, columns) - - # Render an ExportTemplate - elif request.GET['export']: - template = get_object_or_404(ExportTemplate, content_type=content_type, name=request.GET['export']) - return self.export_template(template, request) - - # Check for YAML export support on the model - elif hasattr(model, 'to_yaml'): - response = HttpResponse(self.export_yaml(), content_type='text/yaml') - filename = 'netbox_{}.yaml'.format(self.queryset.model._meta.verbose_name_plural) - response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename) - return response - - # Fall back to default table/YAML export - else: - table = self.get_table(request, permissions) - return self.export_table(table) - - # Render the objects table - table = self.get_table(request, permissions) - configure_table(table, request) - - # If this is an HTMX request, return only the rendered table HTML - if is_htmx(request): - return render(request, 'htmx/table.html', { - 'table': table, - }) - - context = { - 'content_type': content_type, - 'table': table, - 'permissions': permissions, - 'action_buttons': self.action_buttons, - 'filter_form': self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None, - } - context.update(self.get_extra_context(request)) - - return render(request, self.template_name, context) - - -class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class ObjectImportView(GetReturnURLMixin, GenericView): """ Import a single object (YAML or JSON format). - queryset: Base queryset for the objects being created - model_form: The ModelForm used to create individual objects - related_object_forms: A dictionary mapping of forms to be used for the creation of related (child) objects - template_name: The name of the template + Attributes: + model_form: The ModelForm used to create individual objects + related_object_forms: A dictionary mapping of forms to be used for the creation of related (child) objects """ - queryset = None + template_name = 'generic/object_import.html' model_form = None related_object_forms = dict() - template_name = 'generic/object_import.html' def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') @@ -445,17 +291,21 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) -class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class ObjectEditView(GetReturnURLMixin, GenericView): """ Create or edit a single object. - queryset: The base QuerySet for the object being modified - model_form: The form used to create or edit the object - template_name: The name of the template + Attributes: + model_form: The form used to create or edit the object """ - queryset = None - model_form = None template_name = 'generic/object_edit.html' + model_form = None + + def dispatch(self, request, *args, **kwargs): + # Determine required permission based on whether we are editing an existing object + self._permission_action = 'change' if kwargs else 'add' + + return super().dispatch(request, *args, **kwargs) def get_required_permission(self): # self._permission_action is set by dispatch() to either "add" or "change" depending on whether @@ -466,13 +316,16 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ Return an instance for editing. If a PK has been specified, this will be an existing object. - :param kwargs: URL path kwargs + Args: + kwargs: URL path kwargs """ if 'pk' in kwargs: obj = get_object_or_404(self.queryset, **kwargs) + # Take a snapshot of change-logged models if hasattr(obj, 'snapshot'): obj.snapshot() + return obj return self.queryset.model() @@ -482,24 +335,20 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): Provides a hook for views to modify an object before it is processed. For example, a parent object can be defined given some parameter from the request URL. - :param obj: The object being edited - :param request: The current request - :param url_args: URL path args - :param url_kwargs: URL path kwargs + Args: + obj: The object being edited + request: The current request + url_args: URL path args + url_kwargs: URL path kwargs """ return obj - def dispatch(self, request, *args, **kwargs): - # Determine required permission based on whether we are editing an existing object - self._permission_action = 'change' if kwargs else 'add' - - return super().dispatch(request, *args, **kwargs) - def get(self, request, *args, **kwargs): """ GET request handler. - :param request: The current request + Args: + request: The current request """ obj = self.get_object(**kwargs) obj = self.alter_object(obj, request, args, kwargs) @@ -519,7 +368,8 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ POST request handler. - :param request: The current request + Args: + request: The current request """ logger = logging.getLogger('netbox.views.ObjectEditView') obj = self.get_object(**kwargs) @@ -588,14 +438,10 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) -class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class ObjectDeleteView(GetReturnURLMixin, GenericView): """ Delete a single object. - - queryset: The base queryset for the object being deleted - template_name: The name of the template """ - queryset = None template_name = 'generic/object_delete.html' def get_required_permission(self): @@ -605,7 +451,8 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ Return an instance for deletion. If a PK has been specified, this will be an existing object. - :param kwargs: URL path kwargs + Args: + kwargs: URL path kwargs """ obj = get_object_or_404(self.queryset, **kwargs) @@ -619,7 +466,8 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ GET request handler. - :param request: The current request + Args: + request: The current request """ obj = self.get_object(**kwargs) form = ConfirmationForm(initial=request.GET) @@ -646,7 +494,8 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ POST request handler. - :param request: The current request + Args: + request: The current request """ logger = logging.getLogger('netbox.views.ObjectDeleteView') obj = self.get_object(**kwargs) @@ -687,14 +536,13 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): # Device/VirtualMachine components # -class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): +class ComponentCreateView(GetReturnURLMixin, GenericView): """ Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine. """ - queryset = None + template_name = 'dcim/component_create.html' form = None model_form = None - template_name = 'dcim/component_create.html' patterned_fields = ('name', 'label') def get_required_permission(self): From e03593d86f3082c19255ae24f39d1ed860a04c4d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 21 Jan 2022 13:56:58 -0500 Subject: [PATCH 109/271] Move get_extra_context() to base views --- docs/plugins/development/generic-views.md | 22 +++++--- netbox/netbox/views/generic/base.py | 33 +++++++++++- netbox/netbox/views/generic/bulk_views.py | 57 ++++++++++----------- netbox/netbox/views/generic/object_views.py | 28 ++++------ 4 files changed, 84 insertions(+), 56 deletions(-) diff --git a/docs/plugins/development/generic-views.md b/docs/plugins/development/generic-views.md index ced7e380779..d8ad0e7a418 100644 --- a/docs/plugins/development/generic-views.md +++ b/docs/plugins/development/generic-views.md @@ -12,6 +12,9 @@ NetBox provides several generic view classes to facilitate common operations, su | `BulkEditView` | Edit multiple objects | | `BulkDeleteView` | Delete multiple objects | +!!! note + Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `views.generic` module, they are not yet supported for use by plugins. + ### Example Usage ```python @@ -25,23 +28,19 @@ class ThingEditView(ObjectEditView): ... ``` -## Generic Views Reference +## Object Views -Below is the class definition for NetBox's base GenericView. The attributes and methods defined here are available on all generic views. +Below is the class definition for NetBox's BaseObjectView. The attributes and methods defined here are available on all generic views which handle a single object. -::: netbox.views.generic.base.GenericView +::: netbox.views.generic.base.BaseObjectView rendering: show_source: false -!!! note - Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `views.generic` module, they are not yet supported for use by plugins. - ::: netbox.views.generic.ObjectView selection: members: - get_object - get_template_name - - get_extra_context rendering: show_source: false @@ -60,11 +59,18 @@ Below is the class definition for NetBox's base GenericView. The attributes and rendering: show_source: false +## Multi-Object Views + +Below is the class definition for NetBox's BaseMultiObjectView. The attributes and methods defined here are available on all generic views which deal with multiple objects. + +::: netbox.views.generic.base.BaseMultiObjectView + rendering: + show_source: false + ::: netbox.views.generic.ObjectListView selection: members: - get_table - - get_extra_context - export_yaml - export_table - export_template diff --git a/netbox/netbox/views/generic/base.py b/netbox/netbox/views/generic/base.py index 3861a93aa17..7d7c305ddd3 100644 --- a/netbox/netbox/views/generic/base.py +++ b/netbox/netbox/views/generic/base.py @@ -3,7 +3,7 @@ from django.views.generic import View from utilities.views import ObjectPermissionRequiredMixin -class GenericView(ObjectPermissionRequiredMixin, View): +class BaseObjectView(ObjectPermissionRequiredMixin, View): """ Base view class for reusable generic views. @@ -13,3 +13,34 @@ class GenericView(ObjectPermissionRequiredMixin, View): """ queryset = None template_name = None + + def get_extra_context(self, request, instance): + """ + Return any additional context data to include when rendering the template. + + Args: + request: The current request + instance: The object being viewed + """ + return {} + + +class BaseMultiObjectView(ObjectPermissionRequiredMixin, View): + """ + Base view class for reusable generic views. + + Attributes: + queryset: Django QuerySet from which the object(s) will be fetched + template_name: The name of the HTML template file to render + """ + queryset = None + template_name = None + + def get_extra_context(self, request): + """ + Return any additional context data to include when rendering the template. + + Args: + request: The current request + """ + return {} diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index c1ae2038eba..3025818faf9 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -23,7 +23,7 @@ from utilities.htmx import is_htmx from utilities.permissions import get_permission_for_model from utilities.tables import configure_table from utilities.views import GetReturnURLMixin -from .base import GenericView +from .base import BaseMultiObjectView __all__ = ( 'BulkComponentCreateView', @@ -36,7 +36,7 @@ __all__ = ( ) -class ObjectListView(GenericView): +class ObjectListView(BaseMultiObjectView): """ Display multiple objects, all of the same type, as a table. @@ -70,15 +70,6 @@ class ObjectListView(GenericView): return table - def get_extra_context(self, request): - """ - Return any additional context data for the template. - - Agrs: - request: The current request - """ - return {} - def get(self, request): """ GET request handler. @@ -139,8 +130,8 @@ class ObjectListView(GenericView): 'permissions': permissions, 'action_buttons': self.action_buttons, 'filter_form': self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None, + **self.get_extra_context(request), } - context.update(self.get_extra_context(request)) return render(request, self.template_name, context) @@ -196,7 +187,7 @@ class ObjectListView(GenericView): return redirect(request.path) -class BulkCreateView(GetReturnURLMixin, GenericView): +class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): """ Create new objects in bulk. @@ -251,6 +242,7 @@ class BulkCreateView(GetReturnURLMixin, GenericView): 'form': form, 'model_form': model_form, 'return_url': self.get_return_url(request), + **self.get_extra_context(request), }) def post(self, request): @@ -295,10 +287,11 @@ class BulkCreateView(GetReturnURLMixin, GenericView): 'model_form': model_form, 'obj_type': model._meta.verbose_name, 'return_url': self.get_return_url(request), + **self.get_extra_context(request), }) -class BulkImportView(GetReturnURLMixin, GenericView): +class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): """ Import objects in bulk (CSV format). @@ -375,6 +368,7 @@ class BulkImportView(GetReturnURLMixin, GenericView): 'fields': self.model_form().fields, 'obj_type': self.model_form._meta.model._meta.verbose_name, 'return_url': self.get_return_url(request), + **self.get_extra_context(request), }) def post(self, request): @@ -423,10 +417,11 @@ class BulkImportView(GetReturnURLMixin, GenericView): 'fields': self.model_form().fields, 'obj_type': self.model_form._meta.model._meta.verbose_name, 'return_url': self.get_return_url(request), + **self.get_extra_context(request), }) -class BulkEditView(GetReturnURLMixin, GenericView): +class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): """ Edit objects in bulk. @@ -578,10 +573,11 @@ class BulkEditView(GetReturnURLMixin, GenericView): 'table': table, 'obj_type_plural': model._meta.verbose_name_plural, 'return_url': self.get_return_url(request), + **self.get_extra_context(request), }) -class BulkRenameView(GetReturnURLMixin, GenericView): +class BulkRenameView(GetReturnURLMixin, BaseMultiObjectView): """ An extendable view for renaming objects in bulk. """ @@ -668,7 +664,7 @@ class BulkRenameView(GetReturnURLMixin, GenericView): }) -class BulkDeleteView(GetReturnURLMixin, GenericView): +class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView): """ Delete objects in bulk. @@ -684,6 +680,18 @@ class BulkDeleteView(GetReturnURLMixin, GenericView): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'delete') + def get_form(self): + """ + Provide a standard bulk delete form if none has been specified for the view + """ + class BulkDeleteForm(ConfirmationForm): + pk = ModelMultipleChoiceField(queryset=self.queryset, widget=MultipleHiddenInput) + + if self.form: + return self.form + + return BulkDeleteForm + def get(self, request): return redirect(self.get_return_url(request)) @@ -746,26 +754,15 @@ class BulkDeleteView(GetReturnURLMixin, GenericView): 'obj_type_plural': model._meta.verbose_name_plural, 'table': table, 'return_url': self.get_return_url(request), + **self.get_extra_context(request), }) - def get_form(self): - """ - Provide a standard bulk delete form if none has been specified for the view - """ - class BulkDeleteForm(ConfirmationForm): - pk = ModelMultipleChoiceField(queryset=self.queryset, widget=MultipleHiddenInput) - - if self.form: - return self.form - - return BulkDeleteForm - # # Device/VirtualMachine components # -class BulkComponentCreateView(GetReturnURLMixin, GenericView): +class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView): """ Add one or more components (e.g. interfaces, console ports, etc.) to a set of Devices or VirtualMachines. """ diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 79732572dc1..c681767c2b4 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -21,7 +21,7 @@ from utilities.permissions import get_permission_for_model from utilities.tables import configure_table from utilities.utils import normalize_querydict, prepare_cloned_fields from utilities.views import GetReturnURLMixin -from .base import GenericView +from .base import BaseObjectView __all__ = ( 'ComponentCreateView', @@ -33,13 +33,12 @@ __all__ = ( ) -class ObjectView(GenericView): +class ObjectView(BaseObjectView): """ Retrieve a single object for display. Note: If `template_name` is not specified, it will be determined automatically based on the queryset model. """ - def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'view') @@ -60,16 +59,6 @@ class ObjectView(GenericView): model_opts = self.queryset.model._meta return f'{model_opts.app_label}/{model_opts.model_name}.html' - def get_extra_context(self, request, instance): - """ - Return any additional context data for the template. - - Args: - request: The current request - instance: The object being viewed - """ - return {} - def get(self, request, **kwargs): """ GET request handler. `*args` and `**kwargs` are passed to identify the object being queried. @@ -152,7 +141,7 @@ class ObjectChildrenView(ObjectView): }) -class ObjectImportView(GetReturnURLMixin, GenericView): +class ObjectImportView(GetReturnURLMixin, BaseObjectView): """ Import a single object (YAML or JSON format). @@ -291,7 +280,7 @@ class ObjectImportView(GetReturnURLMixin, GenericView): }) -class ObjectEditView(GetReturnURLMixin, GenericView): +class ObjectEditView(GetReturnURLMixin, BaseObjectView): """ Create or edit a single object. @@ -362,6 +351,7 @@ class ObjectEditView(GetReturnURLMixin, GenericView): 'obj_type': self.queryset.model._meta.verbose_name, 'form': form, 'return_url': self.get_return_url(request, obj), + **self.get_extra_context(request, obj), }) def post(self, request, *args, **kwargs): @@ -435,10 +425,11 @@ class ObjectEditView(GetReturnURLMixin, GenericView): 'obj_type': self.queryset.model._meta.verbose_name, 'form': form, 'return_url': self.get_return_url(request, obj), + **self.get_extra_context(request, obj), }) -class ObjectDeleteView(GetReturnURLMixin, GenericView): +class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): """ Delete a single object. """ @@ -481,6 +472,7 @@ class ObjectDeleteView(GetReturnURLMixin, GenericView): 'object_type': self.queryset.model._meta.verbose_name, 'form': form, 'form_url': form_url, + **self.get_extra_context(request, obj), }) return render(request, self.template_name, { @@ -488,6 +480,7 @@ class ObjectDeleteView(GetReturnURLMixin, GenericView): 'object_type': self.queryset.model._meta.verbose_name, 'form': form, 'return_url': self.get_return_url(request, obj), + **self.get_extra_context(request, obj), }) def post(self, request, *args, **kwargs): @@ -529,6 +522,7 @@ class ObjectDeleteView(GetReturnURLMixin, GenericView): 'object_type': self.queryset.model._meta.verbose_name, 'form': form, 'return_url': self.get_return_url(request, obj), + **self.get_extra_context(request, obj), }) @@ -536,7 +530,7 @@ class ObjectDeleteView(GetReturnURLMixin, GenericView): # Device/VirtualMachine components # -class ComponentCreateView(GetReturnURLMixin, GenericView): +class ComponentCreateView(GetReturnURLMixin, BaseObjectView): """ Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine. """ From a74ed33b0ed53eddddad615835adc42534d246cc Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 21 Jan 2022 14:41:37 -0500 Subject: [PATCH 110/271] Move get_object() to BaseObjectView --- docs/plugins/development/generic-views.md | 1 - mkdocs.yml | 1 + netbox/netbox/views/generic/base.py | 12 ++ netbox/netbox/views/generic/bulk_views.py | 128 +++++++++++--------- netbox/netbox/views/generic/object_views.py | 70 ++++++----- 5 files changed, 118 insertions(+), 94 deletions(-) diff --git a/docs/plugins/development/generic-views.md b/docs/plugins/development/generic-views.md index d8ad0e7a418..1a444ca2c26 100644 --- a/docs/plugins/development/generic-views.md +++ b/docs/plugins/development/generic-views.md @@ -71,7 +71,6 @@ Below is the class definition for NetBox's BaseMultiObjectView. The attributes a selection: members: - get_table - - export_yaml - export_table - export_template rendering: diff --git a/mkdocs.yml b/mkdocs.yml index c36d3f467c7..dbd31cb500b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -28,6 +28,7 @@ plugins: - django.setup() rendering: heading_level: 3 + members_order: source show_root_heading: true show_root_full_path: false show_root_toc_entry: false diff --git a/netbox/netbox/views/generic/base.py b/netbox/netbox/views/generic/base.py index 7d7c305ddd3..3ad3bcf679c 100644 --- a/netbox/netbox/views/generic/base.py +++ b/netbox/netbox/views/generic/base.py @@ -1,3 +1,4 @@ +from django.shortcuts import get_object_or_404 from django.views.generic import View from utilities.views import ObjectPermissionRequiredMixin @@ -14,6 +15,15 @@ class BaseObjectView(ObjectPermissionRequiredMixin, View): queryset = None template_name = None + def get_object(self, **kwargs): + """ + Return the object being viewed or modified. The object is identified by an arbitrary set of keyword arguments + gleaned from the URL, which are passed to `get_object_or_404()`. (Typically, only a primary key is needed.) + + If no matching object is found, return a 404 response. + """ + return get_object_or_404(self.queryset, **kwargs) + def get_extra_context(self, request, instance): """ Return any additional context data to include when rendering the template. @@ -31,9 +41,11 @@ class BaseMultiObjectView(ObjectPermissionRequiredMixin, View): Attributes: queryset: Django QuerySet from which the object(s) will be fetched + table: The django-tables2 Table class used to render the objects list template_name: The name of the HTML template file to render """ queryset = None + table = None template_name = None def get_extra_context(self, request): diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 3025818faf9..5286de314fd 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -43,13 +43,11 @@ class ObjectListView(BaseMultiObjectView): Attributes: filterset: A django-filter FilterSet that is applied to the queryset filterset_form: The form class used to render filter options - table: The django-tables2 Table used to render the objects list action_buttons: A list of buttons to include at the top of the page """ template_name = 'generic/object_list.html' filterset = None filterset_form = None - table = None action_buttons = ('add', 'import', 'export') def get_required_permission(self): @@ -70,6 +68,61 @@ class ObjectListView(BaseMultiObjectView): return table + # + # Export methods + # + + def export_yaml(self): + """ + Export the queryset of objects as concatenated YAML documents. + """ + yaml_data = [obj.to_yaml() for obj in self.queryset] + + return '---\n'.join(yaml_data) + + def export_table(self, table, columns=None, filename=None): + """ + Export all table data in CSV format. + + Args: + table: The Table instance to export + columns: A list of specific columns to include. If None, all columns will be exported. + filename: The name of the file attachment sent to the client. If None, will be determined automatically + from the queryset model name. + """ + exclude_columns = {'pk', 'actions'} + if columns: + all_columns = [col_name for col_name, _ in table.selected_columns + table.available_columns] + exclude_columns.update({ + col for col in all_columns if col not in columns + }) + exporter = TableExport( + export_format=TableExport.CSV, + table=table, + exclude_columns=exclude_columns + ) + return exporter.response( + filename=filename or f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv' + ) + + def export_template(self, template, request): + """ + Render an ExportTemplate using the current queryset. + + Args: + template: ExportTemplate instance + request: The current request + """ + try: + return template.render_to_response(self.queryset) + except Exception as e: + messages.error(request, f"There was an error rendering the selected export template ({template.name}): {e}") + return redirect(request.path) + + # + # Request handlers + # + def get(self, request): """ GET request handler. @@ -135,57 +188,6 @@ class ObjectListView(BaseMultiObjectView): return render(request, self.template_name, context) - # - # Export methods - # - - def export_yaml(self): - """ - Export the queryset of objects as concatenated YAML documents. - """ - yaml_data = [obj.to_yaml() for obj in self.queryset] - - return '---\n'.join(yaml_data) - - def export_table(self, table, columns=None, filename=None): - """ - Export all table data in CSV format. - - Args: - table: The Table instance to export - columns: A list of specific columns to include. If None, all columns will be exported. - filename: The name of the file attachment sent to the client. If None, will be determined automatically - from the queryset model name. - """ - exclude_columns = {'pk', 'actions'} - if columns: - all_columns = [col_name for col_name, _ in table.selected_columns + table.available_columns] - exclude_columns.update({ - col for col in all_columns if col not in columns - }) - exporter = TableExport( - export_format=TableExport.CSV, - table=table, - exclude_columns=exclude_columns - ) - return exporter.response( - filename=filename or f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv' - ) - - def export_template(self, template, request): - """ - Render an ExportTemplate using the current queryset. - - Args: - template: ExportTemplate instance - request: The current request - """ - try: - return template.render_to_response(self.queryset) - except Exception as e: - messages.error(request, f"There was an error rendering the selected export template ({template.name}): {e}") - return redirect(request.path) - class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): """ @@ -227,6 +229,10 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): return new_objects + # + # Request handlers + # + def get(self, request): # Set initial values for visible form fields from query args initial = {} @@ -297,12 +303,10 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): Attributes: model_form: The form used to create each imported object - table: The django-tables2 Table used to render the list of imported objects widget_attrs: A dict of attributes to apply to the import widget (e.g. to require a session key) """ template_name = 'generic/object_bulk_import.html' model_form = None - table = None widget_attrs = {} def _import_form(self, *args, **kwargs): @@ -361,6 +365,10 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'add') + # + # Request handlers + # + def get(self, request): return render(request, self.template_name, { @@ -427,12 +435,10 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): Attributes: filterset: FilterSet to apply when deleting by QuerySet - table: The table used to display devices being edited form: The form class used to edit objects in bulk """ template_name = 'generic/object_bulk_edit.html' filterset = None - table = None form = None def get_required_permission(self): @@ -495,6 +501,10 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): return updated_objects + # + # Request handlers + # + def get(self, request): return redirect(self.get_return_url(request)) @@ -692,6 +702,10 @@ class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView): return BulkDeleteForm + # + # Request handlers + # + def get(self, request): return redirect(self.get_return_url(request)) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index c681767c2b4..09a102442ac 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -6,7 +6,7 @@ from django.core.exceptions import ObjectDoesNotExist from django.db import transaction from django.db.models import ProtectedError from django.forms.widgets import HiddenInput -from django.shortcuts import get_object_or_404, redirect, render +from django.shortcuts import redirect, render from django.urls import reverse from django.utils.html import escape from django.utils.http import is_safe_url @@ -42,13 +42,6 @@ class ObjectView(BaseObjectView): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'view') - def get_object(self, **kwargs): - """ - Return the object being viewed, identified by the keyword arguments passed. If no matching object is found, - raise a 404 error. - """ - return get_object_or_404(self.queryset, **kwargs) - def get_template_name(self): """ Return self.template_name if defined. Otherwise, dynamically resolve the template name using the queryset @@ -59,6 +52,10 @@ class ObjectView(BaseObjectView): model_opts = self.queryset.model._meta return f'{model_opts.app_label}/{model_opts.model_name}.html' + # + # Request handlers + # + def get(self, request, **kwargs): """ GET request handler. `*args` and `**kwargs` are passed to identify the object being queried. @@ -105,6 +102,10 @@ class ObjectChildrenView(ObjectView): """ return queryset + # + # Request handlers + # + def get(self, request, *args, **kwargs): """ GET handler for rendering child objects. @@ -202,6 +203,10 @@ class ObjectImportView(GetReturnURLMixin, BaseObjectView): return obj + # + # Request handlers + # + def get(self, request): form = ImportForm() @@ -303,21 +308,12 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): def get_object(self, **kwargs): """ - Return an instance for editing. If a PK has been specified, this will be an existing object. - - Args: - kwargs: URL path kwargs + Return an object for editing. If no keyword arguments have been specified, this will be a new instance. """ - if 'pk' in kwargs: - obj = get_object_or_404(self.queryset, **kwargs) - - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() - - return obj - - return self.queryset.model() + if not kwargs: + # We're creating a new object + return self.queryset.model() + return super().get_object(**kwargs) def alter_object(self, obj, request, url_args, url_kwargs): """ @@ -332,6 +328,10 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): """ return obj + # + # Request handlers + # + def get(self, request, *args, **kwargs): """ GET request handler. @@ -363,6 +363,11 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): """ logger = logging.getLogger('netbox.views.ObjectEditView') obj = self.get_object(**kwargs) + + # Take a snapshot for change logging (if editing an existing object) + if obj.pk and hasattr(obj, 'snapshot'): + obj.snapshot() + obj = self.alter_object(obj, request, args, kwargs) form = self.model_form( @@ -438,20 +443,9 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'delete') - def get_object(self, **kwargs): - """ - Return an instance for deletion. If a PK has been specified, this will be an existing object. - - Args: - kwargs: URL path kwargs - """ - obj = get_object_or_404(self.queryset, **kwargs) - - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() - - return obj + # + # Request handlers + # def get(self, request, *args, **kwargs): """ @@ -494,6 +488,10 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): obj = self.get_object(**kwargs) form = ConfirmationForm(request.POST) + # Take a snapshot of change-logged models + if hasattr(obj, 'snapshot'): + obj.snapshot() + if form.is_valid(): logger.debug("Form validation was successful") From 1c946250424e849dadcf91bef5db7cc17b222518 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 21 Jan 2022 14:48:27 -0500 Subject: [PATCH 111/271] Remove widget_attrs from BulkImportView --- netbox/netbox/views/generic/bulk_views.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 5286de314fd..82e1dc2172b 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -303,18 +303,15 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): Attributes: model_form: The form used to create each imported object - widget_attrs: A dict of attributes to apply to the import widget (e.g. to require a session key) """ template_name = 'generic/object_bulk_import.html' model_form = None - widget_attrs = {} def _import_form(self, *args, **kwargs): class ImportForm(BootstrapMixin, Form): csv = CSVDataField( - from_form=self.model_form, - widget=Textarea(attrs=self.widget_attrs) + from_form=self.model_form ) csv_file = CSVFileField( label="CSV file", From 5abfe821bc50084a5bff4a3f29a7168dd844b326 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 21 Jan 2022 15:43:53 -0500 Subject: [PATCH 112/271] Changelog cnad cleanup for #7853 --- docs/release-notes/version-3.2.md | 3 ++- netbox/dcim/forms/bulk_import.py | 3 +-- netbox/dcim/models/device_components.py | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 432d6fafcbb..c35806c04fd 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -69,6 +69,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * [#7784](https://github.com/netbox-community/netbox/issues/7784) - Support cluster type assignment for config contexts * [#7846](https://github.com/netbox-community/netbox/issues/7846) - Enable associating inventory items with device components * [#7852](https://github.com/netbox-community/netbox/issues/7852) - Enable assigning interfaces to VRFs +* [#7853](https://github.com/netbox-community/netbox/issues/7853) - Add `speed` and `duplex` fields to interface model * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group * [#8295](https://github.com/netbox-community/netbox/issues/8295) - Webhook URLs can now be templatized * [#8296](https://github.com/netbox-community/netbox/issues/8296) - Allow disabling custom links @@ -100,7 +101,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * dcim.FrontPort * Added `module` field * dcim.Interface - * Added `module` and `vrf` fields + * Added `module`, `speed`, `duplex`, and `vrf` fields * dcim.InventoryItem * Added `component_type`, `component_id`, and `role` fields * Added read-only `component` field diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index acce43be03e..1aec329eb52 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -620,8 +620,7 @@ class InterfaceCSVForm(CustomFieldModelCSVForm): ) duplex = CSVChoiceField( choices=InterfaceDuplexChoices, - required=False, - help_text='Duplex' + required=False ) mode = CSVChoiceField( choices=InterfaceModeChoices, diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index cae0d1150ec..4a68f7c8da0 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -546,12 +546,10 @@ class Interface(ModularComponentModel, BaseInterface, LinkTermination, PathEndpo help_text='This interface is used only for out-of-band management' ) speed = models.PositiveIntegerField( - verbose_name='Speed', blank=True, null=True ) duplex = models.CharField( - verbose_name='Duplex', max_length=50, blank=True, null=True, From 571e9801f3c42193e8e26970d63fc0bf9933c774 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 24 Jan 2022 16:02:54 -0500 Subject: [PATCH 113/271] Closes #8195: Ensure all GenericForeignKey ID fields employ PositiveBigIntegerField --- .../migrations/0033_gfk_bigidfield.py | 18 +++++ netbox/dcim/migrations/0151_gfk_bigidfield.py | 73 +++++++++++++++++++ netbox/dcim/models/cables.py | 8 +- netbox/dcim/models/device_components.py | 2 +- .../extras/migrations/0071_gfk_bigidfield.py | 33 +++++++++ netbox/extras/models/change_logging.py | 4 +- netbox/extras/models/models.py | 4 +- netbox/ipam/migrations/0056_gfk_bigidfield.py | 23 ++++++ netbox/ipam/models/fhrp.py | 2 +- netbox/ipam/models/ip.py | 2 +- .../tenancy/migrations/0005_gfk_bigidfield.py | 18 +++++ netbox/tenancy/models/contacts.py | 2 +- 12 files changed, 177 insertions(+), 12 deletions(-) create mode 100644 netbox/circuits/migrations/0033_gfk_bigidfield.py create mode 100644 netbox/dcim/migrations/0151_gfk_bigidfield.py create mode 100644 netbox/extras/migrations/0071_gfk_bigidfield.py create mode 100644 netbox/ipam/migrations/0056_gfk_bigidfield.py create mode 100644 netbox/tenancy/migrations/0005_gfk_bigidfield.py diff --git a/netbox/circuits/migrations/0033_gfk_bigidfield.py b/netbox/circuits/migrations/0033_gfk_bigidfield.py new file mode 100644 index 00000000000..970617a889b --- /dev/null +++ b/netbox/circuits/migrations/0033_gfk_bigidfield.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.11 on 2022-01-24 21:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0032_provider_service_id'), + ] + + operations = [ + migrations.AlterField( + model_name='circuittermination', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/dcim/migrations/0151_gfk_bigidfield.py b/netbox/dcim/migrations/0151_gfk_bigidfield.py new file mode 100644 index 00000000000..733e6ecd5dd --- /dev/null +++ b/netbox/dcim/migrations/0151_gfk_bigidfield.py @@ -0,0 +1,73 @@ +# Generated by Django 3.2.11 on 2022-01-24 21:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0150_interface_speed_duplex'), + ] + + operations = [ + migrations.AlterField( + model_name='cable', + name='termination_a_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='cable', + name='termination_b_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='cablepath', + name='destination_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='cablepath', + name='origin_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='consoleport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='consoleserverport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='frontport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='interface', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='powerfeed', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='poweroutlet', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='powerport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='rearport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 18bf6589595..e3cc20177be 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -38,7 +38,7 @@ class Cable(PrimaryModel): on_delete=models.PROTECT, related_name='+' ) - termination_a_id = models.PositiveIntegerField() + termination_a_id = models.PositiveBigIntegerField() termination_a = GenericForeignKey( ct_field='termination_a_type', fk_field='termination_a_id' @@ -49,7 +49,7 @@ class Cable(PrimaryModel): on_delete=models.PROTECT, related_name='+' ) - termination_b_id = models.PositiveIntegerField() + termination_b_id = models.PositiveBigIntegerField() termination_b = GenericForeignKey( ct_field='termination_b_type', fk_field='termination_b_id' @@ -327,7 +327,7 @@ class CablePath(BigIDModel): on_delete=models.CASCADE, related_name='+' ) - origin_id = models.PositiveIntegerField() + origin_id = models.PositiveBigIntegerField() origin = GenericForeignKey( ct_field='origin_type', fk_field='origin_id' @@ -339,7 +339,7 @@ class CablePath(BigIDModel): blank=True, null=True ) - destination_id = models.PositiveIntegerField( + destination_id = models.PositiveBigIntegerField( blank=True, null=True ) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 4a68f7c8da0..9071dfe4656 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -130,7 +130,7 @@ class LinkTermination(models.Model): blank=True, null=True ) - _link_peer_id = models.PositiveIntegerField( + _link_peer_id = models.PositiveBigIntegerField( blank=True, null=True ) diff --git a/netbox/extras/migrations/0071_gfk_bigidfield.py b/netbox/extras/migrations/0071_gfk_bigidfield.py new file mode 100644 index 00000000000..64ce3c471d2 --- /dev/null +++ b/netbox/extras/migrations/0071_gfk_bigidfield.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.11 on 2022-01-24 21:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0070_customlink_enabled'), + ] + + operations = [ + migrations.AlterField( + model_name='imageattachment', + name='object_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='journalentry', + name='assigned_object_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='objectchange', + name='changed_object_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='objectchange', + name='related_object_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/extras/models/change_logging.py b/netbox/extras/models/change_logging.py index 8dfeb2f18eb..4e703833aef 100644 --- a/netbox/extras/models/change_logging.py +++ b/netbox/extras/models/change_logging.py @@ -43,7 +43,7 @@ class ObjectChange(BigIDModel): on_delete=models.PROTECT, related_name='+' ) - changed_object_id = models.PositiveIntegerField() + changed_object_id = models.PositiveBigIntegerField() changed_object = GenericForeignKey( ct_field='changed_object_type', fk_field='changed_object_id' @@ -55,7 +55,7 @@ class ObjectChange(BigIDModel): blank=True, null=True ) - related_object_id = models.PositiveIntegerField( + related_object_id = models.PositiveBigIntegerField( blank=True, null=True ) diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 7189aed0392..143bc7d9b61 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -351,7 +351,7 @@ class ImageAttachment(WebhooksMixin, ChangeLoggedModel): to=ContentType, on_delete=models.CASCADE ) - object_id = models.PositiveIntegerField() + object_id = models.PositiveBigIntegerField() parent = GenericForeignKey( ct_field='content_type', fk_field='object_id' @@ -431,7 +431,7 @@ class JournalEntry(WebhooksMixin, ChangeLoggedModel): to=ContentType, on_delete=models.CASCADE ) - assigned_object_id = models.PositiveIntegerField() + assigned_object_id = models.PositiveBigIntegerField() assigned_object = GenericForeignKey( ct_field='assigned_object_type', fk_field='assigned_object_id' diff --git a/netbox/ipam/migrations/0056_gfk_bigidfield.py b/netbox/ipam/migrations/0056_gfk_bigidfield.py new file mode 100644 index 00000000000..f40f6527107 --- /dev/null +++ b/netbox/ipam/migrations/0056_gfk_bigidfield.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.11 on 2022-01-24 21:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0055_servicetemplate'), + ] + + operations = [ + migrations.AlterField( + model_name='fhrpgroupassignment', + name='interface_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='ipaddress', + name='assigned_object_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py index a0e575e4593..f0e3c2a230a 100644 --- a/netbox/ipam/models/fhrp.py +++ b/netbox/ipam/models/fhrp.py @@ -74,7 +74,7 @@ class FHRPGroupAssignment(WebhooksMixin, ChangeLoggedModel): to=ContentType, on_delete=models.CASCADE ) - interface_id = models.PositiveIntegerField() + interface_id = models.PositiveBigIntegerField() interface = GenericForeignKey( ct_field='interface_type', fk_field='interface_id' diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 44dd84525fc..632d7103479 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -801,7 +801,7 @@ class IPAddress(PrimaryModel): blank=True, null=True ) - assigned_object_id = models.PositiveIntegerField( + assigned_object_id = models.PositiveBigIntegerField( blank=True, null=True ) diff --git a/netbox/tenancy/migrations/0005_gfk_bigidfield.py b/netbox/tenancy/migrations/0005_gfk_bigidfield.py new file mode 100644 index 00000000000..12bbde29502 --- /dev/null +++ b/netbox/tenancy/migrations/0005_gfk_bigidfield.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.11 on 2022-01-24 21:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tenancy', '0004_extend_tag_support'), + ] + + operations = [ + migrations.AlterField( + model_name='contactassignment', + name='object_id', + field=models.PositiveBigIntegerField(), + ), + ] diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index ecc5990214a..cacd682cbd7 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -131,7 +131,7 @@ class ContactAssignment(WebhooksMixin, ChangeLoggedModel): to=ContentType, on_delete=models.CASCADE ) - object_id = models.PositiveIntegerField() + object_id = models.PositiveBigIntegerField() object = GenericForeignKey( ct_field='content_type', fk_field='object_id' From 497afcc1e451803f6ef741891ccecf71173b3c4e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 25 Jan 2022 13:53:31 -0500 Subject: [PATCH 114/271] Rearrange plugins documentation --- docs/media/plugins/plugin_admin_ui.png | Bin 23831 -> 0 bytes docs/plugins/development.md | 433 ------------------- docs/plugins/development/background-tasks.md | 27 ++ docs/plugins/development/generic-views.md | 96 ---- docs/plugins/development/index.md | 145 ++++++- docs/plugins/development/model-features.md | 64 --- docs/plugins/development/models.md | 107 +++++ docs/plugins/development/rest-api.md | 46 ++ docs/plugins/development/views.md | 254 +++++++++++ mkdocs.yml | 9 +- 10 files changed, 583 insertions(+), 598 deletions(-) delete mode 100644 docs/media/plugins/plugin_admin_ui.png delete mode 100644 docs/plugins/development.md create mode 100644 docs/plugins/development/background-tasks.md delete mode 100644 docs/plugins/development/generic-views.md delete mode 100644 docs/plugins/development/model-features.md create mode 100644 docs/plugins/development/models.md create mode 100644 docs/plugins/development/rest-api.md create mode 100644 docs/plugins/development/views.md diff --git a/docs/media/plugins/plugin_admin_ui.png b/docs/media/plugins/plugin_admin_ui.png deleted file mode 100644 index 44802c5fca3eb41f7f84cfe50f25de6ca0cf55e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23831 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 diff --git a/docs/plugins/development.md b/docs/plugins/development.md deleted file mode 100644 index d488cad6b54..00000000000 --- a/docs/plugins/development.md +++ /dev/null @@ -1,433 +0,0 @@ -# Plugin Development - -!!! info "Help Improve the NetBox Plugins Framework!" - We're looking for volunteers to help improve NetBox's plugins framework. If you have experience developing plugins, we'd love to hear from you! You can find more information about this initiative [here](https://github.com/netbox-community/netbox/discussions/8338). - -This documentation covers the development of custom plugins for NetBox. Plugins are essentially self-contained [Django apps](https://docs.djangoproject.com/en/stable/) which integrate with NetBox to provide custom functionality. Since the development of Django apps is already very well-documented, we'll only be covering the aspects that are specific to NetBox. - -Plugins can do a lot, including: - -* Create Django models to store data in the database -* Provide their own "pages" (views) in the web user interface -* Inject template content and navigation links -* Establish their own REST API endpoints -* Add custom request/response middleware - -However, keep in mind that each piece of functionality is entirely optional. For example, if your plugin merely adds a piece of middleware or an API endpoint for existing data, there's no need to define any new models. - -!!! warning - While very powerful, the NetBox plugins API is necessarily limited in its scope. The plugins API is discussed here in its entirety: Any part of the NetBox code base not documented here is _not_ part of the supported plugins API, and should not be employed by a plugin. Internal elements of NetBox are subject to change at any time and without warning. Plugin authors are **strongly** encouraged to develop plugins using only the officially supported components discussed here and those provided by the underlying Django framework so as to avoid breaking changes in future releases. - -## Initial Setup - -### Plugin Structure - -Although the specific structure of a plugin is largely left to the discretion of its authors, a typical NetBox plugin looks something like this: - -```no-highlight -project-name/ - - plugin_name/ - - templates/ - - plugin_name/ - - *.html - - __init__.py - - middleware.py - - navigation.py - - signals.py - - template_content.py - - urls.py - - views.py - - README - - setup.py -``` - -The top level is the project root, which can have any name that you like. Immediately within the root should exist several items: - -* `setup.py` - This is a standard installation script used to install the plugin package within the Python environment. -* `README` - A brief introduction to your plugin, how to install and configure it, where to find help, and any other pertinent information. It is recommended to write README files using a markup language such as Markdown. -* The plugin source directory, with the same name as your plugin. This must be a valid Python package name (e.g. no spaces or hyphens). - -The plugin source directory contains all the actual Python code and other resources used by your plugin. Its structure is left to the author's discretion, however it is recommended to follow best practices as outlined in the [Django documentation](https://docs.djangoproject.com/en/stable/intro/reusable-apps/). At a minimum, this directory **must** contain an `__init__.py` file containing an instance of NetBox's `PluginConfig` class. - -### Create setup.py - -`setup.py` is the [setup script](https://docs.python.org/3.8/distutils/setupscript.html) we'll use to install our plugin once it's finished. The primary function of this script is to call the setuptools library's `setup()` function to create a Python distribution package. We can pass a number of keyword arguments to inform the package creation as well as to provide metadata about the plugin. An example `setup.py` is below: - -```python -from setuptools import find_packages, setup - -setup( - name='netbox-animal-sounds', - version='0.1', - description='An example NetBox plugin', - url='https://github.com/netbox-community/netbox-animal-sounds', - author='Jeremy Stretch', - license='Apache 2.0', - install_requires=[], - packages=find_packages(), - include_package_data=True, - zip_safe=False, -) -``` - -Many of these are self-explanatory, but for more information, see the [setuptools documentation](https://setuptools.readthedocs.io/en/latest/setuptools.html). - -!!! note - `zip_safe=False` is **required** as the current plugin iteration is not zip safe due to upstream python issue [issue19699](https://bugs.python.org/issue19699) - -### Define a PluginConfig - -The `PluginConfig` class is a NetBox-specific wrapper around Django's built-in [`AppConfig`](https://docs.djangoproject.com/en/stable/ref/applications/) class. It is used to declare NetBox plugin functionality within a Python package. Each plugin should provide its own subclass, defining its name, metadata, and default and required configuration parameters. An example is below: - -```python -from extras.plugins import PluginConfig - -class AnimalSoundsConfig(PluginConfig): - name = 'netbox_animal_sounds' - verbose_name = 'Animal Sounds' - description = 'An example plugin for development purposes' - version = '0.1' - author = 'Jeremy Stretch' - author_email = 'author@example.com' - base_url = 'animal-sounds' - required_settings = [] - default_settings = { - 'loud': False - } - -config = AnimalSoundsConfig -``` - -NetBox looks for the `config` variable within a plugin's `__init__.py` to load its configuration. Typically, this will be set to the PluginConfig subclass, but you may wish to dynamically generate a PluginConfig class based on environment variables or other factors. - -#### PluginConfig Attributes - -| Name | Description | -| ---- |---------------------------------------------------------------------------------------------------------------| -| `name` | Raw plugin name; same as the plugin's source directory | -| `verbose_name` | Human-friendly name for the plugin | -| `version` | Current release ([semantic versioning](https://semver.org/) is encouraged) | -| `description` | Brief description of the plugin's purpose | -| `author` | Name of plugin's author | -| `author_email` | Author's public email address | -| `base_url` | Base path to use for plugin URLs (optional). If not specified, the project's `name` will be used. | -| `required_settings` | A list of any configuration parameters that **must** be defined by the user | -| `default_settings` | A dictionary of configuration parameters and their default values | -| `min_version` | Minimum version of NetBox with which the plugin is compatible | -| `max_version` | Maximum version of NetBox with which the plugin is compatible | -| `middleware` | A list of middleware classes to append after NetBox's build-in middleware | -| `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) | -| `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) | -| `user_preferences` | The dotted path to the dictionary mapping of user preferences defined by the plugin (default: `preferences.preferences`) | - -All required settings must be configured by the user. If a configuration parameter is listed in both `required_settings` and `default_settings`, the default setting will be ignored. - -### Create a Virtual Environment - -It is strongly recommended to create a Python [virtual environment](https://docs.python.org/3/tutorial/venv.html) specific to your plugin. This will afford you complete control over the installed versions of all dependencies and avoid conflicting with any system packages. This environment can live wherever you'd like, however it should be excluded from revision control. (A popular convention is to keep all virtual environments in the user's home directory, e.g. `~/.virtualenvs/`.) - -```shell -python3 -m venv /path/to/my/venv -``` - -You can make NetBox available within this environment by creating a path file pointing to its location. This will add NetBox to the Python path upon activation. (Be sure to adjust the command below to specify your actual virtual environment path, Python version, and NetBox installation.) - -```shell -cd $VENV/lib/python3.8/site-packages/ -echo /opt/netbox/netbox > netbox.pth -``` - -### Install the Plugin for Development - -To ease development, it is recommended to go ahead and install the plugin at this point using setuptools' `develop` mode. This will create symbolic links within your Python environment to the plugin development directory. Call `setup.py` from the plugin's root directory with the `develop` argument (instead of `install`): - -```no-highlight -$ python setup.py develop -``` - -## Database Models - -If your plugin introduces a new type of object in NetBox, you'll probably want to create a [Django model](https://docs.djangoproject.com/en/stable/topics/db/models/) for it. A model is essentially a Python representation of a database table, with attributes that represent individual columns. Model instances can be created, manipulated, and deleted using [queries](https://docs.djangoproject.com/en/stable/topics/db/queries/). Models must be defined within a file named `models.py`. - -Below is an example `models.py` file containing a model with two character fields: - -```python -from django.db import models - -class Animal(models.Model): - name = models.CharField(max_length=50) - sound = models.CharField(max_length=50) - - def __str__(self): - return self.name -``` - -Once you have defined the model(s) for your plugin, you'll need to create the database schema migrations. A migration file is essentially a set of instructions for manipulating the PostgreSQL database to support your new model, or to alter existing models. Creating migrations can usually be done automatically using Django's `makemigrations` management command. - -!!! note - A plugin must be installed before it can be used with Django management commands. If you skipped this step above, run `python setup.py develop` from the plugin's root directory. - -```no-highlight -$ ./manage.py makemigrations netbox_animal_sounds -Migrations for 'netbox_animal_sounds': - /home/jstretch/animal_sounds/netbox_animal_sounds/migrations/0001_initial.py - - Create model Animal -``` - -Next, we can apply the migration to the database with the `migrate` command: - -```no-highlight -$ ./manage.py migrate netbox_animal_sounds -Operations to perform: - Apply all migrations: netbox_animal_sounds -Running migrations: - Applying netbox_animal_sounds.0001_initial... OK -``` - -For more background on schema migrations, see the [Django documentation](https://docs.djangoproject.com/en/stable/topics/migrations/). - -### Using the Django Admin Interface - -Plugins can optionally expose their models via Django's built-in [administrative interface](https://docs.djangoproject.com/en/stable/ref/contrib/admin/). This can greatly improve troubleshooting ability, particularly during development. To expose a model, simply register it using Django's `admin.register()` function. An example `admin.py` file for the above model is shown below: - -```python -from django.contrib import admin -from .models import Animal - -@admin.register(Animal) -class AnimalAdmin(admin.ModelAdmin): - list_display = ('name', 'sound') -``` - -This will display the plugin and its model in the admin UI. Staff users can create, change, and delete model instances via the admin UI without needing to create a custom view. - -![NetBox plugin in the admin UI](../media/plugins/plugin_admin_ui.png) - -## Views - -If your plugin needs its own page or pages in the NetBox web UI, you'll need to define views. A view is a particular page tied to a URL within NetBox, which renders content using a template. Views are typically defined in `views.py`, and URL patterns in `urls.py`. As an example, let's write a view which displays a random animal and the sound it makes. First, we'll create the view in `views.py`: - -```python -from django.shortcuts import render -from django.views.generic import View -from .models import Animal - -class RandomAnimalView(View): - """ - Display a randomly-selected animal. - """ - def get(self, request): - animal = Animal.objects.order_by('?').first() - return render(request, 'netbox_animal_sounds/animal.html', { - 'animal': animal, - }) -``` - -This view retrieves a random animal from the database and and passes it as a context variable when rendering a template named `animal.html`, which doesn't exist yet. To create this template, first create a directory named `templates/netbox_animal_sounds/` within the plugin source directory. (We use the plugin's name as a subdirectory to guard against naming collisions with other plugins.) Then, create a template named `animal.html` as described below. - -### Extending the Base Template - -NetBox provides a base template to ensure a consistent user experience, which plugins can extend with their own content. This template includes four content blocks: - -* `title` - The page title -* `header` - The upper portion of the page -* `content` - The main page body -* `javascript` - A section at the end of the page for including Javascript code - -For more information on how template blocks work, consult the [Django documentation](https://docs.djangoproject.com/en/stable/ref/templates/builtins/#block). - -```jinja2 -{% extends 'base/layout.html' %} - -{% block content %} - {% with config=settings.PLUGINS_CONFIG.netbox_animal_sounds %} -

    - {% if animal %} - The {{ animal.name|lower }} says - {% if config.loud %} - {{ animal.sound|upper }}! - {% else %} - {{ animal.sound }} - {% endif %} - {% else %} - No animals have been created yet! - {% endif %} -

    - {% endwith %} -{% endblock %} - -``` - -The first line of the template instructs Django to extend the NetBox base template and inject our custom content within its `content` block. - -!!! note - Django renders templates with its own custom [template language](https://docs.djangoproject.com/en/stable/topics/templates/#the-django-template-language). This is very similar to Jinja2, however there are some important differences to be aware of. - -Finally, to make the view accessible to users, we need to register a URL for it. We do this in `urls.py` by defining a `urlpatterns` variable containing a list of paths. - -```python -from django.urls import path -from . import views - -urlpatterns = [ - path('random/', views.RandomAnimalView.as_view(), name='random_animal'), -] -``` - -A URL pattern has three components: - -* `route` - The unique portion of the URL dedicated to this view -* `view` - The view itself -* `name` - A short name used to identify the URL path internally - -This makes our view accessible at the URL `/plugins/animal-sounds/random/`. (Remember, our `AnimalSoundsConfig` class sets our plugin's base URL to `animal-sounds`.) Viewing this URL should show the base NetBox template with our custom content inside it. - -## REST API Endpoints - -Plugins can declare custom endpoints on NetBox's REST API to retrieve or manipulate models or other data. These behave very similarly to views, except that instead of rendering arbitrary content using a template, data is returned in JSON format using a serializer. NetBox uses the [Django REST Framework](https://www.django-rest-framework.org/), which makes writing API serializers and views very simple. - -First, we'll create a serializer for our `Animal` model, in `api/serializers.py`: - -```python -from rest_framework.serializers import ModelSerializer -from netbox_animal_sounds.models import Animal - -class AnimalSerializer(ModelSerializer): - - class Meta: - model = Animal - fields = ('id', 'name', 'sound') -``` - -Next, we'll create a generic API view set that allows basic CRUD (create, read, update, and delete) operations for Animal instances. This is defined in `api/views.py`: - -```python -from rest_framework.viewsets import ModelViewSet -from netbox_animal_sounds.models import Animal -from .serializers import AnimalSerializer - -class AnimalViewSet(ModelViewSet): - queryset = Animal.objects.all() - serializer_class = AnimalSerializer -``` - -Finally, we'll register a URL for our endpoint in `api/urls.py`. This file **must** define a variable named `urlpatterns`. - -```python -from rest_framework import routers -from .views import AnimalViewSet - -router = routers.DefaultRouter() -router.register('animals', AnimalViewSet) -urlpatterns = router.urls -``` - -With these three components in place, we can request `/api/plugins/animal-sounds/animals/` to retrieve a list of all Animal objects defined. - -![NetBox REST API plugin endpoint](../media/plugins/plugin_rest_api_endpoint.png) - -!!! warning - This example is provided as a minimal reference implementation only. It does not address authentication, performance, or myriad other concerns that plugin authors should have. - -## Navigation Menu Items - -To make its views easily accessible to users, a plugin can inject items in NetBox's navigation menu under the "Plugins" header. Menu items are added by defining a list of PluginMenuItem instances. By default, this should be a variable named `menu_items` in the file `navigation.py`. An example is shown below. - -```python -from extras.plugins import PluginMenuButton, PluginMenuItem -from utilities.choices import ButtonColorChoices - -menu_items = ( - PluginMenuItem( - link='plugins:netbox_animal_sounds:random_animal', - link_text='Random sound', - buttons=( - PluginMenuButton('home', 'Button A', 'fa fa-info', ButtonColorChoices.BLUE), - PluginMenuButton('home', 'Button B', 'fa fa-warning', ButtonColorChoices.GREEN), - ) - ), -) -``` - -A `PluginMenuItem` has the following attributes: - -* `link` - The name of the URL path to which this menu item links -* `link_text` - The text presented to the user -* `permissions` - A list of permissions required to display this link (optional) -* `buttons` - An iterable of PluginMenuButton instances to display (optional) - -A `PluginMenuButton` has the following attributes: - -* `link` - The name of the URL path to which this button links -* `title` - The tooltip text (displayed when the mouse hovers over the button) -* `icon_class` - Button icon CSS class (NetBox currently supports [Font Awesome 4.7](https://fontawesome.com/v4.7.0/icons/)) -* `color` - One of the choices provided by `ButtonColorChoices` (optional) -* `permissions` - A list of permissions required to display this button (optional) - -!!! note - Any buttons associated within a menu item will be shown only if the user has permission to view the link, regardless of what permissions are set on the buttons. - -## Extending Core Templates - -Plugins can inject custom content into certain areas of the detail views of applicable models. This is accomplished by subclassing `PluginTemplateExtension`, designating a particular NetBox model, and defining the desired methods to render custom content. Four methods are available: - -* `left_page()` - Inject content on the left side of the page -* `right_page()` - Inject content on the right side of the page -* `full_width_page()` - Inject content across the entire bottom of the page -* `buttons()` - Add buttons to the top of the page - -Additionally, a `render()` method is available for convenience. This method accepts the name of a template to render, and any additional context data you want to pass. Its use is optional, however. - -When a PluginTemplateExtension is instantiated, context data is assigned to `self.context`. Available data include: - -* `object` - The object being viewed -* `request` - The current request -* `settings` - Global NetBox settings -* `config` - Plugin-specific configuration parameters - -For example, accessing `{{ request.user }}` within a template will return the current user. - -Declared subclasses should be gathered into a list or tuple for integration with NetBox. By default, NetBox looks for an iterable named `template_extensions` within a `template_content.py` file. (This can be overridden by setting `template_extensions` to a custom value on the plugin's PluginConfig.) An example is below. - -```python -from extras.plugins import PluginTemplateExtension -from .models import Animal - -class SiteAnimalCount(PluginTemplateExtension): - model = 'dcim.site' - - def right_page(self): - return self.render('netbox_animal_sounds/inc/animal_count.html', extra_context={ - 'animal_count': Animal.objects.count(), - }) - -template_extensions = [SiteAnimalCount] -``` - -## Background Tasks - -By default, Netbox provides 3 differents [RQ](https://python-rq.org/) queues to run background jobs : *high*, *default* and *low*. -These 3 core queues can be used out-of-the-box by plugins to define background tasks. - -Plugins can also define dedicated queues. These queues can be configured under the PluginConfig class `queues` attribute. An example configuration -is below: - -```python -class MyPluginConfig(PluginConfig): - name = 'myplugin' - ... - queues = [ - 'queue1', - 'queue2', - 'queue-whatever-the-name' - ] -``` - -The PluginConfig above creates 3 queues with the following names: *myplugin.queue1*, *myplugin.queue2*, *myplugin.queue-whatever-the-name*. -As you can see, the queue's name is always preprended with the plugin's name, to avoid any name clashes between different plugins. - -In case you create dedicated queues for your plugin, it is strongly advised to also create a dedicated RQ worker instance. This instance should only listen to the queues defined in your plugin - to avoid impact between your background tasks and netbox internal tasks. - -``` -python manage.py rqworker myplugin.queue1 myplugin.queue2 myplugin.queue-whatever-the-name -``` diff --git a/docs/plugins/development/background-tasks.md b/docs/plugins/development/background-tasks.md new file mode 100644 index 00000000000..7c7e2936bc4 --- /dev/null +++ b/docs/plugins/development/background-tasks.md @@ -0,0 +1,27 @@ +# Background Tasks + +By default, Netbox provides 3 differents [RQ](https://python-rq.org/) queues to run background jobs : *high*, *default* and *low*. +These 3 core queues can be used out-of-the-box by plugins to define background tasks. + +Plugins can also define dedicated queues. These queues can be configured under the PluginConfig class `queues` attribute. An example configuration +is below: + +```python +class MyPluginConfig(PluginConfig): + name = 'myplugin' + ... + queues = [ + 'queue1', + 'queue2', + 'queue-whatever-the-name' + ] +``` + +The PluginConfig above creates 3 queues with the following names: *myplugin.queue1*, *myplugin.queue2*, *myplugin.queue-whatever-the-name*. +As you can see, the queue's name is always preprended with the plugin's name, to avoid any name clashes between different plugins. + +In case you create dedicated queues for your plugin, it is strongly advised to also create a dedicated RQ worker instance. This instance should only listen to the queues defined in your plugin - to avoid impact between your background tasks and netbox internal tasks. + +``` +python manage.py rqworker myplugin.queue1 myplugin.queue2 myplugin.queue-whatever-the-name +``` diff --git a/docs/plugins/development/generic-views.md b/docs/plugins/development/generic-views.md deleted file mode 100644 index 1a444ca2c26..00000000000 --- a/docs/plugins/development/generic-views.md +++ /dev/null @@ -1,96 +0,0 @@ -# Generic Views - -NetBox provides several generic view classes to facilitate common operations, such as creating, viewing, modifying, and deleting objects. Plugins can subclass these views for their own use. - -| View Class | Description | -|------------|-------------| -| `ObjectView` | View a single object | -| `ObjectEditView` | Create or edit a single object | -| `ObjectDeleteView` | Delete a single object | -| `ObjectListView` | View a list of objects | -| `BulkImportView` | Import a set of new objects | -| `BulkEditView` | Edit multiple objects | -| `BulkDeleteView` | Delete multiple objects | - -!!! note - Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `views.generic` module, they are not yet supported for use by plugins. - -### Example Usage - -```python -# views.py -from netbox.views.generic import ObjectEditView -from .models import Thing - -class ThingEditView(ObjectEditView): - queryset = Thing.objects.all() - template_name = 'myplugin/thing.html' - ... -``` - -## Object Views - -Below is the class definition for NetBox's BaseObjectView. The attributes and methods defined here are available on all generic views which handle a single object. - -::: netbox.views.generic.base.BaseObjectView - rendering: - show_source: false - -::: netbox.views.generic.ObjectView - selection: - members: - - get_object - - get_template_name - rendering: - show_source: false - -::: netbox.views.generic.ObjectEditView - selection: - members: - - get_object - - alter_object - rendering: - show_source: false - -::: netbox.views.generic.ObjectDeleteView - selection: - members: - - get_object - rendering: - show_source: false - -## Multi-Object Views - -Below is the class definition for NetBox's BaseMultiObjectView. The attributes and methods defined here are available on all generic views which deal with multiple objects. - -::: netbox.views.generic.base.BaseMultiObjectView - rendering: - show_source: false - -::: netbox.views.generic.ObjectListView - selection: - members: - - get_table - - export_table - - export_template - rendering: - show_source: false - -::: netbox.views.generic.BulkImportView - selection: - members: false - rendering: - show_source: false - -::: netbox.views.generic.BulkEditView - selection: - members: false - rendering: - show_source: false - -::: netbox.views.generic.BulkDeleteView - selection: - members: - - get_form - rendering: - show_source: false diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md index 31ce5fc2e97..07a04f39f11 100644 --- a/docs/plugins/development/index.md +++ b/docs/plugins/development/index.md @@ -1,3 +1,146 @@ # Plugins Development -TODO +!!! info "Help Improve the NetBox Plugins Framework!" + We're looking for volunteers to help improve NetBox's plugins framework. If you have experience developing plugins, we'd love to hear from you! You can find more information about this initiative [here](https://github.com/netbox-community/netbox/discussions/8338). + +This documentation covers the development of custom plugins for NetBox. Plugins are essentially self-contained [Django apps](https://docs.djangoproject.com/en/stable/) which integrate with NetBox to provide custom functionality. Since the development of Django apps is already very well-documented, we'll only be covering the aspects that are specific to NetBox. + +Plugins can do a lot, including: + +* Create Django models to store data in the database +* Provide their own "pages" (views) in the web user interface +* Inject template content and navigation links +* Establish their own REST API endpoints +* Add custom request/response middleware + +However, keep in mind that each piece of functionality is entirely optional. For example, if your plugin merely adds a piece of middleware or an API endpoint for existing data, there's no need to define any new models. + +!!! warning + While very powerful, the NetBox plugins API is necessarily limited in its scope. The plugins API is discussed here in its entirety: Any part of the NetBox code base not documented here is _not_ part of the supported plugins API, and should not be employed by a plugin. Internal elements of NetBox are subject to change at any time and without warning. Plugin authors are **strongly** encouraged to develop plugins using only the officially supported components discussed here and those provided by the underlying Django framework so as to avoid breaking changes in future releases. + +## Initial Setup + +### Plugin Structure + +Although the specific structure of a plugin is largely left to the discretion of its authors, a typical NetBox plugin looks something like this: + +```no-highlight +project-name/ + - plugin_name/ + - templates/ + - plugin_name/ + - *.html + - __init__.py + - middleware.py + - navigation.py + - signals.py + - template_content.py + - urls.py + - views.py + - README + - setup.py +``` + +The top level is the project root, which can have any name that you like. Immediately within the root should exist several items: + +* `setup.py` - This is a standard installation script used to install the plugin package within the Python environment. +* `README` - A brief introduction to your plugin, how to install and configure it, where to find help, and any other pertinent information. It is recommended to write README files using a markup language such as Markdown. +* The plugin source directory, with the same name as your plugin. This must be a valid Python package name (e.g. no spaces or hyphens). + +The plugin source directory contains all the actual Python code and other resources used by your plugin. Its structure is left to the author's discretion, however it is recommended to follow best practices as outlined in the [Django documentation](https://docs.djangoproject.com/en/stable/intro/reusable-apps/). At a minimum, this directory **must** contain an `__init__.py` file containing an instance of NetBox's `PluginConfig` class. + +### Create setup.py + +`setup.py` is the [setup script](https://docs.python.org/3.8/distutils/setupscript.html) we'll use to install our plugin once it's finished. The primary function of this script is to call the setuptools library's `setup()` function to create a Python distribution package. We can pass a number of keyword arguments to inform the package creation as well as to provide metadata about the plugin. An example `setup.py` is below: + +```python +from setuptools import find_packages, setup + +setup( + name='netbox-animal-sounds', + version='0.1', + description='An example NetBox plugin', + url='https://github.com/netbox-community/netbox-animal-sounds', + author='Jeremy Stretch', + license='Apache 2.0', + install_requires=[], + packages=find_packages(), + include_package_data=True, + zip_safe=False, +) +``` + +Many of these are self-explanatory, but for more information, see the [setuptools documentation](https://setuptools.readthedocs.io/en/latest/setuptools.html). + +!!! note + `zip_safe=False` is **required** as the current plugin iteration is not zip safe due to upstream python issue [issue19699](https://bugs.python.org/issue19699) + +### Define a PluginConfig + +The `PluginConfig` class is a NetBox-specific wrapper around Django's built-in [`AppConfig`](https://docs.djangoproject.com/en/stable/ref/applications/) class. It is used to declare NetBox plugin functionality within a Python package. Each plugin should provide its own subclass, defining its name, metadata, and default and required configuration parameters. An example is below: + +```python +from extras.plugins import PluginConfig + +class AnimalSoundsConfig(PluginConfig): + name = 'netbox_animal_sounds' + verbose_name = 'Animal Sounds' + description = 'An example plugin for development purposes' + version = '0.1' + author = 'Jeremy Stretch' + author_email = 'author@example.com' + base_url = 'animal-sounds' + required_settings = [] + default_settings = { + 'loud': False + } + +config = AnimalSoundsConfig +``` + +NetBox looks for the `config` variable within a plugin's `__init__.py` to load its configuration. Typically, this will be set to the PluginConfig subclass, but you may wish to dynamically generate a PluginConfig class based on environment variables or other factors. + +#### PluginConfig Attributes + +| Name | Description | +| ---- |---------------------------------------------------------------------------------------------------------------| +| `name` | Raw plugin name; same as the plugin's source directory | +| `verbose_name` | Human-friendly name for the plugin | +| `version` | Current release ([semantic versioning](https://semver.org/) is encouraged) | +| `description` | Brief description of the plugin's purpose | +| `author` | Name of plugin's author | +| `author_email` | Author's public email address | +| `base_url` | Base path to use for plugin URLs (optional). If not specified, the project's `name` will be used. | +| `required_settings` | A list of any configuration parameters that **must** be defined by the user | +| `default_settings` | A dictionary of configuration parameters and their default values | +| `min_version` | Minimum version of NetBox with which the plugin is compatible | +| `max_version` | Maximum version of NetBox with which the plugin is compatible | +| `middleware` | A list of middleware classes to append after NetBox's build-in middleware | +| `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) | +| `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) | +| `user_preferences` | The dotted path to the dictionary mapping of user preferences defined by the plugin (default: `preferences.preferences`) | + +All required settings must be configured by the user. If a configuration parameter is listed in both `required_settings` and `default_settings`, the default setting will be ignored. + +### Create a Virtual Environment + +It is strongly recommended to create a Python [virtual environment](https://docs.python.org/3/tutorial/venv.html) specific to your plugin. This will afford you complete control over the installed versions of all dependencies and avoid conflicting with any system packages. This environment can live wherever you'd like, however it should be excluded from revision control. (A popular convention is to keep all virtual environments in the user's home directory, e.g. `~/.virtualenvs/`.) + +```shell +python3 -m venv /path/to/my/venv +``` + +You can make NetBox available within this environment by creating a path file pointing to its location. This will add NetBox to the Python path upon activation. (Be sure to adjust the command below to specify your actual virtual environment path, Python version, and NetBox installation.) + +```shell +cd $VENV/lib/python3.8/site-packages/ +echo /opt/netbox/netbox > netbox.pth +``` + +### Install the Plugin for Development + +To ease development, it is recommended to go ahead and install the plugin at this point using setuptools' `develop` mode. This will create symbolic links within your Python environment to the plugin development directory. Call `setup.py` from the plugin's root directory with the `develop` argument (instead of `install`): + +```no-highlight +$ python setup.py develop +``` diff --git a/docs/plugins/development/model-features.md b/docs/plugins/development/model-features.md deleted file mode 100644 index 35eb9389f21..00000000000 --- a/docs/plugins/development/model-features.md +++ /dev/null @@ -1,64 +0,0 @@ -# Model Features - -## Enabling NetBox Features - -Plugin models can leverage certain NetBox features by inheriting from NetBox's `BaseModel` class. This class extends the plugin model to enable numerous feature, including: - -* Custom fields -* Custom links -* Custom validation -* Export templates -* Journaling -* Tags -* Webhooks - -This class performs two crucial functions: - -1. Apply any fields, methods, or attributes necessary to the operation of these features -2. Register the model with NetBox as utilizing these feature - -Simply subclass BaseModel when defining a model in your plugin: - -```python -# models.py -from netbox.models import BaseModel - -class MyModel(BaseModel): - foo = models.CharField() - ... -``` - -## Enabling Features Individually - -If you prefer instead to enable only a subset of these features for a plugin model, NetBox provides a discrete "mix-in" class for each feature. You can subclass each of these individually when defining your model. (You will also need to inherit from Django's built-in `Model` class.) - -```python -# models.py -from django.db.models import models -from netbox.models.features import ExportTemplatesMixin, TagsMixin - -class MyModel(ExportTemplatesMixin, TagsMixin, models.Model): - foo = models.CharField() - ... -``` - -The example above will enable export templates and tags, but no other NetBox features. A complete list of available feature mixins is included below. (Inheriting all the available mixins is essentially the same as subclassing `BaseModel`.) - -## Feature Mixins Reference - -!!! note - Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `features` module, they are not yet supported for use by plugins. - -::: netbox.models.features.CustomLinksMixin - -::: netbox.models.features.CustomFieldsMixin - -::: netbox.models.features.CustomValidationMixin - -::: netbox.models.features.ExportTemplatesMixin - -::: netbox.models.features.JournalingMixin - -::: netbox.models.features.TagsMixin - -::: netbox.models.features.WebhooksMixin diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md new file mode 100644 index 00000000000..bf06faf08e6 --- /dev/null +++ b/docs/plugins/development/models.md @@ -0,0 +1,107 @@ +# Database Models + +## Creating Models + +If your plugin introduces a new type of object in NetBox, you'll probably want to create a [Django model](https://docs.djangoproject.com/en/stable/topics/db/models/) for it. A model is essentially a Python representation of a database table, with attributes that represent individual columns. Model instances can be created, manipulated, and deleted using [queries](https://docs.djangoproject.com/en/stable/topics/db/queries/). Models must be defined within a file named `models.py`. + +Below is an example `models.py` file containing a model with two character fields: + +```python +from django.db import models + +class Animal(models.Model): + name = models.CharField(max_length=50) + sound = models.CharField(max_length=50) + + def __str__(self): + return self.name +``` + +### Migrations + +Once you have defined the model(s) for your plugin, you'll need to create the database schema migrations. A migration file is essentially a set of instructions for manipulating the PostgreSQL database to support your new model, or to alter existing models. Creating migrations can usually be done automatically using Django's `makemigrations` management command. + +!!! note + A plugin must be installed before it can be used with Django management commands. If you skipped this step above, run `python setup.py develop` from the plugin's root directory. + +```no-highlight +$ ./manage.py makemigrations netbox_animal_sounds +Migrations for 'netbox_animal_sounds': + /home/jstretch/animal_sounds/netbox_animal_sounds/migrations/0001_initial.py + - Create model Animal +``` + +Next, we can apply the migration to the database with the `migrate` command: + +```no-highlight +$ ./manage.py migrate netbox_animal_sounds +Operations to perform: + Apply all migrations: netbox_animal_sounds +Running migrations: + Applying netbox_animal_sounds.0001_initial... OK +``` + +For more background on schema migrations, see the [Django documentation](https://docs.djangoproject.com/en/stable/topics/migrations/). + +## Enabling NetBox Features + +Plugin models can leverage certain NetBox features by inheriting from NetBox's `BaseModel` class. This class extends the plugin model to enable numerous feature, including: + +* Custom fields +* Custom links +* Custom validation +* Export templates +* Journaling +* Tags +* Webhooks + +This class performs two crucial functions: + +1. Apply any fields, methods, or attributes necessary to the operation of these features +2. Register the model with NetBox as utilizing these feature + +Simply subclass BaseModel when defining a model in your plugin: + +```python +# models.py +from netbox.models import BaseModel + +class MyModel(BaseModel): + foo = models.CharField() + ... +``` + +### Enabling Features Individually + +If you prefer instead to enable only a subset of these features for a plugin model, NetBox provides a discrete "mix-in" class for each feature. You can subclass each of these individually when defining your model. (You will also need to inherit from Django's built-in `Model` class.) + +```python +# models.py +from django.db.models import models +from netbox.models.features import ExportTemplatesMixin, TagsMixin + +class MyModel(ExportTemplatesMixin, TagsMixin, models.Model): + foo = models.CharField() + ... +``` + +The example above will enable export templates and tags, but no other NetBox features. A complete list of available feature mixins is included below. (Inheriting all the available mixins is essentially the same as subclassing `BaseModel`.) + +## Feature Mixins Reference + +!!! note + Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `features` module, they are not yet supported for use by plugins. + +::: netbox.models.features.CustomLinksMixin + +::: netbox.models.features.CustomFieldsMixin + +::: netbox.models.features.CustomValidationMixin + +::: netbox.models.features.ExportTemplatesMixin + +::: netbox.models.features.JournalingMixin + +::: netbox.models.features.TagsMixin + +::: netbox.models.features.WebhooksMixin diff --git a/docs/plugins/development/rest-api.md b/docs/plugins/development/rest-api.md new file mode 100644 index 00000000000..efe7b112750 --- /dev/null +++ b/docs/plugins/development/rest-api.md @@ -0,0 +1,46 @@ +# REST API + +Plugins can declare custom endpoints on NetBox's REST API to retrieve or manipulate models or other data. These behave very similarly to views, except that instead of rendering arbitrary content using a template, data is returned in JSON format using a serializer. NetBox uses the [Django REST Framework](https://www.django-rest-framework.org/), which makes writing API serializers and views very simple. + +First, we'll create a serializer for our `Animal` model, in `api/serializers.py`: + +```python +from rest_framework.serializers import ModelSerializer +from netbox_animal_sounds.models import Animal + +class AnimalSerializer(ModelSerializer): + + class Meta: + model = Animal + fields = ('id', 'name', 'sound') +``` + +Next, we'll create a generic API view set that allows basic CRUD (create, read, update, and delete) operations for Animal instances. This is defined in `api/views.py`: + +```python +from rest_framework.viewsets import ModelViewSet +from netbox_animal_sounds.models import Animal +from .serializers import AnimalSerializer + +class AnimalViewSet(ModelViewSet): + queryset = Animal.objects.all() + serializer_class = AnimalSerializer +``` + +Finally, we'll register a URL for our endpoint in `api/urls.py`. This file **must** define a variable named `urlpatterns`. + +```python +from rest_framework import routers +from .views import AnimalViewSet + +router = routers.DefaultRouter() +router.register('animals', AnimalViewSet) +urlpatterns = router.urls +``` + +With these three components in place, we can request `/api/plugins/animal-sounds/animals/` to retrieve a list of all Animal objects defined. + +![NetBox REST API plugin endpoint](../../media/plugins/plugin_rest_api_endpoint.png) + +!!! warning + This example is provided as a minimal reference implementation only. It does not address authentication, performance, or myriad other concerns that plugin authors should have. diff --git a/docs/plugins/development/views.md b/docs/plugins/development/views.md new file mode 100644 index 00000000000..9c44e18ede6 --- /dev/null +++ b/docs/plugins/development/views.md @@ -0,0 +1,254 @@ +# Views + +If your plugin needs its own page or pages in the NetBox web UI, you'll need to define views. A view is a particular page tied to a URL within NetBox, which renders content using a template. Views are typically defined in `views.py`, and URL patterns in `urls.py`. As an example, let's write a view which displays a random animal and the sound it makes. First, we'll create the view in `views.py`: + +```python +from django.shortcuts import render +from django.views.generic import View +from .models import Animal + +class RandomAnimalView(View): + """ + Display a randomly-selected animal. + """ + def get(self, request): + animal = Animal.objects.order_by('?').first() + return render(request, 'netbox_animal_sounds/animal.html', { + 'animal': animal, + }) +``` + +This view retrieves a random animal from the database and and passes it as a context variable when rendering a template named `animal.html`, which doesn't exist yet. To create this template, first create a directory named `templates/netbox_animal_sounds/` within the plugin source directory. (We use the plugin's name as a subdirectory to guard against naming collisions with other plugins.) Then, create a template named `animal.html` as described below. + +## View Classes + +NetBox provides several generic view classes (documented below) to facilitate common operations, such as creating, viewing, modifying, and deleting objects. Plugins can subclass these views for their own use. + +| View Class | Description | +|------------|-------------| +| `ObjectView` | View a single object | +| `ObjectEditView` | Create or edit a single object | +| `ObjectDeleteView` | Delete a single object | +| `ObjectListView` | View a list of objects | +| `BulkImportView` | Import a set of new objects | +| `BulkEditView` | Edit multiple objects | +| `BulkDeleteView` | Delete multiple objects | + +!!! warning + Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `views.generic` module, they are not yet supported for use by plugins. + +### Example Usage + +```python +# views.py +from netbox.views.generic import ObjectEditView +from .models import Thing + +class ThingEditView(ObjectEditView): + queryset = Thing.objects.all() + template_name = 'myplugin/thing.html' + ... +``` + +## URL Registration + +To make the view accessible to users, we need to register a URL for it. We do this in `urls.py` by defining a `urlpatterns` variable containing a list of paths. + +```python +from django.urls import path +from . import views + +urlpatterns = [ + path('random/', views.RandomAnimalView.as_view(), name='random_animal'), +] +``` + +A URL pattern has three components: + +* `route` - The unique portion of the URL dedicated to this view +* `view` - The view itself +* `name` - A short name used to identify the URL path internally + +This makes our view accessible at the URL `/plugins/animal-sounds/random/`. (Remember, our `AnimalSoundsConfig` class sets our plugin's base URL to `animal-sounds`.) Viewing this URL should show the base NetBox template with our custom content inside it. + +## Templates + +### Plugin Views + +NetBox provides a base template to ensure a consistent user experience, which plugins can extend with their own content. This template includes four content blocks: + +* `title` - The page title +* `header` - The upper portion of the page +* `content` - The main page body +* `javascript` - A section at the end of the page for including Javascript code + +For more information on how template blocks work, consult the [Django documentation](https://docs.djangoproject.com/en/stable/ref/templates/builtins/#block). + +```jinja2 +{% extends 'base/layout.html' %} + +{% block content %} + {% with config=settings.PLUGINS_CONFIG.netbox_animal_sounds %} +

    + {% if animal %} + The {{ animal.name|lower }} says + {% if config.loud %} + {{ animal.sound|upper }}! + {% else %} + {{ animal.sound }} + {% endif %} + {% else %} + No animals have been created yet! + {% endif %} +

    + {% endwith %} +{% endblock %} + +``` + +The first line of the template instructs Django to extend the NetBox base template and inject our custom content within its `content` block. + +!!! note + Django renders templates with its own custom [template language](https://docs.djangoproject.com/en/stable/topics/templates/#the-django-template-language). This is very similar to Jinja2, however there are some important differences to be aware of. + +### Extending Core Views + +Plugins can inject custom content into certain areas of the detail views of applicable models. This is accomplished by subclassing `PluginTemplateExtension`, designating a particular NetBox model, and defining the desired methods to render custom content. Four methods are available: + +* `left_page()` - Inject content on the left side of the page +* `right_page()` - Inject content on the right side of the page +* `full_width_page()` - Inject content across the entire bottom of the page +* `buttons()` - Add buttons to the top of the page + +Additionally, a `render()` method is available for convenience. This method accepts the name of a template to render, and any additional context data you want to pass. Its use is optional, however. + +When a PluginTemplateExtension is instantiated, context data is assigned to `self.context`. Available data include: + +* `object` - The object being viewed +* `request` - The current request +* `settings` - Global NetBox settings +* `config` - Plugin-specific configuration parameters + +For example, accessing `{{ request.user }}` within a template will return the current user. + +Declared subclasses should be gathered into a list or tuple for integration with NetBox. By default, NetBox looks for an iterable named `template_extensions` within a `template_content.py` file. (This can be overridden by setting `template_extensions` to a custom value on the plugin's PluginConfig.) An example is below. + +```python +from extras.plugins import PluginTemplateExtension +from .models import Animal + +class SiteAnimalCount(PluginTemplateExtension): + model = 'dcim.site' + + def right_page(self): + return self.render('netbox_animal_sounds/inc/animal_count.html', extra_context={ + 'animal_count': Animal.objects.count(), + }) + +template_extensions = [SiteAnimalCount] +``` + +## Navigation Menu Items + +To make its views easily accessible to users, a plugin can inject items in NetBox's navigation menu under the "Plugins" header. Menu items are added by defining a list of PluginMenuItem instances. By default, this should be a variable named `menu_items` in the file `navigation.py`. An example is shown below. + +```python +from extras.plugins import PluginMenuButton, PluginMenuItem +from utilities.choices import ButtonColorChoices + +menu_items = ( + PluginMenuItem( + link='plugins:netbox_animal_sounds:random_animal', + link_text='Random sound', + buttons=( + PluginMenuButton('home', 'Button A', 'fa fa-info', ButtonColorChoices.BLUE), + PluginMenuButton('home', 'Button B', 'fa fa-warning', ButtonColorChoices.GREEN), + ) + ), +) +``` + +A `PluginMenuItem` has the following attributes: + +* `link` - The name of the URL path to which this menu item links +* `link_text` - The text presented to the user +* `permissions` - A list of permissions required to display this link (optional) +* `buttons` - An iterable of PluginMenuButton instances to display (optional) + +A `PluginMenuButton` has the following attributes: + +* `link` - The name of the URL path to which this button links +* `title` - The tooltip text (displayed when the mouse hovers over the button) +* `icon_class` - Button icon CSS class (NetBox currently supports [Font Awesome 4.7](https://fontawesome.com/v4.7.0/icons/)) +* `color` - One of the choices provided by `ButtonColorChoices` (optional) +* `permissions` - A list of permissions required to display this button (optional) + +!!! note + Any buttons associated within a menu item will be shown only if the user has permission to view the link, regardless of what permissions are set on the buttons. + +## Object Views Reference + +Below is the class definition for NetBox's BaseObjectView. The attributes and methods defined here are available on all generic views which handle a single object. + +::: netbox.views.generic.base.BaseObjectView + rendering: + show_source: false + +::: netbox.views.generic.ObjectView + selection: + members: + - get_object + - get_template_name + rendering: + show_source: false + +::: netbox.views.generic.ObjectEditView + selection: + members: + - get_object + - alter_object + rendering: + show_source: false + +::: netbox.views.generic.ObjectDeleteView + selection: + members: + - get_object + rendering: + show_source: false + +## Multi-Object Views Reference + +Below is the class definition for NetBox's BaseMultiObjectView. The attributes and methods defined here are available on all generic views which deal with multiple objects. + +::: netbox.views.generic.base.BaseMultiObjectView + rendering: + show_source: false + +::: netbox.views.generic.ObjectListView + selection: + members: + - get_table + - export_table + - export_template + rendering: + show_source: false + +::: netbox.views.generic.BulkImportView + selection: + members: false + rendering: + show_source: false + +::: netbox.views.generic.BulkEditView + selection: + members: false + rendering: + show_source: false + +::: netbox.views.generic.BulkDeleteView + selection: + members: + - get_form + rendering: + show_source: false diff --git a/mkdocs.yml b/mkdocs.yml index dbd31cb500b..148e083d282 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -101,10 +101,11 @@ nav: - Plugins: - Using Plugins: 'plugins/index.md' - Developing Plugins: - - Introduction: 'plugins/development/index.md' - - Model Features: 'plugins/development/model-features.md' - - Generic Views: 'plugins/development/generic-views.md' - - Developing Plugins (Old): 'plugins/development.md' + - Getting Started: 'plugins/development/index.md' + - Database Models: 'plugins/development/models.md' + - Views: 'plugins/development/views.md' + - REST API: 'plugins/development/rest-api.md' + - Background Tasks: 'plugins/development/background-tasks.md' - Administration: - Authentication: 'administration/authentication.md' - Permissions: 'administration/permissions.md' From acc9ca7d7df98b147b34be8ccfc3fcac6f8fbb3c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 25 Jan 2022 16:11:49 -0500 Subject: [PATCH 115/271] Move TagFilter to PrimaryFilterSet --- netbox/circuits/filtersets.py | 5 ----- netbox/dcim/filtersets.py | 22 ---------------------- netbox/ipam/filtersets.py | 14 -------------- netbox/netbox/filtersets.py | 5 +++++ netbox/tenancy/filtersets.py | 6 ------ netbox/virtualization/filtersets.py | 6 ------ netbox/wireless/filtersets.py | 4 ---- 7 files changed, 5 insertions(+), 57 deletions(-) diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 0a90116bdc6..998a7bb6d09 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -3,7 +3,6 @@ from django.db.models import Q from dcim.filtersets import CableTerminationFilterSet from dcim.models import Region, Site, SiteGroup -from extras.filters import TagFilter from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import TreeNodeMultipleChoiceFilter @@ -61,7 +60,6 @@ class ProviderFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Site (slug)', ) - tag = TagFilter() class Meta: model = Provider @@ -94,7 +92,6 @@ class ProviderNetworkFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Provider (slug)', ) - tag = TagFilter() class Meta: model = ProviderNetwork @@ -112,7 +109,6 @@ class ProviderNetworkFilterSet(PrimaryModelFilterSet): class CircuitTypeFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = CircuitType @@ -190,7 +186,6 @@ class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label='Site (slug)', ) - tag = TagFilter() class Meta: model = Circuit diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 4dfb080bc03..a7402fa5f0a 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1,7 +1,6 @@ import django_filters from django.contrib.auth.models import User -from extras.filters import TagFilter from extras.filtersets import LocalConfigContextFilterSet from ipam.models import ASN, VRF from netbox.filtersets import ( @@ -79,7 +78,6 @@ class RegionFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Parent region (slug)', ) - tag = TagFilter() class Meta: model = Region @@ -97,7 +95,6 @@ class SiteGroupFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Parent site group (slug)', ) - tag = TagFilter() class Meta: model = SiteGroup @@ -148,7 +145,6 @@ class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet): queryset=ASN.objects.all(), label='AS (ID)', ) - tag = TagFilter() class Meta: model = Site @@ -225,7 +221,6 @@ class LocationFilterSet(TenancyFilterSet, OrganizationalModelFilterSet): to_field_name='slug', label='Location (slug)', ) - tag = TagFilter() class Meta: model = Location @@ -241,7 +236,6 @@ class LocationFilterSet(TenancyFilterSet, OrganizationalModelFilterSet): class RackRoleFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = RackRole @@ -325,7 +319,6 @@ class RackFilterSet(PrimaryModelFilterSet, TenancyFilterSet): serial = django_filters.CharFilter( lookup_expr='iexact' ) - tag = TagFilter() class Meta: model = Rack @@ -389,7 +382,6 @@ class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='username', label='User (name)', ) - tag = TagFilter() class Meta: model = RackReservation @@ -407,7 +399,6 @@ class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet): class ManufacturerFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = Manufacturer @@ -461,7 +452,6 @@ class DeviceTypeFilterSet(PrimaryModelFilterSet): method='_device_bays', label='Has device bays', ) - tag = TagFilter() class Meta: model = DeviceType @@ -546,7 +536,6 @@ class ModuleTypeFilterSet(PrimaryModelFilterSet): method='_pass_through_ports', label='Has pass-through ports', ) - tag = TagFilter() class Meta: model = ModuleType @@ -732,7 +721,6 @@ class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeCompo class DeviceRoleFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = DeviceRole @@ -751,7 +739,6 @@ class PlatformFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Manufacturer (slug)', ) - tag = TagFilter() class Meta: model = Platform @@ -916,7 +903,6 @@ class DeviceFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContex method='_device_bays', label='Has device bays', ) - tag = TagFilter() class Meta: model = Device @@ -990,7 +976,6 @@ class ModuleFilterSet(PrimaryModelFilterSet): queryset=Device.objects.all(), label='Device (ID)', ) - tag = TagFilter() class Meta: model = Module @@ -1080,7 +1065,6 @@ class DeviceComponentFilterSet(django_filters.FilterSet): to_field_name='name', label='Virtual Chassis', ) - tag = TagFilter() def search(self, queryset, name, value): if not value.strip(): @@ -1202,7 +1186,6 @@ class InterfaceFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableT ) mac_address = MultiValueMACAddressFilter() wwn = MultiValueWWNFilter() - tag = TagFilter() vlan_id = django_filters.CharFilter( method='filter_vlan_id', label='Assigned VLAN' @@ -1377,7 +1360,6 @@ class InventoryItemFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): class InventoryItemRoleFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = InventoryItemRole @@ -1447,7 +1429,6 @@ class VirtualChassisFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Tenant (slug)', ) - tag = TagFilter() class Meta: model = VirtualChassis @@ -1505,7 +1486,6 @@ class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet): method='filter_device', field_name='device__site__slug' ) - tag = TagFilter() class Meta: model = Cable @@ -1571,7 +1551,6 @@ class PowerPanelFilterSet(PrimaryModelFilterSet): lookup_expr='in', label='Location (ID)', ) - tag = TagFilter() class Meta: model = PowerPanel @@ -1641,7 +1620,6 @@ class PowerFeedFilterSet(PrimaryModelFilterSet, CableTerminationFilterSet, PathE choices=PowerFeedStatusChoices, null_value=None ) - tag = TagFilter() class Meta: model = PowerFeed diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 52e4499c7e7..aaba09bc617 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -6,7 +6,6 @@ from django.db.models import Q from netaddr.core import AddrFormatError from dcim.models import Device, Interface, Region, Site, SiteGroup -from extras.filters import TagFilter from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import ( @@ -63,7 +62,6 @@ class VRFFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='name', label='Export target (name)', ) - tag = TagFilter() def search(self, queryset, name, value): if not value.strip(): @@ -106,7 +104,6 @@ class RouteTargetFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='rd', label='Export VRF (RD)', ) - tag = TagFilter() def search(self, queryset, name, value): if not value.strip(): @@ -122,7 +119,6 @@ class RouteTargetFilterSet(PrimaryModelFilterSet, TenancyFilterSet): class RIRFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = RIR @@ -152,7 +148,6 @@ class AggregateFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label='RIR (slug)', ) - tag = TagFilter() class Meta: model = Aggregate @@ -218,7 +213,6 @@ class RoleFilterSet(OrganizationalModelFilterSet): method='search', label='Search', ) - tag = TagFilter() class Meta: model = Role @@ -347,7 +341,6 @@ class PrefixFilterSet(PrimaryModelFilterSet, TenancyFilterSet): choices=PrefixStatusChoices, null_value=None ) - tag = TagFilter() class Meta: model = Prefix @@ -453,7 +446,6 @@ class IPRangeFilterSet(TenancyFilterSet, PrimaryModelFilterSet): choices=IPRangeStatusChoices, null_value=None ) - tag = TagFilter() class Meta: model = IPRange @@ -578,7 +570,6 @@ class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet): role = django_filters.MultipleChoiceFilter( choices=IPAddressRoleChoices ) - tag = TagFilter() class Meta: model = IPAddress @@ -664,7 +655,6 @@ class FHRPGroupFilterSet(PrimaryModelFilterSet): queryset=IPAddress.objects.all(), method='filter_related_ip' ) - tag = TagFilter() class Meta: model = FHRPGroup @@ -737,7 +727,6 @@ class VLANGroupFilterSet(OrganizationalModelFilterSet): cluster = django_filters.NumberFilter( method='filter_scope' ) - tag = TagFilter() class Meta: model = VLANGroup @@ -832,7 +821,6 @@ class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet): queryset=VirtualMachine.objects.all(), method='get_for_virtualmachine' ) - tag = TagFilter() class Meta: model = VLAN @@ -864,7 +852,6 @@ class ServiceTemplateFilterSet(PrimaryModelFilterSet): field_name='ports', lookup_expr='contains' ) - tag = TagFilter() class Meta: model = ServiceTemplate @@ -906,7 +893,6 @@ class ServiceFilterSet(PrimaryModelFilterSet): field_name='ports', lookup_expr='contains' ) - tag = TagFilter() class Meta: model = Service diff --git a/netbox/netbox/filtersets.py b/netbox/netbox/filtersets.py index f42ab064b15..3ddf252c7c3 100644 --- a/netbox/netbox/filtersets.py +++ b/netbox/netbox/filtersets.py @@ -120,6 +120,10 @@ class BaseFilterSet(django_filters.FilterSet): def get_additional_lookups(cls, existing_filter_name, existing_filter): new_filters = {} + # Skip on abstract models + if not cls._meta.model: + return {} + # Skip nonstandard lookup expressions if existing_filter.method is not None or existing_filter.lookup_expr not in ['exact', 'in']: return {} @@ -214,6 +218,7 @@ class ChangeLoggedModelFilterSet(BaseFilterSet): class PrimaryModelFilterSet(ChangeLoggedModelFilterSet): + tag = TagFilter() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index c8af891432c..36f62550745 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -1,7 +1,6 @@ import django_filters from django.db.models import Q -from extras.filters import TagFilter from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter from .models import * @@ -33,7 +32,6 @@ class TenantGroupFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Tenant group (slug)', ) - tag = TagFilter() class Meta: model = TenantGroup @@ -58,7 +56,6 @@ class TenantFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Tenant group (slug)', ) - tag = TagFilter() class Meta: model = Tenant @@ -119,7 +116,6 @@ class ContactGroupFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Contact group (slug)', ) - tag = TagFilter() class Meta: model = ContactGroup @@ -127,7 +123,6 @@ class ContactGroupFilterSet(OrganizationalModelFilterSet): class ContactRoleFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = ContactRole @@ -152,7 +147,6 @@ class ContactFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Contact group (slug)', ) - tag = TagFilter() class Meta: model = Contact diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index ed2775de2ac..0fe433bbc6b 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -2,7 +2,6 @@ import django_filters from django.db.models import Q from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup -from extras.filters import TagFilter from extras.filtersets import LocalConfigContextFilterSet from netbox.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import TenancyFilterSet @@ -20,7 +19,6 @@ __all__ = ( class ClusterTypeFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = ClusterType @@ -28,7 +26,6 @@ class ClusterTypeFilterSet(OrganizationalModelFilterSet): class ClusterGroupFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = ClusterGroup @@ -96,7 +93,6 @@ class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label='Cluster type (slug)', ) - tag = TagFilter() class Meta: model = Cluster @@ -217,7 +213,6 @@ class VirtualMachineFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConf method='_has_primary_ip', label='Has a primary IP', ) - tag = TagFilter() class Meta: model = VirtualMachine @@ -278,7 +273,6 @@ class VMInterfaceFilterSet(PrimaryModelFilterSet): mac_address = MultiValueMACAddressFilter( label='MAC address', ) - tag = TagFilter() class Meta: model = VMInterface diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py index 3fb173b1ba4..b95c18c9dc8 100644 --- a/netbox/wireless/filtersets.py +++ b/netbox/wireless/filtersets.py @@ -2,7 +2,6 @@ import django_filters from django.db.models import Q from dcim.choices import LinkStatusChoices -from extras.filters import TagFilter from ipam.models import VLAN from netbox.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from utilities.filters import MultiValueNumberFilter, TreeNodeMultipleChoiceFilter @@ -25,7 +24,6 @@ class WirelessLANGroupFilterSet(OrganizationalModelFilterSet): queryset=WirelessLANGroup.objects.all(), to_field_name='slug' ) - tag = TagFilter() class Meta: model = WirelessLANGroup @@ -57,7 +55,6 @@ class WirelessLANFilterSet(PrimaryModelFilterSet): auth_cipher = django_filters.MultipleChoiceFilter( choices=WirelessAuthCipherChoices ) - tag = TagFilter() class Meta: model = WirelessLAN @@ -89,7 +86,6 @@ class WirelessLinkFilterSet(PrimaryModelFilterSet): auth_cipher = django_filters.MultipleChoiceFilter( choices=WirelessAuthCipherChoices ) - tag = TagFilter() class Meta: model = WirelessLink From 28de9b89132e063597e59e6c518adc260ab5c306 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 25 Jan 2022 16:18:07 -0500 Subject: [PATCH 116/271] Refactor ChangeLoggedModelFilterSet --- netbox/netbox/filtersets.py | 48 +++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/netbox/netbox/filtersets.py b/netbox/netbox/filtersets.py index 3ddf252c7c3..a109b2c707d 100644 --- a/netbox/netbox/filtersets.py +++ b/netbox/netbox/filtersets.py @@ -23,6 +23,31 @@ __all__ = ( ) +# +# Mixins +# + +class ChangeLoggedModelMixin: + created = django_filters.DateFilter() + created__gte = django_filters.DateFilter( + field_name='created', + lookup_expr='gte' + ) + created__lte = django_filters.DateFilter( + field_name='created', + lookup_expr='lte' + ) + last_updated = django_filters.DateTimeFilter() + last_updated__gte = django_filters.DateTimeFilter( + field_name='last_updated', + lookup_expr='gte' + ) + last_updated__lte = django_filters.DateTimeFilter( + field_name='last_updated', + lookup_expr='lte' + ) + + # # FilterSets # @@ -196,28 +221,11 @@ class BaseFilterSet(django_filters.FilterSet): return filters -class ChangeLoggedModelFilterSet(BaseFilterSet): - created = django_filters.DateFilter() - created__gte = django_filters.DateFilter( - field_name='created', - lookup_expr='gte' - ) - created__lte = django_filters.DateFilter( - field_name='created', - lookup_expr='lte' - ) - last_updated = django_filters.DateTimeFilter() - last_updated__gte = django_filters.DateTimeFilter( - field_name='last_updated', - lookup_expr='gte' - ) - last_updated__lte = django_filters.DateTimeFilter( - field_name='last_updated', - lookup_expr='lte' - ) +class ChangeLoggedModelFilterSet(ChangeLoggedModelMixin, BaseFilterSet): + pass -class PrimaryModelFilterSet(ChangeLoggedModelFilterSet): +class PrimaryModelFilterSet(ChangeLoggedModelMixin, BaseFilterSet): tag = TagFilter() def __init__(self, *args, **kwargs): From e4abbfb2c6064d03091f3890a30343cfb788d8ea Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 25 Jan 2022 17:37:06 -0500 Subject: [PATCH 117/271] Closes #8454: Set DEFAULT_AUTO_FIELD to BigAutoField --- docs/release-notes/version-3.2.md | 1 + .../migrations/0033_gfk_bigidfield.py | 18 -- .../migrations/0033_standardize_id_fields.py | 44 +++ netbox/dcim/migrations/0151_gfk_bigidfield.py | 73 ----- .../migrations/0151_standardize_id_fields.py | 274 ++++++++++++++++++ netbox/dcim/models/cables.py | 4 +- .../extras/migrations/0071_gfk_bigidfield.py | 33 --- .../migrations/0071_standardize_id_fields.py | 94 ++++++ netbox/extras/models/change_logging.py | 3 +- netbox/extras/models/models.py | 4 +- netbox/extras/models/tags.py | 4 +- netbox/ipam/migrations/0056_gfk_bigidfield.py | 23 -- .../migrations/0056_standardize_id_fields.py | 99 +++++++ netbox/netbox/models/__init__.py | 11 +- netbox/netbox/settings.py | 2 +- .../tenancy/migrations/0005_gfk_bigidfield.py | 18 -- .../migrations/0005_standardize_id_fields.py | 49 ++++ .../migrations/0002_standardize_id_fields.py | 26 ++ netbox/users/models.py | 5 +- .../migrations/0027_standardize_id_fields.py | 36 +++ .../migrations/0002_standardize_id_fields.py | 26 ++ netbox/wireless/models.py | 2 +- 22 files changed, 665 insertions(+), 184 deletions(-) delete mode 100644 netbox/circuits/migrations/0033_gfk_bigidfield.py create mode 100644 netbox/circuits/migrations/0033_standardize_id_fields.py delete mode 100644 netbox/dcim/migrations/0151_gfk_bigidfield.py create mode 100644 netbox/dcim/migrations/0151_standardize_id_fields.py delete mode 100644 netbox/extras/migrations/0071_gfk_bigidfield.py create mode 100644 netbox/extras/migrations/0071_standardize_id_fields.py delete mode 100644 netbox/ipam/migrations/0056_gfk_bigidfield.py create mode 100644 netbox/ipam/migrations/0056_standardize_id_fields.py delete mode 100644 netbox/tenancy/migrations/0005_gfk_bigidfield.py create mode 100644 netbox/tenancy/migrations/0005_standardize_id_fields.py create mode 100644 netbox/users/migrations/0002_standardize_id_fields.py create mode 100644 netbox/virtualization/migrations/0027_standardize_id_fields.py create mode 100644 netbox/wireless/migrations/0002_standardize_id_fields.py diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index c35806c04fd..789003cca23 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -81,6 +81,7 @@ Inventory item templates can be arranged hierarchically within a device type, an * [#7743](https://github.com/netbox-community/netbox/issues/7743) - Remove legacy ASN field from site model * [#7748](https://github.com/netbox-community/netbox/issues/7748) - Remove legacy contact fields from site model * [#8031](https://github.com/netbox-community/netbox/issues/8031) - Remove automatic redirection of legacy slug-based URLs +* [#8195](https://github.com/netbox-community/netbox/issues/8195), [#8454](https://github.com/netbox-community/netbox/issues/8454) - Use 64-bit integers for all primary keys ### REST API Changes diff --git a/netbox/circuits/migrations/0033_gfk_bigidfield.py b/netbox/circuits/migrations/0033_gfk_bigidfield.py deleted file mode 100644 index 970617a889b..00000000000 --- a/netbox/circuits/migrations/0033_gfk_bigidfield.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.11 on 2022-01-24 21:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('circuits', '0032_provider_service_id'), - ] - - operations = [ - migrations.AlterField( - model_name='circuittermination', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - ] diff --git a/netbox/circuits/migrations/0033_standardize_id_fields.py b/netbox/circuits/migrations/0033_standardize_id_fields.py new file mode 100644 index 00000000000..475fc25274b --- /dev/null +++ b/netbox/circuits/migrations/0033_standardize_id_fields.py @@ -0,0 +1,44 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0032_provider_service_id'), + ] + + operations = [ + # Model IDs + migrations.AlterField( + model_name='circuit', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='circuittermination', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='circuittype', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='provider', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='providernetwork', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + + # GFK IDs + migrations.AlterField( + model_name='circuittermination', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/dcim/migrations/0151_gfk_bigidfield.py b/netbox/dcim/migrations/0151_gfk_bigidfield.py deleted file mode 100644 index 733e6ecd5dd..00000000000 --- a/netbox/dcim/migrations/0151_gfk_bigidfield.py +++ /dev/null @@ -1,73 +0,0 @@ -# Generated by Django 3.2.11 on 2022-01-24 21:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dcim', '0150_interface_speed_duplex'), - ] - - operations = [ - migrations.AlterField( - model_name='cable', - name='termination_a_id', - field=models.PositiveBigIntegerField(), - ), - migrations.AlterField( - model_name='cable', - name='termination_b_id', - field=models.PositiveBigIntegerField(), - ), - migrations.AlterField( - model_name='cablepath', - name='destination_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='cablepath', - name='origin_id', - field=models.PositiveBigIntegerField(), - ), - migrations.AlterField( - model_name='consoleport', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='consoleserverport', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='frontport', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='interface', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='powerfeed', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='poweroutlet', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='powerport', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='rearport', - name='_link_peer_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - ] diff --git a/netbox/dcim/migrations/0151_standardize_id_fields.py b/netbox/dcim/migrations/0151_standardize_id_fields.py new file mode 100644 index 00000000000..76fea859b3b --- /dev/null +++ b/netbox/dcim/migrations/0151_standardize_id_fields.py @@ -0,0 +1,274 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0150_interface_speed_duplex'), + ] + + operations = [ + # Model IDs + migrations.AlterField( + model_name='cable', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='cablepath', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='consoleport', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='consoleporttemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='consoleserverport', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='consoleserverporttemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='device', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='devicebay', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='devicebaytemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='devicerole', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='devicetype', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='frontport', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='frontporttemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='interface', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='interfacetemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='inventoryitem', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='inventoryitemrole', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='inventoryitemtemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='location', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='manufacturer', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='module', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='modulebay', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='modulebaytemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='moduletype', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='platform', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='powerfeed', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='poweroutlet', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='poweroutlettemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='powerpanel', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='powerport', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='powerporttemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='rack', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='rackreservation', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='rackrole', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='rearport', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='rearporttemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='region', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='site', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='sitegroup', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='virtualchassis', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + + # GFK IDs + migrations.AlterField( + model_name='cable', + name='termination_a_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='cable', + name='termination_b_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='cablepath', + name='destination_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='cablepath', + name='origin_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='consoleport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='consoleserverport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='frontport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='interface', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='powerfeed', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='poweroutlet', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='powerport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='rearport', + name='_link_peer_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index e3cc20177be..f1d4d70431a 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -11,7 +11,7 @@ from dcim.choices import * from dcim.constants import * from dcim.fields import PathField from dcim.utils import decompile_path_node, object_to_path_node, path_node_to_object -from netbox.models import BigIDModel, PrimaryModel +from netbox.models import PrimaryModel from utilities.fields import ColorField from utilities.utils import to_meters from .devices import Device @@ -298,7 +298,7 @@ class Cable(PrimaryModel): return COMPATIBLE_TERMINATION_TYPES[self.termination_a._meta.model_name] -class CablePath(BigIDModel): +class CablePath(models.Model): """ A CablePath instance represents the physical path from an origin to a destination, including all intermediate elements in the path. Every instance must specify an `origin`, whereas `destination` may be null (for paths which do diff --git a/netbox/extras/migrations/0071_gfk_bigidfield.py b/netbox/extras/migrations/0071_gfk_bigidfield.py deleted file mode 100644 index 64ce3c471d2..00000000000 --- a/netbox/extras/migrations/0071_gfk_bigidfield.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.11 on 2022-01-24 21:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('extras', '0070_customlink_enabled'), - ] - - operations = [ - migrations.AlterField( - model_name='imageattachment', - name='object_id', - field=models.PositiveBigIntegerField(), - ), - migrations.AlterField( - model_name='journalentry', - name='assigned_object_id', - field=models.PositiveBigIntegerField(), - ), - migrations.AlterField( - model_name='objectchange', - name='changed_object_id', - field=models.PositiveBigIntegerField(), - ), - migrations.AlterField( - model_name='objectchange', - name='related_object_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - ] diff --git a/netbox/extras/migrations/0071_standardize_id_fields.py b/netbox/extras/migrations/0071_standardize_id_fields.py new file mode 100644 index 00000000000..fa2b132bfd1 --- /dev/null +++ b/netbox/extras/migrations/0071_standardize_id_fields.py @@ -0,0 +1,94 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0070_customlink_enabled'), + ] + + operations = [ + # Model IDs + migrations.AlterField( + model_name='configcontext', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='configrevision', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='customfield', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='customlink', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='exporttemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='imageattachment', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='jobresult', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='journalentry', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='objectchange', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='tag', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='taggeditem', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='webhook', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + + # GFK IDs + migrations.AlterField( + model_name='imageattachment', + name='object_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='journalentry', + name='assigned_object_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='objectchange', + name='changed_object_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='objectchange', + name='related_object_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/extras/models/change_logging.py b/netbox/extras/models/change_logging.py index 4e703833aef..8444260c84c 100644 --- a/netbox/extras/models/change_logging.py +++ b/netbox/extras/models/change_logging.py @@ -5,11 +5,10 @@ from django.db import models from django.urls import reverse from extras.choices import * -from netbox.models import BigIDModel from utilities.querysets import RestrictedQuerySet -class ObjectChange(BigIDModel): +class ObjectChange(models.Model): """ Record a change to an object and the user account associated with that change. A change record may optionally indicate an object related to the one being changed. For example, a change to an interface may also indicate the diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 143bc7d9b61..1ea4a01d426 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -18,7 +18,7 @@ from extras.choices import * from extras.constants import * from extras.conditions import ConditionSet from extras.utils import FeatureQuery, image_upload -from netbox.models import BigIDModel, ChangeLoggedModel +from netbox.models import ChangeLoggedModel from netbox.models.features import ExportTemplatesMixin, JobResultsMixin, WebhooksMixin from utilities.querysets import RestrictedQuerySet from utilities.utils import render_jinja2 @@ -467,7 +467,7 @@ class JournalEntry(WebhooksMixin, ChangeLoggedModel): return JournalEntryKindChoices.colors.get(self.kind) -class JobResult(BigIDModel): +class JobResult(models.Model): """ This model stores the results from running a user-defined report. """ diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index df8446b9c1c..a4b3f080d2f 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -3,7 +3,7 @@ from django.urls import reverse from django.utils.text import slugify from taggit.models import TagBase, GenericTaggedItemBase -from netbox.models import BigIDModel, ChangeLoggedModel +from netbox.models import ChangeLoggedModel from netbox.models.features import ExportTemplatesMixin, WebhooksMixin from utilities.choices import ColorChoices from utilities.fields import ColorField @@ -36,7 +36,7 @@ class Tag(ExportTemplatesMixin, WebhooksMixin, ChangeLoggedModel, TagBase): return slug -class TaggedItem(BigIDModel, GenericTaggedItemBase): +class TaggedItem(GenericTaggedItemBase): tag = models.ForeignKey( to=Tag, related_name="%(app_label)s_%(class)s_items", diff --git a/netbox/ipam/migrations/0056_gfk_bigidfield.py b/netbox/ipam/migrations/0056_gfk_bigidfield.py deleted file mode 100644 index f40f6527107..00000000000 --- a/netbox/ipam/migrations/0056_gfk_bigidfield.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.11 on 2022-01-24 21:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('ipam', '0055_servicetemplate'), - ] - - operations = [ - migrations.AlterField( - model_name='fhrpgroupassignment', - name='interface_id', - field=models.PositiveBigIntegerField(), - ), - migrations.AlterField( - model_name='ipaddress', - name='assigned_object_id', - field=models.PositiveBigIntegerField(blank=True, null=True), - ), - ] diff --git a/netbox/ipam/migrations/0056_standardize_id_fields.py b/netbox/ipam/migrations/0056_standardize_id_fields.py new file mode 100644 index 00000000000..cb756445062 --- /dev/null +++ b/netbox/ipam/migrations/0056_standardize_id_fields.py @@ -0,0 +1,99 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0055_servicetemplate'), + ] + + operations = [ + # Model IDs + migrations.AlterField( + model_name='aggregate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='asn', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='fhrpgroup', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='fhrpgroupassignment', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='ipaddress', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='iprange', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='prefix', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='rir', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='role', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='routetarget', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='service', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='servicetemplate', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='vlan', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='vlangroup', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='vrf', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + + # GFK IDs + migrations.AlterField( + model_name='fhrpgroupassignment', + name='interface_id', + field=models.PositiveBigIntegerField(), + ), + migrations.AlterField( + model_name='ipaddress', + name='assigned_object_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index 2db2e260240..3631cf7f408 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -7,7 +7,6 @@ from utilities.querysets import RestrictedQuerySet from netbox.models.features import * __all__ = ( - 'BigIDModel', 'ChangeLoggedModel', 'NestedGroupModel', 'OrganizationalModel', @@ -26,7 +25,7 @@ class BaseModel( ExportTemplatesMixin, JournalingMixin, TagsMixin, - WebhooksMixin, + WebhooksMixin ): class Meta: abstract = True @@ -44,7 +43,7 @@ class BigIDModel(models.Model): abstract = True -class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, BigIDModel): +class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, models.Model): """ Base model for all objects which support change logging. """ @@ -54,7 +53,7 @@ class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, BigIDModel): abstract = True -class PrimaryModel(BaseModel, ChangeLoggingMixin, BigIDModel): +class PrimaryModel(BaseModel, ChangeLoggingMixin, models.Model): """ Primary models represent real objects within the infrastructure being modeled. """ @@ -64,7 +63,7 @@ class PrimaryModel(BaseModel, ChangeLoggingMixin, BigIDModel): abstract = True -class NestedGroupModel(BaseModel, ChangeLoggingMixin, BigIDModel, MPTTModel): +class NestedGroupModel(BaseModel, ChangeLoggingMixin, MPTTModel): """ Base model for objects which are used to form a hierarchy (regions, locations, etc.). These models nest recursively using MPTT. Within each parent, each child instance must have a unique name. @@ -106,7 +105,7 @@ class NestedGroupModel(BaseModel, ChangeLoggingMixin, BigIDModel, MPTTModel): }) -class OrganizationalModel(BaseModel, ChangeLoggingMixin, BigIDModel): +class OrganizationalModel(BaseModel, ChangeLoggingMixin, models.Model): """ Organizational models are those which are used solely to categorize and qualify other objects, and do not convey any real information about the infrastructure being modeled (for example, functional device roles). Organizational diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 5808602a22b..2c33ec862b9 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -406,7 +406,7 @@ LOGIN_REDIRECT_URL = f'/{BASE_PATH}' CSRF_TRUSTED_ORIGINS = ALLOWED_HOSTS -DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # Exclude potentially sensitive models from wildcard view exemption. These may still be exempted # by specifying the model individually in the EXEMPT_VIEW_PERMISSIONS configuration parameter. diff --git a/netbox/tenancy/migrations/0005_gfk_bigidfield.py b/netbox/tenancy/migrations/0005_gfk_bigidfield.py deleted file mode 100644 index 12bbde29502..00000000000 --- a/netbox/tenancy/migrations/0005_gfk_bigidfield.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.11 on 2022-01-24 21:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('tenancy', '0004_extend_tag_support'), - ] - - operations = [ - migrations.AlterField( - model_name='contactassignment', - name='object_id', - field=models.PositiveBigIntegerField(), - ), - ] diff --git a/netbox/tenancy/migrations/0005_standardize_id_fields.py b/netbox/tenancy/migrations/0005_standardize_id_fields.py new file mode 100644 index 00000000000..514478f17b4 --- /dev/null +++ b/netbox/tenancy/migrations/0005_standardize_id_fields.py @@ -0,0 +1,49 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tenancy', '0004_extend_tag_support'), + ] + + operations = [ + # Model IDs + migrations.AlterField( + model_name='contact', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='contactassignment', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='contactgroup', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='contactrole', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='tenant', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='tenantgroup', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + + # GFK IDs + migrations.AlterField( + model_name='contactassignment', + name='object_id', + field=models.PositiveBigIntegerField(), + ), + ] diff --git a/netbox/users/migrations/0002_standardize_id_fields.py b/netbox/users/migrations/0002_standardize_id_fields.py new file mode 100644 index 00000000000..60191d916db --- /dev/null +++ b/netbox/users/migrations/0002_standardize_id_fields.py @@ -0,0 +1,26 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_squashed_0011'), + ] + + operations = [ + migrations.AlterField( + model_name='objectpermission', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='token', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='userconfig', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + ] diff --git a/netbox/users/models.py b/netbox/users/models.py index 0ce91363bb5..722ec5ba698 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -11,7 +11,6 @@ from django.dispatch import receiver from django.utils import timezone from netbox.config import get_config -from netbox.models import BigIDModel from utilities.querysets import RestrictedQuerySet from utilities.utils import flatten_dict from .constants import * @@ -187,7 +186,7 @@ def create_userconfig(instance, created, **kwargs): # REST API # -class Token(BigIDModel): +class Token(models.Model): """ An API token used for user authentication. This extends the stock model to allow each user to have multiple tokens. It also supports setting an expiration time and toggling write ability. @@ -246,7 +245,7 @@ class Token(BigIDModel): # Permissions # -class ObjectPermission(BigIDModel): +class ObjectPermission(models.Model): """ A mapping of view, add, change, and/or delete permission for users and/or groups to an arbitrary set of objects identified by ORM query parameters. diff --git a/netbox/virtualization/migrations/0027_standardize_id_fields.py b/netbox/virtualization/migrations/0027_standardize_id_fields.py new file mode 100644 index 00000000000..01d7e8af1f4 --- /dev/null +++ b/netbox/virtualization/migrations/0027_standardize_id_fields.py @@ -0,0 +1,36 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('virtualization', '0026_vminterface_bridge'), + ] + + operations = [ + migrations.AlterField( + model_name='cluster', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='clustergroup', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='clustertype', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='virtualmachine', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='vminterface', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + ] diff --git a/netbox/wireless/migrations/0002_standardize_id_fields.py b/netbox/wireless/migrations/0002_standardize_id_fields.py new file mode 100644 index 00000000000..9e0b202c2d9 --- /dev/null +++ b/netbox/wireless/migrations/0002_standardize_id_fields.py @@ -0,0 +1,26 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wireless', '0001_wireless'), + ] + + operations = [ + migrations.AlterField( + model_name='wirelesslan', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='wirelesslangroup', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='wirelesslink', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), + ), + ] diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index 843462ec652..621024d7917 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -5,7 +5,7 @@ from mptt.models import MPTTModel, TreeForeignKey from dcim.choices import LinkStatusChoices from dcim.constants import WIRELESS_IFACE_TYPES -from netbox.models import BigIDModel, NestedGroupModel, PrimaryModel +from netbox.models import NestedGroupModel, PrimaryModel from .choices import * from .constants import * From b797b08bcfe53fefc3add75f54cb54c2f4e760ea Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 26 Jan 2022 09:02:04 -0500 Subject: [PATCH 118/271] Remove BigIDModel --- .../extras/migrations/0071_standardize_id_fields.py | 5 ----- netbox/extras/models/tags.py | 3 +++ netbox/netbox/models/__init__.py | 12 ------------ 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/netbox/extras/migrations/0071_standardize_id_fields.py b/netbox/extras/migrations/0071_standardize_id_fields.py index fa2b132bfd1..63e3051d819 100644 --- a/netbox/extras/migrations/0071_standardize_id_fields.py +++ b/netbox/extras/migrations/0071_standardize_id_fields.py @@ -54,11 +54,6 @@ class Migration(migrations.Migration): name='id', field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), ), - migrations.AlterField( - model_name='tag', - name='id', - field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False), - ), migrations.AlterField( model_name='taggeditem', name='id', diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index a4b3f080d2f..a4e4049d73f 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -14,6 +14,9 @@ from utilities.fields import ColorField # class Tag(ExportTemplatesMixin, WebhooksMixin, ChangeLoggedModel, TagBase): + id = models.BigAutoField( + primary_key=True + ) color = ColorField( default=ColorChoices.COLOR_GREY ) diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index 3631cf7f408..638d27c1bae 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -31,18 +31,6 @@ class BaseModel( abstract = True -class BigIDModel(models.Model): - """ - Abstract base model for all data objects. Ensures the use of a 64-bit PK. - """ - id = models.BigAutoField( - primary_key=True - ) - - class Meta: - abstract = True - - class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, models.Model): """ Base model for all objects which support change logging. From eb00e202693dcccb836b3dbafa86ec254afc5d45 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 26 Jan 2022 09:03:30 -0500 Subject: [PATCH 119/271] Revert "Refactor ChangeLoggedModelFilterSet" This reverts commit 28de9b89132e063597e59e6c518adc260ab5c306. --- netbox/netbox/filtersets.py | 48 ++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/netbox/netbox/filtersets.py b/netbox/netbox/filtersets.py index a109b2c707d..3ddf252c7c3 100644 --- a/netbox/netbox/filtersets.py +++ b/netbox/netbox/filtersets.py @@ -23,31 +23,6 @@ __all__ = ( ) -# -# Mixins -# - -class ChangeLoggedModelMixin: - created = django_filters.DateFilter() - created__gte = django_filters.DateFilter( - field_name='created', - lookup_expr='gte' - ) - created__lte = django_filters.DateFilter( - field_name='created', - lookup_expr='lte' - ) - last_updated = django_filters.DateTimeFilter() - last_updated__gte = django_filters.DateTimeFilter( - field_name='last_updated', - lookup_expr='gte' - ) - last_updated__lte = django_filters.DateTimeFilter( - field_name='last_updated', - lookup_expr='lte' - ) - - # # FilterSets # @@ -221,11 +196,28 @@ class BaseFilterSet(django_filters.FilterSet): return filters -class ChangeLoggedModelFilterSet(ChangeLoggedModelMixin, BaseFilterSet): - pass +class ChangeLoggedModelFilterSet(BaseFilterSet): + created = django_filters.DateFilter() + created__gte = django_filters.DateFilter( + field_name='created', + lookup_expr='gte' + ) + created__lte = django_filters.DateFilter( + field_name='created', + lookup_expr='lte' + ) + last_updated = django_filters.DateTimeFilter() + last_updated__gte = django_filters.DateTimeFilter( + field_name='last_updated', + lookup_expr='gte' + ) + last_updated__lte = django_filters.DateTimeFilter( + field_name='last_updated', + lookup_expr='lte' + ) -class PrimaryModelFilterSet(ChangeLoggedModelMixin, BaseFilterSet): +class PrimaryModelFilterSet(ChangeLoggedModelFilterSet): tag = TagFilter() def __init__(self, *args, **kwargs): From b67859832afa52742defa0a5bd60f9be1ddbe8e4 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 26 Jan 2022 20:25:23 -0500 Subject: [PATCH 120/271] Refactor to_objectchange() --- netbox/circuits/models/circuits.py | 10 ++---- .../dcim/models/device_component_templates.py | 32 +++++++------------ netbox/dcim/models/device_components.py | 10 ++---- netbox/extras/models/models.py | 4 ++- netbox/ipam/models/ip.py | 5 +-- netbox/netbox/models/features.py | 3 +- netbox/virtualization/models.py | 5 +-- 7 files changed, 27 insertions(+), 42 deletions(-) diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index e697caa0a28..faea380f07e 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -209,13 +209,9 @@ class CircuitTermination(WebhooksMixin, ChangeLoggedModel, LinkTermination): raise ValidationError("A circuit termination cannot attach to both a site and a provider network.") def to_objectchange(self, action): - # Annotate the parent Circuit - try: - circuit = self.circuit - except Circuit.DoesNotExist: - # Parent circuit has been deleted - circuit = None - return super().to_objectchange(action, related_object=circuit) + objectchange = super().to_objectchange(action) + objectchange.related_object = self.circuit + return objectchange @property def parent_object(self): diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 72ac9df40cb..0538704d2ca 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -70,14 +70,10 @@ class ComponentTemplateModel(WebhooksMixin, ChangeLoggedModel): """ raise NotImplementedError() - def to_objectchange(self, action, related_object=None): - # Annotate the parent DeviceType - try: - device_type = self.device_type - except ObjectDoesNotExist: - # The parent DeviceType has already been deleted - device_type = None - return super().to_objectchange(action, related_object=device_type) + def to_objectchange(self, action): + objectchange = super().to_objectchange(action) + objectchange.related_object = self.device_type + return objectchange class ModularComponentTemplateModel(ComponentTemplateModel): @@ -102,19 +98,13 @@ class ModularComponentTemplateModel(ComponentTemplateModel): class Meta: abstract = True - def to_objectchange(self, action, related_object=None): - # Annotate the parent DeviceType or ModuleType - try: - if getattr(self, 'device_type'): - return super().to_objectchange(action, related_object=self.device_type) - except ObjectDoesNotExist: - pass - try: - if getattr(self, 'module_type'): - return super().to_objectchange(action, related_object=self.module_type) - except ObjectDoesNotExist: - pass - return super().to_objectchange(action) + def to_objectchange(self, action): + objectchange = super().to_objectchange(action) + if self.device_type is not None: + objectchange.related_object = self.device_type + elif self.module_type is not None: + objectchange.related_object = self.module_type + return objectchange def clean(self): super().clean() diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 9071dfe4656..de22708ea34 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -75,13 +75,9 @@ class ComponentModel(PrimaryModel): return self.name def to_objectchange(self, action): - # Annotate the parent Device - try: - device = self.device - except ObjectDoesNotExist: - # The parent Device has already been deleted - device = None - return super().to_objectchange(action, related_object=device) + objectchange = super().to_objectchange(action) + objectchange.related_object = self.device + return super().to_objectchange(action) @property def parent_object(self): diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 1ea4a01d426..afcb6556c36 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -418,7 +418,9 @@ class ImageAttachment(WebhooksMixin, ChangeLoggedModel): return None def to_objectchange(self, action): - return super().to_objectchange(action, related_object=self.parent) + objectchange = super().to_objectchange(action) + objectchange.related_object = self.parent + return objectchange class JournalEntry(WebhooksMixin, ChangeLoggedModel): diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 632d7103479..b13899f7cfd 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -904,8 +904,9 @@ class IPAddress(PrimaryModel): super().save(*args, **kwargs) def to_objectchange(self, action): - # Annotate the assigned object, if any - return super().to_objectchange(action, related_object=self.assigned_object) + objectchange = super().to_objectchange(action) + objectchange.related_object = self.assigned_object + return objectchange @property def family(self): diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index ce398045907..19b804b01e5 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -57,7 +57,7 @@ class ChangeLoggingMixin(models.Model): logger.debug(f"Taking a snapshot of {self}") self._prechange_snapshot = serialize_object(self) - def to_objectchange(self, action, related_object=None): + def to_objectchange(self, action): """ Return a new ObjectChange representing a change made to this object. This will typically be called automatically by ChangeLoggingMiddleware. @@ -65,7 +65,6 @@ class ChangeLoggingMixin(models.Model): from extras.models import ObjectChange objectchange = ObjectChange( changed_object=self, - related_object=related_object, object_repr=str(self)[:200], action=action ) diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index d2f513f0be9..790cdcdbf0a 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -441,8 +441,9 @@ class VMInterface(PrimaryModel, BaseInterface): }) def to_objectchange(self, action): - # Annotate the parent VirtualMachine - return super().to_objectchange(action, related_object=self.virtual_machine) + objectchange = super().to_objectchange(action) + objectchange.related_object = self.virtual_machine + return objectchange @property def parent_object(self): From a795b95f7edcdc84a753e05d9907c1592b858a87 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 26 Jan 2022 20:41:41 -0500 Subject: [PATCH 121/271] Closes #8451: Include ChangeLoggingMixin in BaseModel --- docs/plugins/development/models.md | 3 +++ netbox/netbox/models/__init__.py | 7 ++++--- netbox/netbox/models/features.py | 4 ---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md index bf06faf08e6..b8b1e31222f 100644 --- a/docs/plugins/development/models.md +++ b/docs/plugins/development/models.md @@ -47,6 +47,7 @@ For more background on schema migrations, see the [Django documentation](https:/ Plugin models can leverage certain NetBox features by inheriting from NetBox's `BaseModel` class. This class extends the plugin model to enable numerous feature, including: +* Change logging * Custom fields * Custom links * Custom validation @@ -92,6 +93,8 @@ The example above will enable export templates and tags, but no other NetBox fea !!! note Please note that only the classes which appear in this documentation are currently supported. Although other classes may be present within the `features` module, they are not yet supported for use by plugins. +::: netbox.models.features.ChangeLoggingMixin + ::: netbox.models.features.CustomLinksMixin ::: netbox.models.features.CustomFieldsMixin diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index 638d27c1bae..bf120c8ac43 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -19,6 +19,7 @@ __all__ = ( # class BaseModel( + ChangeLoggingMixin, CustomFieldsMixin, CustomLinksMixin, CustomValidationMixin, @@ -41,7 +42,7 @@ class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, models.Model) abstract = True -class PrimaryModel(BaseModel, ChangeLoggingMixin, models.Model): +class PrimaryModel(BaseModel, models.Model): """ Primary models represent real objects within the infrastructure being modeled. """ @@ -51,7 +52,7 @@ class PrimaryModel(BaseModel, ChangeLoggingMixin, models.Model): abstract = True -class NestedGroupModel(BaseModel, ChangeLoggingMixin, MPTTModel): +class NestedGroupModel(BaseModel, MPTTModel): """ Base model for objects which are used to form a hierarchy (regions, locations, etc.). These models nest recursively using MPTT. Within each parent, each child instance must have a unique name. @@ -93,7 +94,7 @@ class NestedGroupModel(BaseModel, ChangeLoggingMixin, MPTTModel): }) -class OrganizationalModel(BaseModel, ChangeLoggingMixin, models.Model): +class OrganizationalModel(BaseModel, models.Model): """ Organizational models are those which are used solely to categorize and qualify other objects, and do not convey any real information about the infrastructure being modeled (for example, functional device roles). Organizational diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 19b804b01e5..24b9a4bff59 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -1,5 +1,3 @@ -import logging - from django.contrib.contenttypes.fields import GenericRelation from django.db.models.signals import class_prepared from django.dispatch import receiver @@ -53,8 +51,6 @@ class ChangeLoggingMixin(models.Model): """ Save a snapshot of the object's current state in preparation for modification. """ - logger = logging.getLogger('netbox') - logger.debug(f"Taking a snapshot of {self}") self._prechange_snapshot = serialize_object(self) def to_objectchange(self, action): From c5650bb2787c2fe1f55234904c6e0570f2eab17d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 26 Jan 2022 20:57:14 -0500 Subject: [PATCH 122/271] Rename PrimaryModel to NetBoxModel --- docs/development/adding-models.md | 2 +- docs/plugins/development/models.md | 7 ++++--- netbox/circuits/models/circuits.py | 4 ++-- netbox/circuits/models/providers.py | 6 +++--- netbox/dcim/models/cables.py | 4 ++-- netbox/dcim/models/device_components.py | 4 ++-- netbox/dcim/models/devices.py | 12 ++++++------ netbox/dcim/models/power.py | 6 +++--- netbox/dcim/models/racks.py | 6 +++--- netbox/dcim/models/sites.py | 4 ++-- netbox/ipam/models/fhrp.py | 4 ++-- netbox/ipam/models/ip.py | 12 ++++++------ netbox/ipam/models/services.py | 6 +++--- netbox/ipam/models/vlans.py | 4 ++-- netbox/ipam/models/vrfs.py | 6 +++--- netbox/netbox/models/__init__.py | 21 +++++++++++---------- netbox/tenancy/models/contacts.py | 4 ++-- netbox/tenancy/models/tenants.py | 4 ++-- netbox/virtualization/models.py | 8 ++++---- netbox/wireless/models.py | 6 +++--- 20 files changed, 66 insertions(+), 64 deletions(-) diff --git a/docs/development/adding-models.md b/docs/development/adding-models.md index d55afb2f273..f4d171f48a4 100644 --- a/docs/development/adding-models.md +++ b/docs/development/adding-models.md @@ -2,7 +2,7 @@ ## 1. Define the model class -Models within each app are stored in either `models.py` or within a submodule under the `models/` directory. When creating a model, be sure to subclass the [appropriate base model](models.md) from `netbox.models`. This will typically be PrimaryModel or OrganizationalModel. Remember to add the model class to the `__all__` listing for the module. +Models within each app are stored in either `models.py` or within a submodule under the `models/` directory. When creating a model, be sure to subclass the [appropriate base model](models.md) from `netbox.models`. This will typically be NetBoxModel or OrganizationalModel. Remember to add the model class to the `__all__` listing for the module. Each model should define, at a minimum: diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md index b8b1e31222f..225ac3d92e3 100644 --- a/docs/plugins/development/models.md +++ b/docs/plugins/development/models.md @@ -65,9 +65,10 @@ Simply subclass BaseModel when defining a model in your plugin: ```python # models.py -from netbox.models import BaseModel +from django.db import models +from netbox.models import NetBoxModel -class MyModel(BaseModel): +class MyModel(NetBoxModel): foo = models.CharField() ... ``` @@ -78,7 +79,7 @@ If you prefer instead to enable only a subset of these features for a plugin mod ```python # models.py -from django.db.models import models +from django.db import models from netbox.models.features import ExportTemplatesMixin, TagsMixin class MyModel(ExportTemplatesMixin, TagsMixin, models.Model): diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index faea380f07e..0f3de91ed2e 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -5,7 +5,7 @@ from django.urls import reverse from circuits.choices import * from dcim.models import LinkTermination -from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel +from netbox.models import ChangeLoggedModel, OrganizationalModel, NetBoxModel from netbox.models.features import WebhooksMixin __all__ = ( @@ -43,7 +43,7 @@ class CircuitType(OrganizationalModel): return reverse('circuits:circuittype', args=[self.pk]) -class Circuit(PrimaryModel): +class Circuit(NetBoxModel): """ A communications circuit connects two points. Each Circuit belongs to a Provider; Providers may have multiple circuits. Each circuit is also assigned a CircuitType and a Site. Circuit port speed and commit rate are measured diff --git a/netbox/circuits/models/providers.py b/netbox/circuits/models/providers.py index 8fd52c5874c..9cf4bf5c127 100644 --- a/netbox/circuits/models/providers.py +++ b/netbox/circuits/models/providers.py @@ -3,7 +3,7 @@ from django.db import models from django.urls import reverse from dcim.fields import ASNField -from netbox.models import PrimaryModel +from netbox.models import NetBoxModel __all__ = ( 'ProviderNetwork', @@ -11,7 +11,7 @@ __all__ = ( ) -class Provider(PrimaryModel): +class Provider(NetBoxModel): """ Each Circuit belongs to a Provider. This is usually a telecommunications company or similar organization. This model stores information pertinent to the user's relationship with the Provider. @@ -70,7 +70,7 @@ class Provider(PrimaryModel): return reverse('circuits:provider', args=[self.pk]) -class ProviderNetwork(PrimaryModel): +class ProviderNetwork(NetBoxModel): """ This represents a provider network which exists outside of NetBox, the details of which are unknown or unimportant to the user. diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index f1d4d70431a..0d46d3c8f73 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -11,7 +11,7 @@ from dcim.choices import * from dcim.constants import * from dcim.fields import PathField from dcim.utils import decompile_path_node, object_to_path_node, path_node_to_object -from netbox.models import PrimaryModel +from netbox.models import NetBoxModel from utilities.fields import ColorField from utilities.utils import to_meters from .devices import Device @@ -28,7 +28,7 @@ __all__ = ( # Cables # -class Cable(PrimaryModel): +class Cable(NetBoxModel): """ A physical connection between two endpoints. """ diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index de22708ea34..a6887a7689f 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -11,7 +11,7 @@ from dcim.choices import * from dcim.constants import * from dcim.fields import MACAddressField, WWNField from dcim.svg import CableTraceSVG -from netbox.models import OrganizationalModel, PrimaryModel +from netbox.models import OrganizationalModel, NetBoxModel from utilities.choices import ColorChoices from utilities.fields import ColorField, NaturalOrderingField from utilities.mptt import TreeManager @@ -39,7 +39,7 @@ __all__ = ( ) -class ComponentModel(PrimaryModel): +class ComponentModel(NetBoxModel): """ An abstract model inherited by any model which has a parent Device. """ diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index f94c9757d13..37c9002869b 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -14,7 +14,7 @@ from dcim.constants import * from extras.models import ConfigContextModel from extras.querysets import ConfigContextModelQuerySet from netbox.config import ConfigItem -from netbox.models import OrganizationalModel, PrimaryModel +from netbox.models import OrganizationalModel, NetBoxModel from utilities.choices import ColorChoices from utilities.fields import ColorField, NaturalOrderingField from .device_components import * @@ -68,7 +68,7 @@ class Manufacturer(OrganizationalModel): return reverse('dcim:manufacturer', args=[self.pk]) -class DeviceType(PrimaryModel): +class DeviceType(NetBoxModel): """ A DeviceType represents a particular make (Manufacturer) and model of device. It specifies rack height and depth, as well as high-level functional role(s). @@ -350,7 +350,7 @@ class DeviceType(PrimaryModel): return self.subdevice_role == SubdeviceRoleChoices.ROLE_CHILD -class ModuleType(PrimaryModel): +class ModuleType(NetBoxModel): """ A ModuleType represents a hardware element that can be installed within a device and which houses additional components; for example, a line card within a chassis-based switch such as the Cisco Catalyst 6500. Like a @@ -569,7 +569,7 @@ class Platform(OrganizationalModel): return reverse('dcim:platform', args=[self.pk]) -class Device(PrimaryModel, ConfigContextModel): +class Device(NetBoxModel, ConfigContextModel): """ A Device represents a piece of physical hardware mounted within a Rack. Each Device is assigned a DeviceType, DeviceRole, and (optionally) a Platform. Device names are not required, however if one is set it must be unique. @@ -1005,7 +1005,7 @@ class Device(PrimaryModel, ConfigContextModel): return DeviceStatusChoices.colors.get(self.status, 'secondary') -class Module(PrimaryModel, ConfigContextModel): +class Module(NetBoxModel, ConfigContextModel): """ A Module represents a field-installable component within a Device which may itself hold multiple device components (for example, a line card within a chassis switch). Modules are instantiated from ModuleTypes. @@ -1087,7 +1087,7 @@ class Module(PrimaryModel, ConfigContextModel): # Virtual chassis # -class VirtualChassis(PrimaryModel): +class VirtualChassis(NetBoxModel): """ A collection of Devices which operate with a shared control plane (e.g. a switch stack). """ diff --git a/netbox/dcim/models/power.py b/netbox/dcim/models/power.py index fe7f69df927..bbbdda83c12 100644 --- a/netbox/dcim/models/power.py +++ b/netbox/dcim/models/power.py @@ -6,7 +6,7 @@ from django.urls import reverse from dcim.choices import * from dcim.constants import * -from netbox.models import PrimaryModel +from netbox.models import NetBoxModel from utilities.validators import ExclusionValidator from .device_components import LinkTermination, PathEndpoint @@ -20,7 +20,7 @@ __all__ = ( # Power # -class PowerPanel(PrimaryModel): +class PowerPanel(NetBoxModel): """ A distribution point for electrical power; e.g. a data center RPP. """ @@ -66,7 +66,7 @@ class PowerPanel(PrimaryModel): ) -class PowerFeed(PrimaryModel, PathEndpoint, LinkTermination): +class PowerFeed(NetBoxModel, PathEndpoint, LinkTermination): """ An electrical circuit delivered from a PowerPanel. """ diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 1ebbbcba425..0fe84aa0cdb 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -14,7 +14,7 @@ from dcim.choices import * from dcim.constants import * from dcim.svg import RackElevationSVG from netbox.config import get_config -from netbox.models import OrganizationalModel, PrimaryModel +from netbox.models import OrganizationalModel, NetBoxModel from utilities.choices import ColorChoices from utilities.fields import ColorField, NaturalOrderingField from utilities.utils import array_to_string @@ -63,7 +63,7 @@ class RackRole(OrganizationalModel): return reverse('dcim:rackrole', args=[self.pk]) -class Rack(PrimaryModel): +class Rack(NetBoxModel): """ Devices are housed within Racks. Each rack has a defined height measured in rack units, and a front and rear face. Each Rack is assigned to a Site and (optionally) a Location. @@ -435,7 +435,7 @@ class Rack(PrimaryModel): return int(allocated_draw_total / available_power_total * 100) -class RackReservation(PrimaryModel): +class RackReservation(NetBoxModel): """ One or more reserved units within a Rack. """ diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index 3756933acd8..625422d6b76 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -7,7 +7,7 @@ from timezone_field import TimeZoneField from dcim.choices import * from dcim.constants import * -from netbox.models import NestedGroupModel, PrimaryModel +from netbox.models import NestedGroupModel, NetBoxModel from utilities.fields import NaturalOrderingField __all__ = ( @@ -194,7 +194,7 @@ class SiteGroup(NestedGroupModel): # Sites # -class Site(PrimaryModel): +class Site(NetBoxModel): """ A Site represents a geographic location within a network; typically a building or campus. The optional facility field can be used to include an external designation, such as a data center name (e.g. Equinix SV6). diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py index f0e3c2a230a..2a8d1bdcd7c 100644 --- a/netbox/ipam/models/fhrp.py +++ b/netbox/ipam/models/fhrp.py @@ -4,7 +4,7 @@ from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.urls import reverse -from netbox.models import ChangeLoggedModel, PrimaryModel +from netbox.models import ChangeLoggedModel, NetBoxModel from netbox.models.features import WebhooksMixin from ipam.choices import * from ipam.constants import * @@ -15,7 +15,7 @@ __all__ = ( ) -class FHRPGroup(PrimaryModel): +class FHRPGroup(NetBoxModel): """ A grouping of next hope resolution protocol (FHRP) peers. (For instance, VRRP or HSRP.) """ diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index b13899f7cfd..1354c6e64fc 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -9,7 +9,7 @@ from django.utils.functional import cached_property from dcim.fields import ASNField from dcim.models import Device -from netbox.models import OrganizationalModel, PrimaryModel +from netbox.models import OrganizationalModel, NetBoxModel from ipam.choices import * from ipam.constants import * from ipam.fields import IPNetworkField, IPAddressField @@ -88,7 +88,7 @@ class RIR(OrganizationalModel): return reverse('ipam:rir', args=[self.pk]) -class ASN(PrimaryModel): +class ASN(NetBoxModel): """ An autonomous system (AS) number is typically used to represent an independent routing domain. A site can have one or more ASNs assigned to it. @@ -147,7 +147,7 @@ class ASN(PrimaryModel): return self.asn -class Aggregate(GetAvailablePrefixesMixin, PrimaryModel): +class Aggregate(GetAvailablePrefixesMixin, NetBoxModel): """ An aggregate exists at the root level of the IP address space hierarchy in NetBox. Aggregates are used to organize the hierarchy and track the overall utilization of available address space. Each Aggregate is assigned to a RIR. @@ -280,7 +280,7 @@ class Role(OrganizationalModel): return reverse('ipam:role', args=[self.pk]) -class Prefix(GetAvailablePrefixesMixin, PrimaryModel): +class Prefix(GetAvailablePrefixesMixin, NetBoxModel): """ A Prefix represents an IPv4 or IPv6 network, including mask length. Prefixes can optionally be assigned to Sites and VRFs. A Prefix must be assigned a status and may optionally be assigned a used-define Role. A Prefix can also be @@ -557,7 +557,7 @@ class Prefix(GetAvailablePrefixesMixin, PrimaryModel): return min(utilization, 100) -class IPRange(PrimaryModel): +class IPRange(NetBoxModel): """ A range of IP addresses, defined by start and end addresses. """ @@ -752,7 +752,7 @@ class IPRange(PrimaryModel): return int(float(child_count) / self.size * 100) -class IPAddress(PrimaryModel): +class IPAddress(NetBoxModel): """ An IPAddress represents an individual IPv4 or IPv6 address and its mask. The mask length should match what is configured in the real world. (Typically, only loopback interfaces are configured with /32 or /128 masks.) Like diff --git a/netbox/ipam/models/services.py b/netbox/ipam/models/services.py index bd8030a0a3a..70ad381979d 100644 --- a/netbox/ipam/models/services.py +++ b/netbox/ipam/models/services.py @@ -6,7 +6,7 @@ from django.urls import reverse from ipam.choices import * from ipam.constants import * -from netbox.models import PrimaryModel +from netbox.models import NetBoxModel from utilities.utils import array_to_string @@ -46,7 +46,7 @@ class ServiceBase(models.Model): return array_to_string(self.ports) -class ServiceTemplate(ServiceBase, PrimaryModel): +class ServiceTemplate(ServiceBase, NetBoxModel): """ A template for a Service to be applied to a device or virtual machine. """ @@ -62,7 +62,7 @@ class ServiceTemplate(ServiceBase, PrimaryModel): return reverse('ipam:servicetemplate', args=[self.pk]) -class Service(ServiceBase, PrimaryModel): +class Service(ServiceBase, NetBoxModel): """ A Service represents a layer-four service (e.g. HTTP or SSH) running on a Device or VirtualMachine. A Service may optionally be tied to one or more specific IPAddresses belonging to its parent. diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index f73571ea9a2..7cd03ed5586 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -9,7 +9,7 @@ from dcim.models import Interface from ipam.choices import * from ipam.constants import * from ipam.querysets import VLANQuerySet -from netbox.models import OrganizationalModel, PrimaryModel +from netbox.models import OrganizationalModel, NetBoxModel from virtualization.models import VMInterface @@ -116,7 +116,7 @@ class VLANGroup(OrganizationalModel): return None -class VLAN(PrimaryModel): +class VLAN(NetBoxModel): """ A VLAN is a distinct layer two forwarding domain identified by a 12-bit integer (1-4094). Each VLAN must be assigned to a Site, however VLAN IDs need not be unique within a Site. A VLAN may optionally be assigned to a VLANGroup, diff --git a/netbox/ipam/models/vrfs.py b/netbox/ipam/models/vrfs.py index f1b2d682f06..fc34b548804 100644 --- a/netbox/ipam/models/vrfs.py +++ b/netbox/ipam/models/vrfs.py @@ -2,7 +2,7 @@ from django.db import models from django.urls import reverse from ipam.constants import * -from netbox.models import PrimaryModel +from netbox.models import NetBoxModel __all__ = ( @@ -11,7 +11,7 @@ __all__ = ( ) -class VRF(PrimaryModel): +class VRF(NetBoxModel): """ A virtual routing and forwarding (VRF) table represents a discrete layer three forwarding domain (e.g. a routing table). Prefixes and IPAddresses can optionally be assigned to VRFs. (Prefixes and IPAddresses not assigned to a VRF @@ -73,7 +73,7 @@ class VRF(PrimaryModel): return reverse('ipam:vrf', args=[self.pk]) -class RouteTarget(PrimaryModel): +class RouteTarget(NetBoxModel): """ A BGP extended community used to control the redistribution of routes among VRFs, as defined in RFC 4364. """ diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index bf120c8ac43..b3bfe06c07d 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -10,15 +10,11 @@ __all__ = ( 'ChangeLoggedModel', 'NestedGroupModel', 'OrganizationalModel', - 'PrimaryModel', + 'NetBoxModel', ) -# -# Base model classes -# - -class BaseModel( +class NetBoxFeatureSet( ChangeLoggingMixin, CustomFieldsMixin, CustomLinksMixin, @@ -32,9 +28,14 @@ class BaseModel( abstract = True +# +# Base model classes +# + class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, models.Model): """ - Base model for all objects which support change logging. + Base model for ancillary models; provides limited functionality for models which don't + support NetBox's full feature set. """ objects = RestrictedQuerySet.as_manager() @@ -42,7 +43,7 @@ class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, models.Model) abstract = True -class PrimaryModel(BaseModel, models.Model): +class NetBoxModel(NetBoxFeatureSet, models.Model): """ Primary models represent real objects within the infrastructure being modeled. """ @@ -52,7 +53,7 @@ class PrimaryModel(BaseModel, models.Model): abstract = True -class NestedGroupModel(BaseModel, MPTTModel): +class NestedGroupModel(NetBoxFeatureSet, MPTTModel): """ Base model for objects which are used to form a hierarchy (regions, locations, etc.). These models nest recursively using MPTT. Within each parent, each child instance must have a unique name. @@ -94,7 +95,7 @@ class NestedGroupModel(BaseModel, MPTTModel): }) -class OrganizationalModel(BaseModel, models.Model): +class OrganizationalModel(NetBoxFeatureSet, models.Model): """ Organizational models are those which are used solely to categorize and qualify other objects, and do not convey any real information about the infrastructure being modeled (for example, functional device roles). Organizational diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index cacd682cbd7..81dd9977310 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -4,7 +4,7 @@ from django.db import models from django.urls import reverse from mptt.models import TreeForeignKey -from netbox.models import ChangeLoggedModel, NestedGroupModel, OrganizationalModel, PrimaryModel +from netbox.models import ChangeLoggedModel, NestedGroupModel, OrganizationalModel, NetBoxModel from netbox.models.features import WebhooksMixin from tenancy.choices import * @@ -76,7 +76,7 @@ class ContactRole(OrganizationalModel): return reverse('tenancy:contactrole', args=[self.pk]) -class Contact(PrimaryModel): +class Contact(NetBoxModel): """ Contact information for a particular object(s) in NetBox. """ diff --git a/netbox/tenancy/models/tenants.py b/netbox/tenancy/models/tenants.py index 9952a700daa..88d8d52f1a4 100644 --- a/netbox/tenancy/models/tenants.py +++ b/netbox/tenancy/models/tenants.py @@ -3,7 +3,7 @@ from django.db import models from django.urls import reverse from mptt.models import TreeForeignKey -from netbox.models import NestedGroupModel, PrimaryModel +from netbox.models import NestedGroupModel, NetBoxModel __all__ = ( 'Tenant', @@ -43,7 +43,7 @@ class TenantGroup(NestedGroupModel): return reverse('tenancy:tenantgroup', args=[self.pk]) -class Tenant(PrimaryModel): +class Tenant(NetBoxModel): """ A Tenant represents an organization served by the NetBox owner. This is typically a customer or an internal department. diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 790cdcdbf0a..dda1d0bee04 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -8,7 +8,7 @@ from dcim.models import BaseInterface, Device from extras.models import ConfigContextModel from extras.querysets import ConfigContextModelQuerySet from netbox.config import get_config -from netbox.models import OrganizationalModel, PrimaryModel +from netbox.models import OrganizationalModel, NetBoxModel from utilities.fields import NaturalOrderingField from utilities.ordering import naturalize_interface from utilities.query_functions import CollateAsChar @@ -100,7 +100,7 @@ class ClusterGroup(OrganizationalModel): # Clusters # -class Cluster(PrimaryModel): +class Cluster(NetBoxModel): """ A cluster of VirtualMachines. Each Cluster may optionally be associated with one or more Devices. """ @@ -183,7 +183,7 @@ class Cluster(PrimaryModel): # Virtual machines # -class VirtualMachine(PrimaryModel, ConfigContextModel): +class VirtualMachine(NetBoxModel, ConfigContextModel): """ A virtual machine which runs inside a Cluster. """ @@ -345,7 +345,7 @@ class VirtualMachine(PrimaryModel, ConfigContextModel): # Interfaces # -class VMInterface(PrimaryModel, BaseInterface): +class VMInterface(NetBoxModel, BaseInterface): virtual_machine = models.ForeignKey( to='virtualization.VirtualMachine', on_delete=models.CASCADE, diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index 621024d7917..fc80e91df58 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -5,7 +5,7 @@ from mptt.models import MPTTModel, TreeForeignKey from dcim.choices import LinkStatusChoices from dcim.constants import WIRELESS_IFACE_TYPES -from netbox.models import NestedGroupModel, PrimaryModel +from netbox.models import NestedGroupModel, NetBoxModel from .choices import * from .constants import * @@ -79,7 +79,7 @@ class WirelessLANGroup(NestedGroupModel): return reverse('wireless:wirelesslangroup', args=[self.pk]) -class WirelessLAN(WirelessAuthenticationBase, PrimaryModel): +class WirelessLAN(WirelessAuthenticationBase, NetBoxModel): """ A wireless network formed among an arbitrary number of access point and clients. """ @@ -117,7 +117,7 @@ class WirelessLAN(WirelessAuthenticationBase, PrimaryModel): return reverse('wireless:wirelesslan', args=[self.pk]) -class WirelessLink(WirelessAuthenticationBase, PrimaryModel): +class WirelessLink(WirelessAuthenticationBase, NetBoxModel): """ A point-to-point connection between two wireless Interfaces. """ From 083d1acb81a2028acbe5d20ef0993061c93fda1a Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 27 Jan 2022 09:24:20 -0500 Subject: [PATCH 123/271] Closes #8453: Rename PrimaryModelFilterSet to NetBoxModelFilterSet & expose for plugins --- docs/plugins/development/filtersets.md | 56 ++++++++++++++++++++++++++ docs/plugins/development/models.md | 2 +- mkdocs.yml | 1 + netbox/circuits/filtersets.py | 8 ++-- netbox/dcim/filtersets.py | 44 ++++++++++---------- netbox/ipam/filtersets.py | 22 +++++----- netbox/netbox/filtersets.py | 11 +++-- netbox/tenancy/filtersets.py | 6 +-- netbox/virtualization/filtersets.py | 8 ++-- netbox/wireless/filtersets.py | 6 +-- 10 files changed, 112 insertions(+), 52 deletions(-) create mode 100644 docs/plugins/development/filtersets.md diff --git a/docs/plugins/development/filtersets.md b/docs/plugins/development/filtersets.md new file mode 100644 index 00000000000..e2a98ed0be7 --- /dev/null +++ b/docs/plugins/development/filtersets.md @@ -0,0 +1,56 @@ +# Filter Sets + +Filter sets define the mechanisms available for filtering or searching through a set of objects in NetBox. For instance, sites can be filtered by their parent region or group, status, facility ID, and so on. The same filter set is used consistently for a model whether the request is made via the UI, REST API, or GraphQL API. NetBox employs the [django-filters2](https://django-tables2.readthedocs.io/en/latest/) library to define filter sets. + +## FilterSet Classes + +To support additional functionality standard to NetBox models, such as tag assignment and custom field support, the `NetBoxModelFilterSet` class is available for use by plugins. This should be used as the base filter set class for plugin models which inherit from `NetBoxModel`. Within this class, individual filters can be declared as directed by the `django-filters` documentation. An example is provided below. + +```python +# filtersets.py +import django_filters +from netbox.filtersets import NetBoxModelFilterSet +from .models import MyModel + +class MyFilterSet(NetBoxModelFilterSet): + status = django_filters.MultipleChoiceFilter( + choices=( + ('foo', 'Foo'), + ('bar', 'Bar'), + ('baz', 'Baz'), + ), + null_value=None + ) + + class Meta: + model = MyModel + fields = ('some', 'other', 'fields') +``` + +## Declaring Filter Sets + +To utilize a filter set in the subclass of a generic view, such as `ObjectListView` or `BulkEditView`, set it as the `filterset` attribute on the view class: + +```python +# views.py +from netbox.views.generic import ObjectListView +from .filtersets import MyModelFitlerSet +from .models import MyModel + +class MyModelListView(ObjectListView): + queryset = MyModel.objects.all() + filterset = MyModelFitlerSet +``` + +To enable a filter on a REST API endpoint, set it as the `filterset_class` attribute on the API view: + +```python +# api/views.py +from myplugin import models, filtersets +from . import serializers + +class MyModelViewSet(...): + queryset = models.MyModel.objects.all() + serializer_class = serializers.MyModelSerializer + filterset_class = filtersets.MyModelFilterSet +``` diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md index 225ac3d92e3..521420b1bbf 100644 --- a/docs/plugins/development/models.md +++ b/docs/plugins/development/models.md @@ -45,7 +45,7 @@ For more background on schema migrations, see the [Django documentation](https:/ ## Enabling NetBox Features -Plugin models can leverage certain NetBox features by inheriting from NetBox's `BaseModel` class. This class extends the plugin model to enable numerous feature, including: +Plugin models can leverage certain NetBox features by inheriting from NetBox's `NetBoxModel` class. This class extends the plugin model to enable numerous feature, including: * Change logging * Custom fields diff --git a/mkdocs.yml b/mkdocs.yml index 148e083d282..1a77cb1955f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -104,6 +104,7 @@ nav: - Getting Started: 'plugins/development/index.md' - Database Models: 'plugins/development/models.md' - Views: 'plugins/development/views.md' + - Filtersets: 'plugins/development/filtersets.md' - REST API: 'plugins/development/rest-api.md' - Background Tasks: 'plugins/development/background-tasks.md' - Administration: diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 998a7bb6d09..40ac61e7741 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -3,7 +3,7 @@ from django.db.models import Q from dcim.filtersets import CableTerminationFilterSet from dcim.models import Region, Site, SiteGroup -from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet +from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import TreeNodeMultipleChoiceFilter from .choices import * @@ -18,7 +18,7 @@ __all__ = ( ) -class ProviderFilterSet(PrimaryModelFilterSet): +class ProviderFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -77,7 +77,7 @@ class ProviderFilterSet(PrimaryModelFilterSet): ) -class ProviderNetworkFilterSet(PrimaryModelFilterSet): +class ProviderNetworkFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -115,7 +115,7 @@ class CircuitTypeFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug'] -class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index a7402fa5f0a..dda6de5b1e0 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import User from extras.filtersets import LocalConfigContextFilterSet from ipam.models import ASN, VRF from netbox.filtersets import ( - BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet, + BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet, ) from tenancy.filtersets import TenancyFilterSet from tenancy.models import Tenant @@ -101,7 +101,7 @@ class SiteGroupFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'description'] -class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class SiteFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -242,7 +242,7 @@ class RackRoleFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'color'] -class RackFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -339,7 +339,7 @@ class RackFilterSet(PrimaryModelFilterSet, TenancyFilterSet): ) -class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class RackReservationFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -405,7 +405,7 @@ class ManufacturerFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'description'] -class DeviceTypeFilterSet(PrimaryModelFilterSet): +class DeviceTypeFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -497,7 +497,7 @@ class DeviceTypeFilterSet(PrimaryModelFilterSet): return queryset.exclude(devicebaytemplates__isnull=value) -class ModuleTypeFilterSet(PrimaryModelFilterSet): +class ModuleTypeFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -745,7 +745,7 @@ class PlatformFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'napalm_driver', 'description'] -class DeviceFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContextFilterSet): +class DeviceFilterSet(NetBoxModelFilterSet, TenancyFilterSet, LocalConfigContextFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -956,7 +956,7 @@ class DeviceFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContex return queryset.exclude(devicebays__isnull=value) -class ModuleFilterSet(PrimaryModelFilterSet): +class ModuleFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -1096,7 +1096,7 @@ class PathEndpointFilterSet(django_filters.FilterSet): return queryset.filter(Q(_path__isnull=True) | Q(_path__is_active=False)) -class ConsolePortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): +class ConsolePortFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): type = django_filters.MultipleChoiceFilter( choices=ConsolePortTypeChoices, null_value=None @@ -1107,7 +1107,7 @@ class ConsolePortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, Cabl fields = ['id', 'name', 'label', 'description'] -class ConsoleServerPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): +class ConsoleServerPortFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): type = django_filters.MultipleChoiceFilter( choices=ConsolePortTypeChoices, null_value=None @@ -1118,7 +1118,7 @@ class ConsoleServerPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet fields = ['id', 'name', 'label', 'description'] -class PowerPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): +class PowerPortFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): type = django_filters.MultipleChoiceFilter( choices=PowerPortTypeChoices, null_value=None @@ -1129,7 +1129,7 @@ class PowerPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableT fields = ['id', 'name', 'label', 'maximum_draw', 'allocated_draw', 'description'] -class PowerOutletFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): +class PowerOutletFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): type = django_filters.MultipleChoiceFilter( choices=PowerOutletTypeChoices, null_value=None @@ -1144,7 +1144,7 @@ class PowerOutletFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, Cabl fields = ['id', 'name', 'label', 'feed_leg', 'description'] -class InterfaceFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): +class InterfaceFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -1271,7 +1271,7 @@ class InterfaceFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableT }.get(value, queryset.none()) -class FrontPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet): +class FrontPortFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet): type = django_filters.MultipleChoiceFilter( choices=PortTypeChoices, null_value=None @@ -1282,7 +1282,7 @@ class FrontPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableT fields = ['id', 'name', 'label', 'type', 'color', 'description'] -class RearPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet): +class RearPortFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet): type = django_filters.MultipleChoiceFilter( choices=PortTypeChoices, null_value=None @@ -1293,21 +1293,21 @@ class RearPortFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableTe fields = ['id', 'name', 'label', 'type', 'color', 'positions', 'description'] -class ModuleBayFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): +class ModuleBayFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet): class Meta: model = ModuleBay fields = ['id', 'name', 'label', 'description'] -class DeviceBayFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): +class DeviceBayFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet): class Meta: model = DeviceBay fields = ['id', 'name', 'label', 'description'] -class InventoryItemFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): +class InventoryItemFilterSet(NetBoxModelFilterSet, DeviceComponentFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -1366,7 +1366,7 @@ class InventoryItemRoleFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'color'] -class VirtualChassisFilterSet(PrimaryModelFilterSet): +class VirtualChassisFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -1445,7 +1445,7 @@ class VirtualChassisFilterSet(PrimaryModelFilterSet): return queryset.filter(qs_filter).distinct() -class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet): +class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -1504,7 +1504,7 @@ class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet): return queryset -class PowerPanelFilterSet(PrimaryModelFilterSet): +class PowerPanelFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -1565,7 +1565,7 @@ class PowerPanelFilterSet(PrimaryModelFilterSet): return queryset.filter(qs_filter) -class PowerFeedFilterSet(PrimaryModelFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): +class PowerFeedFilterSet(NetBoxModelFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index aaba09bc617..207b5e2dc12 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -6,7 +6,7 @@ from django.db.models import Q from netaddr.core import AddrFormatError from dcim.models import Device, Interface, Region, Site, SiteGroup -from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet +from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, @@ -35,7 +35,7 @@ __all__ = ( ) -class VRFFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class VRFFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -77,7 +77,7 @@ class VRFFilterSet(PrimaryModelFilterSet, TenancyFilterSet): fields = ['id', 'name', 'rd', 'enforce_unique'] -class RouteTargetFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class RouteTargetFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -125,7 +125,7 @@ class RIRFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'is_private', 'description'] -class AggregateFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class AggregateFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -219,7 +219,7 @@ class RoleFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug'] -class PrefixFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class PrefixFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -409,7 +409,7 @@ class PrefixFilterSet(PrimaryModelFilterSet, TenancyFilterSet): ) -class IPRangeFilterSet(TenancyFilterSet, PrimaryModelFilterSet): +class IPRangeFilterSet(TenancyFilterSet, NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -475,7 +475,7 @@ class IPRangeFilterSet(TenancyFilterSet, PrimaryModelFilterSet): return queryset.none() -class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -640,7 +640,7 @@ class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet): return queryset.exclude(assigned_object_id__isnull=value) -class FHRPGroupFilterSet(PrimaryModelFilterSet): +class FHRPGroupFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -748,7 +748,7 @@ class VLANGroupFilterSet(OrganizationalModelFilterSet): ) -class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -843,7 +843,7 @@ class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet): return queryset.get_for_virtualmachine(value) -class ServiceTemplateFilterSet(PrimaryModelFilterSet): +class ServiceTemplateFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -864,7 +864,7 @@ class ServiceTemplateFilterSet(PrimaryModelFilterSet): return queryset.filter(qs_filter) -class ServiceFilterSet(PrimaryModelFilterSet): +class ServiceFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/netbox/filtersets.py b/netbox/netbox/filtersets.py index 3ddf252c7c3..e36b9dd1dbf 100644 --- a/netbox/netbox/filtersets.py +++ b/netbox/netbox/filtersets.py @@ -18,8 +18,8 @@ from utilities import filters __all__ = ( 'BaseFilterSet', 'ChangeLoggedModelFilterSet', + 'NetBoxModelFilterSet', 'OrganizationalModelFilterSet', - 'PrimaryModelFilterSet', ) @@ -29,7 +29,7 @@ __all__ = ( class BaseFilterSet(django_filters.FilterSet): """ - A base FilterSet which provides common functionality to all NetBox FilterSets + A base FilterSet which provides some enhanced functionality over django-filter2's FilterSet class. """ FILTER_DEFAULTS = deepcopy(django_filters.filterset.FILTER_FOR_DBFIELD_DEFAULTS) FILTER_DEFAULTS.update({ @@ -217,7 +217,10 @@ class ChangeLoggedModelFilterSet(BaseFilterSet): ) -class PrimaryModelFilterSet(ChangeLoggedModelFilterSet): +class NetBoxModelFilterSet(ChangeLoggedModelFilterSet): + """ + Provides additional filtering functionality (e.g. tags, custom fields) for core NetBox models. + """ tag = TagFilter() def __init__(self, *args, **kwargs): @@ -244,7 +247,7 @@ class PrimaryModelFilterSet(ChangeLoggedModelFilterSet): self.filters.update(custom_field_filters) -class OrganizationalModelFilterSet(PrimaryModelFilterSet): +class OrganizationalModelFilterSet(NetBoxModelFilterSet): """ A base class for adding the search method to models which only expose the `name` and `slug` fields """ diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index 36f62550745..28087fecfa5 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -1,7 +1,7 @@ import django_filters from django.db.models import Q -from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet +from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter from .models import * @@ -38,7 +38,7 @@ class TenantGroupFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'description'] -class TenantFilterSet(PrimaryModelFilterSet): +class TenantFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -129,7 +129,7 @@ class ContactRoleFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug'] -class ContactFilterSet(PrimaryModelFilterSet): +class ContactFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index 0fe433bbc6b..28b23e8a80e 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -3,7 +3,7 @@ from django.db.models import Q from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup from extras.filtersets import LocalConfigContextFilterSet -from netbox.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet +from netbox.filtersets import OrganizationalModelFilterSet, NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter from .choices import * @@ -32,7 +32,7 @@ class ClusterGroupFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'description'] -class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet): +class ClusterFilterSet(NetBoxModelFilterSet, TenancyFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -107,7 +107,7 @@ class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet): ) -class VirtualMachineFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContextFilterSet): +class VirtualMachineFilterSet(NetBoxModelFilterSet, TenancyFilterSet, LocalConfigContextFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -233,7 +233,7 @@ class VirtualMachineFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConf return queryset.exclude(params) -class VMInterfaceFilterSet(PrimaryModelFilterSet): +class VMInterfaceFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py index b95c18c9dc8..a88179acf67 100644 --- a/netbox/wireless/filtersets.py +++ b/netbox/wireless/filtersets.py @@ -3,7 +3,7 @@ from django.db.models import Q from dcim.choices import LinkStatusChoices from ipam.models import VLAN -from netbox.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet +from netbox.filtersets import OrganizationalModelFilterSet, NetBoxModelFilterSet from utilities.filters import MultiValueNumberFilter, TreeNodeMultipleChoiceFilter from .choices import * from .models import * @@ -30,7 +30,7 @@ class WirelessLANGroupFilterSet(OrganizationalModelFilterSet): fields = ['id', 'name', 'slug', 'description'] -class WirelessLANFilterSet(PrimaryModelFilterSet): +class WirelessLANFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', @@ -70,7 +70,7 @@ class WirelessLANFilterSet(PrimaryModelFilterSet): return queryset.filter(qs_filter) -class WirelessLinkFilterSet(PrimaryModelFilterSet): +class WirelessLinkFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label='Search', From 4a1b4e04853d73eb3d7829744dd689343875c369 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 27 Jan 2022 15:00:10 -0500 Subject: [PATCH 124/271] Closes #8469: Move BaseTable, columns to netbox core app --- netbox/circuits/tables.py | 31 +++-- netbox/circuits/views.py | 3 +- netbox/dcim/tables/__init__.py | 8 +- netbox/dcim/tables/cables.py | 12 +- netbox/dcim/tables/devices.py | 115 +++++++++--------- netbox/dcim/tables/devicetypes.py | 46 ++++--- netbox/dcim/tables/modules.py | 16 +-- netbox/dcim/tables/power.py | 18 +-- netbox/dcim/tables/racks.py | 31 +++-- netbox/dcim/tables/sites.py | 42 +++---- netbox/dcim/views.py | 2 +- netbox/extras/tables.py | 63 +++++----- netbox/extras/views.py | 2 +- netbox/ipam/tables/fhrp.py | 12 +- netbox/ipam/tables/ip.py | 66 +++++----- netbox/ipam/tables/services.py | 10 +- netbox/ipam/tables/vlans.py | 35 +++--- netbox/ipam/tables/vrfs.py | 18 +-- netbox/ipam/views.py | 2 +- .../{utilities => netbox}/tables/__init__.py | 10 -- .../{utilities => netbox}/tables/columns.py | 0 netbox/{utilities => netbox}/tables/tables.py | 2 +- netbox/netbox/views/generic/bulk_views.py | 2 +- netbox/netbox/views/generic/object_views.py | 2 +- netbox/tenancy/tables.py | 42 +++---- netbox/tenancy/views.py | 2 +- netbox/users/tests/test_preferences.py | 2 +- netbox/utilities/tables.py | 7 ++ netbox/utilities/tests/test_tables.py | 4 +- netbox/virtualization/tables.py | 39 +++--- netbox/virtualization/views.py | 2 +- netbox/wireless/tables.py | 22 ++-- netbox/wireless/views.py | 2 +- 33 files changed, 321 insertions(+), 349 deletions(-) rename netbox/{utilities => netbox}/tables/__init__.py (91%) rename netbox/{utilities => netbox}/tables/columns.py (100%) rename netbox/{utilities => netbox}/tables/tables.py (99%) create mode 100644 netbox/utilities/tables.py diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index b5fdc54406d..0ffb8f03b0b 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -1,11 +1,10 @@ import django_tables2 as tables from django_tables2.utils import Accessor +from netbox.tables import BaseTable, columns from tenancy.tables import TenantColumn -from utilities.tables import BaseTable, ChoiceFieldColumn, MarkdownColumn, TagColumn, ToggleColumn from .models import * - __all__ = ( 'CircuitTable', 'CircuitTypeTable', @@ -22,11 +21,11 @@ CIRCUITTERMINATION_LINK = """ {% endif %} """ + # # Table columns # - class CommitRateColumn(tables.TemplateColumn): """ Humanize the commit rate in the column view @@ -43,13 +42,13 @@ class CommitRateColumn(tables.TemplateColumn): def value(self, value): return str(value) if value else None + # # Providers # - class ProviderTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -57,8 +56,8 @@ class ProviderTable(BaseTable): accessor=Accessor('count_circuits'), verbose_name='Circuits' ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='circuits:provider_list' ) @@ -76,15 +75,15 @@ class ProviderTable(BaseTable): # class ProviderNetworkTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) provider = tables.Column( linkify=True ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='circuits:providernetwork_list' ) @@ -101,11 +100,11 @@ class ProviderNetworkTable(BaseTable): # class CircuitTypeTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - tags = TagColumn( + tags = columns.TagColumn( url_name='circuits:circuittype_list' ) circuit_count = tables.Column( @@ -125,7 +124,7 @@ class CircuitTypeTable(BaseTable): # class CircuitTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() cid = tables.Column( linkify=True, verbose_name='Circuit ID' @@ -133,7 +132,7 @@ class CircuitTable(BaseTable): provider = tables.Column( linkify=True ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() tenant = TenantColumn() termination_a = tables.TemplateColumn( template_code=CIRCUITTERMINATION_LINK, @@ -144,8 +143,8 @@ class CircuitTable(BaseTable): verbose_name='Side Z' ) commit_rate = CommitRateColumn() - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='circuits:circuit_list' ) diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 97e985dcded..3229977becf 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -5,10 +5,9 @@ from django.shortcuts import get_object_or_404, redirect, render from netbox.views import generic from utilities.forms import ConfirmationForm -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.utils import count_related from . import filtersets, forms, tables -from .choices import CircuitTerminationSideChoices from .models import * diff --git a/netbox/dcim/tables/__init__.py b/netbox/dcim/tables/__init__.py index 993ae0518f9..7567762fa35 100644 --- a/netbox/dcim/tables/__init__.py +++ b/netbox/dcim/tables/__init__.py @@ -1,8 +1,8 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from utilities.tables import BaseTable, BooleanColumn from dcim.models import ConsolePort, Interface, PowerPort +from netbox.tables import BaseTable, columns from .cables import * from .devices import * from .devicetypes import * @@ -36,7 +36,7 @@ class ConsoleConnectionTable(BaseTable): linkify=True, verbose_name='Console Port' ) - reachable = BooleanColumn( + reachable = columns.BooleanColumn( accessor=Accessor('_path__is_active'), verbose_name='Reachable' ) @@ -67,7 +67,7 @@ class PowerConnectionTable(BaseTable): linkify=True, verbose_name='Power Port' ) - reachable = BooleanColumn( + reachable = columns.BooleanColumn( accessor=Accessor('_path__is_active'), verbose_name='Reachable' ) @@ -101,7 +101,7 @@ class InterfaceConnectionTable(BaseTable): linkify=True, verbose_name='Interface B' ) - reachable = BooleanColumn( + reachable = columns.BooleanColumn( accessor=Accessor('_path__is_active'), verbose_name='Reachable' ) diff --git a/netbox/dcim/tables/cables.py b/netbox/dcim/tables/cables.py index bea2c0adf66..addb67c33f0 100644 --- a/netbox/dcim/tables/cables.py +++ b/netbox/dcim/tables/cables.py @@ -2,8 +2,8 @@ import django_tables2 as tables from django_tables2.utils import Accessor from dcim.models import Cable +from netbox.tables import BaseTable, columns from tenancy.tables import TenantColumn -from utilities.tables import BaseTable, ChoiceFieldColumn, ColorColumn, TagColumn, TemplateColumn, ToggleColumn from .template_code import CABLE_LENGTH, CABLE_TERMINATION_PARENT __all__ = ( @@ -16,7 +16,7 @@ __all__ = ( # class CableTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() termination_a_parent = tables.TemplateColumn( template_code=CABLE_TERMINATION_PARENT, accessor=Accessor('termination_a'), @@ -41,14 +41,14 @@ class CableTable(BaseTable): linkify=True, verbose_name='Termination B' ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() tenant = TenantColumn() - length = TemplateColumn( + length = columns.TemplateColumn( template_code=CABLE_LENGTH, order_by='_abs_length' ) - color = ColorColumn() - tags = TagColumn( + color = columns.ColorColumn() + tags = columns.TagColumn( url_name='dcim:cable_list' ) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 7b00a16e928..7dee2bcbe87 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -5,11 +5,8 @@ from dcim.models import ( ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, FrontPort, Interface, InventoryItem, InventoryItemRole, ModuleBay, Platform, PowerOutlet, PowerPort, RearPort, VirtualChassis, ) +from netbox.tables import BaseTable, columns from tenancy.tables import TenantColumn -from utilities.tables import ( - ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, - MarkdownColumn, TagColumn, TemplateColumn, ToggleColumn, -) from .template_code import * __all__ = ( @@ -75,23 +72,23 @@ def get_interface_state_attribute(record): # class DeviceRoleTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - device_count = LinkedCountColumn( + device_count = columns.LinkedCountColumn( viewname='dcim:device_list', url_params={'role_id': 'pk'}, verbose_name='Devices' ) - vm_count = LinkedCountColumn( + vm_count = columns.LinkedCountColumn( viewname='virtualization:virtualmachine_list', url_params={'role_id': 'pk'}, verbose_name='VMs' ) - color = ColorColumn() - vm_role = BooleanColumn() - tags = TagColumn( + color = columns.ColorColumn() + vm_role = columns.BooleanColumn() + tags = columns.TagColumn( url_name='dcim:devicerole_list' ) @@ -109,21 +106,21 @@ class DeviceRoleTable(BaseTable): # class PlatformTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - device_count = LinkedCountColumn( + device_count = columns.LinkedCountColumn( viewname='dcim:device_list', url_params={'platform_id': 'pk'}, verbose_name='Devices' ) - vm_count = LinkedCountColumn( + vm_count = columns.LinkedCountColumn( viewname='virtualization:virtualmachine_list', url_params={'platform_id': 'pk'}, verbose_name='VMs' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:platform_list' ) @@ -143,12 +140,12 @@ class PlatformTable(BaseTable): # class DeviceTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.TemplateColumn( order_by=('_name',), template_code=DEVICE_LINK ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() tenant = TenantColumn() site = tables.Column( linkify=True @@ -159,7 +156,7 @@ class DeviceTable(BaseTable): rack = tables.Column( linkify=True ) - device_role = ColoredLabelColumn( + device_role = columns.ColoredLabelColumn( verbose_name='Role' ) manufacturer = tables.Column( @@ -195,8 +192,8 @@ class DeviceTable(BaseTable): vc_priority = tables.Column( verbose_name='VC Priority' ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='dcim:device_list' ) @@ -218,7 +215,7 @@ class DeviceImportTable(BaseTable): name = tables.TemplateColumn( template_code=DEVICE_LINK ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() tenant = TenantColumn() site = tables.Column( linkify=True @@ -244,7 +241,7 @@ class DeviceImportTable(BaseTable): # class DeviceComponentTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() device = tables.Column( linkify=True ) @@ -274,22 +271,22 @@ class CableTerminationTable(BaseTable): cable = tables.Column( linkify=True ) - cable_color = ColorColumn( + cable_color = columns.ColorColumn( accessor='cable.color', orderable=False, verbose_name='Cable Color' ) - link_peer = TemplateColumn( + link_peer = columns.TemplateColumn( accessor='_link_peer', template_code=LINKTERMINATION, orderable=False, verbose_name='Link Peer' ) - mark_connected = BooleanColumn() + mark_connected = columns.BooleanColumn() class PathEndpointTable(CableTerminationTable): - connection = TemplateColumn( + connection = columns.TemplateColumn( accessor='_path.last_node', template_code=LINKTERMINATION, verbose_name='Connection', @@ -304,7 +301,7 @@ class ConsolePortTable(ModularDeviceComponentTable, PathEndpointTable): 'args': [Accessor('device_id')], } ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:consoleport_list' ) @@ -323,7 +320,7 @@ class DeviceConsolePortTable(ConsolePortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=CONSOLEPORT_BUTTONS ) @@ -346,7 +343,7 @@ class ConsoleServerPortTable(ModularDeviceComponentTable, PathEndpointTable): 'args': [Accessor('device_id')], } ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:consoleserverport_list' ) @@ -366,7 +363,7 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=CONSOLESERVERPORT_BUTTONS ) @@ -389,7 +386,7 @@ class PowerPortTable(ModularDeviceComponentTable, PathEndpointTable): 'args': [Accessor('device_id')], } ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:powerport_list' ) @@ -410,7 +407,7 @@ class DevicePowerPortTable(PowerPortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=POWERPORT_BUTTONS ) @@ -438,7 +435,7 @@ class PowerOutletTable(ModularDeviceComponentTable, PathEndpointTable): power_port = tables.Column( linkify=True ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:poweroutlet_list' ) @@ -458,7 +455,7 @@ class DevicePowerOutletTable(PowerOutletTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=POWEROUTLET_BUTTONS ) @@ -477,7 +474,7 @@ class DevicePowerOutletTable(PowerOutletTable): class BaseInterfaceTable(BaseTable): - enabled = BooleanColumn() + enabled = columns.BooleanColumn() ip_addresses = tables.TemplateColumn( template_code=INTERFACE_IPADDRESSES, orderable=False, @@ -490,7 +487,7 @@ class BaseInterfaceTable(BaseTable): verbose_name='FHRP Groups' ) untagged_vlan = tables.Column(linkify=True) - tagged_vlans = TemplateColumn( + tagged_vlans = columns.TemplateColumn( template_code=INTERFACE_TAGGED_VLANS, orderable=False, verbose_name='Tagged VLANs' @@ -504,11 +501,11 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi 'args': [Accessor('device_id')], } ) - mgmt_only = BooleanColumn() + mgmt_only = columns.BooleanColumn() wireless_link = tables.Column( linkify=True ) - wireless_lans = TemplateColumn( + wireless_lans = columns.TemplateColumn( template_code=INTERFACE_WIRELESS_LANS, orderable=False, verbose_name='Wireless LANs' @@ -516,7 +513,7 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi vrf = tables.Column( linkify=True ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:interface_list' ) @@ -550,7 +547,7 @@ class DeviceInterfaceTable(InterfaceTable): linkify=True, verbose_name='LAG' ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=INTERFACE_BUTTONS ) @@ -582,14 +579,14 @@ class FrontPortTable(ModularDeviceComponentTable, CableTerminationTable): 'args': [Accessor('device_id')], } ) - color = ColorColumn() + color = columns.ColorColumn() rear_port_position = tables.Column( verbose_name='Position' ) rear_port = tables.Column( linkify=True ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:frontport_list' ) @@ -612,7 +609,7 @@ class DeviceFrontPortTable(FrontPortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=FRONTPORT_BUTTONS ) @@ -637,8 +634,8 @@ class RearPortTable(ModularDeviceComponentTable, CableTerminationTable): 'args': [Accessor('device_id')], } ) - color = ColorColumn() - tags = TagColumn( + color = columns.ColorColumn() + tags = columns.TagColumn( url_name='dcim:rearport_list' ) @@ -658,7 +655,7 @@ class DeviceRearPortTable(RearPortTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=REARPORT_BUTTONS ) @@ -690,7 +687,7 @@ class DeviceBayTable(DeviceComponentTable): installed_device = tables.Column( linkify=True ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:devicebay_list' ) @@ -711,7 +708,7 @@ class DeviceDeviceBayTable(DeviceBayTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=DEVICEBAY_BUTTONS ) @@ -734,7 +731,7 @@ class ModuleBayTable(DeviceComponentTable): linkify=True, verbose_name='Installed module' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:modulebay_list' ) @@ -745,7 +742,7 @@ class ModuleBayTable(DeviceComponentTable): class DeviceModuleBayTable(ModuleBayTable): - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=MODULEBAY_BUTTONS ) @@ -773,8 +770,8 @@ class InventoryItemTable(DeviceComponentTable): orderable=False, linkify=True ) - discovered = BooleanColumn() - tags = TagColumn( + discovered = columns.BooleanColumn() + tags = columns.TagColumn( url_name='dcim:inventoryitem_list' ) cable = None # Override DeviceComponentTable @@ -797,7 +794,7 @@ class DeviceInventoryItemTable(InventoryItemTable): order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) - actions = ActionsColumn() + actions = columns.ActionsColumn() class Meta(BaseTable.Meta): model = InventoryItem @@ -811,17 +808,17 @@ class DeviceInventoryItemTable(InventoryItemTable): class InventoryItemRoleTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - inventoryitem_count = LinkedCountColumn( + inventoryitem_count = columns.LinkedCountColumn( viewname='dcim:inventoryitem_list', url_params={'role_id': 'pk'}, verbose_name='Items' ) - color = ColorColumn() - tags = TagColumn( + color = columns.ColorColumn() + tags = columns.TagColumn( url_name='dcim:inventoryitemrole_list' ) @@ -838,19 +835,19 @@ class InventoryItemRoleTable(BaseTable): # class VirtualChassisTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) master = tables.Column( linkify=True ) - member_count = LinkedCountColumn( + member_count = columns.LinkedCountColumn( viewname='dcim:device_list', url_params={'virtual_chassis_id': 'pk'}, verbose_name='Members' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:virtualchassis_list' ) diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 93832d70686..0b4f04a2af9 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -5,9 +5,7 @@ from dcim.models import ( ConsolePortTemplate, ConsoleServerPortTemplate, DeviceBayTemplate, DeviceType, FrontPortTemplate, InterfaceTemplate, InventoryItemTemplate, Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, ) -from utilities.tables import ( - ActionsColumn, BaseTable, BooleanColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, -) +from netbox.tables import BaseTable, columns from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS __all__ = ( @@ -31,7 +29,7 @@ __all__ = ( # class ManufacturerTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -45,7 +43,7 @@ class ManufacturerTable(BaseTable): verbose_name='Platforms' ) slug = tables.Column() - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:manufacturer_list' ) @@ -65,21 +63,21 @@ class ManufacturerTable(BaseTable): # class DeviceTypeTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() model = tables.Column( linkify=True, verbose_name='Device Type' ) - is_full_depth = BooleanColumn( + is_full_depth = columns.BooleanColumn( verbose_name='Full Depth' ) - instance_count = LinkedCountColumn( + instance_count = columns.LinkedCountColumn( viewname='dcim:device_list', url_params={'device_type_id': 'pk'}, verbose_name='Instances' ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='dcim:devicetype_list' ) @@ -99,7 +97,7 @@ class DeviceTypeTable(BaseTable): # class ComponentTemplateTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() id = tables.Column( verbose_name='ID' ) @@ -112,7 +110,7 @@ class ComponentTemplateTable(BaseTable): class ConsolePortTemplateTable(ComponentTemplateTable): - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete'), extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) @@ -124,7 +122,7 @@ class ConsolePortTemplateTable(ComponentTemplateTable): class ConsoleServerPortTemplateTable(ComponentTemplateTable): - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete'), extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) @@ -136,7 +134,7 @@ class ConsoleServerPortTemplateTable(ComponentTemplateTable): class PowerPortTemplateTable(ComponentTemplateTable): - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete'), extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) @@ -148,7 +146,7 @@ class PowerPortTemplateTable(ComponentTemplateTable): class PowerOutletTemplateTable(ComponentTemplateTable): - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete'), extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) @@ -160,10 +158,10 @@ class PowerOutletTemplateTable(ComponentTemplateTable): class InterfaceTemplateTable(ComponentTemplateTable): - mgmt_only = BooleanColumn( + mgmt_only = columns.BooleanColumn( verbose_name='Management Only' ) - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete'), extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) @@ -178,8 +176,8 @@ class FrontPortTemplateTable(ComponentTemplateTable): rear_port_position = tables.Column( verbose_name='Position' ) - color = ColorColumn() - actions = ActionsColumn( + color = columns.ColorColumn() + actions = columns.ActionsColumn( sequence=('edit', 'delete'), extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) @@ -191,8 +189,8 @@ class FrontPortTemplateTable(ComponentTemplateTable): class RearPortTemplateTable(ComponentTemplateTable): - color = ColorColumn() - actions = ActionsColumn( + color = columns.ColorColumn() + actions = columns.ActionsColumn( sequence=('edit', 'delete'), extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS ) @@ -204,7 +202,7 @@ class RearPortTemplateTable(ComponentTemplateTable): class ModuleBayTemplateTable(ComponentTemplateTable): - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete') ) @@ -215,7 +213,7 @@ class ModuleBayTemplateTable(ComponentTemplateTable): class DeviceBayTemplateTable(ComponentTemplateTable): - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete') ) @@ -226,7 +224,7 @@ class DeviceBayTemplateTable(ComponentTemplateTable): class InventoryItemTemplateTable(ComponentTemplateTable): - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete') ) role = tables.Column( diff --git a/netbox/dcim/tables/modules.py b/netbox/dcim/tables/modules.py index 6d620433a68..4a4c9d09a2f 100644 --- a/netbox/dcim/tables/modules.py +++ b/netbox/dcim/tables/modules.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.models import Module, ModuleType -from utilities.tables import BaseTable, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn +from netbox.tables import BaseTable, columns __all__ = ( 'ModuleTable', @@ -10,18 +10,18 @@ __all__ = ( class ModuleTypeTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() model = tables.Column( linkify=True, verbose_name='Module Type' ) - instance_count = LinkedCountColumn( + instance_count = columns.LinkedCountColumn( viewname='dcim:module_list', url_params={'module_type_id': 'pk'}, verbose_name='Instances' ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='dcim:moduletype_list' ) @@ -36,7 +36,7 @@ class ModuleTypeTable(BaseTable): class ModuleTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() device = tables.Column( linkify=True ) @@ -46,8 +46,8 @@ class ModuleTable(BaseTable): module_type = tables.Column( linkify=True ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='dcim:module_list' ) diff --git a/netbox/dcim/tables/power.py b/netbox/dcim/tables/power.py index c1ea8a34c22..e1c0304a2ab 100644 --- a/netbox/dcim/tables/power.py +++ b/netbox/dcim/tables/power.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.models import PowerFeed, PowerPanel -from utilities.tables import BaseTable, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn +from netbox.tables import BaseTable, columns from .devices import CableTerminationTable __all__ = ( @@ -15,19 +15,19 @@ __all__ = ( # class PowerPanelTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) site = tables.Column( linkify=True ) - powerfeed_count = LinkedCountColumn( + powerfeed_count = columns.LinkedCountColumn( viewname='dcim:powerfeed_list', url_params={'power_panel_id': 'pk'}, verbose_name='Feeds' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:powerpanel_list' ) @@ -44,7 +44,7 @@ class PowerPanelTable(BaseTable): # We're not using PathEndpointTable for PowerFeed because power connections # cannot traverse pass-through ports. class PowerFeedTable(CableTerminationTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -54,16 +54,16 @@ class PowerFeedTable(CableTerminationTable): rack = tables.Column( linkify=True ) - status = ChoiceFieldColumn() - type = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() + type = columns.ChoiceFieldColumn() max_utilization = tables.TemplateColumn( template_code="{{ value }}%" ) available_power = tables.Column( verbose_name='Available power (VA)' ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='dcim:powerfeed_list' ) diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index 55c6f9ba8f8..9e89d7b824e 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -2,11 +2,8 @@ import django_tables2 as tables from django_tables2.utils import Accessor from dcim.models import Rack, RackReservation, RackRole +from netbox.tables import BaseTable, columns from tenancy.tables import TenantColumn -from utilities.tables import ( - BaseTable, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, - ToggleColumn, UtilizationColumn, -) __all__ = ( 'RackTable', @@ -20,11 +17,11 @@ __all__ = ( # class RackRoleTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column(linkify=True) rack_count = tables.Column(verbose_name='Racks') - color = ColorColumn() - tags = TagColumn( + color = columns.ColorColumn() + tags = columns.TagColumn( url_name='dcim:rackrole_list' ) @@ -42,7 +39,7 @@ class RackRoleTable(BaseTable): # class RackTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( order_by=('_name',), linkify=True @@ -54,27 +51,27 @@ class RackTable(BaseTable): linkify=True ) tenant = TenantColumn() - status = ChoiceFieldColumn() - role = ColoredLabelColumn() + status = columns.ChoiceFieldColumn() + role = columns.ColoredLabelColumn() u_height = tables.TemplateColumn( template_code="{{ record.u_height }}U", verbose_name='Height' ) - comments = MarkdownColumn() - device_count = LinkedCountColumn( + comments = columns.MarkdownColumn() + device_count = columns.LinkedCountColumn( viewname='dcim:device_list', url_params={'rack_id': 'pk'}, verbose_name='Devices' ) - get_utilization = UtilizationColumn( + get_utilization = columns.UtilizationColumn( orderable=False, verbose_name='Space' ) - get_power_utilization = UtilizationColumn( + get_power_utilization = columns.UtilizationColumn( orderable=False, verbose_name='Power' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:rack_list' ) outer_width = tables.TemplateColumn( @@ -104,7 +101,7 @@ class RackTable(BaseTable): # class RackReservationTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() reservation = tables.Column( accessor='pk', linkify=True @@ -121,7 +118,7 @@ class RackReservationTable(BaseTable): orderable=False, verbose_name='Units' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:rackreservation_list' ) diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 32bf000ef8a..7a4e2f34f5c 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -1,10 +1,8 @@ import django_tables2 as tables from dcim.models import Location, Region, Site, SiteGroup +from netbox.tables import BaseTable, columns from tenancy.tables import TenantColumn -from utilities.tables import ( - ActionsColumn, BaseTable, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, -) from .template_code import LOCATION_BUTTONS __all__ = ( @@ -20,16 +18,16 @@ __all__ = ( # class RegionTable(BaseTable): - pk = ToggleColumn() - name = MPTTColumn( + pk = columns.ToggleColumn() + name = columns.MPTTColumn( linkify=True ) - site_count = LinkedCountColumn( + site_count = columns.LinkedCountColumn( viewname='dcim:site_list', url_params={'region_id': 'pk'}, verbose_name='Sites' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:region_list' ) @@ -46,16 +44,16 @@ class RegionTable(BaseTable): # class SiteGroupTable(BaseTable): - pk = ToggleColumn() - name = MPTTColumn( + pk = columns.ToggleColumn() + name = columns.MPTTColumn( linkify=True ) - site_count = LinkedCountColumn( + site_count = columns.LinkedCountColumn( viewname='dcim:site_list', url_params={'group_id': 'pk'}, verbose_name='Sites' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:sitegroup_list' ) @@ -72,26 +70,26 @@ class SiteGroupTable(BaseTable): # class SiteTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() region = tables.Column( linkify=True ) group = tables.Column( linkify=True ) - asn_count = LinkedCountColumn( + asn_count = columns.LinkedCountColumn( accessor=tables.A('asns.count'), viewname='ipam:asn_list', url_params={'site_id': 'pk'}, verbose_name='ASNs' ) tenant = TenantColumn() - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='dcim:site_list' ) @@ -110,28 +108,28 @@ class SiteTable(BaseTable): # class LocationTable(BaseTable): - pk = ToggleColumn() - name = MPTTColumn( + pk = columns.ToggleColumn() + name = columns.MPTTColumn( linkify=True ) site = tables.Column( linkify=True ) tenant = TenantColumn() - rack_count = LinkedCountColumn( + rack_count = columns.LinkedCountColumn( viewname='dcim:rack_list', url_params={'location_id': 'pk'}, verbose_name='Racks' ) - device_count = LinkedCountColumn( + device_count = columns.LinkedCountColumn( viewname='dcim:device_list', url_params={'location_id': 'pk'}, verbose_name='Devices' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='dcim:location_list' ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=LOCATION_BUTTONS ) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index b3cff1a26ed..231a3ef0988 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -20,7 +20,7 @@ from netbox.views import generic from utilities.forms import ConfirmationForm from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.permissions import get_permission_for_model -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.utils import count_related from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin from virtualization.models import VirtualMachine diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index 7d60518b267..b235cd8e2fc 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -1,10 +1,7 @@ import django_tables2 as tables from django.conf import settings -from utilities.tables import ( - ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, ColorColumn, ContentTypeColumn, ContentTypesColumn, - MarkdownColumn, ToggleColumn, -) +from netbox.tables import BaseTable, columns from .models import * __all__ = ( @@ -47,12 +44,12 @@ OBJECTCHANGE_REQUEST_ID = """ # class CustomFieldTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - content_types = ContentTypesColumn() - required = BooleanColumn() + content_types = columns.ContentTypesColumn() + required = columns.BooleanColumn() class Meta(BaseTable.Meta): model = CustomField @@ -68,13 +65,13 @@ class CustomFieldTable(BaseTable): # class CustomLinkTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - content_type = ContentTypeColumn() - enabled = BooleanColumn() - new_window = BooleanColumn() + content_type = columns.ContentTypeColumn() + enabled = columns.BooleanColumn() + new_window = columns.BooleanColumn() class Meta(BaseTable.Meta): model = CustomLink @@ -90,12 +87,12 @@ class CustomLinkTable(BaseTable): # class ExportTemplateTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - content_type = ContentTypeColumn() - as_attachment = BooleanColumn() + content_type = columns.ContentTypeColumn() + as_attachment = columns.BooleanColumn() class Meta(BaseTable.Meta): model = ExportTemplate @@ -113,22 +110,22 @@ class ExportTemplateTable(BaseTable): # class WebhookTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - content_types = ContentTypesColumn() - enabled = BooleanColumn() - type_create = BooleanColumn( + content_types = columns.ContentTypesColumn() + enabled = columns.BooleanColumn() + type_create = columns.BooleanColumn( verbose_name='Create' ) - type_update = BooleanColumn( + type_update = columns.BooleanColumn( verbose_name='Update' ) - type_delete = BooleanColumn( + type_delete = columns.BooleanColumn( verbose_name='Delete' ) - ssl_validation = BooleanColumn( + ssl_validation = columns.BooleanColumn( verbose_name='SSL Validation' ) @@ -149,11 +146,11 @@ class WebhookTable(BaseTable): # class TagTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - color = ColorColumn() + color = columns.ColorColumn() class Meta(BaseTable.Meta): model = Tag @@ -167,7 +164,7 @@ class TaggedItemTable(BaseTable): linkify=lambda record: record.content_object.get_absolute_url(), accessor='content_object__id' ) - content_type = ContentTypeColumn( + content_type = columns.ContentTypeColumn( verbose_name='Type' ) content_object = tables.Column( @@ -182,11 +179,11 @@ class TaggedItemTable(BaseTable): class ConfigContextTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - is_active = BooleanColumn( + is_active = columns.BooleanColumn( verbose_name='Active' ) @@ -205,8 +202,8 @@ class ObjectChangeTable(BaseTable): linkify=True, format=settings.SHORT_DATETIME_FORMAT ) - action = ChoiceFieldColumn() - changed_object_type = ContentTypeColumn( + action = columns.ChoiceFieldColumn() + changed_object_type = columns.ContentTypeColumn( verbose_name='Type' ) object_repr = tables.TemplateColumn( @@ -217,7 +214,7 @@ class ObjectChangeTable(BaseTable): template_code=OBJECTCHANGE_REQUEST_ID, verbose_name='Request ID' ) - actions = ActionsColumn(sequence=()) + actions = columns.ActionsColumn(sequence=()) class Meta(BaseTable.Meta): model = ObjectChange @@ -232,7 +229,7 @@ class ObjectJournalTable(BaseTable): linkify=True, format=settings.SHORT_DATETIME_FORMAT ) - kind = ChoiceFieldColumn() + kind = columns.ChoiceFieldColumn() comments = tables.TemplateColumn( template_code='{% load helpers %}{{ value|render_markdown|truncatewords_html:50 }}' ) @@ -243,8 +240,8 @@ class ObjectJournalTable(BaseTable): class JournalEntryTable(ObjectJournalTable): - pk = ToggleColumn() - assigned_object_type = ContentTypeColumn( + pk = columns.ToggleColumn() + assigned_object_type = columns.ContentTypeColumn( verbose_name='Object type' ) assigned_object = tables.Column( @@ -252,7 +249,7 @@ class JournalEntryTable(ObjectJournalTable): orderable=False, verbose_name='Object' ) - comments = MarkdownColumn() + comments = columns.MarkdownColumn() class Meta(BaseTable.Meta): model = JournalEntry diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 59f922d82b3..0c59ae8744f 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -11,7 +11,7 @@ from rq import Worker from netbox.views import generic from utilities.forms import ConfirmationForm from utilities.htmx import is_htmx -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.utils import copy_safe_request, count_related, normalize_querydict, shallow_compare_dict from utilities.views import ContentTypePermissionRequiredMixin from . import filtersets, forms, tables diff --git a/netbox/ipam/tables/fhrp.py b/netbox/ipam/tables/fhrp.py index f9119126c46..e200d6cac52 100644 --- a/netbox/ipam/tables/fhrp.py +++ b/netbox/ipam/tables/fhrp.py @@ -1,7 +1,7 @@ import django_tables2 as tables -from utilities.tables import ActionsColumn, BaseTable, MarkdownColumn, TagColumn, ToggleColumn from ipam.models import * +from netbox.tables import BaseTable, columns __all__ = ( 'FHRPGroupTable', @@ -17,11 +17,11 @@ IPADDRESSES = """ class FHRPGroupTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() group_id = tables.Column( linkify=True ) - comments = MarkdownColumn() + comments = columns.MarkdownColumn() ip_addresses = tables.TemplateColumn( template_code=IPADDRESSES, orderable=False, @@ -30,7 +30,7 @@ class FHRPGroupTable(BaseTable): interface_count = tables.Column( verbose_name='Interfaces' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:fhrpgroup_list' ) @@ -44,7 +44,7 @@ class FHRPGroupTable(BaseTable): class FHRPGroupAssignmentTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() interface_parent = tables.Column( accessor=tables.A('interface.parent_object'), linkify=True, @@ -58,7 +58,7 @@ class FHRPGroupAssignmentTable(BaseTable): group = tables.Column( linkify=True ) - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete') ) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index b2e4ef958db..a69118da3a7 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -3,10 +3,8 @@ from django.utils.safestring import mark_safe from django_tables2.utils import Accessor from ipam.models import * +from netbox.tables import BaseTable, columns from tenancy.tables import TenantColumn -from utilities.tables import ( - BaseTable, BooleanColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ToggleColumn, UtilizationColumn, -) __all__ = ( 'AggregateTable', @@ -73,19 +71,19 @@ VRF_LINK = """ # class RIRTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - is_private = BooleanColumn( + is_private = columns.BooleanColumn( verbose_name='Private' ) - aggregate_count = LinkedCountColumn( + aggregate_count = columns.LinkedCountColumn( viewname='ipam:aggregate_list', url_params={'rir_id': 'pk'}, verbose_name='Aggregates' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:rir_list' ) @@ -103,13 +101,13 @@ class RIRTable(BaseTable): # class ASNTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() asn = tables.Column( accessor=tables.A('asn_asdot'), linkify=True ) - site_count = LinkedCountColumn( + site_count = columns.LinkedCountColumn( viewname='dcim:site_list', url_params={'asn_id': 'pk'}, verbose_name='Sites' @@ -126,7 +124,7 @@ class ASNTable(BaseTable): # class AggregateTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() prefix = tables.Column( linkify=True, verbose_name='Aggregate' @@ -139,11 +137,11 @@ class AggregateTable(BaseTable): child_count = tables.Column( verbose_name='Prefixes' ) - utilization = UtilizationColumn( + utilization = columns.UtilizationColumn( accessor='get_utilization', orderable=False ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:aggregate_list' ) @@ -161,21 +159,21 @@ class AggregateTable(BaseTable): # class RoleTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) - prefix_count = LinkedCountColumn( + prefix_count = columns.LinkedCountColumn( viewname='ipam:prefix_list', url_params={'role_id': 'pk'}, verbose_name='Prefixes' ) - vlan_count = LinkedCountColumn( + vlan_count = columns.LinkedCountColumn( viewname='ipam:vlan_list', url_params={'role_id': 'pk'}, verbose_name='VLANs' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:role_list' ) @@ -192,7 +190,7 @@ class RoleTable(BaseTable): # Prefixes # -class PrefixUtilizationColumn(UtilizationColumn): +class PrefixUtilizationColumn(columns.UtilizationColumn): """ Extend UtilizationColumn to allow disabling the warning & danger thresholds for prefixes marked as fully utilized. @@ -208,7 +206,7 @@ class PrefixUtilizationColumn(UtilizationColumn): class PrefixTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() prefix = tables.TemplateColumn( template_code=PREFIX_LINK, attrs={'td': {'class': 'text-nowrap'}} @@ -222,7 +220,7 @@ class PrefixTable(BaseTable): accessor=Accessor('_depth'), verbose_name='Depth' ) - children = LinkedCountColumn( + children = columns.LinkedCountColumn( accessor=Accessor('_children'), viewname='ipam:prefix_list', url_params={ @@ -231,7 +229,7 @@ class PrefixTable(BaseTable): }, verbose_name='Children' ) - status = ChoiceFieldColumn( + status = columns.ChoiceFieldColumn( default=AVAILABLE_LABEL ) vrf = tables.TemplateColumn( @@ -254,17 +252,17 @@ class PrefixTable(BaseTable): role = tables.Column( linkify=True ) - is_pool = BooleanColumn( + is_pool = columns.BooleanColumn( verbose_name='Pool' ) - mark_utilized = BooleanColumn( + mark_utilized = columns.BooleanColumn( verbose_name='Marked Utilized' ) utilization = PrefixUtilizationColumn( accessor='get_utilization', orderable=False ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:prefix_list' ) @@ -286,7 +284,7 @@ class PrefixTable(BaseTable): # IP ranges # class IPRangeTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() start_address = tables.Column( linkify=True ) @@ -294,18 +292,18 @@ class IPRangeTable(BaseTable): template_code=VRF_LINK, verbose_name='VRF' ) - status = ChoiceFieldColumn( + status = columns.ChoiceFieldColumn( default=AVAILABLE_LABEL ) role = tables.Column( linkify=True ) tenant = TenantColumn() - utilization = UtilizationColumn( + utilization = columns.UtilizationColumn( accessor='utilization', orderable=False ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:iprange_list' ) @@ -328,7 +326,7 @@ class IPRangeTable(BaseTable): # class IPAddressTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() address = tables.TemplateColumn( template_code=IPADDRESS_LINK, verbose_name='IP Address' @@ -337,10 +335,10 @@ class IPAddressTable(BaseTable): template_code=VRF_LINK, verbose_name='VRF' ) - status = ChoiceFieldColumn( + status = columns.ChoiceFieldColumn( default=AVAILABLE_LABEL ) - role = ChoiceFieldColumn() + role = columns.ChoiceFieldColumn() tenant = TenantColumn() assigned_object = tables.Column( linkify=True, @@ -358,12 +356,12 @@ class IPAddressTable(BaseTable): orderable=False, verbose_name='NAT (Inside)' ) - assigned = BooleanColumn( + assigned = columns.BooleanColumn( accessor='assigned_object_id', linkify=True, verbose_name='Assigned' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:ipaddress_list' ) @@ -386,7 +384,7 @@ class IPAddressAssignTable(BaseTable): template_code=IPADDRESS_ASSIGN_LINK, verbose_name='IP Address' ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() assigned_object = tables.Column( orderable=False ) @@ -410,7 +408,7 @@ class AssignedIPAddressesTable(BaseTable): template_code=VRF_LINK, verbose_name='VRF' ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() tenant = TenantColumn() class Meta(BaseTable.Meta): diff --git a/netbox/ipam/tables/services.py b/netbox/ipam/tables/services.py index 5c3e14b2c29..8b4f389e615 100644 --- a/netbox/ipam/tables/services.py +++ b/netbox/ipam/tables/services.py @@ -1,7 +1,7 @@ import django_tables2 as tables -from utilities.tables import BaseTable, TagColumn, ToggleColumn from ipam.models import * +from netbox.tables import BaseTable, columns __all__ = ( 'ServiceTable', @@ -10,14 +10,14 @@ __all__ = ( class ServiceTemplateTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) ports = tables.Column( accessor=tables.A('port_list') ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:servicetemplate_list' ) @@ -28,7 +28,7 @@ class ServiceTemplateTable(BaseTable): class ServiceTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -39,7 +39,7 @@ class ServiceTable(BaseTable): ports = tables.Column( accessor=tables.A('port_list') ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:service_list' ) diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index d387e24dddb..faace125725 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -3,13 +3,10 @@ from django.utils.safestring import mark_safe from django_tables2.utils import Accessor from dcim.models import Interface -from tenancy.tables import TenantColumn -from utilities.tables import ( - ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn, - TemplateColumn, ToggleColumn, -) -from virtualization.models import VMInterface from ipam.models import * +from netbox.tables import BaseTable, columns +from tenancy.tables import TenantColumn +from virtualization.models import VMInterface __all__ = ( 'InterfaceVLANTable', @@ -62,22 +59,22 @@ VLAN_MEMBER_TAGGED = """ # class VLANGroupTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column(linkify=True) - scope_type = ContentTypeColumn() + scope_type = columns.ContentTypeColumn() scope = tables.Column( linkify=True, orderable=False ) - vlan_count = LinkedCountColumn( + vlan_count = columns.LinkedCountColumn( viewname='ipam:vlan_list', url_params={'group_id': 'pk'}, verbose_name='VLANs' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:vlangroup_list' ) - actions = ActionsColumn( + actions = columns.ActionsColumn( extra_buttons=VLANGROUP_BUTTONS ) @@ -95,7 +92,7 @@ class VLANGroupTable(BaseTable): # class VLANTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() vid = tables.TemplateColumn( template_code=VLAN_LINK, verbose_name='VID' @@ -110,18 +107,18 @@ class VLANTable(BaseTable): linkify=True ) tenant = TenantColumn() - status = ChoiceFieldColumn( + status = columns.ChoiceFieldColumn( default=AVAILABLE_LABEL ) role = tables.Column( linkify=True ) - prefixes = TemplateColumn( + prefixes = columns.TemplateColumn( template_code=VLAN_PREFIXES, orderable=False, verbose_name='Prefixes' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:vlan_list' ) @@ -155,7 +152,7 @@ class VLANDevicesTable(VLANMembersTable): device = tables.Column( linkify=True ) - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit',) ) @@ -169,7 +166,7 @@ class VLANVirtualMachinesTable(VLANMembersTable): virtual_machine = tables.Column( linkify=True ) - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit',) ) @@ -187,7 +184,7 @@ class InterfaceVLANTable(BaseTable): linkify=True, verbose_name='ID' ) - tagged = BooleanColumn() + tagged = columns.BooleanColumn() site = tables.Column( linkify=True ) @@ -196,7 +193,7 @@ class InterfaceVLANTable(BaseTable): verbose_name='Group' ) tenant = TenantColumn() - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() role = tables.Column( linkify=True ) diff --git a/netbox/ipam/tables/vrfs.py b/netbox/ipam/tables/vrfs.py index e71fb1fa4be..7dbad6420bb 100644 --- a/netbox/ipam/tables/vrfs.py +++ b/netbox/ipam/tables/vrfs.py @@ -1,8 +1,8 @@ import django_tables2 as tables -from tenancy.tables import TenantColumn -from utilities.tables import BaseTable, BooleanColumn, TagColumn, TemplateColumn, ToggleColumn from ipam.models import * +from netbox.tables import BaseTable, columns +from tenancy.tables import TenantColumn __all__ = ( 'RouteTargetTable', @@ -21,7 +21,7 @@ VRF_TARGETS = """ # class VRFTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -29,18 +29,18 @@ class VRFTable(BaseTable): verbose_name='RD' ) tenant = TenantColumn() - enforce_unique = BooleanColumn( + enforce_unique = columns.BooleanColumn( verbose_name='Unique' ) - import_targets = TemplateColumn( + import_targets = columns.TemplateColumn( template_code=VRF_TARGETS, orderable=False ) - export_targets = TemplateColumn( + export_targets = columns.TemplateColumn( template_code=VRF_TARGETS, orderable=False ) - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:vrf_list' ) @@ -58,12 +58,12 @@ class VRFTable(BaseTable): # class RouteTargetTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) tenant = TenantColumn() - tags = TagColumn( + tags = columns.TagColumn( url_name='ipam:vrf_list' ) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 35d5cf50214..85c2482e5a9 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -8,7 +8,7 @@ from dcim.filtersets import InterfaceFilterSet from dcim.models import Interface, Site from dcim.tables import SiteTable from netbox.views import generic -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.utils import count_related from virtualization.filtersets import VMInterfaceFilterSet from virtualization.models import VMInterface diff --git a/netbox/utilities/tables/__init__.py b/netbox/netbox/tables/__init__.py similarity index 91% rename from netbox/utilities/tables/__init__.py rename to netbox/netbox/tables/__init__.py index 25fa9529605..40ae2f5472d 100644 --- a/netbox/utilities/tables/__init__.py +++ b/netbox/netbox/tables/__init__.py @@ -27,13 +27,3 @@ def configure_table(table, request): 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(table) - - -# -# Callables -# - -def linkify_phone(value): - if value is None: - return None - return f"tel:{value}" diff --git a/netbox/utilities/tables/columns.py b/netbox/netbox/tables/columns.py similarity index 100% rename from netbox/utilities/tables/columns.py rename to netbox/netbox/tables/columns.py diff --git a/netbox/utilities/tables/tables.py b/netbox/netbox/tables/tables.py similarity index 99% rename from netbox/utilities/tables/tables.py rename to netbox/netbox/tables/tables.py index d1915569e7b..8b8f6ae4c52 100644 --- a/netbox/utilities/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -7,7 +7,7 @@ from django.db.models.fields.related import RelatedField from django_tables2.data import TableQuerysetData from extras.models import CustomField, CustomLink -from . import columns +from netbox.tables import columns __all__ = ( 'BaseTable', diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 82e1dc2172b..9c834d76ff0 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -21,7 +21,7 @@ from utilities.forms import ( ) from utilities.htmx import is_htmx from utilities.permissions import get_permission_for_model -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.views import GetReturnURLMixin from .base import BaseMultiObjectView diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 09a102442ac..316c3a1ee7d 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -18,7 +18,7 @@ from utilities.exceptions import AbortTransaction, PermissionsViolation from utilities.forms import ConfirmationForm, ImportForm, restrict_form_fields from utilities.htmx import is_htmx from utilities.permissions import get_permission_for_model -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.utils import normalize_querydict, prepare_cloned_fields from utilities.views import GetReturnURLMixin from .base import BaseObjectView diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index 55a0591b586..bbaa4fdffcf 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -1,9 +1,7 @@ import django_tables2 as tables -from utilities.tables import ( - ActionsColumn, BaseTable, ContentTypeColumn, LinkedCountColumn, linkify_phone, MarkdownColumn, MPTTColumn, - TagColumn, ToggleColumn, -) +from netbox.tables import BaseTable, columns +from utilities.tables import linkify_phone from .models import * __all__ = ( @@ -47,16 +45,16 @@ class TenantColumn(tables.TemplateColumn): # class TenantGroupTable(BaseTable): - pk = ToggleColumn() - name = MPTTColumn( + pk = columns.ToggleColumn() + name = columns.MPTTColumn( linkify=True ) - tenant_count = LinkedCountColumn( + tenant_count = columns.LinkedCountColumn( viewname='tenancy:tenant_list', url_params={'group_id': 'pk'}, verbose_name='Tenants' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='tenancy:tenantgroup_list' ) @@ -69,15 +67,15 @@ class TenantGroupTable(BaseTable): class TenantTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) group = tables.Column( linkify=True ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='tenancy:tenant_list' ) @@ -92,16 +90,16 @@ class TenantTable(BaseTable): # class ContactGroupTable(BaseTable): - pk = ToggleColumn() - name = MPTTColumn( + pk = columns.ToggleColumn() + name = columns.MPTTColumn( linkify=True ) - contact_count = LinkedCountColumn( + contact_count = columns.LinkedCountColumn( viewname='tenancy:contact_list', url_params={'role_id': 'pk'}, verbose_name='Contacts' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='tenancy:contactgroup_list' ) @@ -114,7 +112,7 @@ class ContactGroupTable(BaseTable): class ContactRoleTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -126,7 +124,7 @@ class ContactRoleTable(BaseTable): class ContactTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -136,11 +134,11 @@ class ContactTable(BaseTable): phone = tables.Column( linkify=linkify_phone, ) - comments = MarkdownColumn() + comments = columns.MarkdownColumn() assignment_count = tables.Column( verbose_name='Assignments' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='tenancy:tenant_list' ) @@ -154,8 +152,8 @@ class ContactTable(BaseTable): class ContactAssignmentTable(BaseTable): - pk = ToggleColumn() - content_type = ContentTypeColumn( + pk = columns.ToggleColumn() + content_type = columns.ContentTypeColumn( verbose_name='Object Type' ) object = tables.Column( @@ -168,7 +166,7 @@ class ContactAssignmentTable(BaseTable): role = tables.Column( linkify=True ) - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete') ) diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 1d2dac0b59e..d4ebcb67277 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -6,7 +6,7 @@ from circuits.models import Circuit from dcim.models import Site, Rack, Device, RackReservation, Cable from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF from netbox.views import generic -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.utils import count_related from virtualization.models import VirtualMachine, Cluster from . import filtersets, forms, tables diff --git a/netbox/users/tests/test_preferences.py b/netbox/users/tests/test_preferences.py index 035ca6840af..326aac13aaa 100644 --- a/netbox/users/tests/test_preferences.py +++ b/netbox/users/tests/test_preferences.py @@ -6,7 +6,7 @@ from django.urls import reverse from dcim.models import Site from dcim.tables import SiteTable from users.preferences import UserPreference -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.testing import TestCase diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py new file mode 100644 index 00000000000..c8420e08430 --- /dev/null +++ b/netbox/utilities/tables.py @@ -0,0 +1,7 @@ +def linkify_phone(value): + """ + Render a telephone number as a hyperlink. + """ + if value is None: + return None + return f"tel:{value}" diff --git a/netbox/utilities/tests/test_tables.py b/netbox/utilities/tests/test_tables.py index 55a5e4cc73d..7a9f3bd9c91 100644 --- a/netbox/utilities/tests/test_tables.py +++ b/netbox/utilities/tests/test_tables.py @@ -2,12 +2,12 @@ from django.template import Context, Template from django.test import TestCase from dcim.models import Site -from utilities.tables import BaseTable, TagColumn +from netbox.tables import BaseTable, columns from utilities.testing import create_tags class TagColumnTable(BaseTable): - tags = TagColumn(url_name='dcim:site_list') + tags = columns.TagColumn(url_name='dcim:site_list') class Meta(BaseTable.Meta): model = Site diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index 517f0a4b81f..950174029a3 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -1,11 +1,8 @@ import django_tables2 as tables from dcim.tables.devices import BaseInterfaceTable +from netbox.tables import BaseTable, columns from tenancy.tables import TenantColumn -from utilities.tables import ( - ActionsColumn, BaseTable, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, - ToggleColumn, -) from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface __all__ = ( @@ -31,14 +28,14 @@ VMINTERFACE_BUTTONS = """ # class ClusterTypeTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) cluster_count = tables.Column( verbose_name='Clusters' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='virtualization:clustertype_list' ) @@ -55,14 +52,14 @@ class ClusterTypeTable(BaseTable): # class ClusterGroupTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) cluster_count = tables.Column( verbose_name='Clusters' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='virtualization:clustergroup_list' ) @@ -79,7 +76,7 @@ class ClusterGroupTable(BaseTable): # class ClusterTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -95,18 +92,18 @@ class ClusterTable(BaseTable): site = tables.Column( linkify=True ) - device_count = LinkedCountColumn( + device_count = columns.LinkedCountColumn( viewname='dcim:device_list', url_params={'cluster_id': 'pk'}, verbose_name='Devices' ) - vm_count = LinkedCountColumn( + vm_count = columns.LinkedCountColumn( viewname='virtualization:virtualmachine_list', url_params={'cluster_id': 'pk'}, verbose_name='VMs' ) - comments = MarkdownColumn() - tags = TagColumn( + comments = columns.MarkdownColumn() + tags = columns.TagColumn( url_name='virtualization:cluster_list' ) @@ -124,18 +121,18 @@ class ClusterTable(BaseTable): # class VirtualMachineTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() name = tables.Column( order_by=('_name',), linkify=True ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() cluster = tables.Column( linkify=True ) - role = ColoredLabelColumn() + role = columns.ColoredLabelColumn() tenant = TenantColumn() - comments = MarkdownColumn() + comments = columns.MarkdownColumn() primary_ip4 = tables.Column( linkify=True, verbose_name='IPv4 Address' @@ -149,7 +146,7 @@ class VirtualMachineTable(BaseTable): order_by=('primary_ip4', 'primary_ip6'), verbose_name='IP Address' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='virtualization:virtualmachine_list' ) @@ -169,14 +166,14 @@ class VirtualMachineTable(BaseTable): # class VMInterfaceTable(BaseInterfaceTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() virtual_machine = tables.Column( linkify=True ) name = tables.Column( linkify=True ) - tags = TagColumn( + tags = columns.TagColumn( url_name='virtualization:vminterface_list' ) @@ -196,7 +193,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): bridge = tables.Column( linkify=True ) - actions = ActionsColumn( + actions = columns.ActionsColumn( sequence=('edit', 'delete'), extra_buttons=VMINTERFACE_BUTTONS ) diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 0fc8c9bf74a..0957e28a253 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -11,7 +11,7 @@ from extras.views import ObjectConfigContextView from ipam.models import IPAddress, Service from ipam.tables import AssignedIPAddressesTable, InterfaceVLANTable from netbox.views import generic -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.utils import count_related from . import filtersets, forms, tables from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface diff --git a/netbox/wireless/tables.py b/netbox/wireless/tables.py index 650d91554d3..d1dba993d07 100644 --- a/netbox/wireless/tables.py +++ b/netbox/wireless/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.models import Interface -from utilities.tables import BaseTable, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn +from netbox.tables import BaseTable, columns from .models import * __all__ = ( @@ -12,16 +12,16 @@ __all__ = ( class WirelessLANGroupTable(BaseTable): - pk = ToggleColumn() - name = MPTTColumn( + pk = columns.ToggleColumn() + name = columns.MPTTColumn( linkify=True ) - wirelesslan_count = LinkedCountColumn( + wirelesslan_count = columns.LinkedCountColumn( viewname='wireless:wirelesslan_list', url_params={'group_id': 'pk'}, verbose_name='Wireless LANs' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='wireless:wirelesslangroup_list' ) @@ -34,7 +34,7 @@ class WirelessLANGroupTable(BaseTable): class WirelessLANTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() ssid = tables.Column( linkify=True ) @@ -44,7 +44,7 @@ class WirelessLANTable(BaseTable): interface_count = tables.Column( verbose_name='Interfaces' ) - tags = TagColumn( + tags = columns.TagColumn( url_name='wireless:wirelesslan_list' ) @@ -58,7 +58,7 @@ class WirelessLANTable(BaseTable): class WirelessLANInterfacesTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() device = tables.Column( linkify=True ) @@ -73,12 +73,12 @@ class WirelessLANInterfacesTable(BaseTable): class WirelessLinkTable(BaseTable): - pk = ToggleColumn() + pk = columns.ToggleColumn() id = tables.Column( linkify=True, verbose_name='ID' ) - status = ChoiceFieldColumn() + status = columns.ChoiceFieldColumn() device_a = tables.Column( accessor=tables.A('interface_a__device'), linkify=True @@ -93,7 +93,7 @@ class WirelessLinkTable(BaseTable): interface_b = tables.Column( linkify=True ) - tags = TagColumn( + tags = columns.TagColumn( url_name='wireless:wirelesslink_list' ) diff --git a/netbox/wireless/views.py b/netbox/wireless/views.py index 443cf8eef02..5ac90f0be0e 100644 --- a/netbox/wireless/views.py +++ b/netbox/wireless/views.py @@ -1,6 +1,6 @@ from dcim.models import Interface from netbox.views import generic -from utilities.tables import configure_table +from netbox.tables import configure_table from utilities.utils import count_related from . import filtersets, forms, tables from .models import * From 59d3f5c4ea6576f60a8beafdec6e3c1d56a47c35 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 27 Jan 2022 15:48:05 -0500 Subject: [PATCH 125/271] Split out NetBoxTable from BaseTable --- netbox/circuits/tables.py | 22 +++--- netbox/dcim/tables/__init__.py | 5 +- netbox/dcim/tables/cables.py | 7 +- netbox/dcim/tables/devices.py | 44 +++++------ netbox/dcim/tables/devicetypes.py | 17 ++-- netbox/dcim/tables/modules.py | 12 ++- netbox/dcim/tables/power.py | 10 +-- netbox/dcim/tables/racks.py | 17 ++-- netbox/dcim/tables/sites.py | 22 +++--- netbox/extras/tables.py | 47 +++++------ netbox/ipam/tables/fhrp.py | 12 ++- netbox/ipam/tables/ip.py | 45 +++++------ netbox/ipam/tables/services.py | 12 ++- netbox/ipam/tables/vlans.py | 22 +++--- netbox/ipam/tables/vrfs.py | 12 ++- netbox/netbox/tables/tables.py | 79 +++++++++++++------ .../tests/test_tables.py | 6 +- netbox/tenancy/tables.py | 32 +++----- netbox/virtualization/tables.py | 27 +++---- netbox/wireless/tables.py | 22 +++--- 20 files changed, 218 insertions(+), 254 deletions(-) rename netbox/{utilities => netbox}/tests/test_tables.py (89%) diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 0ffb8f03b0b..56da24842e4 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn from .models import * @@ -47,8 +47,7 @@ class CommitRateColumn(tables.TemplateColumn): # Providers # -class ProviderTable(BaseTable): - pk = columns.ToggleColumn() +class ProviderTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -61,7 +60,7 @@ class ProviderTable(BaseTable): url_name='circuits:provider_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Provider fields = ( 'pk', 'id', 'name', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'circuit_count', @@ -74,8 +73,7 @@ class ProviderTable(BaseTable): # Provider networks # -class ProviderNetworkTable(BaseTable): - pk = columns.ToggleColumn() +class ProviderNetworkTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -87,7 +85,7 @@ class ProviderNetworkTable(BaseTable): url_name='circuits:providernetwork_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ProviderNetwork fields = ( 'pk', 'id', 'name', 'provider', 'service_id', 'description', 'comments', 'created', 'last_updated', 'tags', @@ -99,8 +97,7 @@ class ProviderNetworkTable(BaseTable): # Circuit types # -class CircuitTypeTable(BaseTable): - pk = columns.ToggleColumn() +class CircuitTypeTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -111,7 +108,7 @@ class CircuitTypeTable(BaseTable): verbose_name='Circuits' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = CircuitType fields = ( 'pk', 'id', 'name', 'circuit_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', @@ -123,8 +120,7 @@ class CircuitTypeTable(BaseTable): # Circuits # -class CircuitTable(BaseTable): - pk = columns.ToggleColumn() +class CircuitTable(NetBoxTable): cid = tables.Column( linkify=True, verbose_name='Circuit ID' @@ -148,7 +144,7 @@ class CircuitTable(BaseTable): url_name='circuits:circuit_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Circuit fields = ( 'pk', 'id', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'install_date', diff --git a/netbox/dcim/tables/__init__.py b/netbox/dcim/tables/__init__.py index 7567762fa35..e3b2a42bae7 100644 --- a/netbox/dcim/tables/__init__.py +++ b/netbox/dcim/tables/__init__.py @@ -1,8 +1,8 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from dcim.models import ConsolePort, Interface, PowerPort from netbox.tables import BaseTable, columns +from dcim.models import ConsolePort, Interface, PowerPort from .cables import * from .devices import * from .devicetypes import * @@ -44,7 +44,6 @@ class ConsoleConnectionTable(BaseTable): class Meta(BaseTable.Meta): model = ConsolePort fields = ('device', 'name', 'console_server', 'console_server_port', 'reachable') - exclude = ('id', ) class PowerConnectionTable(BaseTable): @@ -75,7 +74,6 @@ class PowerConnectionTable(BaseTable): class Meta(BaseTable.Meta): model = PowerPort fields = ('device', 'name', 'pdu', 'outlet', 'reachable') - exclude = ('id', ) class InterfaceConnectionTable(BaseTable): @@ -109,4 +107,3 @@ class InterfaceConnectionTable(BaseTable): class Meta(BaseTable.Meta): model = Interface fields = ('device_a', 'interface_a', 'device_b', 'interface_b', 'reachable') - exclude = ('id', ) diff --git a/netbox/dcim/tables/cables.py b/netbox/dcim/tables/cables.py index addb67c33f0..1774a3e22f2 100644 --- a/netbox/dcim/tables/cables.py +++ b/netbox/dcim/tables/cables.py @@ -2,7 +2,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor from dcim.models import Cable -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn from .template_code import CABLE_LENGTH, CABLE_TERMINATION_PARENT @@ -15,8 +15,7 @@ __all__ = ( # Cables # -class CableTable(BaseTable): - pk = columns.ToggleColumn() +class CableTable(NetBoxTable): termination_a_parent = tables.TemplateColumn( template_code=CABLE_TERMINATION_PARENT, accessor=Accessor('termination_a'), @@ -52,7 +51,7 @@ class CableTable(BaseTable): url_name='dcim:cable_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Cable fields = ( 'pk', 'id', 'label', 'termination_a_parent', 'termination_a', 'termination_b_parent', 'termination_b', diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 7dee2bcbe87..37faaae7f81 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -5,7 +5,7 @@ from dcim.models import ( ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, FrontPort, Interface, InventoryItem, InventoryItemRole, ModuleBay, Platform, PowerOutlet, PowerPort, RearPort, VirtualChassis, ) -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn from .template_code import * @@ -71,8 +71,7 @@ def get_interface_state_attribute(record): # Device roles # -class DeviceRoleTable(BaseTable): - pk = columns.ToggleColumn() +class DeviceRoleTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -92,7 +91,7 @@ class DeviceRoleTable(BaseTable): url_name='dcim:devicerole_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = DeviceRole fields = ( 'pk', 'id', 'name', 'device_count', 'vm_count', 'color', 'vm_role', 'description', 'slug', 'tags', @@ -105,8 +104,7 @@ class DeviceRoleTable(BaseTable): # Platforms # -class PlatformTable(BaseTable): - pk = columns.ToggleColumn() +class PlatformTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -124,7 +122,7 @@ class PlatformTable(BaseTable): url_name='dcim:platform_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Platform fields = ( 'pk', 'id', 'name', 'manufacturer', 'device_count', 'vm_count', 'slug', 'napalm_driver', 'napalm_args', @@ -139,8 +137,7 @@ class PlatformTable(BaseTable): # Devices # -class DeviceTable(BaseTable): - pk = columns.ToggleColumn() +class DeviceTable(NetBoxTable): name = tables.TemplateColumn( order_by=('_name',), template_code=DEVICE_LINK @@ -197,7 +194,7 @@ class DeviceTable(BaseTable): url_name='dcim:device_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Device fields = ( 'pk', 'id', 'name', 'status', 'tenant', 'device_role', 'manufacturer', 'device_type', 'platform', 'serial', @@ -211,7 +208,7 @@ class DeviceTable(BaseTable): ) -class DeviceImportTable(BaseTable): +class DeviceImportTable(NetBoxTable): name = tables.TemplateColumn( template_code=DEVICE_LINK ) @@ -230,7 +227,7 @@ class DeviceImportTable(BaseTable): verbose_name='Type' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Device fields = ('id', 'name', 'status', 'tenant', 'site', 'rack', 'position', 'device_role', 'device_type') empty_text = False @@ -240,8 +237,7 @@ class DeviceImportTable(BaseTable): # Device components # -class DeviceComponentTable(BaseTable): - pk = columns.ToggleColumn() +class DeviceComponentTable(NetBoxTable): device = tables.Column( linkify=True ) @@ -250,7 +246,7 @@ class DeviceComponentTable(BaseTable): order_by=('_name',) ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): order_by = ('device', 'name') @@ -267,7 +263,7 @@ class ModularDeviceComponentTable(DeviceComponentTable): ) -class CableTerminationTable(BaseTable): +class CableTerminationTable(NetBoxTable): cable = tables.Column( linkify=True ) @@ -473,7 +469,7 @@ class DevicePowerOutletTable(PowerOutletTable): } -class BaseInterfaceTable(BaseTable): +class BaseInterfaceTable(NetBoxTable): enabled = columns.BooleanColumn() ip_addresses = tables.TemplateColumn( template_code=INTERFACE_IPADDRESSES, @@ -776,7 +772,7 @@ class InventoryItemTable(DeviceComponentTable): ) cable = None # Override DeviceComponentTable - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = InventoryItem fields = ( 'pk', 'id', 'name', 'device', 'component', 'label', 'role', 'manufacturer', 'part_id', 'serial', @@ -796,7 +792,7 @@ class DeviceInventoryItemTable(InventoryItemTable): ) actions = columns.ActionsColumn() - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = InventoryItem fields = ( 'pk', 'id', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'component', @@ -807,8 +803,7 @@ class DeviceInventoryItemTable(InventoryItemTable): ) -class InventoryItemRoleTable(BaseTable): - pk = columns.ToggleColumn() +class InventoryItemRoleTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -822,7 +817,7 @@ class InventoryItemRoleTable(BaseTable): url_name='dcim:inventoryitemrole_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = InventoryItemRole fields = ( 'pk', 'id', 'name', 'inventoryitem_count', 'color', 'description', 'slug', 'tags', 'actions', @@ -834,8 +829,7 @@ class InventoryItemRoleTable(BaseTable): # Virtual chassis # -class VirtualChassisTable(BaseTable): - pk = columns.ToggleColumn() +class VirtualChassisTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -851,7 +845,7 @@ class VirtualChassisTable(BaseTable): url_name='dcim:virtualchassis_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VirtualChassis fields = ('pk', 'id', 'name', 'domain', 'master', 'member_count', 'tags', 'created', 'last_updated',) default_columns = ('pk', 'name', 'domain', 'master', 'member_count') diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 0b4f04a2af9..44848f6baf3 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -5,7 +5,7 @@ from dcim.models import ( ConsolePortTemplate, ConsoleServerPortTemplate, DeviceBayTemplate, DeviceType, FrontPortTemplate, InterfaceTemplate, InventoryItemTemplate, Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, ) -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS __all__ = ( @@ -28,8 +28,7 @@ __all__ = ( # Manufacturers # -class ManufacturerTable(BaseTable): - pk = columns.ToggleColumn() +class ManufacturerTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -47,7 +46,7 @@ class ManufacturerTable(BaseTable): url_name='dcim:manufacturer_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Manufacturer fields = ( 'pk', 'id', 'name', 'devicetype_count', 'inventoryitem_count', 'platform_count', 'description', 'slug', @@ -62,8 +61,7 @@ class ManufacturerTable(BaseTable): # Device types # -class DeviceTypeTable(BaseTable): - pk = columns.ToggleColumn() +class DeviceTypeTable(NetBoxTable): model = tables.Column( linkify=True, verbose_name='Device Type' @@ -81,7 +79,7 @@ class DeviceTypeTable(BaseTable): url_name='dcim:devicetype_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = DeviceType fields = ( 'pk', 'id', 'model', 'manufacturer', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', @@ -96,8 +94,7 @@ class DeviceTypeTable(BaseTable): # Device type components # -class ComponentTemplateTable(BaseTable): - pk = columns.ToggleColumn() +class ComponentTemplateTable(NetBoxTable): id = tables.Column( verbose_name='ID' ) @@ -105,7 +102,7 @@ class ComponentTemplateTable(BaseTable): order_by=('_name',) ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): exclude = ('id', ) diff --git a/netbox/dcim/tables/modules.py b/netbox/dcim/tables/modules.py index 4a4c9d09a2f..5b009e42e6f 100644 --- a/netbox/dcim/tables/modules.py +++ b/netbox/dcim/tables/modules.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.models import Module, ModuleType -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns __all__ = ( 'ModuleTable', @@ -9,8 +9,7 @@ __all__ = ( ) -class ModuleTypeTable(BaseTable): - pk = columns.ToggleColumn() +class ModuleTypeTable(NetBoxTable): model = tables.Column( linkify=True, verbose_name='Module Type' @@ -25,7 +24,7 @@ class ModuleTypeTable(BaseTable): url_name='dcim:moduletype_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ModuleType fields = ( 'pk', 'id', 'model', 'manufacturer', 'part_number', 'comments', 'tags', @@ -35,8 +34,7 @@ class ModuleTypeTable(BaseTable): ) -class ModuleTable(BaseTable): - pk = columns.ToggleColumn() +class ModuleTable(NetBoxTable): device = tables.Column( linkify=True ) @@ -51,7 +49,7 @@ class ModuleTable(BaseTable): url_name='dcim:module_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Module fields = ( 'pk', 'id', 'device', 'module_bay', 'module_type', 'serial', 'asset_tag', 'comments', 'tags', diff --git a/netbox/dcim/tables/power.py b/netbox/dcim/tables/power.py index e1c0304a2ab..99bc963f90b 100644 --- a/netbox/dcim/tables/power.py +++ b/netbox/dcim/tables/power.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.models import PowerFeed, PowerPanel -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from .devices import CableTerminationTable __all__ = ( @@ -14,8 +14,7 @@ __all__ = ( # Power panels # -class PowerPanelTable(BaseTable): - pk = columns.ToggleColumn() +class PowerPanelTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -31,7 +30,7 @@ class PowerPanelTable(BaseTable): url_name='dcim:powerpanel_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = PowerPanel fields = ('pk', 'id', 'name', 'site', 'location', 'powerfeed_count', 'tags', 'created', 'last_updated',) default_columns = ('pk', 'name', 'site', 'location', 'powerfeed_count') @@ -44,7 +43,6 @@ class PowerPanelTable(BaseTable): # We're not using PathEndpointTable for PowerFeed because power connections # cannot traverse pass-through ports. class PowerFeedTable(CableTerminationTable): - pk = columns.ToggleColumn() name = tables.Column( linkify=True ) @@ -67,7 +65,7 @@ class PowerFeedTable(CableTerminationTable): url_name='dcim:powerfeed_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = PowerFeed fields = ( 'pk', 'id', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index 9e89d7b824e..416e9e8ff46 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -2,7 +2,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor from dcim.models import Rack, RackReservation, RackRole -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn __all__ = ( @@ -16,8 +16,7 @@ __all__ = ( # Rack roles # -class RackRoleTable(BaseTable): - pk = columns.ToggleColumn() +class RackRoleTable(NetBoxTable): name = tables.Column(linkify=True) rack_count = tables.Column(verbose_name='Racks') color = columns.ColorColumn() @@ -25,7 +24,7 @@ class RackRoleTable(BaseTable): url_name='dcim:rackrole_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = RackRole fields = ( 'pk', 'id', 'name', 'rack_count', 'color', 'description', 'slug', 'tags', 'actions', 'created', @@ -38,8 +37,7 @@ class RackRoleTable(BaseTable): # Racks # -class RackTable(BaseTable): - pk = columns.ToggleColumn() +class RackTable(NetBoxTable): name = tables.Column( order_by=('_name',), linkify=True @@ -83,7 +81,7 @@ class RackTable(BaseTable): verbose_name='Outer Depth' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Rack fields = ( 'pk', 'id', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'serial', 'asset_tag', @@ -100,8 +98,7 @@ class RackTable(BaseTable): # Rack reservations # -class RackReservationTable(BaseTable): - pk = columns.ToggleColumn() +class RackReservationTable(NetBoxTable): reservation = tables.Column( accessor='pk', linkify=True @@ -122,7 +119,7 @@ class RackReservationTable(BaseTable): url_name='dcim:rackreservation_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = RackReservation fields = ( 'pk', 'id', 'reservation', 'site', 'rack', 'unit_list', 'user', 'created', 'tenant', 'description', 'tags', diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 7a4e2f34f5c..1be1f74d0e8 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.models import Location, Region, Site, SiteGroup -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn from .template_code import LOCATION_BUTTONS @@ -17,8 +17,7 @@ __all__ = ( # Regions # -class RegionTable(BaseTable): - pk = columns.ToggleColumn() +class RegionTable(NetBoxTable): name = columns.MPTTColumn( linkify=True ) @@ -31,7 +30,7 @@ class RegionTable(BaseTable): url_name='dcim:region_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Region fields = ( 'pk', 'id', 'name', 'slug', 'site_count', 'description', 'tags', 'created', 'last_updated', 'actions', @@ -43,8 +42,7 @@ class RegionTable(BaseTable): # Site groups # -class SiteGroupTable(BaseTable): - pk = columns.ToggleColumn() +class SiteGroupTable(NetBoxTable): name = columns.MPTTColumn( linkify=True ) @@ -57,7 +55,7 @@ class SiteGroupTable(BaseTable): url_name='dcim:sitegroup_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = SiteGroup fields = ( 'pk', 'id', 'name', 'slug', 'site_count', 'description', 'tags', 'created', 'last_updated', 'actions', @@ -69,8 +67,7 @@ class SiteGroupTable(BaseTable): # Sites # -class SiteTable(BaseTable): - pk = columns.ToggleColumn() +class SiteTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -93,7 +90,7 @@ class SiteTable(BaseTable): url_name='dcim:site_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Site fields = ( 'pk', 'id', 'name', 'slug', 'status', 'facility', 'region', 'group', 'tenant', 'asn_count', 'time_zone', @@ -107,8 +104,7 @@ class SiteTable(BaseTable): # Locations # -class LocationTable(BaseTable): - pk = columns.ToggleColumn() +class LocationTable(NetBoxTable): name = columns.MPTTColumn( linkify=True ) @@ -133,7 +129,7 @@ class LocationTable(BaseTable): extra_buttons=LOCATION_BUTTONS ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Location fields = ( 'pk', 'id', 'name', 'site', 'tenant', 'rack_count', 'device_count', 'description', 'slug', 'tags', diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index b235cd8e2fc..52aeb9708d5 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from django.conf import settings -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from .models import * __all__ = ( @@ -43,15 +43,14 @@ OBJECTCHANGE_REQUEST_ID = """ # Custom fields # -class CustomFieldTable(BaseTable): - pk = columns.ToggleColumn() +class CustomFieldTable(NetBoxTable): name = tables.Column( linkify=True ) content_types = columns.ContentTypesColumn() required = columns.BooleanColumn() - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = CustomField fields = ( 'pk', 'id', 'name', 'content_types', 'label', 'type', 'required', 'weight', 'default', @@ -64,8 +63,7 @@ class CustomFieldTable(BaseTable): # Custom links # -class CustomLinkTable(BaseTable): - pk = columns.ToggleColumn() +class CustomLinkTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -73,7 +71,7 @@ class CustomLinkTable(BaseTable): enabled = columns.BooleanColumn() new_window = columns.BooleanColumn() - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = CustomLink fields = ( 'pk', 'id', 'name', 'content_type', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', @@ -86,15 +84,14 @@ class CustomLinkTable(BaseTable): # Export templates # -class ExportTemplateTable(BaseTable): - pk = columns.ToggleColumn() +class ExportTemplateTable(NetBoxTable): name = tables.Column( linkify=True ) content_type = columns.ContentTypeColumn() as_attachment = columns.BooleanColumn() - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ExportTemplate fields = ( 'pk', 'id', 'name', 'content_type', 'description', 'mime_type', 'file_extension', 'as_attachment', @@ -109,8 +106,7 @@ class ExportTemplateTable(BaseTable): # Webhooks # -class WebhookTable(BaseTable): - pk = columns.ToggleColumn() +class WebhookTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -129,7 +125,7 @@ class WebhookTable(BaseTable): verbose_name='SSL Validation' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Webhook fields = ( 'pk', 'id', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete', 'http_method', @@ -145,20 +141,19 @@ class WebhookTable(BaseTable): # Tags # -class TagTable(BaseTable): - pk = columns.ToggleColumn() +class TagTable(NetBoxTable): name = tables.Column( linkify=True ) color = columns.ColorColumn() - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Tag fields = ('pk', 'id', 'name', 'items', 'slug', 'color', 'description', 'created', 'last_updated', 'actions') default_columns = ('pk', 'name', 'items', 'slug', 'color', 'description') -class TaggedItemTable(BaseTable): +class TaggedItemTable(NetBoxTable): id = tables.Column( verbose_name='ID', linkify=lambda record: record.content_object.get_absolute_url(), @@ -173,13 +168,12 @@ class TaggedItemTable(BaseTable): verbose_name='Object' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = TaggedItem fields = ('id', 'content_type', 'content_object') -class ConfigContextTable(BaseTable): - pk = columns.ToggleColumn() +class ConfigContextTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -187,7 +181,7 @@ class ConfigContextTable(BaseTable): verbose_name='Active' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ConfigContext fields = ( 'pk', 'id', 'name', 'weight', 'is_active', 'description', 'regions', 'sites', 'roles', @@ -197,7 +191,7 @@ class ConfigContextTable(BaseTable): default_columns = ('pk', 'name', 'weight', 'is_active', 'description') -class ObjectChangeTable(BaseTable): +class ObjectChangeTable(NetBoxTable): time = tables.DateTimeColumn( linkify=True, format=settings.SHORT_DATETIME_FORMAT @@ -216,12 +210,12 @@ class ObjectChangeTable(BaseTable): ) actions = columns.ActionsColumn(sequence=()) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ObjectChange fields = ('id', 'time', 'user_name', 'action', 'changed_object_type', 'object_repr', 'request_id') -class ObjectJournalTable(BaseTable): +class ObjectJournalTable(NetBoxTable): """ Used for displaying a set of JournalEntries within the context of a single object. """ @@ -234,13 +228,12 @@ class ObjectJournalTable(BaseTable): template_code='{% load helpers %}{{ value|render_markdown|truncatewords_html:50 }}' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = JournalEntry fields = ('id', 'created', 'created_by', 'kind', 'comments', 'actions') class JournalEntryTable(ObjectJournalTable): - pk = columns.ToggleColumn() assigned_object_type = columns.ContentTypeColumn( verbose_name='Object type' ) @@ -251,7 +244,7 @@ class JournalEntryTable(ObjectJournalTable): ) comments = columns.MarkdownColumn() - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = JournalEntry fields = ( 'pk', 'id', 'created', 'created_by', 'assigned_object_type', 'assigned_object', 'kind', diff --git a/netbox/ipam/tables/fhrp.py b/netbox/ipam/tables/fhrp.py index e200d6cac52..8848cb079d4 100644 --- a/netbox/ipam/tables/fhrp.py +++ b/netbox/ipam/tables/fhrp.py @@ -1,7 +1,7 @@ import django_tables2 as tables from ipam.models import * -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns __all__ = ( 'FHRPGroupTable', @@ -16,8 +16,7 @@ IPADDRESSES = """ """ -class FHRPGroupTable(BaseTable): - pk = columns.ToggleColumn() +class FHRPGroupTable(NetBoxTable): group_id = tables.Column( linkify=True ) @@ -34,7 +33,7 @@ class FHRPGroupTable(BaseTable): url_name='ipam:fhrpgroup_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = FHRPGroup fields = ( 'pk', 'group_id', 'protocol', 'auth_type', 'auth_key', 'description', 'ip_addresses', 'interface_count', @@ -43,8 +42,7 @@ class FHRPGroupTable(BaseTable): default_columns = ('pk', 'group_id', 'protocol', 'auth_type', 'description', 'ip_addresses', 'interface_count') -class FHRPGroupAssignmentTable(BaseTable): - pk = columns.ToggleColumn() +class FHRPGroupAssignmentTable(NetBoxTable): interface_parent = tables.Column( accessor=tables.A('interface.parent_object'), linkify=True, @@ -62,7 +60,7 @@ class FHRPGroupAssignmentTable(BaseTable): sequence=('edit', 'delete') ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = FHRPGroupAssignment fields = ('pk', 'group', 'interface_parent', 'interface', 'priority') exclude = ('id',) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index a69118da3a7..762857136db 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -3,7 +3,7 @@ from django.utils.safestring import mark_safe from django_tables2.utils import Accessor from ipam.models import * -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn __all__ = ( @@ -70,8 +70,7 @@ VRF_LINK = """ # RIRs # -class RIRTable(BaseTable): - pk = columns.ToggleColumn() +class RIRTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -87,7 +86,7 @@ class RIRTable(BaseTable): url_name='ipam:rir_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = RIR fields = ( 'pk', 'id', 'name', 'slug', 'is_private', 'aggregate_count', 'description', 'tags', 'created', @@ -100,8 +99,7 @@ class RIRTable(BaseTable): # ASNs # -class ASNTable(BaseTable): - pk = columns.ToggleColumn() +class ASNTable(NetBoxTable): asn = tables.Column( accessor=tables.A('asn_asdot'), linkify=True @@ -113,7 +111,7 @@ class ASNTable(BaseTable): verbose_name='Sites' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ASN fields = ('pk', 'asn', 'rir', 'site_count', 'tenant', 'description', 'created', 'last_updated', 'actions') default_columns = ('pk', 'asn', 'rir', 'site_count', 'sites', 'tenant') @@ -123,8 +121,7 @@ class ASNTable(BaseTable): # Aggregates # -class AggregateTable(BaseTable): - pk = columns.ToggleColumn() +class AggregateTable(NetBoxTable): prefix = tables.Column( linkify=True, verbose_name='Aggregate' @@ -145,7 +142,7 @@ class AggregateTable(BaseTable): url_name='ipam:aggregate_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Aggregate fields = ( 'pk', 'id', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description', 'tags', @@ -158,8 +155,7 @@ class AggregateTable(BaseTable): # Roles # -class RoleTable(BaseTable): - pk = columns.ToggleColumn() +class RoleTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -177,7 +173,7 @@ class RoleTable(BaseTable): url_name='ipam:role_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Role fields = ( 'pk', 'id', 'name', 'slug', 'prefix_count', 'vlan_count', 'description', 'weight', 'tags', 'created', @@ -205,8 +201,7 @@ class PrefixUtilizationColumn(columns.UtilizationColumn): """ -class PrefixTable(BaseTable): - pk = columns.ToggleColumn() +class PrefixTable(NetBoxTable): prefix = tables.TemplateColumn( template_code=PREFIX_LINK, attrs={'td': {'class': 'text-nowrap'}} @@ -266,7 +261,7 @@ class PrefixTable(BaseTable): url_name='ipam:prefix_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Prefix fields = ( 'pk', 'id', 'prefix', 'prefix_flat', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', @@ -283,8 +278,7 @@ class PrefixTable(BaseTable): # # IP ranges # -class IPRangeTable(BaseTable): - pk = columns.ToggleColumn() +class IPRangeTable(NetBoxTable): start_address = tables.Column( linkify=True ) @@ -307,7 +301,7 @@ class IPRangeTable(BaseTable): url_name='ipam:iprange_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = IPRange fields = ( 'pk', 'id', 'start_address', 'end_address', 'size', 'vrf', 'status', 'role', 'tenant', 'description', @@ -325,8 +319,7 @@ class IPRangeTable(BaseTable): # IPAddresses # -class IPAddressTable(BaseTable): - pk = columns.ToggleColumn() +class IPAddressTable(NetBoxTable): address = tables.TemplateColumn( template_code=IPADDRESS_LINK, verbose_name='IP Address' @@ -365,7 +358,7 @@ class IPAddressTable(BaseTable): url_name='ipam:ipaddress_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = IPAddress fields = ( 'pk', 'id', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'assigned', 'dns_name', 'description', @@ -379,7 +372,7 @@ class IPAddressTable(BaseTable): } -class IPAddressAssignTable(BaseTable): +class IPAddressAssignTable(NetBoxTable): address = tables.TemplateColumn( template_code=IPADDRESS_ASSIGN_LINK, verbose_name='IP Address' @@ -389,14 +382,14 @@ class IPAddressAssignTable(BaseTable): orderable=False ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = IPAddress fields = ('address', 'dns_name', 'vrf', 'status', 'role', 'tenant', 'assigned_object', 'description') exclude = ('id', ) orderable = False -class AssignedIPAddressesTable(BaseTable): +class AssignedIPAddressesTable(NetBoxTable): """ List IP addresses assigned to an object. """ @@ -411,7 +404,7 @@ class AssignedIPAddressesTable(BaseTable): status = columns.ChoiceFieldColumn() tenant = TenantColumn() - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = IPAddress fields = ('address', 'vrf', 'status', 'role', 'tenant', 'description') exclude = ('id', ) diff --git a/netbox/ipam/tables/services.py b/netbox/ipam/tables/services.py index 8b4f389e615..8c81a28c29b 100644 --- a/netbox/ipam/tables/services.py +++ b/netbox/ipam/tables/services.py @@ -1,7 +1,7 @@ import django_tables2 as tables from ipam.models import * -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns __all__ = ( 'ServiceTable', @@ -9,8 +9,7 @@ __all__ = ( ) -class ServiceTemplateTable(BaseTable): - pk = columns.ToggleColumn() +class ServiceTemplateTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -21,14 +20,13 @@ class ServiceTemplateTable(BaseTable): url_name='ipam:servicetemplate_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ServiceTemplate fields = ('pk', 'id', 'name', 'protocol', 'ports', 'description', 'tags') default_columns = ('pk', 'name', 'protocol', 'ports', 'description') -class ServiceTable(BaseTable): - pk = columns.ToggleColumn() +class ServiceTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -43,7 +41,7 @@ class ServiceTable(BaseTable): url_name='ipam:service_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Service fields = ( 'pk', 'id', 'name', 'parent', 'protocol', 'ports', 'ipaddresses', 'description', 'tags', 'created', diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index faace125725..192da0813fb 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -4,7 +4,7 @@ from django_tables2.utils import Accessor from dcim.models import Interface from ipam.models import * -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn from virtualization.models import VMInterface @@ -58,8 +58,7 @@ VLAN_MEMBER_TAGGED = """ # VLAN groups # -class VLANGroupTable(BaseTable): - pk = columns.ToggleColumn() +class VLANGroupTable(NetBoxTable): name = tables.Column(linkify=True) scope_type = columns.ContentTypeColumn() scope = tables.Column( @@ -78,7 +77,7 @@ class VLANGroupTable(BaseTable): extra_buttons=VLANGROUP_BUTTONS ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VLANGroup fields = ( 'pk', 'id', 'name', 'scope_type', 'scope', 'min_vid', 'max_vid', 'vlan_count', 'slug', 'description', @@ -91,8 +90,7 @@ class VLANGroupTable(BaseTable): # VLANs # -class VLANTable(BaseTable): - pk = columns.ToggleColumn() +class VLANTable(NetBoxTable): vid = tables.TemplateColumn( template_code=VLAN_LINK, verbose_name='VID' @@ -122,7 +120,7 @@ class VLANTable(BaseTable): url_name='ipam:vlan_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VLAN fields = ( 'pk', 'id', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags', @@ -134,7 +132,7 @@ class VLANTable(BaseTable): } -class VLANMembersTable(BaseTable): +class VLANMembersTable(NetBoxTable): """ Base table for Interface and VMInterface assignments """ @@ -156,7 +154,7 @@ class VLANDevicesTable(VLANMembersTable): sequence=('edit',) ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Interface fields = ('device', 'name', 'tagged', 'actions') exclude = ('id', ) @@ -170,13 +168,13 @@ class VLANVirtualMachinesTable(VLANMembersTable): sequence=('edit',) ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VMInterface fields = ('virtual_machine', 'name', 'tagged', 'actions') exclude = ('id', ) -class InterfaceVLANTable(BaseTable): +class InterfaceVLANTable(NetBoxTable): """ List VLANs assigned to a specific Interface. """ @@ -198,7 +196,7 @@ class InterfaceVLANTable(BaseTable): linkify=True ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VLAN fields = ('vid', 'tagged', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description') exclude = ('id', ) diff --git a/netbox/ipam/tables/vrfs.py b/netbox/ipam/tables/vrfs.py index 7dbad6420bb..727f402ff4e 100644 --- a/netbox/ipam/tables/vrfs.py +++ b/netbox/ipam/tables/vrfs.py @@ -1,7 +1,7 @@ import django_tables2 as tables from ipam.models import * -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn __all__ = ( @@ -20,8 +20,7 @@ VRF_TARGETS = """ # VRFs # -class VRFTable(BaseTable): - pk = columns.ToggleColumn() +class VRFTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -44,7 +43,7 @@ class VRFTable(BaseTable): url_name='ipam:vrf_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VRF fields = ( 'pk', 'id', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', @@ -57,8 +56,7 @@ class VRFTable(BaseTable): # Route targets # -class RouteTargetTable(BaseTable): - pk = columns.ToggleColumn() +class RouteTargetTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -67,7 +65,7 @@ class RouteTargetTable(BaseTable): url_name='ipam:vrf_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = RouteTarget fields = ('pk', 'id', 'name', 'tenant', 'description', 'tags', 'created', 'last_updated',) default_columns = ('pk', 'name', 'tenant', 'description') diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index 8b8f6ae4c52..fe422118c43 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -11,49 +11,37 @@ from netbox.tables import columns __all__ = ( 'BaseTable', + 'NetBoxTable', ) class BaseTable(tables.Table): """ - Default table for object lists + Base table class for NetBox objects. Adds support for: + + * User configuration (column preferences) + * Automatic prefetching of related objects + * BS5 styling :param user: Personalize table display for the given user (optional). Has no effect if AnonymousUser is passed. """ - id = tables.Column( - linkify=True, - verbose_name='ID' - ) - actions = columns.ActionsColumn() + exempt_columns = () class Meta: attrs = { 'class': 'table table-hover object-list', } - def __init__(self, *args, user=None, extra_columns=None, **kwargs): - if extra_columns is None: - extra_columns = [] + def __init__(self, *args, user=None, **kwargs): - # Add custom field & custom link columns - content_type = ContentType.objects.get_for_model(self._meta.model) - custom_fields = CustomField.objects.filter(content_types=content_type) - extra_columns.extend([ - (f'cf_{cf.name}', columns.CustomFieldColumn(cf)) for cf in custom_fields - ]) - custom_links = CustomLink.objects.filter(content_type=content_type, enabled=True) - extra_columns.extend([ - (f'cl_{cl.name}', columns.CustomLinkColumn(cl)) for cl in custom_links - ]) - - super().__init__(*args, extra_columns=extra_columns, **kwargs) + super().__init__(*args, **kwargs) # Set default empty_text if none was provided if self.empty_text is None: self.empty_text = f"No {self._meta.model._meta.verbose_name_plural} found" - # Hide non-default columns (except for actions) - default_columns = [*getattr(self.Meta, 'default_columns', self.Meta.fields), 'actions'] + # Hide non-default columns + default_columns = [*getattr(self.Meta, 'default_columns', self.Meta.fields), *self.exempt_columns] for column in self.columns: if column.name not in default_columns: self.columns.hide(column.name) @@ -65,7 +53,7 @@ class BaseTable(tables.Table): # Show only persistent or selected columns for name, column in self.columns.items(): - if name in ['pk', 'actions', *selected_columns]: + if name in [*self.exempt_columns, *selected_columns]: self.columns.show(name) else: self.columns.hide(name) @@ -116,7 +104,7 @@ class BaseTable(tables.Table): def _get_columns(self, visible=True): columns = [] for name, column in self.columns.items(): - if column.visible == visible and name not in ['pk', 'actions']: + if column.visible == visible and name not in self.exempt_columns: columns.append((name, column.verbose_name)) return columns @@ -137,3 +125,44 @@ class BaseTable(tables.Table): if not hasattr(self, '_objects_count'): self._objects_count = sum(1 for obj in self.data if hasattr(obj, 'pk')) return self._objects_count + + +class NetBoxTable(BaseTable): + """ + Table class for most NetBox objects. Adds support for custom field & custom link columns. Includes + default columns for: + + * PK (row selection) + * ID + * Actions + """ + pk = columns.ToggleColumn( + visible=False + ) + id = tables.Column( + linkify=True, + verbose_name='ID' + ) + actions = columns.ActionsColumn() + + exempt_columns = ('pk', 'actions') + + class Meta(BaseTable.Meta): + pass + + def __init__(self, *args, extra_columns=None, **kwargs): + if extra_columns is None: + extra_columns = [] + + # Add custom field & custom link columns + content_type = ContentType.objects.get_for_model(self._meta.model) + custom_fields = CustomField.objects.filter(content_types=content_type) + extra_columns.extend([ + (f'cf_{cf.name}', columns.CustomFieldColumn(cf)) for cf in custom_fields + ]) + custom_links = CustomLink.objects.filter(content_type=content_type, enabled=True) + extra_columns.extend([ + (f'cl_{cl.name}', columns.CustomLinkColumn(cl)) for cl in custom_links + ]) + + super().__init__(*args, extra_columns=extra_columns, **kwargs) diff --git a/netbox/utilities/tests/test_tables.py b/netbox/netbox/tests/test_tables.py similarity index 89% rename from netbox/utilities/tests/test_tables.py rename to netbox/netbox/tests/test_tables.py index 7a9f3bd9c91..17b9743cdc4 100644 --- a/netbox/utilities/tests/test_tables.py +++ b/netbox/netbox/tests/test_tables.py @@ -2,14 +2,14 @@ from django.template import Context, Template from django.test import TestCase from dcim.models import Site -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from utilities.testing import create_tags -class TagColumnTable(BaseTable): +class TagColumnTable(NetBoxTable): tags = columns.TagColumn(url_name='dcim:site_list') - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Site fields = ('pk', 'name', 'tags',) default_columns = fields diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index bbaa4fdffcf..4f90ee01f24 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -1,6 +1,6 @@ import django_tables2 as tables -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from utilities.tables import linkify_phone from .models import * @@ -44,8 +44,7 @@ class TenantColumn(tables.TemplateColumn): # Tenants # -class TenantGroupTable(BaseTable): - pk = columns.ToggleColumn() +class TenantGroupTable(NetBoxTable): name = columns.MPTTColumn( linkify=True ) @@ -58,7 +57,7 @@ class TenantGroupTable(BaseTable): url_name='tenancy:tenantgroup_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = TenantGroup fields = ( 'pk', 'id', 'name', 'tenant_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', @@ -66,8 +65,7 @@ class TenantGroupTable(BaseTable): default_columns = ('pk', 'name', 'tenant_count', 'description') -class TenantTable(BaseTable): - pk = columns.ToggleColumn() +class TenantTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -79,7 +77,7 @@ class TenantTable(BaseTable): url_name='tenancy:tenant_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Tenant fields = ('pk', 'id', 'name', 'slug', 'group', 'description', 'comments', 'tags', 'created', 'last_updated',) default_columns = ('pk', 'name', 'group', 'description') @@ -89,8 +87,7 @@ class TenantTable(BaseTable): # Contacts # -class ContactGroupTable(BaseTable): - pk = columns.ToggleColumn() +class ContactGroupTable(NetBoxTable): name = columns.MPTTColumn( linkify=True ) @@ -103,7 +100,7 @@ class ContactGroupTable(BaseTable): url_name='tenancy:contactgroup_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ContactGroup fields = ( 'pk', 'name', 'contact_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', @@ -111,20 +108,18 @@ class ContactGroupTable(BaseTable): default_columns = ('pk', 'name', 'contact_count', 'description') -class ContactRoleTable(BaseTable): - pk = columns.ToggleColumn() +class ContactRoleTable(NetBoxTable): name = tables.Column( linkify=True ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ContactRole fields = ('pk', 'name', 'description', 'slug', 'created', 'last_updated', 'actions') default_columns = ('pk', 'name', 'description') -class ContactTable(BaseTable): - pk = columns.ToggleColumn() +class ContactTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -142,7 +137,7 @@ class ContactTable(BaseTable): url_name='tenancy:tenant_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Contact fields = ( 'pk', 'name', 'group', 'title', 'phone', 'email', 'address', 'comments', 'assignment_count', 'tags', @@ -151,8 +146,7 @@ class ContactTable(BaseTable): default_columns = ('pk', 'name', 'group', 'assignment_count', 'title', 'phone', 'email') -class ContactAssignmentTable(BaseTable): - pk = columns.ToggleColumn() +class ContactAssignmentTable(NetBoxTable): content_type = columns.ContentTypeColumn( verbose_name='Object Type' ) @@ -170,7 +164,7 @@ class ContactAssignmentTable(BaseTable): sequence=('edit', 'delete') ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ContactAssignment fields = ('pk', 'content_type', 'object', 'contact', 'role', 'priority', 'actions') default_columns = ('pk', 'content_type', 'object', 'contact', 'role', 'priority') diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index 950174029a3..e1156627ae0 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.tables.devices import BaseInterfaceTable -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from tenancy.tables import TenantColumn from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -27,8 +27,7 @@ VMINTERFACE_BUTTONS = """ # Cluster types # -class ClusterTypeTable(BaseTable): - pk = columns.ToggleColumn() +class ClusterTypeTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -39,7 +38,7 @@ class ClusterTypeTable(BaseTable): url_name='virtualization:clustertype_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ClusterType fields = ( 'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'created', 'last_updated', 'tags', 'actions', @@ -51,8 +50,7 @@ class ClusterTypeTable(BaseTable): # Cluster groups # -class ClusterGroupTable(BaseTable): - pk = columns.ToggleColumn() +class ClusterGroupTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -63,7 +61,7 @@ class ClusterGroupTable(BaseTable): url_name='virtualization:clustergroup_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = ClusterGroup fields = ( 'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'created', 'last_updated', 'actions', @@ -75,8 +73,7 @@ class ClusterGroupTable(BaseTable): # Clusters # -class ClusterTable(BaseTable): - pk = columns.ToggleColumn() +class ClusterTable(NetBoxTable): name = tables.Column( linkify=True ) @@ -107,7 +104,7 @@ class ClusterTable(BaseTable): url_name='virtualization:cluster_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Cluster fields = ( 'pk', 'id', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'tags', @@ -120,8 +117,7 @@ class ClusterTable(BaseTable): # Virtual machines # -class VirtualMachineTable(BaseTable): - pk = columns.ToggleColumn() +class VirtualMachineTable(NetBoxTable): name = tables.Column( order_by=('_name',), linkify=True @@ -150,7 +146,7 @@ class VirtualMachineTable(BaseTable): url_name='virtualization:virtualmachine_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VirtualMachine fields = ( 'pk', 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', @@ -166,7 +162,6 @@ class VirtualMachineTable(BaseTable): # class VMInterfaceTable(BaseInterfaceTable): - pk = columns.ToggleColumn() virtual_machine = tables.Column( linkify=True ) @@ -177,7 +172,7 @@ class VMInterfaceTable(BaseInterfaceTable): url_name='virtualization:vminterface_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VMInterface fields = ( 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags', @@ -198,7 +193,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): extra_buttons=VMINTERFACE_BUTTONS ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = VMInterface fields = ( 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags', diff --git a/netbox/wireless/tables.py b/netbox/wireless/tables.py index d1dba993d07..8dd81dffd3c 100644 --- a/netbox/wireless/tables.py +++ b/netbox/wireless/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.models import Interface -from netbox.tables import BaseTable, columns +from netbox.tables import NetBoxTable, columns from .models import * __all__ = ( @@ -11,8 +11,7 @@ __all__ = ( ) -class WirelessLANGroupTable(BaseTable): - pk = columns.ToggleColumn() +class WirelessLANGroupTable(NetBoxTable): name = columns.MPTTColumn( linkify=True ) @@ -25,7 +24,7 @@ class WirelessLANGroupTable(BaseTable): url_name='wireless:wirelesslangroup_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = WirelessLANGroup fields = ( 'pk', 'name', 'wirelesslan_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', @@ -33,8 +32,7 @@ class WirelessLANGroupTable(BaseTable): default_columns = ('pk', 'name', 'wirelesslan_count', 'description') -class WirelessLANTable(BaseTable): - pk = columns.ToggleColumn() +class WirelessLANTable(NetBoxTable): ssid = tables.Column( linkify=True ) @@ -48,7 +46,7 @@ class WirelessLANTable(BaseTable): url_name='wireless:wirelesslan_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = WirelessLAN fields = ( 'pk', 'ssid', 'group', 'description', 'vlan', 'interface_count', 'auth_type', 'auth_cipher', 'auth_psk', @@ -57,8 +55,7 @@ class WirelessLANTable(BaseTable): default_columns = ('pk', 'ssid', 'group', 'description', 'vlan', 'auth_type', 'interface_count') -class WirelessLANInterfacesTable(BaseTable): - pk = columns.ToggleColumn() +class WirelessLANInterfacesTable(NetBoxTable): device = tables.Column( linkify=True ) @@ -66,14 +63,13 @@ class WirelessLANInterfacesTable(BaseTable): linkify=True ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = Interface fields = ('pk', 'device', 'name', 'rf_role', 'rf_channel') default_columns = ('pk', 'device', 'name', 'rf_role', 'rf_channel') -class WirelessLinkTable(BaseTable): - pk = columns.ToggleColumn() +class WirelessLinkTable(NetBoxTable): id = tables.Column( linkify=True, verbose_name='ID' @@ -97,7 +93,7 @@ class WirelessLinkTable(BaseTable): url_name='wireless:wirelesslink_list' ) - class Meta(BaseTable.Meta): + class Meta(NetBoxTable.Meta): model = WirelessLink fields = ( 'pk', 'id', 'status', 'device_a', 'interface_a', 'device_b', 'interface_b', 'ssid', 'description', From 3c1ea5d0fb2fabeda539e1cdc23e62bcd15b7b8d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 27 Jan 2022 16:14:02 -0500 Subject: [PATCH 126/271] Closes #8470: Expose NetBoxTable in the plugins framework --- docs/plugins/development/tables.md | 37 ++++++++++++++++++++++++++++++ mkdocs.yml | 5 ++-- 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 docs/plugins/development/tables.md diff --git a/docs/plugins/development/tables.md b/docs/plugins/development/tables.md new file mode 100644 index 00000000000..16f9f6c178b --- /dev/null +++ b/docs/plugins/development/tables.md @@ -0,0 +1,37 @@ +# Tables + +NetBox employs the [`django-tables2`](https://django-tables2.readthedocs.io/) library for rendering dynamic object tables. These tables display lists of objects, and can be sorted and filtered by various parameters. + +## NetBoxTable + +To provide additional functionality beyond what is supported by the stock `Table` class in `django-tables2`, NetBox provides the `NetBoxTable` class. This custom table class includes support for: + +* User-configurable column display and ordering +* Custom field & custom link columns +* Automatic prefetching of related objects + +It also includes several default columns: + +* `pk` - A checkbox for selecting the object associated with each table row +* `id` - The object's numeric database ID, as a hyperlink to the object's view +* `actions` - A dropdown menu presenting object-specific actions available to the user. + +### Example + +```python +# tables.py +import django_tables2 as tables +from netbox.tables import NetBoxTable +from .models import MyModel + +class MyModelTable(NetBoxTable): + name = tables.Column( + linkify=True + ) + ... + + class Meta(NetBoxTable.Meta): + model = MyModel + fields = ('pk', 'id', 'name', ...) + default_columns = ('pk', 'name', ...) +``` diff --git a/mkdocs.yml b/mkdocs.yml index 1a77cb1955f..3b1e52f5071 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -102,9 +102,10 @@ nav: - Using Plugins: 'plugins/index.md' - Developing Plugins: - Getting Started: 'plugins/development/index.md' - - Database Models: 'plugins/development/models.md' + - Models: 'plugins/development/models.md' - Views: 'plugins/development/views.md' - - Filtersets: 'plugins/development/filtersets.md' + - Tables: 'plugins/development/tables.md' + - Filter Sets: 'plugins/development/filtersets.md' - REST API: 'plugins/development/rest-api.md' - Background Tasks: 'plugins/development/background-tasks.md' - Administration: From f1697c68566e5573ebb39848b1a2dd5bbadc9636 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 27 Jan 2022 16:21:19 -0500 Subject: [PATCH 127/271] Add change log for plugins framework additions --- docs/release-notes/version-3.2.md | 38 +++++++++++++++++++------------ 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 789003cca23..1b4a7ef8713 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -14,23 +14,15 @@ ### New Features -#### Service Templates ([#1591](https://github.com/netbox-community/netbox/issues/1591)) +#### Plugins Framework Extensions ([#8333](https://github.com/netbox-community/netbox/issues/8333)) -A new service template model has been introduced to assist in standardizing the definition and application of layer four services to devices and virtual machines. As an alternative to manually defining a name, protocol, and port(s) each time a service is created, a user now has the option of selecting a pre-defined template from which these values will be populated. +NetBox's plugins framework has been extended considerably in this release. Changes include: -#### Automatic Provisioning of Next Available VLANs ([#2658](https://github.com/netbox-community/netbox/issues/2658)) +* Seven generic view classes are now officially supported for use by plugins. +* `NetBoxModel` is available for subclassing to enable various NetBox features, such as custom fields and change logging. +* `NetBoxModelFilterSet` is available to extend NetBox's dynamic filtering ability to plugin models. -A new REST API endpoint has been added at `/api/ipam/vlan-groups//available-vlans/`. A GET request to this endpoint will return a list of available VLANs within the group. A POST request can be made to this endpoint specifying the name(s) of one or more VLANs to create within the group, and their VLAN IDs will be assigned automatically. - -#### Inventory Item Roles ([#3087](https://github.com/netbox-community/netbox/issues/3087)) - -A new model has been introduced to represent function roles for inventory items, similar to device roles. The assignment of roles to inventory items is optional. - -#### Custom Object Fields ([#7006](https://github.com/netbox-community/netbox/issues/7006)) - -Two new types of custom field have been added: object and multi-object. These can be used to associate objects with other objects in NetBox. For example, you might create a custom field named `primary_site` on the tenant model so that a particular site can be associated with each tenant as its primary. The multi-object custom field type allows for the assignment of one or more objects of the same type. - -Custom field object assignment is fully supported in the REST API, and functions similarly to normal foreign key relations. Nested representations are provided for each custom field object. +No breaking changes to previously supported components have been introduced in this release. However, plugin authors are encouraged to audit their code for misuse of unsupported components, as much of NetBox's internal code base has been reorganized. #### Modules & Module Types ([#7844](https://github.com/netbox-community/netbox/issues/7844)) @@ -38,6 +30,12 @@ Several new models have been added to support field-replaceable device modules, Automatic renaming of module components is also supported. When a new module is created, any occurrence of the string `{module}` in a component name will be replaced with the position of the module bay into which the module is being installed. +#### Custom Object Fields ([#7006](https://github.com/netbox-community/netbox/issues/7006)) + +Two new types of custom field have been added: object and multi-object. These can be used to associate objects with other objects in NetBox. For example, you might create a custom field named `primary_site` on the tenant model so that a particular site can be associated with each tenant as its primary. The multi-object custom field type allows for the assignment of one or more objects of the same type. + +Custom field object assignment is fully supported in the REST API, and functions similarly to normal foreign key relations. Nested representations are provided for each custom field object. + #### Custom Status Choices ([#8054](https://github.com/netbox-community/netbox/issues/8054)) Custom choices can be now added to most status fields in NetBox. This is done by defining the `FIELD_CHOICES` configuration parameter to map field identifiers to an iterable of custom choices. These choices are populated automatically when NetBox initializes. For example, the following will add three custom choices for the site status field: @@ -52,12 +50,24 @@ FIELD_CHOICES = { } ``` +#### Inventory Item Roles ([#3087](https://github.com/netbox-community/netbox/issues/3087)) + +A new model has been introduced to represent function roles for inventory items, similar to device roles. The assignment of roles to inventory items is optional. + #### Inventory Item Templates ([#8118](https://github.com/netbox-community/netbox/issues/8118)) Inventory items can now be templatized on a device type similar to the other component types. This enables users to better pre-model fixed hardware components. Inventory item templates can be arranged hierarchically within a device type, and may be assigned to other components. These relationships will be mirrored when instantiating inventory items on a newly-created device. +#### Service Templates ([#1591](https://github.com/netbox-community/netbox/issues/1591)) + +A new service template model has been introduced to assist in standardizing the definition and application of layer four services to devices and virtual machines. As an alternative to manually defining a name, protocol, and port(s) each time a service is created, a user now has the option of selecting a pre-defined template from which these values will be populated. + +#### Automatic Provisioning of Next Available VLANs ([#2658](https://github.com/netbox-community/netbox/issues/2658)) + +A new REST API endpoint has been added at `/api/ipam/vlan-groups//available-vlans/`. A GET request to this endpoint will return a list of available VLANs within the group. A POST request can be made to this endpoint specifying the name(s) of one or more VLANs to create within the group, and their VLAN IDs will be assigned automatically. + ### Enhancements * [#5429](https://github.com/netbox-community/netbox/issues/5429) - Enable toggling the placement of table paginators From 0fe72376b158ebcfca02f29a92c2c0ce29be91c5 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 28 Jan 2022 10:00:36 -0500 Subject: [PATCH 128/271] Remove unused form attribute from BulkDeleteView --- netbox/netbox/views/generic/bulk_views.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 9c834d76ff0..a042a3cff43 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -675,14 +675,13 @@ class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView): """ Delete objects in bulk. - filterset: FilterSet to apply when deleting by QuerySet - table: The table used to display devices being deleted - form: The form class used to delete objects in bulk + Attributes: + filterset: FilterSet to apply when deleting by QuerySet + table: The table used to display devices being deleted """ template_name = 'generic/object_bulk_delete.html' filterset = None table = None - form = None def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'delete') @@ -694,9 +693,6 @@ class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView): class BulkDeleteForm(ConfirmationForm): pk = ModelMultipleChoiceField(queryset=self.queryset, widget=MultipleHiddenInput) - if self.form: - return self.form - return BulkDeleteForm # From f4776731ecc3d815c8002e9bbc50b81299e34403 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 28 Jan 2022 15:48:15 -0500 Subject: [PATCH 129/271] Establish 4 core forms in netbox.forms.base --- docs/plugins/development/forms.md | 10 ++ mkdocs.yml | 1 + netbox/circuits/forms/bulk_edit.py | 10 +- netbox/circuits/forms/bulk_import.py | 10 +- netbox/circuits/forms/filtersets.py | 10 +- netbox/circuits/forms/models.py | 10 +- netbox/dcim/forms/bulk_edit.py | 70 +++++------- netbox/dcim/forms/bulk_import.py | 56 ++++----- netbox/dcim/forms/connections.py | 8 +- netbox/dcim/forms/filtersets.py | 43 +++---- netbox/dcim/forms/models.py | 60 +++++----- netbox/dcim/forms/object_create.py | 4 +- netbox/extras/forms/customfields.py | 81 ------------- netbox/extras/forms/models.py | 17 --- netbox/ipam/forms/bulk_edit.py | 28 ++--- netbox/ipam/forms/bulk_import.py | 30 ++--- netbox/ipam/forms/filtersets.py | 28 ++--- netbox/ipam/forms/models.py | 32 +++--- netbox/netbox/{forms.py => forms/__init__.py} | 1 + netbox/netbox/forms/base.py | 108 ++++++++++++++++++ netbox/tenancy/forms/bulk_edit.py | 12 +- netbox/tenancy/forms/bulk_import.py | 12 +- netbox/tenancy/forms/filtersets.py | 12 +- netbox/tenancy/forms/models.py | 12 +- netbox/virtualization/forms/bulk_edit.py | 12 +- netbox/virtualization/forms/bulk_import.py | 12 +- netbox/virtualization/forms/filtersets.py | 13 ++- netbox/virtualization/forms/models.py | 12 +- netbox/wireless/forms/bulk_edit.py | 8 +- netbox/wireless/forms/bulk_import.py | 8 +- netbox/wireless/forms/filtersets.py | 8 +- netbox/wireless/forms/models.py | 8 +- 32 files changed, 380 insertions(+), 366 deletions(-) create mode 100644 docs/plugins/development/forms.md rename netbox/netbox/{forms.py => forms/__init__.py} (98%) create mode 100644 netbox/netbox/forms/base.py diff --git a/docs/plugins/development/forms.md b/docs/plugins/development/forms.md new file mode 100644 index 00000000000..5af1781949e --- /dev/null +++ b/docs/plugins/development/forms.md @@ -0,0 +1,10 @@ +# Forms + +NetBox provides several base form classes for use by plugins. These are documented below. + +* `NetBoxModelForm` +* `NetBoxModelCSVForm` +* `NetBoxModelBulkEditForm` +* `NetBoxModelFilterSetForm` + +### TODO: Include forms reference diff --git a/mkdocs.yml b/mkdocs.yml index 3b1e52f5071..004f21c5ed4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -105,6 +105,7 @@ nav: - Models: 'plugins/development/models.md' - Views: 'plugins/development/views.md' - Tables: 'plugins/development/tables.md' + - Forms: 'plugins/development/forms.md' - Filter Sets: 'plugins/development/filtersets.md' - REST API: 'plugins/development/rest-api.md' - Background Tasks: 'plugins/development/background-tasks.md' diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index af6bca91fb5..3e54cf71183 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -2,7 +2,7 @@ from django import forms from circuits.choices import CircuitStatusChoices from circuits.models import * -from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm +from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant from utilities.forms import add_blank_choice, CommentField, DynamicModelChoiceField, SmallTextarea, StaticSelect @@ -14,7 +14,7 @@ __all__ = ( ) -class ProviderBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ProviderBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Provider.objects.all(), widget=forms.MultipleHiddenInput @@ -53,7 +53,7 @@ class ProviderBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class ProviderNetworkBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ProviderNetwork.objects.all(), widget=forms.MultipleHiddenInput @@ -81,7 +81,7 @@ class ProviderNetworkBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditFor ] -class CircuitTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=CircuitType.objects.all(), widget=forms.MultipleHiddenInput @@ -95,7 +95,7 @@ class CircuitTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['description'] -class CircuitBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class CircuitBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Circuit.objects.all(), widget=forms.MultipleHiddenInput diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index fe1b927e52f..6da79f75c7a 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -1,6 +1,6 @@ from circuits.choices import CircuitStatusChoices from circuits.models import * -from extras.forms import CustomFieldModelCSVForm +from netbox.forms import NetBoxModelCSVForm from tenancy.models import Tenant from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField @@ -12,7 +12,7 @@ __all__ = ( ) -class ProviderCSVForm(CustomFieldModelCSVForm): +class ProviderCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -22,7 +22,7 @@ class ProviderCSVForm(CustomFieldModelCSVForm): ) -class ProviderNetworkCSVForm(CustomFieldModelCSVForm): +class ProviderNetworkCSVForm(NetBoxModelCSVForm): provider = CSVModelChoiceField( queryset=Provider.objects.all(), to_field_name='name', @@ -36,7 +36,7 @@ class ProviderNetworkCSVForm(CustomFieldModelCSVForm): ] -class CircuitTypeCSVForm(CustomFieldModelCSVForm): +class CircuitTypeCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -47,7 +47,7 @@ class CircuitTypeCSVForm(CustomFieldModelCSVForm): } -class CircuitCSVForm(CustomFieldModelCSVForm): +class CircuitCSVForm(NetBoxModelCSVForm): provider = CSVModelChoiceField( queryset=Provider.objects.all(), to_field_name='name', diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index f5ff6508872..18f914b587d 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -4,7 +4,7 @@ from django.utils.translation import gettext as _ from circuits.choices import CircuitStatusChoices from circuits.models import * from dcim.models import Region, Site, SiteGroup -from extras.forms import CustomFieldModelFilterForm +from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm from utilities.forms import DynamicModelMultipleChoiceField, StaticSelectMultiple, TagFilterField @@ -16,7 +16,7 @@ __all__ = ( ) -class ProviderFilterForm(CustomFieldModelFilterForm): +class ProviderFilterForm(NetBoxModelFilterSetForm): model = Provider field_groups = [ ['q', 'tag'], @@ -49,7 +49,7 @@ class ProviderFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class ProviderNetworkFilterForm(CustomFieldModelFilterForm): +class ProviderNetworkFilterForm(NetBoxModelFilterSetForm): model = ProviderNetwork field_groups = ( ('q', 'tag'), @@ -67,12 +67,12 @@ class ProviderNetworkFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class CircuitTypeFilterForm(CustomFieldModelFilterForm): +class CircuitTypeFilterForm(NetBoxModelFilterSetForm): model = CircuitType tag = TagFilterField(model) -class CircuitFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class CircuitFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Circuit field_groups = [ ['q', 'tag'], diff --git a/netbox/circuits/forms/models.py b/netbox/circuits/forms/models.py index f67114828ee..bf5d92e8532 100644 --- a/netbox/circuits/forms/models.py +++ b/netbox/circuits/forms/models.py @@ -2,8 +2,8 @@ from django import forms from circuits.models import * from dcim.models import Region, Site, SiteGroup -from extras.forms import CustomFieldModelForm from extras.models import Tag +from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.forms import ( BootstrapMixin, CommentField, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField, @@ -19,7 +19,7 @@ __all__ = ( ) -class ProviderForm(CustomFieldModelForm): +class ProviderForm(NetBoxModelForm): slug = SlugField() comments = CommentField() tags = DynamicModelMultipleChoiceField( @@ -53,7 +53,7 @@ class ProviderForm(CustomFieldModelForm): } -class ProviderNetworkForm(CustomFieldModelForm): +class ProviderNetworkForm(NetBoxModelForm): provider = DynamicModelChoiceField( queryset=Provider.objects.all() ) @@ -73,7 +73,7 @@ class ProviderNetworkForm(CustomFieldModelForm): ) -class CircuitTypeForm(CustomFieldModelForm): +class CircuitTypeForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -87,7 +87,7 @@ class CircuitTypeForm(CustomFieldModelForm): ] -class CircuitForm(TenancyForm, CustomFieldModelForm): +class CircuitForm(TenancyForm, NetBoxModelForm): provider = DynamicModelChoiceField( queryset=Provider.objects.all() ) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 3d73ada47fd..f5eb179fa30 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -6,8 +6,8 @@ from timezone_field import TimeZoneFormField from dcim.choices import * from dcim.constants import * from dcim.models import * -from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm from ipam.models import ASN, VLAN, VRF +from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant from utilities.forms import ( add_blank_choice, BulkEditForm, BulkEditNullBooleanSelect, ColorField, CommentField, DynamicModelChoiceField, @@ -57,7 +57,7 @@ __all__ = ( ) -class RegionBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class RegionBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Region.objects.all(), widget=forms.MultipleHiddenInput @@ -75,7 +75,7 @@ class RegionBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['parent', 'description'] -class SiteGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=SiteGroup.objects.all(), widget=forms.MultipleHiddenInput @@ -93,7 +93,7 @@ class SiteGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['parent', 'description'] -class SiteBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class SiteBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Site.objects.all(), widget=forms.MultipleHiddenInput @@ -137,7 +137,7 @@ class SiteBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class LocationBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class LocationBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Location.objects.all(), widget=forms.MultipleHiddenInput @@ -166,7 +166,7 @@ class LocationBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['parent', 'tenant', 'description'] -class RackRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class RackRoleBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=RackRole.objects.all(), widget=forms.MultipleHiddenInput @@ -183,7 +183,7 @@ class RackRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['color', 'description'] -class RackBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class RackBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Rack.objects.all(), widget=forms.MultipleHiddenInput @@ -283,7 +283,7 @@ class RackBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class RackReservationBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class RackReservationBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=RackReservation.objects.all(), widget=forms.MultipleHiddenInput() @@ -308,7 +308,7 @@ class RackReservationBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditFor nullable_fields = [] -class ManufacturerBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Manufacturer.objects.all(), widget=forms.MultipleHiddenInput @@ -322,7 +322,7 @@ class ManufacturerBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['description'] -class DeviceTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=DeviceType.objects.all(), widget=forms.MultipleHiddenInput() @@ -353,7 +353,7 @@ class DeviceTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['part_number', 'airflow'] -class ModuleTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ModuleType.objects.all(), widget=forms.MultipleHiddenInput() @@ -370,7 +370,7 @@ class ModuleTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['part_number'] -class DeviceRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=DeviceRole.objects.all(), widget=forms.MultipleHiddenInput @@ -392,7 +392,7 @@ class DeviceRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['color', 'description'] -class PlatformBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class PlatformBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Platform.objects.all(), widget=forms.MultipleHiddenInput @@ -415,7 +415,7 @@ class PlatformBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['manufacturer', 'napalm_driver', 'description'] -class DeviceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class DeviceBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Device.objects.all(), widget=forms.MultipleHiddenInput() @@ -476,7 +476,7 @@ class DeviceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class ModuleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ModuleBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Module.objects.all(), widget=forms.MultipleHiddenInput() @@ -502,7 +502,7 @@ class ModuleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['serial'] -class CableBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class CableBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Cable.objects.all(), widget=forms.MultipleHiddenInput @@ -558,7 +558,7 @@ class CableBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): }) -class VirtualChassisBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VirtualChassis.objects.all(), widget=forms.MultipleHiddenInput() @@ -572,7 +572,7 @@ class VirtualChassisBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm nullable_fields = ['domain'] -class PowerPanelBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=PowerPanel.objects.all(), widget=forms.MultipleHiddenInput @@ -611,7 +611,7 @@ class PowerPanelBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['location'] -class PowerFeedBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=PowerFeed.objects.all(), widget=forms.MultipleHiddenInput @@ -939,8 +939,7 @@ class InventoryItemTemplateBulkEditForm(BulkEditForm): class ConsolePortBulkEditForm( form_from_model(ConsolePort, ['label', 'type', 'speed', 'mark_connected', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=ConsolePort.objects.all(), @@ -957,8 +956,7 @@ class ConsolePortBulkEditForm( class ConsoleServerPortBulkEditForm( form_from_model(ConsoleServerPort, ['label', 'type', 'speed', 'mark_connected', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=ConsoleServerPort.objects.all(), @@ -975,8 +973,7 @@ class ConsoleServerPortBulkEditForm( class PowerPortBulkEditForm( form_from_model(PowerPort, ['label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=PowerPort.objects.all(), @@ -993,8 +990,7 @@ class PowerPortBulkEditForm( class PowerOutletBulkEditForm( form_from_model(PowerOutlet, ['label', 'type', 'feed_leg', 'power_port', 'mark_connected', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=PowerOutlet.objects.all(), @@ -1031,8 +1027,7 @@ class InterfaceBulkEditForm( 'label', 'type', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', ]), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=Interface.objects.all(), @@ -1154,8 +1149,7 @@ class InterfaceBulkEditForm( class FrontPortBulkEditForm( form_from_model(FrontPort, ['label', 'type', 'color', 'mark_connected', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=FrontPort.objects.all(), @@ -1168,8 +1162,7 @@ class FrontPortBulkEditForm( class RearPortBulkEditForm( form_from_model(RearPort, ['label', 'type', 'color', 'mark_connected', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=RearPort.objects.all(), @@ -1182,8 +1175,7 @@ class RearPortBulkEditForm( class ModuleBayBulkEditForm( form_from_model(DeviceBay, ['label', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=ModuleBay.objects.all(), @@ -1196,8 +1188,7 @@ class ModuleBayBulkEditForm( class DeviceBayBulkEditForm( form_from_model(DeviceBay, ['label', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=DeviceBay.objects.all(), @@ -1210,8 +1201,7 @@ class DeviceBayBulkEditForm( class InventoryItemBulkEditForm( form_from_model(InventoryItem, ['label', 'role', 'manufacturer', 'part_id', 'description']), - AddRemoveTagsForm, - CustomFieldModelBulkEditForm + NetBoxModelBulkEditForm ): pk = forms.ModelMultipleChoiceField( queryset=InventoryItem.objects.all(), @@ -1234,7 +1224,7 @@ class InventoryItemBulkEditForm( # Device component roles # -class InventoryItemRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=InventoryItemRole.objects.all(), widget=forms.MultipleHiddenInput diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 1aec329eb52..3974c4d54af 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -7,8 +7,8 @@ from django.utils.safestring import mark_safe from dcim.choices import * from dcim.constants import * from dcim.models import * -from extras.forms import CustomFieldModelCSVForm from ipam.models import VRF +from netbox.forms import NetBoxModelCSVForm from tenancy.models import Tenant from utilities.forms import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVTypedChoiceField, SlugField from virtualization.models import Cluster @@ -46,7 +46,7 @@ __all__ = ( ) -class RegionCSVForm(CustomFieldModelCSVForm): +class RegionCSVForm(NetBoxModelCSVForm): parent = CSVModelChoiceField( queryset=Region.objects.all(), required=False, @@ -59,7 +59,7 @@ class RegionCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'parent', 'description') -class SiteGroupCSVForm(CustomFieldModelCSVForm): +class SiteGroupCSVForm(NetBoxModelCSVForm): parent = CSVModelChoiceField( queryset=SiteGroup.objects.all(), required=False, @@ -72,7 +72,7 @@ class SiteGroupCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'parent', 'description') -class SiteCSVForm(CustomFieldModelCSVForm): +class SiteCSVForm(NetBoxModelCSVForm): status = CSVChoiceField( choices=SiteStatusChoices, help_text='Operational status' @@ -109,7 +109,7 @@ class SiteCSVForm(CustomFieldModelCSVForm): } -class LocationCSVForm(CustomFieldModelCSVForm): +class LocationCSVForm(NetBoxModelCSVForm): site = CSVModelChoiceField( queryset=Site.objects.all(), to_field_name='name', @@ -136,7 +136,7 @@ class LocationCSVForm(CustomFieldModelCSVForm): fields = ('site', 'parent', 'name', 'slug', 'tenant', 'description') -class RackRoleCSVForm(CustomFieldModelCSVForm): +class RackRoleCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -147,7 +147,7 @@ class RackRoleCSVForm(CustomFieldModelCSVForm): } -class RackCSVForm(CustomFieldModelCSVForm): +class RackCSVForm(NetBoxModelCSVForm): site = CSVModelChoiceField( queryset=Site.objects.all(), to_field_name='name' @@ -205,7 +205,7 @@ class RackCSVForm(CustomFieldModelCSVForm): self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) -class RackReservationCSVForm(CustomFieldModelCSVForm): +class RackReservationCSVForm(NetBoxModelCSVForm): site = CSVModelChoiceField( queryset=Site.objects.all(), to_field_name='name', @@ -255,14 +255,14 @@ class RackReservationCSVForm(CustomFieldModelCSVForm): self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) -class ManufacturerCSVForm(CustomFieldModelCSVForm): +class ManufacturerCSVForm(NetBoxModelCSVForm): class Meta: model = Manufacturer fields = ('name', 'slug', 'description') -class DeviceRoleCSVForm(CustomFieldModelCSVForm): +class DeviceRoleCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -273,7 +273,7 @@ class DeviceRoleCSVForm(CustomFieldModelCSVForm): } -class PlatformCSVForm(CustomFieldModelCSVForm): +class PlatformCSVForm(NetBoxModelCSVForm): slug = SlugField() manufacturer = CSVModelChoiceField( queryset=Manufacturer.objects.all(), @@ -287,7 +287,7 @@ class PlatformCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'manufacturer', 'napalm_driver', 'napalm_args', 'description') -class BaseDeviceCSVForm(CustomFieldModelCSVForm): +class BaseDeviceCSVForm(NetBoxModelCSVForm): device_role = CSVModelChoiceField( queryset=DeviceRole.objects.all(), to_field_name='name', @@ -403,7 +403,7 @@ class DeviceCSVForm(BaseDeviceCSVForm): self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) -class ModuleCSVForm(CustomFieldModelCSVForm): +class ModuleCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -478,7 +478,7 @@ class ChildDeviceCSVForm(BaseDeviceCSVForm): # Device components # -class ConsolePortCSVForm(CustomFieldModelCSVForm): +class ConsolePortCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -501,7 +501,7 @@ class ConsolePortCSVForm(CustomFieldModelCSVForm): fields = ('device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description') -class ConsoleServerPortCSVForm(CustomFieldModelCSVForm): +class ConsoleServerPortCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -524,7 +524,7 @@ class ConsoleServerPortCSVForm(CustomFieldModelCSVForm): fields = ('device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description') -class PowerPortCSVForm(CustomFieldModelCSVForm): +class PowerPortCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -542,7 +542,7 @@ class PowerPortCSVForm(CustomFieldModelCSVForm): ) -class PowerOutletCSVForm(CustomFieldModelCSVForm): +class PowerOutletCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -591,7 +591,7 @@ class PowerOutletCSVForm(CustomFieldModelCSVForm): self.fields['power_port'].queryset = PowerPort.objects.none() -class InterfaceCSVForm(CustomFieldModelCSVForm): +class InterfaceCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -655,7 +655,7 @@ class InterfaceCSVForm(CustomFieldModelCSVForm): return self.cleaned_data['enabled'] -class FrontPortCSVForm(CustomFieldModelCSVForm): +class FrontPortCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -703,7 +703,7 @@ class FrontPortCSVForm(CustomFieldModelCSVForm): self.fields['rear_port'].queryset = RearPort.objects.none() -class RearPortCSVForm(CustomFieldModelCSVForm): +class RearPortCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -721,7 +721,7 @@ class RearPortCSVForm(CustomFieldModelCSVForm): } -class ModuleBayCSVForm(CustomFieldModelCSVForm): +class ModuleBayCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -732,7 +732,7 @@ class ModuleBayCSVForm(CustomFieldModelCSVForm): fields = ('device', 'name', 'label', 'position', 'description') -class DeviceBayCSVForm(CustomFieldModelCSVForm): +class DeviceBayCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -778,7 +778,7 @@ class DeviceBayCSVForm(CustomFieldModelCSVForm): self.fields['installed_device'].queryset = Interface.objects.none() -class InventoryItemCSVForm(CustomFieldModelCSVForm): +class InventoryItemCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name' @@ -827,7 +827,7 @@ class InventoryItemCSVForm(CustomFieldModelCSVForm): # Device component roles # -class InventoryItemRoleCSVForm(CustomFieldModelCSVForm): +class InventoryItemRoleCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -842,7 +842,7 @@ class InventoryItemRoleCSVForm(CustomFieldModelCSVForm): # Cables # -class CableCSVForm(CustomFieldModelCSVForm): +class CableCSVForm(NetBoxModelCSVForm): # Termination A side_a_device = CSVModelChoiceField( queryset=Device.objects.all(), @@ -947,7 +947,7 @@ class CableCSVForm(CustomFieldModelCSVForm): # Virtual chassis # -class VirtualChassisCSVForm(CustomFieldModelCSVForm): +class VirtualChassisCSVForm(NetBoxModelCSVForm): master = CSVModelChoiceField( queryset=Device.objects.all(), to_field_name='name', @@ -964,7 +964,7 @@ class VirtualChassisCSVForm(CustomFieldModelCSVForm): # Power # -class PowerPanelCSVForm(CustomFieldModelCSVForm): +class PowerPanelCSVForm(NetBoxModelCSVForm): site = CSVModelChoiceField( queryset=Site.objects.all(), to_field_name='name', @@ -990,7 +990,7 @@ class PowerPanelCSVForm(CustomFieldModelCSVForm): self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) -class PowerFeedCSVForm(CustomFieldModelCSVForm): +class PowerFeedCSVForm(NetBoxModelCSVForm): site = CSVModelChoiceField( queryset=Site.objects.all(), to_field_name='name', diff --git a/netbox/dcim/forms/connections.py b/netbox/dcim/forms/connections.py index 6a7a0902348..7ae6a898a5b 100644 --- a/netbox/dcim/forms/connections.py +++ b/netbox/dcim/forms/connections.py @@ -1,7 +1,7 @@ from circuits.models import Circuit, CircuitTermination, Provider from dcim.models import * -from extras.forms import CustomFieldModelForm from extras.models import Tag +from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect @@ -18,7 +18,7 @@ __all__ = ( ) -class ConnectCableToDeviceForm(TenancyForm, CustomFieldModelForm): +class ConnectCableToDeviceForm(TenancyForm, NetBoxModelForm): """ Base form for connecting a Cable to a Device component """ @@ -171,7 +171,7 @@ class ConnectCableToRearPortForm(ConnectCableToDeviceForm): ) -class ConnectCableToCircuitTerminationForm(TenancyForm, CustomFieldModelForm): +class ConnectCableToCircuitTerminationForm(TenancyForm, NetBoxModelForm): termination_b_provider = DynamicModelChoiceField( queryset=Provider.objects.all(), label='Provider', @@ -229,7 +229,7 @@ class ConnectCableToCircuitTerminationForm(TenancyForm, CustomFieldModelForm): return getattr(self.cleaned_data['termination_b_id'], 'pk', None) -class ConnectCableToPowerFeedForm(TenancyForm, CustomFieldModelForm): +class ConnectCableToPowerFeedForm(TenancyForm, NetBoxModelForm): termination_b_region = DynamicModelChoiceField( queryset=Region.objects.all(), label='Region', diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 8868cdf787d..e9aa3ec3faf 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -5,8 +5,9 @@ from django.utils.translation import gettext as _ from dcim.choices import * from dcim.constants import * from dcim.models import * -from extras.forms import CustomFieldModelFilterForm, LocalConfigContextFilterForm +from extras.forms import LocalConfigContextFilterForm from ipam.models import ASN, VRF +from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm from utilities.forms import ( APISelectMultiple, add_blank_choice, ColorField, DynamicModelMultipleChoiceField, FilterForm, StaticSelect, @@ -52,7 +53,7 @@ __all__ = ( ) -class DeviceComponentFilterForm(CustomFieldModelFilterForm): +class DeviceComponentFilterForm(NetBoxModelFilterSetForm): name = forms.CharField( required=False ) @@ -103,7 +104,7 @@ class DeviceComponentFilterForm(CustomFieldModelFilterForm): ) -class RegionFilterForm(CustomFieldModelFilterForm): +class RegionFilterForm(NetBoxModelFilterSetForm): model = Region parent_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -113,7 +114,7 @@ class RegionFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class SiteGroupFilterForm(CustomFieldModelFilterForm): +class SiteGroupFilterForm(NetBoxModelFilterSetForm): model = SiteGroup parent_id = DynamicModelMultipleChoiceField( queryset=SiteGroup.objects.all(), @@ -123,7 +124,7 @@ class SiteGroupFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class SiteFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class SiteFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Site field_groups = [ ['q', 'tag'], @@ -154,7 +155,7 @@ class SiteFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class LocationFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class LocationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Location field_groups = [ ['q', 'tag'], @@ -192,12 +193,12 @@ class LocationFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class RackRoleFilterForm(CustomFieldModelFilterForm): +class RackRoleFilterForm(NetBoxModelFilterSetForm): model = RackRole tag = TagFilterField(model) -class RackFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class RackFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Rack field_groups = [ ['q', 'tag'], @@ -270,7 +271,7 @@ class RackElevationFilterForm(RackFilterForm): ) -class RackReservationFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class RackReservationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = RackReservation field_groups = [ ['q', 'tag'], @@ -308,12 +309,12 @@ class RackReservationFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class ManufacturerFilterForm(CustomFieldModelFilterForm): +class ManufacturerFilterForm(NetBoxModelFilterSetForm): model = Manufacturer tag = TagFilterField(model) -class DeviceTypeFilterForm(CustomFieldModelFilterForm): +class DeviceTypeFilterForm(NetBoxModelFilterSetForm): model = DeviceType field_groups = [ ['q', 'tag'], @@ -383,7 +384,7 @@ class DeviceTypeFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class ModuleTypeFilterForm(CustomFieldModelFilterForm): +class ModuleTypeFilterForm(NetBoxModelFilterSetForm): model = ModuleType field_groups = [ ['q', 'tag'], @@ -444,12 +445,12 @@ class ModuleTypeFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class DeviceRoleFilterForm(CustomFieldModelFilterForm): +class DeviceRoleFilterForm(NetBoxModelFilterSetForm): model = DeviceRole tag = TagFilterField(model) -class PlatformFilterForm(CustomFieldModelFilterForm): +class PlatformFilterForm(NetBoxModelFilterSetForm): model = Platform manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), @@ -459,7 +460,7 @@ class PlatformFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class DeviceFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm): +class DeviceFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = Device field_groups = [ ['q', 'tag'], @@ -613,7 +614,7 @@ class DeviceFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFi tag = TagFilterField(model) -class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm): +class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = Module field_groups = [ ['q', 'tag'], @@ -644,7 +645,7 @@ class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFi tag = TagFilterField(model) -class VirtualChassisFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class VirtualChassisFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = VirtualChassis field_groups = [ ['q', 'tag'], @@ -673,7 +674,7 @@ class VirtualChassisFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class CableFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Cable field_groups = [ ['q', 'tag'], @@ -736,7 +737,7 @@ class CableFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class PowerPanelFilterForm(CustomFieldModelFilterForm): +class PowerPanelFilterForm(NetBoxModelFilterSetForm): model = PowerPanel field_groups = ( ('q', 'tag'), @@ -773,7 +774,7 @@ class PowerPanelFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class PowerFeedFilterForm(CustomFieldModelFilterForm): +class PowerFeedFilterForm(NetBoxModelFilterSetForm): model = PowerFeed field_groups = [ ['q', 'tag'], @@ -1103,7 +1104,7 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): # Device component roles # -class InventoryItemRoleFilterForm(CustomFieldModelFilterForm): +class InventoryItemRoleFilterForm(NetBoxModelFilterSetForm): model = InventoryItemRole tag = TagFilterField(model) diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 378a567fc57..80e78594070 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -7,9 +7,9 @@ from timezone_field import TimeZoneFormField from dcim.choices import * from dcim.constants import * from dcim.models import * -from extras.forms import CustomFieldModelForm from extras.models import Tag from ipam.models import ASN, IPAddress, VLAN, VLANGroup, VRF +from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.forms import ( APISelect, add_blank_choice, BootstrapMixin, ClearableFileInput, CommentField, ContentTypeChoiceField, @@ -72,7 +72,7 @@ Tagged (All): Implies all VLANs are available (w/optional untagged VLAN) """ -class RegionForm(CustomFieldModelForm): +class RegionForm(NetBoxModelForm): parent = DynamicModelChoiceField( queryset=Region.objects.all(), required=False @@ -90,7 +90,7 @@ class RegionForm(CustomFieldModelForm): ) -class SiteGroupForm(CustomFieldModelForm): +class SiteGroupForm(NetBoxModelForm): parent = DynamicModelChoiceField( queryset=SiteGroup.objects.all(), required=False @@ -108,7 +108,7 @@ class SiteGroupForm(CustomFieldModelForm): ) -class SiteForm(TenancyForm, CustomFieldModelForm): +class SiteForm(TenancyForm, NetBoxModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False @@ -173,7 +173,7 @@ class SiteForm(TenancyForm, CustomFieldModelForm): } -class LocationForm(TenancyForm, CustomFieldModelForm): +class LocationForm(TenancyForm, NetBoxModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, @@ -221,7 +221,7 @@ class LocationForm(TenancyForm, CustomFieldModelForm): ) -class RackRoleForm(CustomFieldModelForm): +class RackRoleForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -235,7 +235,7 @@ class RackRoleForm(CustomFieldModelForm): ] -class RackForm(TenancyForm, CustomFieldModelForm): +class RackForm(TenancyForm, NetBoxModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, @@ -295,7 +295,7 @@ class RackForm(TenancyForm, CustomFieldModelForm): } -class RackReservationForm(TenancyForm, CustomFieldModelForm): +class RackReservationForm(TenancyForm, NetBoxModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, @@ -359,7 +359,7 @@ class RackReservationForm(TenancyForm, CustomFieldModelForm): ) -class ManufacturerForm(CustomFieldModelForm): +class ManufacturerForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -373,7 +373,7 @@ class ManufacturerForm(CustomFieldModelForm): ] -class DeviceTypeForm(CustomFieldModelForm): +class DeviceTypeForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all() ) @@ -412,7 +412,7 @@ class DeviceTypeForm(CustomFieldModelForm): } -class ModuleTypeForm(CustomFieldModelForm): +class ModuleTypeForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all() ) @@ -429,7 +429,7 @@ class ModuleTypeForm(CustomFieldModelForm): ] -class DeviceRoleForm(CustomFieldModelForm): +class DeviceRoleForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -443,7 +443,7 @@ class DeviceRoleForm(CustomFieldModelForm): ] -class PlatformForm(CustomFieldModelForm): +class PlatformForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False @@ -466,7 +466,7 @@ class PlatformForm(CustomFieldModelForm): } -class DeviceForm(TenancyForm, CustomFieldModelForm): +class DeviceForm(TenancyForm, NetBoxModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, @@ -648,7 +648,7 @@ class DeviceForm(TenancyForm, CustomFieldModelForm): self.fields['position'].widget.choices = [(position, f'U{position}')] -class ModuleForm(CustomFieldModelForm): +class ModuleForm(NetBoxModelForm): device = DynamicModelChoiceField( queryset=Device.objects.all(), required=False, @@ -688,7 +688,7 @@ class ModuleForm(CustomFieldModelForm): ] -class CableForm(TenancyForm, CustomFieldModelForm): +class CableForm(TenancyForm, NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -711,7 +711,7 @@ class CableForm(TenancyForm, CustomFieldModelForm): } -class PowerPanelForm(CustomFieldModelForm): +class PowerPanelForm(NetBoxModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, @@ -755,7 +755,7 @@ class PowerPanelForm(CustomFieldModelForm): ) -class PowerFeedForm(CustomFieldModelForm): +class PowerFeedForm(NetBoxModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, @@ -823,7 +823,7 @@ class PowerFeedForm(CustomFieldModelForm): # Virtual chassis # -class VirtualChassisForm(CustomFieldModelForm): +class VirtualChassisForm(NetBoxModelForm): master = forms.ModelChoiceField( queryset=Device.objects.all(), required=False, @@ -1120,7 +1120,7 @@ class InventoryItemTemplateForm(BootstrapMixin, forms.ModelForm): # Device components # -class ConsolePortForm(CustomFieldModelForm): +class ConsolePortForm(NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1138,7 +1138,7 @@ class ConsolePortForm(CustomFieldModelForm): } -class ConsoleServerPortForm(CustomFieldModelForm): +class ConsoleServerPortForm(NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1156,7 +1156,7 @@ class ConsoleServerPortForm(CustomFieldModelForm): } -class PowerPortForm(CustomFieldModelForm): +class PowerPortForm(NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1174,7 +1174,7 @@ class PowerPortForm(CustomFieldModelForm): } -class PowerOutletForm(CustomFieldModelForm): +class PowerOutletForm(NetBoxModelForm): power_port = DynamicModelChoiceField( queryset=PowerPort.objects.all(), required=False, @@ -1199,7 +1199,7 @@ class PowerOutletForm(CustomFieldModelForm): } -class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): +class InterfaceForm(InterfaceCommonForm, NetBoxModelForm): parent = DynamicModelChoiceField( queryset=Interface.objects.all(), required=False, @@ -1308,7 +1308,7 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): } -class FrontPortForm(CustomFieldModelForm): +class FrontPortForm(NetBoxModelForm): rear_port = DynamicModelChoiceField( queryset=RearPort.objects.all(), query_params={ @@ -1332,7 +1332,7 @@ class FrontPortForm(CustomFieldModelForm): } -class RearPortForm(CustomFieldModelForm): +class RearPortForm(NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1349,7 +1349,7 @@ class RearPortForm(CustomFieldModelForm): } -class ModuleBayForm(CustomFieldModelForm): +class ModuleBayForm(NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1365,7 +1365,7 @@ class ModuleBayForm(CustomFieldModelForm): } -class DeviceBayForm(CustomFieldModelForm): +class DeviceBayForm(NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -1401,7 +1401,7 @@ class PopulateDeviceBayForm(BootstrapMixin, forms.Form): ).exclude(pk=device_bay.device.pk) -class InventoryItemForm(CustomFieldModelForm): +class InventoryItemForm(NetBoxModelForm): parent = DynamicModelChoiceField( queryset=InventoryItem.objects.all(), required=False, @@ -1451,7 +1451,7 @@ class InventoryItemForm(CustomFieldModelForm): # Device component roles # -class InventoryItemRoleForm(CustomFieldModelForm): +class InventoryItemRoleForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 1fea886ea64..73bb621fcce 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -1,8 +1,8 @@ from django import forms from dcim.models import * -from extras.forms import CustomFieldModelForm from extras.models import Tag +from netbox.forms import NetBoxModelForm from utilities.forms import ( BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, ) @@ -149,7 +149,7 @@ class FrontPortCreateForm(DeviceComponentCreateForm): } -class VirtualChassisCreateForm(CustomFieldModelForm): +class VirtualChassisCreateForm(NetBoxModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, diff --git a/netbox/extras/forms/customfields.py b/netbox/extras/forms/customfields.py index 8912d03651d..c3a44f47b03 100644 --- a/netbox/extras/forms/customfields.py +++ b/netbox/extras/forms/customfields.py @@ -1,16 +1,8 @@ -from django import forms from django.contrib.contenttypes.models import ContentType -from django.db.models import Q -from extras.choices import * from extras.models import * -from utilities.forms import BootstrapMixin, BulkEditBaseForm, CSVModelForm __all__ = ( - 'CustomFieldModelCSVForm', - 'CustomFieldModelBulkEditForm', - 'CustomFieldModelFilterForm', - 'CustomFieldModelForm', 'CustomFieldsMixin', ) @@ -50,76 +42,3 @@ class CustomFieldsMixin: # Annotate the field in the list of CustomField form fields self.custom_fields[field_name] = customfield - - -class CustomFieldModelForm(BootstrapMixin, CustomFieldsMixin, forms.ModelForm): - """ - Extend ModelForm to include custom field support. - """ - def _get_content_type(self): - return ContentType.objects.get_for_model(self._meta.model) - - def _get_form_field(self, customfield): - if self.instance.pk: - form_field = customfield.to_form_field(set_initial=False) - form_field.initial = self.instance.custom_field_data.get(customfield.name, None) - return form_field - - return customfield.to_form_field() - - def clean(self): - - # Save custom field data on instance - for cf_name, customfield in self.custom_fields.items(): - key = cf_name[3:] # Strip "cf_" from field name - value = self.cleaned_data.get(cf_name) - - # Convert "empty" values to null - if value in self.fields[cf_name].empty_values: - self.instance.custom_field_data[key] = None - else: - self.instance.custom_field_data[key] = customfield.serialize(value) - - return super().clean() - - -class CustomFieldModelCSVForm(CSVModelForm, CustomFieldModelForm): - - def _get_form_field(self, customfield): - return customfield.to_form_field(for_csv_import=True) - - -class CustomFieldModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditBaseForm): - - def _get_form_field(self, customfield): - return customfield.to_form_field(set_initial=False, enforce_required=False) - - def _append_customfield_fields(self): - """ - Append form fields for all CustomFields assigned to this object type. - """ - for customfield in self._get_custom_fields(self._get_content_type()): - # Annotate non-required custom fields as nullable - if not customfield.required: - self.nullable_fields.append(customfield.name) - - self.fields[customfield.name] = self._get_form_field(customfield) - - # Annotate the field in the list of CustomField form fields - self.custom_fields[customfield.name] = customfield - - -class CustomFieldModelFilterForm(BootstrapMixin, CustomFieldsMixin, forms.Form): - q = forms.CharField( - required=False, - label='Search' - ) - - def _get_custom_fields(self, content_type): - return CustomField.objects.filter(content_types=content_type).exclude( - Q(filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED) | - Q(type=CustomFieldTypeChoices.TYPE_JSON) - ) - - def _get_form_field(self, customfield): - return customfield.to_form_field(set_initial=False, enforce_required=False) diff --git a/netbox/extras/forms/models.py b/netbox/extras/forms/models.py index 9aac8454b10..5c29a83816c 100644 --- a/netbox/extras/forms/models.py +++ b/netbox/extras/forms/models.py @@ -13,7 +13,6 @@ from utilities.forms import ( from virtualization.models import Cluster, ClusterGroup, ClusterType __all__ = ( - 'AddRemoveTagsForm', 'ConfigContextForm', 'CustomFieldForm', 'CustomLinkForm', @@ -134,22 +133,6 @@ class TagForm(BootstrapMixin, forms.ModelForm): ) -class AddRemoveTagsForm(forms.Form): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Add add/remove tags fields - self.fields['add_tags'] = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - self.fields['remove_tags'] = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class ConfigContextForm(BootstrapMixin, forms.ModelForm): regions = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 308a467d149..3da03dd41ba 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -1,11 +1,11 @@ from django import forms from dcim.models import Region, Site, SiteGroup -from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm from ipam.choices import * from ipam.constants import * from ipam.models import * from ipam.models import ASN +from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant from utilities.forms import ( add_blank_choice, BulkEditNullBooleanSelect, DatePicker, DynamicModelChoiceField, NumericArrayField, StaticSelect, @@ -30,7 +30,7 @@ __all__ = ( ) -class VRFBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class VRFBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VRF.objects.all(), widget=forms.MultipleHiddenInput() @@ -55,7 +55,7 @@ class VRFBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class RouteTargetBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=RouteTarget.objects.all(), widget=forms.MultipleHiddenInput() @@ -75,7 +75,7 @@ class RouteTargetBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class RIRBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class RIRBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=RIR.objects.all(), widget=forms.MultipleHiddenInput @@ -93,7 +93,7 @@ class RIRBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['is_private', 'description'] -class ASNBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ASNBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ASN.objects.all(), widget=forms.MultipleHiddenInput() @@ -125,7 +125,7 @@ class ASNBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): } -class AggregateBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class AggregateBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Aggregate.objects.all(), widget=forms.MultipleHiddenInput() @@ -156,7 +156,7 @@ class AggregateBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): } -class RoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class RoleBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Role.objects.all(), widget=forms.MultipleHiddenInput @@ -173,7 +173,7 @@ class RoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['description'] -class PrefixBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class PrefixBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Prefix.objects.all(), widget=forms.MultipleHiddenInput() @@ -238,7 +238,7 @@ class PrefixBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class IPRangeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class IPRangeBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=IPRange.objects.all(), widget=forms.MultipleHiddenInput() @@ -272,7 +272,7 @@ class IPRangeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class IPAddressBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class IPAddressBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=IPAddress.objects.all(), widget=forms.MultipleHiddenInput() @@ -317,7 +317,7 @@ class IPAddressBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class FHRPGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=FHRPGroup.objects.all(), widget=forms.MultipleHiddenInput() @@ -352,7 +352,7 @@ class FHRPGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['auth_type', 'auth_key', 'description'] -class VLANGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VLANGroup.objects.all(), widget=forms.MultipleHiddenInput @@ -382,7 +382,7 @@ class VLANGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['site', 'description'] -class VLANBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class VLANBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VLAN.objects.all(), widget=forms.MultipleHiddenInput() @@ -434,7 +434,7 @@ class VLANBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class ServiceTemplateBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ServiceTemplate.objects.all(), widget=forms.MultipleHiddenInput() diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index 1ae977fe5fb..365f82858d7 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -2,10 +2,10 @@ from django import forms from django.contrib.contenttypes.models import ContentType from dcim.models import Device, Interface, Site -from extras.forms import CustomFieldModelCSVForm from ipam.choices import * from ipam.constants import * from ipam.models import * +from netbox.forms import NetBoxModelCSVForm from tenancy.models import Tenant from utilities.forms import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, SlugField from virtualization.models import VirtualMachine, VMInterface @@ -28,7 +28,7 @@ __all__ = ( ) -class VRFCSVForm(CustomFieldModelCSVForm): +class VRFCSVForm(NetBoxModelCSVForm): tenant = CSVModelChoiceField( queryset=Tenant.objects.all(), required=False, @@ -41,7 +41,7 @@ class VRFCSVForm(CustomFieldModelCSVForm): fields = ('name', 'rd', 'tenant', 'enforce_unique', 'description') -class RouteTargetCSVForm(CustomFieldModelCSVForm): +class RouteTargetCSVForm(NetBoxModelCSVForm): tenant = CSVModelChoiceField( queryset=Tenant.objects.all(), required=False, @@ -54,7 +54,7 @@ class RouteTargetCSVForm(CustomFieldModelCSVForm): fields = ('name', 'description', 'tenant') -class RIRCSVForm(CustomFieldModelCSVForm): +class RIRCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -65,7 +65,7 @@ class RIRCSVForm(CustomFieldModelCSVForm): } -class AggregateCSVForm(CustomFieldModelCSVForm): +class AggregateCSVForm(NetBoxModelCSVForm): rir = CSVModelChoiceField( queryset=RIR.objects.all(), to_field_name='name', @@ -83,7 +83,7 @@ class AggregateCSVForm(CustomFieldModelCSVForm): fields = ('prefix', 'rir', 'tenant', 'date_added', 'description') -class ASNCSVForm(CustomFieldModelCSVForm): +class ASNCSVForm(NetBoxModelCSVForm): rir = CSVModelChoiceField( queryset=RIR.objects.all(), to_field_name='name', @@ -102,7 +102,7 @@ class ASNCSVForm(CustomFieldModelCSVForm): help_texts = {} -class RoleCSVForm(CustomFieldModelCSVForm): +class RoleCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -110,7 +110,7 @@ class RoleCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'weight', 'description') -class PrefixCSVForm(CustomFieldModelCSVForm): +class PrefixCSVForm(NetBoxModelCSVForm): vrf = CSVModelChoiceField( queryset=VRF.objects.all(), to_field_name='name', @@ -174,7 +174,7 @@ class PrefixCSVForm(CustomFieldModelCSVForm): self.fields['vlan'].queryset = self.fields['vlan'].queryset.filter(**params) -class IPRangeCSVForm(CustomFieldModelCSVForm): +class IPRangeCSVForm(NetBoxModelCSVForm): vrf = CSVModelChoiceField( queryset=VRF.objects.all(), to_field_name='name', @@ -205,7 +205,7 @@ class IPRangeCSVForm(CustomFieldModelCSVForm): ) -class IPAddressCSVForm(CustomFieldModelCSVForm): +class IPAddressCSVForm(NetBoxModelCSVForm): vrf = CSVModelChoiceField( queryset=VRF.objects.all(), to_field_name='name', @@ -312,7 +312,7 @@ class IPAddressCSVForm(CustomFieldModelCSVForm): return ipaddress -class FHRPGroupCSVForm(CustomFieldModelCSVForm): +class FHRPGroupCSVForm(NetBoxModelCSVForm): protocol = CSVChoiceField( choices=FHRPGroupProtocolChoices ) @@ -326,7 +326,7 @@ class FHRPGroupCSVForm(CustomFieldModelCSVForm): fields = ('protocol', 'group_id', 'auth_type', 'auth_key', 'description') -class VLANGroupCSVForm(CustomFieldModelCSVForm): +class VLANGroupCSVForm(NetBoxModelCSVForm): slug = SlugField() scope_type = CSVContentTypeField( queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), @@ -354,7 +354,7 @@ class VLANGroupCSVForm(CustomFieldModelCSVForm): } -class VLANCSVForm(CustomFieldModelCSVForm): +class VLANCSVForm(NetBoxModelCSVForm): site = CSVModelChoiceField( queryset=Site.objects.all(), required=False, @@ -393,7 +393,7 @@ class VLANCSVForm(CustomFieldModelCSVForm): } -class ServiceTemplateCSVForm(CustomFieldModelCSVForm): +class ServiceTemplateCSVForm(NetBoxModelCSVForm): protocol = CSVChoiceField( choices=ServiceProtocolChoices, help_text='IP protocol' @@ -404,7 +404,7 @@ class ServiceTemplateCSVForm(CustomFieldModelCSVForm): fields = ('name', 'protocol', 'ports', 'description') -class ServiceCSVForm(CustomFieldModelCSVForm): +class ServiceCSVForm(NetBoxModelCSVForm): device = CSVModelChoiceField( queryset=Device.objects.all(), required=False, diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 9bfb1df104f..4301a1810b2 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -2,11 +2,11 @@ from django import forms from django.utils.translation import gettext as _ from dcim.models import Location, Rack, Region, Site, SiteGroup -from extras.forms import CustomFieldModelFilterForm from ipam.choices import * from ipam.constants import * from ipam.models import * from ipam.models import ASN +from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm from utilities.forms import ( add_blank_choice, DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect, StaticSelectMultiple, @@ -39,7 +39,7 @@ IPADDRESS_MASK_LENGTH_CHOICES = add_blank_choice([ ]) -class VRFFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class VRFFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = VRF field_groups = [ ['q', 'tag'], @@ -59,7 +59,7 @@ class VRFFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class RouteTargetFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class RouteTargetFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = RouteTarget field_groups = [ ['q', 'tag'], @@ -79,7 +79,7 @@ class RouteTargetFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class RIRFilterForm(CustomFieldModelFilterForm): +class RIRFilterForm(NetBoxModelFilterSetForm): model = RIR is_private = forms.NullBooleanField( required=False, @@ -91,7 +91,7 @@ class RIRFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class AggregateFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class AggregateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Aggregate field_groups = [ ['q', 'tag'], @@ -112,7 +112,7 @@ class AggregateFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class ASNFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class ASNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = ASN field_groups = [ ['q'], @@ -132,12 +132,12 @@ class ASNFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): ) -class RoleFilterForm(CustomFieldModelFilterForm): +class RoleFilterForm(NetBoxModelFilterSetForm): model = Role tag = TagFilterField(model) -class PrefixFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class PrefixFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Prefix field_groups = [ ['q', 'tag'], @@ -228,7 +228,7 @@ class PrefixFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class IPRangeFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class IPRangeFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = IPRange field_groups = [ ['q', 'tag'], @@ -261,7 +261,7 @@ class IPRangeFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class IPAddressFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = IPAddress field_groups = [ ['q', 'tag'], @@ -321,7 +321,7 @@ class IPAddressFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class FHRPGroupFilterForm(CustomFieldModelFilterForm): +class FHRPGroupFilterForm(NetBoxModelFilterSetForm): model = FHRPGroup field_groups = ( ('q', 'tag'), @@ -351,7 +351,7 @@ class FHRPGroupFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class VLANGroupFilterForm(CustomFieldModelFilterForm): +class VLANGroupFilterForm(NetBoxModelFilterSetForm): field_groups = [ ['q', 'tag'], ['region', 'sitegroup', 'site', 'location', 'rack'], @@ -394,7 +394,7 @@ class VLANGroupFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class VLANFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = VLAN field_groups = [ ['q', 'tag'], @@ -448,7 +448,7 @@ class VLANFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class ServiceTemplateFilterForm(CustomFieldModelFilterForm): +class ServiceTemplateFilterForm(NetBoxModelFilterSetForm): model = ServiceTemplate field_groups = ( ('q', 'tag'), diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py index 34c67773f19..e86fe1dab33 100644 --- a/netbox/ipam/forms/models.py +++ b/netbox/ipam/forms/models.py @@ -2,13 +2,13 @@ from django import forms from django.contrib.contenttypes.models import ContentType from dcim.models import Device, Interface, Location, Rack, Region, Site, SiteGroup -from extras.forms import CustomFieldModelForm from extras.models import Tag from ipam.choices import * from ipam.constants import * from ipam.formfields import IPNetworkFormField from ipam.models import * from ipam.models import ASN +from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.exceptions import PermissionsViolation from utilities.forms import ( @@ -39,7 +39,7 @@ __all__ = ( ) -class VRFForm(TenancyForm, CustomFieldModelForm): +class VRFForm(TenancyForm, NetBoxModelForm): import_targets = DynamicModelMultipleChoiceField( queryset=RouteTarget.objects.all(), required=False @@ -72,7 +72,7 @@ class VRFForm(TenancyForm, CustomFieldModelForm): } -class RouteTargetForm(TenancyForm, CustomFieldModelForm): +class RouteTargetForm(TenancyForm, NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -89,7 +89,7 @@ class RouteTargetForm(TenancyForm, CustomFieldModelForm): ) -class RIRForm(CustomFieldModelForm): +class RIRForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -103,7 +103,7 @@ class RIRForm(CustomFieldModelForm): ] -class AggregateForm(TenancyForm, CustomFieldModelForm): +class AggregateForm(TenancyForm, NetBoxModelForm): rir = DynamicModelChoiceField( queryset=RIR.objects.all(), label='RIR' @@ -131,7 +131,7 @@ class AggregateForm(TenancyForm, CustomFieldModelForm): } -class ASNForm(TenancyForm, CustomFieldModelForm): +class ASNForm(TenancyForm, NetBoxModelForm): rir = DynamicModelChoiceField( queryset=RIR.objects.all(), label='RIR', @@ -175,7 +175,7 @@ class ASNForm(TenancyForm, CustomFieldModelForm): return instance -class RoleForm(CustomFieldModelForm): +class RoleForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -189,7 +189,7 @@ class RoleForm(CustomFieldModelForm): ] -class PrefixForm(TenancyForm, CustomFieldModelForm): +class PrefixForm(TenancyForm, NetBoxModelForm): vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -264,7 +264,7 @@ class PrefixForm(TenancyForm, CustomFieldModelForm): } -class IPRangeForm(TenancyForm, CustomFieldModelForm): +class IPRangeForm(TenancyForm, NetBoxModelForm): vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -293,7 +293,7 @@ class IPRangeForm(TenancyForm, CustomFieldModelForm): } -class IPAddressForm(TenancyForm, CustomFieldModelForm): +class IPAddressForm(TenancyForm, NetBoxModelForm): device = DynamicModelChoiceField( queryset=Device.objects.all(), required=False, @@ -506,7 +506,7 @@ class IPAddressForm(TenancyForm, CustomFieldModelForm): return ipaddress -class IPAddressBulkAddForm(TenancyForm, CustomFieldModelForm): +class IPAddressBulkAddForm(TenancyForm, NetBoxModelForm): vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -540,7 +540,7 @@ class IPAddressAssignForm(BootstrapMixin, forms.Form): ) -class FHRPGroupForm(CustomFieldModelForm): +class FHRPGroupForm(NetBoxModelForm): tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -629,7 +629,7 @@ class FHRPGroupAssignmentForm(BootstrapMixin, forms.ModelForm): self.fields['group'].widget.add_query_param('related_ip', ipaddress.pk) -class VLANGroupForm(CustomFieldModelForm): +class VLANGroupForm(NetBoxModelForm): scope_type = ContentTypeChoiceField( queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), required=False @@ -736,7 +736,7 @@ class VLANGroupForm(CustomFieldModelForm): self.instance.scope_id = None -class VLANForm(TenancyForm, CustomFieldModelForm): +class VLANForm(TenancyForm, NetBoxModelForm): # VLANGroup assignment fields scope_type = forms.ChoiceField( choices=( @@ -817,7 +817,7 @@ class VLANForm(TenancyForm, CustomFieldModelForm): } -class ServiceTemplateForm(CustomFieldModelForm): +class ServiceTemplateForm(NetBoxModelForm): ports = NumericArrayField( base_field=forms.IntegerField( min_value=SERVICE_PORT_MIN, @@ -838,7 +838,7 @@ class ServiceTemplateForm(CustomFieldModelForm): } -class ServiceForm(CustomFieldModelForm): +class ServiceForm(NetBoxModelForm): device = DynamicModelChoiceField( queryset=Device.objects.all(), required=False diff --git a/netbox/netbox/forms.py b/netbox/netbox/forms/__init__.py similarity index 98% rename from netbox/netbox/forms.py rename to netbox/netbox/forms/__init__.py index b5d68c1fcd9..9984a446191 100644 --- a/netbox/netbox/forms.py +++ b/netbox/netbox/forms/__init__.py @@ -1,6 +1,7 @@ from django import forms from utilities.forms import BootstrapMixin +from .base import * OBJ_TYPE_CHOICES = ( ('', 'All Objects'), diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py new file mode 100644 index 00000000000..601b0062a71 --- /dev/null +++ b/netbox/netbox/forms/base.py @@ -0,0 +1,108 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType +from django.db.models import Q + +from extras.choices import CustomFieldFilterLogicChoices, CustomFieldTypeChoices +from extras.forms.customfields import CustomFieldsMixin +from extras.models import CustomField, Tag +from utilities.forms import BootstrapMixin, BulkEditBaseForm, CSVModelForm +from utilities.forms.fields import DynamicModelMultipleChoiceField + +__all__ = ( + 'NetBoxModelForm', + 'NetBoxModelCSVForm', + 'NetBoxModelBulkEditForm', + 'NetBoxModelFilterSetForm', +) + + +class NetBoxModelForm(BootstrapMixin, CustomFieldsMixin, forms.ModelForm): + """ + Base form for creating & editing NetBox models. Adds support for custom fields. + """ + def _get_content_type(self): + return ContentType.objects.get_for_model(self._meta.model) + + def _get_form_field(self, customfield): + if self.instance.pk: + form_field = customfield.to_form_field(set_initial=False) + form_field.initial = self.instance.custom_field_data.get(customfield.name, None) + return form_field + + return customfield.to_form_field() + + def clean(self): + + # Save custom field data on instance + for cf_name, customfield in self.custom_fields.items(): + key = cf_name[3:] # Strip "cf_" from field name + value = self.cleaned_data.get(cf_name) + + # Convert "empty" values to null + if value in self.fields[cf_name].empty_values: + self.instance.custom_field_data[key] = None + else: + self.instance.custom_field_data[key] = customfield.serialize(value) + + return super().clean() + + +class NetBoxModelCSVForm(CSVModelForm, NetBoxModelForm): + """ + Base form for creating a NetBox objects from CSV data. Used for bulk importing. + """ + def _get_form_field(self, customfield): + return customfield.to_form_field(for_csv_import=True) + + +class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditBaseForm): + """ + Base form for modifying multiple NetBox objects (of the same type) in bulk via the UI. Adds support for custom + fields and adding/removing tags. + """ + add_tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + remove_tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + def _get_form_field(self, customfield): + return customfield.to_form_field(set_initial=False, enforce_required=False) + + def _append_customfield_fields(self): + """ + Append form fields for all CustomFields assigned to this object type. + """ + for customfield in self._get_custom_fields(self._get_content_type()): + # Annotate non-required custom fields as nullable + if not customfield.required: + self.nullable_fields.append(customfield.name) + + self.fields[customfield.name] = self._get_form_field(customfield) + + # Annotate the field in the list of CustomField form fields + self.custom_fields[customfield.name] = customfield + + +class NetBoxModelFilterSetForm(BootstrapMixin, CustomFieldsMixin, forms.Form): + """ + Base form for FilerSet forms. These are used to filter object lists in the NetBox UI. + + The corresponding FilterSet *must* provide a `q` filter. + """ + q = forms.CharField( + required=False, + label='Search' + ) + + def _get_custom_fields(self, content_type): + return CustomField.objects.filter(content_types=content_type).exclude( + Q(filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED) | + Q(type=CustomFieldTypeChoices.TYPE_JSON) + ) + + def _get_form_field(self, customfield): + return customfield.to_form_field(set_initial=False, enforce_required=False) diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py index 9dc1b8ec54e..9b14a167b1d 100644 --- a/netbox/tenancy/forms/bulk_edit.py +++ b/netbox/tenancy/forms/bulk_edit.py @@ -1,6 +1,6 @@ from django import forms -from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm +from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import * from utilities.forms import DynamicModelChoiceField @@ -17,7 +17,7 @@ __all__ = ( # Tenants # -class TenantGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class TenantGroupBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=TenantGroup.objects.all(), widget=forms.MultipleHiddenInput @@ -35,7 +35,7 @@ class TenantGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['parent', 'description'] -class TenantBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class TenantBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Tenant.objects.all(), widget=forms.MultipleHiddenInput() @@ -55,7 +55,7 @@ class TenantBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): # Contacts # -class ContactGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ContactGroupBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ContactGroup.objects.all(), widget=forms.MultipleHiddenInput @@ -73,7 +73,7 @@ class ContactGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['parent', 'description'] -class ContactRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ContactRole.objects.all(), widget=forms.MultipleHiddenInput @@ -87,7 +87,7 @@ class ContactRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['description'] -class ContactBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ContactBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Contact.objects.all(), widget=forms.MultipleHiddenInput() diff --git a/netbox/tenancy/forms/bulk_import.py b/netbox/tenancy/forms/bulk_import.py index 51b863cac97..409590c284c 100644 --- a/netbox/tenancy/forms/bulk_import.py +++ b/netbox/tenancy/forms/bulk_import.py @@ -1,4 +1,4 @@ -from extras.forms import CustomFieldModelCSVForm +from netbox.forms import NetBoxModelCSVForm from tenancy.models import * from utilities.forms import CSVModelChoiceField, SlugField @@ -15,7 +15,7 @@ __all__ = ( # Tenants # -class TenantGroupCSVForm(CustomFieldModelCSVForm): +class TenantGroupCSVForm(NetBoxModelCSVForm): parent = CSVModelChoiceField( queryset=TenantGroup.objects.all(), required=False, @@ -29,7 +29,7 @@ class TenantGroupCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'parent', 'description') -class TenantCSVForm(CustomFieldModelCSVForm): +class TenantCSVForm(NetBoxModelCSVForm): slug = SlugField() group = CSVModelChoiceField( queryset=TenantGroup.objects.all(), @@ -47,7 +47,7 @@ class TenantCSVForm(CustomFieldModelCSVForm): # Contacts # -class ContactGroupCSVForm(CustomFieldModelCSVForm): +class ContactGroupCSVForm(NetBoxModelCSVForm): parent = CSVModelChoiceField( queryset=ContactGroup.objects.all(), required=False, @@ -61,7 +61,7 @@ class ContactGroupCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'parent', 'description') -class ContactRoleCSVForm(CustomFieldModelCSVForm): +class ContactRoleCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -69,7 +69,7 @@ class ContactRoleCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'description') -class ContactCSVForm(CustomFieldModelCSVForm): +class ContactCSVForm(NetBoxModelCSVForm): group = CSVModelChoiceField( queryset=ContactGroup.objects.all(), required=False, diff --git a/netbox/tenancy/forms/filtersets.py b/netbox/tenancy/forms/filtersets.py index 7849e21716b..8fb4b50ff4a 100644 --- a/netbox/tenancy/forms/filtersets.py +++ b/netbox/tenancy/forms/filtersets.py @@ -1,6 +1,6 @@ from django.utils.translation import gettext as _ -from extras.forms import CustomFieldModelFilterForm +from netbox.forms import NetBoxModelFilterSetForm from tenancy.models import * from utilities.forms import DynamicModelMultipleChoiceField, TagFilterField @@ -17,7 +17,7 @@ __all__ = ( # Tenants # -class TenantGroupFilterForm(CustomFieldModelFilterForm): +class TenantGroupFilterForm(NetBoxModelFilterSetForm): model = TenantGroup parent_id = DynamicModelMultipleChoiceField( queryset=TenantGroup.objects.all(), @@ -27,7 +27,7 @@ class TenantGroupFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class TenantFilterForm(CustomFieldModelFilterForm): +class TenantFilterForm(NetBoxModelFilterSetForm): model = Tenant field_groups = ( ('q', 'tag'), @@ -46,7 +46,7 @@ class TenantFilterForm(CustomFieldModelFilterForm): # Contacts # -class ContactGroupFilterForm(CustomFieldModelFilterForm): +class ContactGroupFilterForm(NetBoxModelFilterSetForm): model = ContactGroup parent_id = DynamicModelMultipleChoiceField( queryset=ContactGroup.objects.all(), @@ -56,12 +56,12 @@ class ContactGroupFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class ContactRoleFilterForm(CustomFieldModelFilterForm): +class ContactRoleFilterForm(NetBoxModelFilterSetForm): model = ContactRole tag = TagFilterField(model) -class ContactFilterForm(CustomFieldModelFilterForm): +class ContactFilterForm(NetBoxModelFilterSetForm): model = Contact field_groups = ( ('q', 'tag'), diff --git a/netbox/tenancy/forms/models.py b/netbox/tenancy/forms/models.py index 398a44c9b42..313b5541786 100644 --- a/netbox/tenancy/forms/models.py +++ b/netbox/tenancy/forms/models.py @@ -1,7 +1,7 @@ from django import forms -from extras.forms import CustomFieldModelForm from extras.models import Tag +from netbox.forms import NetBoxModelForm from tenancy.models import * from utilities.forms import ( BootstrapMixin, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, SmallTextarea, @@ -22,7 +22,7 @@ __all__ = ( # Tenants # -class TenantGroupForm(CustomFieldModelForm): +class TenantGroupForm(NetBoxModelForm): parent = DynamicModelChoiceField( queryset=TenantGroup.objects.all(), required=False @@ -40,7 +40,7 @@ class TenantGroupForm(CustomFieldModelForm): ] -class TenantForm(CustomFieldModelForm): +class TenantForm(NetBoxModelForm): slug = SlugField() group = DynamicModelChoiceField( queryset=TenantGroup.objects.all(), @@ -66,7 +66,7 @@ class TenantForm(CustomFieldModelForm): # Contacts # -class ContactGroupForm(CustomFieldModelForm): +class ContactGroupForm(NetBoxModelForm): parent = DynamicModelChoiceField( queryset=ContactGroup.objects.all(), required=False @@ -82,7 +82,7 @@ class ContactGroupForm(CustomFieldModelForm): fields = ('parent', 'name', 'slug', 'description', 'tags') -class ContactRoleForm(CustomFieldModelForm): +class ContactRoleForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -94,7 +94,7 @@ class ContactRoleForm(CustomFieldModelForm): fields = ('name', 'slug', 'description', 'tags') -class ContactForm(CustomFieldModelForm): +class ContactForm(NetBoxModelForm): group = DynamicModelChoiceField( queryset=ContactGroup.objects.all(), required=False diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 1e80e88e521..4232a87cd18 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -3,8 +3,8 @@ from django import forms from dcim.choices import InterfaceModeChoices from dcim.constants import INTERFACE_MTU_MAX, INTERFACE_MTU_MIN from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup -from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm from ipam.models import VLAN +from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant from utilities.forms import ( add_blank_choice, BulkEditNullBooleanSelect, BulkRenameForm, CommentField, DynamicModelChoiceField, @@ -23,7 +23,7 @@ __all__ = ( ) -class ClusterTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ClusterTypeBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ClusterType.objects.all(), widget=forms.MultipleHiddenInput @@ -37,7 +37,7 @@ class ClusterTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['description'] -class ClusterGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), widget=forms.MultipleHiddenInput @@ -51,7 +51,7 @@ class ClusterGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['description'] -class ClusterBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class ClusterBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Cluster.objects.all(), widget=forms.MultipleHiddenInput() @@ -95,7 +95,7 @@ class ClusterBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): ] -class VirtualMachineBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VirtualMachine.objects.all(), widget=forms.MultipleHiddenInput() @@ -150,7 +150,7 @@ class VirtualMachineBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm ] -class VMInterfaceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VMInterface.objects.all(), widget=forms.MultipleHiddenInput() diff --git a/netbox/virtualization/forms/bulk_import.py b/netbox/virtualization/forms/bulk_import.py index bd327995966..cefc2219dd7 100644 --- a/netbox/virtualization/forms/bulk_import.py +++ b/netbox/virtualization/forms/bulk_import.py @@ -1,6 +1,6 @@ from dcim.choices import InterfaceModeChoices from dcim.models import DeviceRole, Platform, Site -from extras.forms import CustomFieldModelCSVForm +from netbox.forms import NetBoxModelCSVForm from tenancy.models import Tenant from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField from virtualization.choices import * @@ -15,7 +15,7 @@ __all__ = ( ) -class ClusterTypeCSVForm(CustomFieldModelCSVForm): +class ClusterTypeCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -23,7 +23,7 @@ class ClusterTypeCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'description') -class ClusterGroupCSVForm(CustomFieldModelCSVForm): +class ClusterGroupCSVForm(NetBoxModelCSVForm): slug = SlugField() class Meta: @@ -31,7 +31,7 @@ class ClusterGroupCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'description') -class ClusterCSVForm(CustomFieldModelCSVForm): +class ClusterCSVForm(NetBoxModelCSVForm): type = CSVModelChoiceField( queryset=ClusterType.objects.all(), to_field_name='name', @@ -61,7 +61,7 @@ class ClusterCSVForm(CustomFieldModelCSVForm): fields = ('name', 'type', 'group', 'site', 'comments') -class VirtualMachineCSVForm(CustomFieldModelCSVForm): +class VirtualMachineCSVForm(NetBoxModelCSVForm): status = CSVChoiceField( choices=VirtualMachineStatusChoices, help_text='Operational status of device' @@ -99,7 +99,7 @@ class VirtualMachineCSVForm(CustomFieldModelCSVForm): ) -class VMInterfaceCSVForm(CustomFieldModelCSVForm): +class VMInterfaceCSVForm(NetBoxModelCSVForm): virtual_machine = CSVModelChoiceField( queryset=VirtualMachine.objects.all(), to_field_name='name' diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 9ca8eba6e14..292cd661d4c 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -2,7 +2,8 @@ from django import forms from django.utils.translation import gettext as _ from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup -from extras.forms import CustomFieldModelFilterForm, LocalConfigContextFilterForm +from extras.forms import LocalConfigContextFilterForm +from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm from utilities.forms import ( DynamicModelMultipleChoiceField, StaticSelect, StaticSelectMultiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, @@ -19,17 +20,17 @@ __all__ = ( ) -class ClusterTypeFilterForm(CustomFieldModelFilterForm): +class ClusterTypeFilterForm(NetBoxModelFilterSetForm): model = ClusterType tag = TagFilterField(model) -class ClusterGroupFilterForm(CustomFieldModelFilterForm): +class ClusterGroupFilterForm(NetBoxModelFilterSetForm): model = ClusterGroup tag = TagFilterField(model) -class ClusterFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): +class ClusterFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Cluster field_groups = [ ['q', 'tag'], @@ -71,7 +72,7 @@ class ClusterFilterForm(TenancyFilterForm, CustomFieldModelFilterForm): tag = TagFilterField(model) -class VirtualMachineFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm): +class VirtualMachineFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = VirtualMachine field_groups = [ ['q', 'tag'], @@ -151,7 +152,7 @@ class VirtualMachineFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, tag = TagFilterField(model) -class VMInterfaceFilterForm(CustomFieldModelFilterForm): +class VMInterfaceFilterForm(NetBoxModelFilterSetForm): model = VMInterface field_groups = [ ['q', 'tag'], diff --git a/netbox/virtualization/forms/models.py b/netbox/virtualization/forms/models.py index 624c9e87fa1..883fcd363b9 100644 --- a/netbox/virtualization/forms/models.py +++ b/netbox/virtualization/forms/models.py @@ -5,9 +5,9 @@ from django.core.exceptions import ValidationError from dcim.forms.common import InterfaceCommonForm from dcim.forms.models import INTERFACE_MODE_HELP_TEXT from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup -from extras.forms import CustomFieldModelForm from extras.models import Tag from ipam.models import IPAddress, VLAN, VLANGroup +from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.forms import ( BootstrapMixin, CommentField, ConfirmationForm, DynamicModelChoiceField, DynamicModelMultipleChoiceField, @@ -26,7 +26,7 @@ __all__ = ( ) -class ClusterTypeForm(CustomFieldModelForm): +class ClusterTypeForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -40,7 +40,7 @@ class ClusterTypeForm(CustomFieldModelForm): ) -class ClusterGroupForm(CustomFieldModelForm): +class ClusterGroupForm(NetBoxModelForm): slug = SlugField() tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -54,7 +54,7 @@ class ClusterGroupForm(CustomFieldModelForm): ) -class ClusterForm(TenancyForm, CustomFieldModelForm): +class ClusterForm(TenancyForm, NetBoxModelForm): type = DynamicModelChoiceField( queryset=ClusterType.objects.all() ) @@ -171,7 +171,7 @@ class ClusterRemoveDevicesForm(ConfirmationForm): ) -class VirtualMachineForm(TenancyForm, CustomFieldModelForm): +class VirtualMachineForm(TenancyForm, NetBoxModelForm): cluster_group = DynamicModelChoiceField( queryset=ClusterGroup.objects.all(), required=False, @@ -271,7 +271,7 @@ class VirtualMachineForm(TenancyForm, CustomFieldModelForm): self.fields['primary_ip6'].widget.attrs['readonly'] = True -class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm): +class VMInterfaceForm(InterfaceCommonForm, NetBoxModelForm): parent = DynamicModelChoiceField( queryset=VMInterface.objects.all(), required=False, diff --git a/netbox/wireless/forms/bulk_edit.py b/netbox/wireless/forms/bulk_edit.py index 9d07d09f041..147108d779d 100644 --- a/netbox/wireless/forms/bulk_edit.py +++ b/netbox/wireless/forms/bulk_edit.py @@ -1,8 +1,8 @@ from django import forms from dcim.choices import LinkStatusChoices -from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm from ipam.models import VLAN +from netbox.forms import NetBoxModelBulkEditForm from utilities.forms import add_blank_choice, DynamicModelChoiceField from wireless.choices import * from wireless.constants import SSID_MAX_LENGTH @@ -15,7 +15,7 @@ __all__ = ( ) -class WirelessLANGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=WirelessLANGroup.objects.all(), widget=forms.MultipleHiddenInput @@ -33,7 +33,7 @@ class WirelessLANGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditFo nullable_fields = ['parent', 'description'] -class WirelessLANBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=WirelessLAN.objects.all(), widget=forms.MultipleHiddenInput @@ -72,7 +72,7 @@ class WirelessLANBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): nullable_fields = ['ssid', 'group', 'vlan', 'description', 'auth_type', 'auth_cipher', 'auth_psk'] -class WirelessLinkBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm): +class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=WirelessLink.objects.all(), widget=forms.MultipleHiddenInput diff --git a/netbox/wireless/forms/bulk_import.py b/netbox/wireless/forms/bulk_import.py index aa79e1fc713..4b8acb38598 100644 --- a/netbox/wireless/forms/bulk_import.py +++ b/netbox/wireless/forms/bulk_import.py @@ -1,7 +1,7 @@ from dcim.choices import LinkStatusChoices from dcim.models import Interface -from extras.forms import CustomFieldModelCSVForm from ipam.models import VLAN +from netbox.forms import NetBoxModelCSVForm from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField from wireless.choices import * from wireless.models import * @@ -13,7 +13,7 @@ __all__ = ( ) -class WirelessLANGroupCSVForm(CustomFieldModelCSVForm): +class WirelessLANGroupCSVForm(NetBoxModelCSVForm): parent = CSVModelChoiceField( queryset=WirelessLANGroup.objects.all(), required=False, @@ -27,7 +27,7 @@ class WirelessLANGroupCSVForm(CustomFieldModelCSVForm): fields = ('name', 'slug', 'parent', 'description') -class WirelessLANCSVForm(CustomFieldModelCSVForm): +class WirelessLANCSVForm(NetBoxModelCSVForm): group = CSVModelChoiceField( queryset=WirelessLANGroup.objects.all(), required=False, @@ -56,7 +56,7 @@ class WirelessLANCSVForm(CustomFieldModelCSVForm): fields = ('ssid', 'group', 'description', 'vlan', 'auth_type', 'auth_cipher', 'auth_psk') -class WirelessLinkCSVForm(CustomFieldModelCSVForm): +class WirelessLinkCSVForm(NetBoxModelCSVForm): status = CSVChoiceField( choices=LinkStatusChoices, help_text='Connection status' diff --git a/netbox/wireless/forms/filtersets.py b/netbox/wireless/forms/filtersets.py index 82df93e6c81..3c46caf21e9 100644 --- a/netbox/wireless/forms/filtersets.py +++ b/netbox/wireless/forms/filtersets.py @@ -2,7 +2,7 @@ from django import forms from django.utils.translation import gettext as _ from dcim.choices import LinkStatusChoices -from extras.forms import CustomFieldModelFilterForm +from netbox.forms import NetBoxModelFilterSetForm from utilities.forms import add_blank_choice, DynamicModelMultipleChoiceField, StaticSelect, TagFilterField from wireless.choices import * from wireless.models import * @@ -14,7 +14,7 @@ __all__ = ( ) -class WirelessLANGroupFilterForm(CustomFieldModelFilterForm): +class WirelessLANGroupFilterForm(NetBoxModelFilterSetForm): model = WirelessLANGroup parent_id = DynamicModelMultipleChoiceField( queryset=WirelessLANGroup.objects.all(), @@ -24,7 +24,7 @@ class WirelessLANGroupFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class WirelessLANFilterForm(CustomFieldModelFilterForm): +class WirelessLANFilterForm(NetBoxModelFilterSetForm): model = WirelessLAN field_groups = [ ('q', 'tag'), @@ -56,7 +56,7 @@ class WirelessLANFilterForm(CustomFieldModelFilterForm): tag = TagFilterField(model) -class WirelessLinkFilterForm(CustomFieldModelFilterForm): +class WirelessLinkFilterForm(NetBoxModelFilterSetForm): model = WirelessLink ssid = forms.CharField( required=False, diff --git a/netbox/wireless/forms/models.py b/netbox/wireless/forms/models.py index 7687cb37255..30a4a23524a 100644 --- a/netbox/wireless/forms/models.py +++ b/netbox/wireless/forms/models.py @@ -1,7 +1,7 @@ from dcim.models import Device, Interface, Location, Site -from extras.forms import CustomFieldModelForm from extras.models import Tag from ipam.models import VLAN +from netbox.forms import NetBoxModelForm from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, StaticSelect from wireless.models import * @@ -12,7 +12,7 @@ __all__ = ( ) -class WirelessLANGroupForm(CustomFieldModelForm): +class WirelessLANGroupForm(NetBoxModelForm): parent = DynamicModelChoiceField( queryset=WirelessLANGroup.objects.all(), required=False @@ -30,7 +30,7 @@ class WirelessLANGroupForm(CustomFieldModelForm): ] -class WirelessLANForm(CustomFieldModelForm): +class WirelessLANForm(NetBoxModelForm): group = DynamicModelChoiceField( queryset=WirelessLANGroup.objects.all(), required=False @@ -61,7 +61,7 @@ class WirelessLANForm(CustomFieldModelForm): } -class WirelessLinkForm(CustomFieldModelForm): +class WirelessLinkForm(NetBoxModelForm): site_a = DynamicModelChoiceField( queryset=Site.objects.all(), required=False, From e4eee1cdfc74519e1494102506655063ac8b0264 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 28 Jan 2022 16:47:54 -0500 Subject: [PATCH 130/271] Clean up nullable fields declaration for bulk edit forms --- netbox/circuits/forms/bulk_edit.py | 14 ++--- netbox/dcim/forms/bulk_edit.py | 78 ++++++++++++------------ netbox/extras/forms/bulk_edit.py | 18 ++---- netbox/ipam/forms/bulk_edit.py | 44 +++++++------ netbox/netbox/forms/base.py | 13 ++-- netbox/tenancy/forms/bulk_edit.py | 12 ++-- netbox/utilities/forms/forms.py | 40 +++++++----- netbox/virtualization/forms/bulk_edit.py | 16 ++--- netbox/wireless/forms/bulk_edit.py | 6 +- 9 files changed, 120 insertions(+), 121 deletions(-) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 3e54cf71183..f17df130206 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -48,9 +48,9 @@ class ProviderBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', - ] + ) class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): @@ -76,9 +76,9 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'service_id', 'description', 'comments', - ] + ) class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): @@ -92,7 +92,7 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['description'] + nullable_fields = ('description',) class CircuitBulkEditForm(NetBoxModelBulkEditForm): @@ -132,6 +132,6 @@ class CircuitBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'tenant', 'commit_rate', 'description', 'comments', - ] + ) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index f5eb179fa30..13e9d945bc0 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -72,7 +72,7 @@ class RegionBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['parent', 'description'] + nullable_fields = ('parent', 'description') class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): @@ -90,7 +90,7 @@ class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['parent', 'description'] + nullable_fields = ('parent', 'description') class SiteBulkEditForm(NetBoxModelBulkEditForm): @@ -132,9 +132,9 @@ class SiteBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'region', 'group', 'tenant', 'asns', 'description', 'time_zone', - ] + ) class LocationBulkEditForm(NetBoxModelBulkEditForm): @@ -163,7 +163,7 @@ class LocationBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['parent', 'tenant', 'description'] + nullable_fields = ('parent', 'tenant', 'description') class RackRoleBulkEditForm(NetBoxModelBulkEditForm): @@ -180,7 +180,7 @@ class RackRoleBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['color', 'description'] + nullable_fields = ('color', 'description') class RackBulkEditForm(NetBoxModelBulkEditForm): @@ -278,9 +278,9 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'comments', - ] + ) class RackReservationBulkEditForm(NetBoxModelBulkEditForm): @@ -304,9 +304,6 @@ class RackReservationBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = [] - class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( @@ -319,7 +316,7 @@ class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['description'] + nullable_fields = ('description',) class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): @@ -350,7 +347,7 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['part_number', 'airflow'] + nullable_fields = ('part_number', 'airflow') class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): @@ -367,7 +364,7 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['part_number'] + nullable_fields = ('part_number',) class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): @@ -389,7 +386,7 @@ class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['color', 'description'] + nullable_fields = ('color', 'description') class PlatformBulkEditForm(NetBoxModelBulkEditForm): @@ -412,7 +409,7 @@ class PlatformBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['manufacturer', 'napalm_driver', 'description'] + nullable_fields = ('manufacturer', 'napalm_driver', 'description') class DeviceBulkEditForm(NetBoxModelBulkEditForm): @@ -471,9 +468,9 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'tenant', 'platform', 'serial', 'airflow', - ] + ) class ModuleBulkEditForm(NetBoxModelBulkEditForm): @@ -499,7 +496,7 @@ class ModuleBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['serial'] + nullable_fields = ('serial',) class CableBulkEditForm(NetBoxModelBulkEditForm): @@ -542,9 +539,9 @@ class CableBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'type', 'status', 'tenant', 'label', 'color', 'length', - ] + ) def clean(self): super().clean() @@ -569,7 +566,7 @@ class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['domain'] + nullable_fields = ('domain',) class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): @@ -608,7 +605,7 @@ class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['location'] + nullable_fields = ('location',) class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): @@ -667,9 +664,9 @@ class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'location', 'comments', - ] + ) # @@ -930,7 +927,7 @@ class InventoryItemTemplateBulkEditForm(BulkEditForm): ) class Meta: - nullable_fields = ['label', 'role', 'manufacturer', 'part_id', 'description'] + nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description') # @@ -951,7 +948,7 @@ class ConsolePortBulkEditForm( ) class Meta: - nullable_fields = ['label', 'description'] + nullable_fields = ('label', 'description') class ConsoleServerPortBulkEditForm( @@ -968,7 +965,7 @@ class ConsoleServerPortBulkEditForm( ) class Meta: - nullable_fields = ['label', 'description'] + nullable_fields = ('label', 'description') class PowerPortBulkEditForm( @@ -985,7 +982,7 @@ class PowerPortBulkEditForm( ) class Meta: - nullable_fields = ['label', 'description'] + nullable_fields = ('label', 'description') class PowerOutletBulkEditForm( @@ -1008,7 +1005,7 @@ class PowerOutletBulkEditForm( ) class Meta: - nullable_fields = ['label', 'type', 'feed_leg', 'power_port', 'description'] + nullable_fields = ('label', 'type', 'feed_leg', 'power_port', 'description') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -1088,10 +1085,11 @@ class InterfaceBulkEditForm( ) class Meta: - nullable_fields = [ - 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'description', 'mode', 'rf_channel', - 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'vrf', - ] + nullable_fields = ( + 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'description', 'mode', + 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', + 'vrf', + ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -1157,7 +1155,7 @@ class FrontPortBulkEditForm( ) class Meta: - nullable_fields = ['label', 'description'] + nullable_fields = ('label', 'description') class RearPortBulkEditForm( @@ -1170,7 +1168,7 @@ class RearPortBulkEditForm( ) class Meta: - nullable_fields = ['label', 'description'] + nullable_fields = ('label', 'description') class ModuleBayBulkEditForm( @@ -1183,7 +1181,7 @@ class ModuleBayBulkEditForm( ) class Meta: - nullable_fields = ['label', 'position', 'description'] + nullable_fields = ('label', 'position', 'description') class DeviceBayBulkEditForm( @@ -1196,7 +1194,7 @@ class DeviceBayBulkEditForm( ) class Meta: - nullable_fields = ['label', 'description'] + nullable_fields = ('label', 'description') class InventoryItemBulkEditForm( @@ -1217,7 +1215,7 @@ class InventoryItemBulkEditForm( ) class Meta: - nullable_fields = ['label', 'role', 'manufacturer', 'part_id', 'description'] + nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description') # @@ -1238,4 +1236,4 @@ class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['color', 'description'] + nullable_fields = ('color', 'description') diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 56b51c89404..362592acea1 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -34,7 +34,7 @@ class CustomFieldBulkEditForm(BulkEditForm): ) class Meta: - nullable_fields = [] + nullable_fields = ('description',) class CustomLinkBulkEditForm(BulkEditForm): @@ -64,9 +64,6 @@ class CustomLinkBulkEditForm(BulkEditForm): widget=StaticSelect() ) - class Meta: - nullable_fields = [] - class ExportTemplateBulkEditForm(BulkEditForm): pk = forms.ModelMultipleChoiceField( @@ -96,7 +93,7 @@ class ExportTemplateBulkEditForm(BulkEditForm): ) class Meta: - nullable_fields = ['description', 'mime_type', 'file_extension'] + nullable_fields = ('description', 'mime_type', 'file_extension') class WebhookBulkEditForm(BulkEditForm): @@ -139,7 +136,7 @@ class WebhookBulkEditForm(BulkEditForm): ) class Meta: - nullable_fields = ['secret', 'conditions', 'ca_file_path'] + nullable_fields = ('secret', 'conditions', 'ca_file_path') class TagBulkEditForm(BulkEditForm): @@ -156,7 +153,7 @@ class TagBulkEditForm(BulkEditForm): ) class Meta: - nullable_fields = ['description'] + nullable_fields = ('description',) class ConfigContextBulkEditForm(BulkEditForm): @@ -178,9 +175,7 @@ class ConfigContextBulkEditForm(BulkEditForm): ) class Meta: - nullable_fields = [ - 'description', - ] + nullable_fields = ('description',) class JournalEntryBulkEditForm(BulkEditForm): @@ -196,6 +191,3 @@ class JournalEntryBulkEditForm(BulkEditForm): required=False, widget=forms.Textarea() ) - - class Meta: - nullable_fields = [] diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 3da03dd41ba..6370513188b 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -50,9 +50,9 @@ class VRFBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'tenant', 'description', - ] + ) class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): @@ -70,9 +70,9 @@ class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'tenant', 'description', - ] + ) class RIRBulkEditForm(NetBoxModelBulkEditForm): @@ -90,7 +90,7 @@ class RIRBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['is_private', 'description'] + nullable_fields = ('is_private', 'description') class ASNBulkEditForm(NetBoxModelBulkEditForm): @@ -117,9 +117,9 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'date_added', 'description', - ] + ) widgets = { 'date_added': DatePicker(), } @@ -148,9 +148,9 @@ class AggregateBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'date_added', 'description', - ] + ) widgets = { 'date_added': DatePicker(), } @@ -170,7 +170,7 @@ class RoleBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['description'] + nullable_fields = ('description',) class PrefixBulkEditForm(NetBoxModelBulkEditForm): @@ -233,9 +233,9 @@ class PrefixBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'site', 'vrf', 'tenant', 'role', 'description', - ] + ) class IPRangeBulkEditForm(NetBoxModelBulkEditForm): @@ -267,9 +267,9 @@ class IPRangeBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'vrf', 'tenant', 'role', 'description', - ] + ) class IPAddressBulkEditForm(NetBoxModelBulkEditForm): @@ -312,9 +312,9 @@ class IPAddressBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'vrf', 'role', 'tenant', 'dns_name', 'description', - ] + ) class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): @@ -349,7 +349,7 @@ class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['auth_type', 'auth_key', 'description'] + nullable_fields = ('auth_type', 'auth_key', 'description') class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): @@ -379,7 +379,7 @@ class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['site', 'description'] + nullable_fields = ('site', 'description') class VLANBulkEditForm(NetBoxModelBulkEditForm): @@ -429,9 +429,9 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'site', 'group', 'tenant', 'role', 'description', - ] + ) class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): @@ -457,9 +457,7 @@ class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ - 'description', - ] + nullable_fields = ('description',) class ServiceBulkEditForm(ServiceTemplateBulkEditForm): diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 601b0062a71..63582a2d9c1 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -5,7 +5,7 @@ from django.db.models import Q from extras.choices import CustomFieldFilterLogicChoices, CustomFieldTypeChoices from extras.forms.customfields import CustomFieldsMixin from extras.models import CustomField, Tag -from utilities.forms import BootstrapMixin, BulkEditBaseForm, CSVModelForm +from utilities.forms import BootstrapMixin, BulkEditMixin, CSVModelForm from utilities.forms.fields import DynamicModelMultipleChoiceField __all__ = ( @@ -55,7 +55,7 @@ class NetBoxModelCSVForm(CSVModelForm, NetBoxModelForm): return customfield.to_form_field(for_csv_import=True) -class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditBaseForm): +class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditMixin, forms.Form): """ Base form for modifying multiple NetBox objects (of the same type) in bulk via the UI. Adds support for custom fields and adding/removing tags. @@ -76,16 +76,21 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditBaseFor """ Append form fields for all CustomFields assigned to this object type. """ + nullable_custom_fields = [] for customfield in self._get_custom_fields(self._get_content_type()): - # Annotate non-required custom fields as nullable + # Record non-required custom fields as nullable if not customfield.required: - self.nullable_fields.append(customfield.name) + nullable_custom_fields.append(customfield.name) self.fields[customfield.name] = self._get_form_field(customfield) # Annotate the field in the list of CustomField form fields self.custom_fields[customfield.name] = customfield + # Annotate nullable custom fields (if any) on the form instance + if nullable_custom_fields: + self.custom_fields = (*self.custom_fields, *nullable_custom_fields) + class NetBoxModelFilterSetForm(BootstrapMixin, CustomFieldsMixin, forms.Form): """ diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py index 9b14a167b1d..f3cc2c33d08 100644 --- a/netbox/tenancy/forms/bulk_edit.py +++ b/netbox/tenancy/forms/bulk_edit.py @@ -32,7 +32,7 @@ class TenantGroupBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['parent', 'description'] + nullable_fields = ('parent', 'description') class TenantBulkEditForm(NetBoxModelBulkEditForm): @@ -46,9 +46,7 @@ class TenantBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ - 'group', - ] + nullable_fields = ('group',) # @@ -70,7 +68,7 @@ class ContactGroupBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['parent', 'description'] + nullable_fields = ('parent', 'description') class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): @@ -84,7 +82,7 @@ class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['description'] + nullable_fields = ('description',) class ContactBulkEditForm(NetBoxModelBulkEditForm): @@ -113,4 +111,4 @@ class ContactBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['group', 'title', 'phone', 'email', 'address', 'comments'] + nullable_fields = ('group', 'title', 'phone', 'email', 'address', 'comments') diff --git a/netbox/utilities/forms/forms.py b/netbox/utilities/forms/forms.py index 88f837b2b0d..d9a6c2b294b 100644 --- a/netbox/utilities/forms/forms.py +++ b/netbox/utilities/forms/forms.py @@ -10,7 +10,7 @@ from .widgets import APISelect, APISelectMultiple, ClearableFileInput, StaticSel __all__ = ( 'BootstrapMixin', 'BulkEditForm', - 'BulkEditBaseForm', + 'BulkEditMixin', 'BulkRenameForm', 'ConfirmationForm', 'CSVModelForm', @@ -21,6 +21,10 @@ __all__ = ( ) +# +# Mixins +# + class BootstrapMixin: """ Add the base Bootstrap CSS classes to form elements. @@ -61,6 +65,24 @@ class BootstrapMixin: field.widget.attrs['class'] = ' '.join((css, 'form-select')).strip() +class BulkEditMixin: + """ + Base form for editing multiple objects in bulk + """ + def __init__(self, model, *args, **kwargs): + super().__init__(*args, **kwargs) + self.model = model + self.nullable_fields = () + + # Copy any nullable fields defined in Meta + if hasattr(self, 'Meta') and hasattr(self.Meta, 'nullable_fields'): + self.nullable_fields = self.Meta.nullable_fields + + +# +# Form classes +# + class ReturnURLForm(forms.Form): """ Provides a hidden return URL field to control where the user is directed after the form is submitted. @@ -75,21 +97,7 @@ class ConfirmationForm(BootstrapMixin, ReturnURLForm): confirm = forms.BooleanField(required=True, widget=forms.HiddenInput(), initial=True) -class BulkEditBaseForm(forms.Form): - """ - Base form for editing multiple objects in bulk - """ - def __init__(self, model, *args, **kwargs): - super().__init__(*args, **kwargs) - self.model = model - self.nullable_fields = [] - - # Copy any nullable fields defined in Meta - if hasattr(self.Meta, 'nullable_fields'): - self.nullable_fields = self.Meta.nullable_fields - - -class BulkEditForm(BootstrapMixin, BulkEditBaseForm): +class BulkEditForm(BootstrapMixin, BulkEditMixin, forms.Form): pass diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 4232a87cd18..dd846029a8d 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -34,7 +34,7 @@ class ClusterTypeBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['description'] + nullable_fields = ('description',) class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): @@ -48,7 +48,7 @@ class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['description'] + nullable_fields = ('description',) class ClusterBulkEditForm(NetBoxModelBulkEditForm): @@ -90,9 +90,9 @@ class ClusterBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'group', 'site', 'comments', 'tenant', - ] + ) class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): @@ -145,9 +145,9 @@ class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', - ] + ) class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): @@ -198,9 +198,9 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = [ + nullable_fields = ( 'parent', 'bridge', 'mtu', 'description', - ] + ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/netbox/wireless/forms/bulk_edit.py b/netbox/wireless/forms/bulk_edit.py index 147108d779d..2d2a3ff1436 100644 --- a/netbox/wireless/forms/bulk_edit.py +++ b/netbox/wireless/forms/bulk_edit.py @@ -30,7 +30,7 @@ class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['parent', 'description'] + nullable_fields = ('parent', 'description') class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): @@ -69,7 +69,7 @@ class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['ssid', 'group', 'vlan', 'description', 'auth_type', 'auth_cipher', 'auth_psk'] + nullable_fields = ('ssid', 'group', 'vlan', 'description', 'auth_type', 'auth_cipher', 'auth_psk') class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): @@ -103,4 +103,4 @@ class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): ) class Meta: - nullable_fields = ['ssid', 'description', 'auth_type', 'auth_cipher', 'auth_psk'] + nullable_fields = ('ssid', 'description', 'auth_type', 'auth_cipher', 'auth_psk') From cf3ca5a661cc015baf4ef462be07e91c09db0ede Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 31 Jan 2022 14:10:13 -0500 Subject: [PATCH 131/271] Refactor & document supported form fields --- docs/plugins/development/forms.md | 68 +++ netbox/utilities/forms/fields.py | 526 ------------------ netbox/utilities/forms/fields/__init__.py | 5 + .../utilities/forms/fields/content_types.py | 37 ++ netbox/utilities/forms/fields/csv.py | 193 +++++++ netbox/utilities/forms/fields/dynamic.py | 141 +++++ netbox/utilities/forms/fields/expandable.py | 54 ++ netbox/utilities/forms/fields/fields.py | 127 +++++ 8 files changed, 625 insertions(+), 526 deletions(-) delete mode 100644 netbox/utilities/forms/fields.py create mode 100644 netbox/utilities/forms/fields/__init__.py create mode 100644 netbox/utilities/forms/fields/content_types.py create mode 100644 netbox/utilities/forms/fields/csv.py create mode 100644 netbox/utilities/forms/fields/dynamic.py create mode 100644 netbox/utilities/forms/fields/expandable.py create mode 100644 netbox/utilities/forms/fields/fields.py diff --git a/docs/plugins/development/forms.md b/docs/plugins/development/forms.md index 5af1781949e..c9c6cbde638 100644 --- a/docs/plugins/development/forms.md +++ b/docs/plugins/development/forms.md @@ -1,5 +1,7 @@ # Forms +## Form Classes + NetBox provides several base form classes for use by plugins. These are documented below. * `NetBoxModelForm` @@ -8,3 +10,69 @@ NetBox provides several base form classes for use by plugins. These are document * `NetBoxModelFilterSetForm` ### TODO: Include forms reference + +In addition to the [form fields provided by Django](https://docs.djangoproject.com/en/stable/ref/forms/fields/), NetBox provides several field classes for use within forms to handle specific types of data. These can be imported from `utilities.forms.fields` and are documented below. + +## General Purpose Fields + +::: utilities.forms.ColorField + selection: + members: false + +::: utilities.forms.CommentField + selection: + members: false + +::: utilities.forms.JSONField + selection: + members: false + +::: utilities.forms.MACAddressField + selection: + members: false + +::: utilities.forms.SlugField + selection: + members: false + +## Dynamic Object Fields + +::: utilities.forms.DynamicModelChoiceField + selection: + members: false + +::: utilities.forms.DynamicModelMultipleChoiceField + selection: + members: false + +## Content Type Fields + +::: utilities.forms.ContentTypeChoiceField + selection: + members: false + +::: utilities.forms.ContentTypeMultipleChoiceField + selection: + members: false + +## CSV Import Fields + +::: utilities.forms.CSVChoiceField + selection: + members: false + +::: utilities.forms.CSVMultipleChoiceField + selection: + members: false + +::: utilities.forms.CSVModelChoiceField + selection: + members: false + +::: utilities.forms.CSVContentTypeField + selection: + members: false + +::: utilities.forms.CSVMultipleContentTypeField + selection: + members: false diff --git a/netbox/utilities/forms/fields.py b/netbox/utilities/forms/fields.py deleted file mode 100644 index ceca895c0b9..00000000000 --- a/netbox/utilities/forms/fields.py +++ /dev/null @@ -1,526 +0,0 @@ -import csv -import json -import re -from io import StringIO -from netaddr import AddrFormatError, EUI - -import django_filters -from django import forms -from django.conf import settings -from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist -from django.db.models import Count, Q -from django.forms import BoundField -from django.forms.fields import JSONField as _JSONField, InvalidJSONInput -from django.urls import reverse - -from utilities.choices import unpack_grouped_choices -from utilities.utils import content_type_identifier, content_type_name -from utilities.validators import EnhancedURLValidator -from . import widgets -from .constants import * -from .utils import expand_alphanumeric_pattern, expand_ipaddress_pattern, parse_csv, validate_csv - -__all__ = ( - 'ColorField', - 'CommentField', - 'ContentTypeChoiceField', - 'ContentTypeMultipleChoiceField', - 'CSVChoiceField', - 'CSVContentTypeField', - 'CSVDataField', - 'CSVFileField', - 'CSVModelChoiceField', - 'CSVMultipleChoiceField', - 'CSVMultipleContentTypeField', - 'CSVTypedChoiceField', - 'DynamicModelChoiceField', - 'DynamicModelMultipleChoiceField', - 'ExpandableIPAddressField', - 'ExpandableNameField', - 'JSONField', - 'LaxURLField', - 'MACAddressField', - 'SlugField', - 'TagFilterField', -) - - -class CommentField(forms.CharField): - """ - A textarea with support for Markdown rendering. Exists mostly just to add a standard help_text. - """ - widget = forms.Textarea - default_label = '' - # TODO: Port Markdown cheat sheet to internal documentation - default_helptext = ' '\ - ''\ - 'Markdown syntax is supported' - - def __init__(self, *args, **kwargs): - required = kwargs.pop('required', False) - label = kwargs.pop('label', self.default_label) - help_text = kwargs.pop('help_text', self.default_helptext) - super().__init__(required=required, label=label, help_text=help_text, *args, **kwargs) - - -class SlugField(forms.SlugField): - """ - Extend the built-in SlugField to automatically populate from a field called `name` unless otherwise specified. - """ - - def __init__(self, slug_source='name', *args, **kwargs): - label = kwargs.pop('label', "Slug") - help_text = kwargs.pop('help_text', "URL-friendly unique shorthand") - widget = kwargs.pop('widget', widgets.SlugWidget) - super().__init__(label=label, help_text=help_text, widget=widget, *args, **kwargs) - self.widget.attrs['slug-source'] = slug_source - - -class ColorField(forms.CharField): - """ - A field which represents a color in hexadecimal RRGGBB format. - """ - widget = widgets.ColorSelect - - -class TagFilterField(forms.MultipleChoiceField): - """ - A filter field for the tags of a model. Only the tags used by a model are displayed. - - :param model: The model of the filter - """ - widget = widgets.StaticSelectMultiple - - def __init__(self, model, *args, **kwargs): - def get_choices(): - tags = model.tags.annotate( - count=Count('extras_taggeditem_items') - ).order_by('name') - return [ - (str(tag.slug), '{} ({})'.format(tag.name, tag.count)) for tag in tags - ] - - # Choices are fetched each time the form is initialized - super().__init__(label='Tags', choices=get_choices, required=False, *args, **kwargs) - - -class LaxURLField(forms.URLField): - """ - Modifies Django's built-in URLField to remove the requirement for fully-qualified domain names - (e.g. http://myserver/ is valid) - """ - default_validators = [EnhancedURLValidator()] - - -class JSONField(_JSONField): - """ - Custom wrapper around Django's built-in JSONField to avoid presenting "null" as the default text. - """ - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if not self.help_text: - self.help_text = 'Enter context data in JSON format.' - self.widget.attrs['placeholder'] = '' - - def prepare_value(self, value): - if isinstance(value, InvalidJSONInput): - return value - if value is None: - return '' - return json.dumps(value, sort_keys=True, indent=4) - - -class MACAddressField(forms.Field): - widget = forms.CharField - default_error_messages = { - 'invalid': 'MAC address must be in EUI-48 format', - } - - def to_python(self, value): - value = super().to_python(value) - - # Validate MAC address format - try: - value = EUI(value.strip()) - except AddrFormatError: - raise forms.ValidationError(self.error_messages['invalid'], code='invalid') - - return value - - -# -# Content type fields -# - -class ContentTypeChoiceMixin: - - def __init__(self, queryset, *args, **kwargs): - # Order ContentTypes by app_label - queryset = queryset.order_by('app_label', 'model') - super().__init__(queryset, *args, **kwargs) - - def label_from_instance(self, obj): - try: - return content_type_name(obj) - except AttributeError: - return super().label_from_instance(obj) - - -class ContentTypeChoiceField(ContentTypeChoiceMixin, forms.ModelChoiceField): - widget = widgets.StaticSelect - - -class ContentTypeMultipleChoiceField(ContentTypeChoiceMixin, forms.ModelMultipleChoiceField): - widget = widgets.StaticSelectMultiple - - -# -# CSV fields -# - -class CSVDataField(forms.CharField): - """ - A CharField (rendered as a Textarea) which accepts CSV-formatted data. It returns data as a two-tuple: The first - item is a dictionary of column headers, mapping field names to the attribute by which they match a related object - (where applicable). The second item is a list of dictionaries, each representing a discrete row of CSV data. - - :param from_form: The form from which the field derives its validation rules. - """ - widget = forms.Textarea - - def __init__(self, from_form, *args, **kwargs): - - form = from_form() - self.model = form.Meta.model - self.fields = form.fields - self.required_fields = [ - name for name, field in form.fields.items() if field.required - ] - - super().__init__(*args, **kwargs) - - self.strip = False - if not self.label: - self.label = '' - if not self.initial: - self.initial = ','.join(self.required_fields) + '\n' - if not self.help_text: - self.help_text = 'Enter the list of column headers followed by one line per record to be imported, using ' \ - 'commas to separate values. Multi-line data and values containing commas may be wrapped ' \ - 'in double quotes.' - - def to_python(self, value): - reader = csv.reader(StringIO(value.strip())) - - return parse_csv(reader) - - def validate(self, value): - headers, records = value - validate_csv(headers, self.fields, self.required_fields) - - return value - - -class CSVFileField(forms.FileField): - """ - A FileField (rendered as a file input button) which accepts a file containing CSV-formatted data. It returns - data as a two-tuple: The first item is a dictionary of column headers, mapping field names to the attribute - by which they match a related object (where applicable). The second item is a list of dictionaries, each - representing a discrete row of CSV data. - - :param from_form: The form from which the field derives its validation rules. - """ - - def __init__(self, from_form, *args, **kwargs): - - form = from_form() - self.model = form.Meta.model - self.fields = form.fields - self.required_fields = [ - name for name, field in form.fields.items() if field.required - ] - - super().__init__(*args, **kwargs) - - def to_python(self, file): - if file is None: - return None - - csv_str = file.read().decode('utf-8').strip() - reader = csv.reader(StringIO(csv_str)) - headers, records = parse_csv(reader) - - return headers, records - - def validate(self, value): - if value is None: - return None - - headers, records = value - validate_csv(headers, self.fields, self.required_fields) - - return value - - -class CSVChoicesMixin: - STATIC_CHOICES = True - - def __init__(self, *, choices=(), **kwargs): - super().__init__(choices=choices, **kwargs) - self.choices = unpack_grouped_choices(choices) - - -class CSVChoiceField(CSVChoicesMixin, forms.ChoiceField): - """ - A CSV field which accepts a single selection value. - """ - pass - - -class CSVMultipleChoiceField(CSVChoicesMixin, forms.MultipleChoiceField): - """ - A CSV field which accepts multiple selection values. - """ - def to_python(self, value): - if not value: - return [] - if not isinstance(value, str): - raise forms.ValidationError(f"Invalid value for a multiple choice field: {value}") - return value.split(',') - - -class CSVTypedChoiceField(forms.TypedChoiceField): - STATIC_CHOICES = True - - -class CSVModelChoiceField(forms.ModelChoiceField): - """ - Provides additional validation for model choices entered as CSV data. - """ - default_error_messages = { - 'invalid_choice': 'Object not found.', - } - - def to_python(self, value): - try: - return super().to_python(value) - except MultipleObjectsReturned: - raise forms.ValidationError( - f'"{value}" is not a unique value for this field; multiple objects were found' - ) - - -class CSVContentTypeField(CSVModelChoiceField): - """ - Reference a ContentType in the form . - """ - STATIC_CHOICES = True - - def prepare_value(self, value): - return content_type_identifier(value) - - def to_python(self, value): - if not value: - return None - try: - app_label, model = value.split('.') - except ValueError: - raise forms.ValidationError(f'Object type must be specified as "."') - try: - return self.queryset.get(app_label=app_label, model=model) - except ObjectDoesNotExist: - raise forms.ValidationError(f'Invalid object type') - - -class CSVMultipleContentTypeField(forms.ModelMultipleChoiceField): - STATIC_CHOICES = True - - # TODO: Improve validation of selected ContentTypes - def prepare_value(self, value): - if type(value) is str: - ct_filter = Q() - for name in value.split(','): - app_label, model = name.split('.') - ct_filter |= Q(app_label=app_label, model=model) - return list(ContentType.objects.filter(ct_filter).values_list('pk', flat=True)) - return content_type_identifier(value) - - -# -# Expansion fields -# - -class ExpandableNameField(forms.CharField): - """ - A field which allows for numeric range expansion - Example: 'Gi0/[1-3]' => ['Gi0/1', 'Gi0/2', 'Gi0/3'] - """ - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if not self.help_text: - self.help_text = """ - Alphanumeric ranges are supported for bulk creation. Mixed cases and types within a single range - are not supported. Example: [ge,xe]-0/0/[0-9] - """ - - def to_python(self, value): - if not value: - return '' - if re.search(ALPHANUMERIC_EXPANSION_PATTERN, value): - return list(expand_alphanumeric_pattern(value)) - return [value] - - -class ExpandableIPAddressField(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'] - """ - - 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' - - 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)) - elif ':' in value and re.search(IP6_EXPANSION_PATTERN, value): - return list(expand_ipaddress_pattern(value, 6)) - return [value] - - -# -# Dynamic fields -# - -class DynamicModelChoiceMixin: - """ - :param query_params: A dictionary of additional key/value pairs to attach to the API request - :param initial_params: A dictionary of child field references to use for selecting a parent field's initial value - :param null_option: The string used to represent a null selection (if any) - :param disabled_indicator: The name of the field which, if populated, will disable selection of the - choice (optional) - :param str fetch_trigger: The event type which will cause the select element to - fetch data from the API. Must be 'load', 'open', or 'collapse'. (optional) - """ - filter = django_filters.ModelChoiceFilter - widget = widgets.APISelect - - def __init__(self, query_params=None, initial_params=None, null_option=None, disabled_indicator=None, - fetch_trigger=None, empty_label=None, *args, **kwargs): - self.query_params = query_params or {} - self.initial_params = initial_params or {} - self.null_option = null_option - self.disabled_indicator = disabled_indicator - self.fetch_trigger = fetch_trigger - - # to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference - # by widget_attrs() - self.to_field_name = kwargs.get('to_field_name') - self.empty_option = empty_label or "" - - super().__init__(*args, **kwargs) - - def widget_attrs(self, widget): - attrs = { - 'data-empty-option': self.empty_option - } - - # Set value-field attribute if the field specifies to_field_name - if self.to_field_name: - attrs['value-field'] = self.to_field_name - - # Set the string used to represent a null option - if self.null_option is not None: - attrs['data-null-option'] = self.null_option - - # Set the disabled indicator, if any - if self.disabled_indicator is not None: - attrs['disabled-indicator'] = self.disabled_indicator - - # Set the fetch trigger, if any. - if self.fetch_trigger is not None: - attrs['data-fetch-trigger'] = self.fetch_trigger - - # Attach any static query parameters - if (len(self.query_params) > 0): - widget.add_query_params(self.query_params) - - return attrs - - def get_bound_field(self, form, field_name): - bound_field = BoundField(form, self, field_name) - - # Set initial value based on prescribed child fields (if not already set) - if not self.initial and self.initial_params: - filter_kwargs = {} - for kwarg, child_field in self.initial_params.items(): - value = form.initial.get(child_field.lstrip('$')) - if value: - filter_kwargs[kwarg] = value - if filter_kwargs: - self.initial = self.queryset.filter(**filter_kwargs).first() - - # Modify the QuerySet of the field before we return it. Limit choices to any data already bound: Options - # will be populated on-demand via the APISelect widget. - data = bound_field.value() - if data: - field_name = getattr(self, 'to_field_name') or 'pk' - filter = self.filter(field_name=field_name) - try: - self.queryset = filter.filter(self.queryset, data) - except (TypeError, ValueError): - # Catch any error caused by invalid initial data passed from the user - self.queryset = self.queryset.none() - else: - self.queryset = self.queryset.none() - - # Set the data URL on the APISelect widget (if not already set) - widget = bound_field.field.widget - if not widget.attrs.get('data-url'): - app_label = self.queryset.model._meta.app_label - model_name = self.queryset.model._meta.model_name - data_url = reverse('{}-api:{}-list'.format(app_label, model_name)) - widget.attrs['data-url'] = data_url - - return bound_field - - -class DynamicModelChoiceField(DynamicModelChoiceMixin, forms.ModelChoiceField): - """ - Override get_bound_field() to avoid pre-populating field choices with a SQL query. The field will be - rendered only with choices set via bound data. Choices are populated on-demand via the APISelect widget. - """ - - def clean(self, value): - """ - When null option is enabled and "None" is sent as part of a form to be submitted, it is sent as the - string 'null'. This will check for that condition and gracefully handle the conversion to a NoneType. - """ - if self.null_option is not None and value == settings.FILTERS_NULL_CHOICE_VALUE: - return None - return super().clean(value) - - -class DynamicModelMultipleChoiceField(DynamicModelChoiceMixin, forms.ModelMultipleChoiceField): - """ - A multiple-choice version of DynamicModelChoiceField. - """ - filter = django_filters.ModelMultipleChoiceFilter - widget = widgets.APISelectMultiple - - def clean(self, value): - """ - When null option is enabled and "None" is sent as part of a form to be submitted, it is sent as the - string 'null'. This will check for that condition and gracefully handle the conversion to a NoneType. - """ - if self.null_option is not None and settings.FILTERS_NULL_CHOICE_VALUE in value: - value = [v for v in value if v != settings.FILTERS_NULL_CHOICE_VALUE] - return [None, *value] - return super().clean(value) diff --git a/netbox/utilities/forms/fields/__init__.py b/netbox/utilities/forms/fields/__init__.py new file mode 100644 index 00000000000..eacde0040a9 --- /dev/null +++ b/netbox/utilities/forms/fields/__init__.py @@ -0,0 +1,5 @@ +from .content_types import * +from .csv import * +from .dynamic import * +from .expandable import * +from .fields import * diff --git a/netbox/utilities/forms/fields/content_types.py b/netbox/utilities/forms/fields/content_types.py new file mode 100644 index 00000000000..80861166c10 --- /dev/null +++ b/netbox/utilities/forms/fields/content_types.py @@ -0,0 +1,37 @@ +from django import forms + +from utilities.forms import widgets +from utilities.utils import content_type_name + +__all__ = ( + 'ContentTypeChoiceField', + 'ContentTypeMultipleChoiceField', +) + + +class ContentTypeChoiceMixin: + + def __init__(self, queryset, *args, **kwargs): + # Order ContentTypes by app_label + queryset = queryset.order_by('app_label', 'model') + super().__init__(queryset, *args, **kwargs) + + def label_from_instance(self, obj): + try: + return content_type_name(obj) + except AttributeError: + return super().label_from_instance(obj) + + +class ContentTypeChoiceField(ContentTypeChoiceMixin, forms.ModelChoiceField): + """ + Selection field for a single content type. + """ + widget = widgets.StaticSelect + + +class ContentTypeMultipleChoiceField(ContentTypeChoiceMixin, forms.ModelMultipleChoiceField): + """ + Selection field for one or more content types. + """ + widget = widgets.StaticSelectMultiple diff --git a/netbox/utilities/forms/fields/csv.py b/netbox/utilities/forms/fields/csv.py new file mode 100644 index 00000000000..275c8084cee --- /dev/null +++ b/netbox/utilities/forms/fields/csv.py @@ -0,0 +1,193 @@ +import csv +from io import StringIO + +from django import forms +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist +from django.db.models import Q + +from utilities.choices import unpack_grouped_choices +from utilities.forms.utils import parse_csv, validate_csv +from utilities.utils import content_type_identifier + +__all__ = ( + 'CSVChoiceField', + 'CSVContentTypeField', + 'CSVDataField', + 'CSVFileField', + 'CSVModelChoiceField', + 'CSVMultipleChoiceField', + 'CSVMultipleContentTypeField', + 'CSVTypedChoiceField', +) + + +class CSVDataField(forms.CharField): + """ + A CharField (rendered as a Textarea) which accepts CSV-formatted data. It returns data as a two-tuple: The first + item is a dictionary of column headers, mapping field names to the attribute by which they match a related object + (where applicable). The second item is a list of dictionaries, each representing a discrete row of CSV data. + + :param from_form: The form from which the field derives its validation rules. + """ + widget = forms.Textarea + + def __init__(self, from_form, *args, **kwargs): + + form = from_form() + self.model = form.Meta.model + self.fields = form.fields + self.required_fields = [ + name for name, field in form.fields.items() if field.required + ] + + super().__init__(*args, **kwargs) + + self.strip = False + if not self.label: + self.label = '' + if not self.initial: + self.initial = ','.join(self.required_fields) + '\n' + if not self.help_text: + self.help_text = 'Enter the list of column headers followed by one line per record to be imported, using ' \ + 'commas to separate values. Multi-line data and values containing commas may be wrapped ' \ + 'in double quotes.' + + def to_python(self, value): + reader = csv.reader(StringIO(value.strip())) + + return parse_csv(reader) + + def validate(self, value): + headers, records = value + validate_csv(headers, self.fields, self.required_fields) + + return value + + +class CSVFileField(forms.FileField): + """ + A FileField (rendered as a file input button) which accepts a file containing CSV-formatted data. It returns + data as a two-tuple: The first item is a dictionary of column headers, mapping field names to the attribute + by which they match a related object (where applicable). The second item is a list of dictionaries, each + representing a discrete row of CSV data. + + :param from_form: The form from which the field derives its validation rules. + """ + + def __init__(self, from_form, *args, **kwargs): + + form = from_form() + self.model = form.Meta.model + self.fields = form.fields + self.required_fields = [ + name for name, field in form.fields.items() if field.required + ] + + super().__init__(*args, **kwargs) + + def to_python(self, file): + if file is None: + return None + + csv_str = file.read().decode('utf-8').strip() + reader = csv.reader(StringIO(csv_str)) + headers, records = parse_csv(reader) + + return headers, records + + def validate(self, value): + if value is None: + return None + + headers, records = value + validate_csv(headers, self.fields, self.required_fields) + + return value + + +class CSVChoicesMixin: + STATIC_CHOICES = True + + def __init__(self, *, choices=(), **kwargs): + super().__init__(choices=choices, **kwargs) + self.choices = unpack_grouped_choices(choices) + + +class CSVChoiceField(CSVChoicesMixin, forms.ChoiceField): + """ + A CSV field which accepts a single selection value. + """ + pass + + +class CSVMultipleChoiceField(CSVChoicesMixin, forms.MultipleChoiceField): + """ + A CSV field which accepts multiple selection values. + """ + def to_python(self, value): + if not value: + return [] + if not isinstance(value, str): + raise forms.ValidationError(f"Invalid value for a multiple choice field: {value}") + return value.split(',') + + +class CSVTypedChoiceField(forms.TypedChoiceField): + STATIC_CHOICES = True + + +class CSVModelChoiceField(forms.ModelChoiceField): + """ + Extends Django's `ModelChoiceField` to provide additional validation for CSV values. + """ + default_error_messages = { + 'invalid_choice': 'Object not found.', + } + + def to_python(self, value): + try: + return super().to_python(value) + except MultipleObjectsReturned: + raise forms.ValidationError( + f'"{value}" is not a unique value for this field; multiple objects were found' + ) + + +class CSVContentTypeField(CSVModelChoiceField): + """ + CSV field for referencing a single content type, in the form `.`. + """ + STATIC_CHOICES = True + + def prepare_value(self, value): + return content_type_identifier(value) + + def to_python(self, value): + if not value: + return None + try: + app_label, model = value.split('.') + except ValueError: + raise forms.ValidationError(f'Object type must be specified as "."') + try: + return self.queryset.get(app_label=app_label, model=model) + except ObjectDoesNotExist: + raise forms.ValidationError(f'Invalid object type') + + +class CSVMultipleContentTypeField(forms.ModelMultipleChoiceField): + """ + CSV field for referencing one or more content types, in the form `.`. + """ + STATIC_CHOICES = True + + # TODO: Improve validation of selected ContentTypes + def prepare_value(self, value): + if type(value) is str: + ct_filter = Q() + for name in value.split(','): + app_label, model = name.split('.') + ct_filter |= Q(app_label=app_label, model=model) + return list(ContentType.objects.filter(ct_filter).values_list('pk', flat=True)) + return content_type_identifier(value) diff --git a/netbox/utilities/forms/fields/dynamic.py b/netbox/utilities/forms/fields/dynamic.py new file mode 100644 index 00000000000..1bc8b9ec4a0 --- /dev/null +++ b/netbox/utilities/forms/fields/dynamic.py @@ -0,0 +1,141 @@ +import django_filters +from django import forms +from django.conf import settings +from django.forms import BoundField +from django.urls import reverse + +from utilities.forms import widgets + +__all__ = ( + 'DynamicModelChoiceField', + 'DynamicModelMultipleChoiceField', +) + + +class DynamicModelChoiceMixin: + """ + Override `get_bound_field()` to avoid pre-populating field choices with a SQL query. The field will be + rendered only with choices set via bound data. Choices are populated on-demand via the APISelect widget. + + Attributes: + query_params: A dictionary of additional key/value pairs to attach to the API request + initial_params: A dictionary of child field references to use for selecting a parent field's initial value + null_option: The string used to represent a null selection (if any) + disabled_indicator: The name of the field which, if populated, will disable selection of the + choice (optional) + fetch_trigger: The event type which will cause the select element to + fetch data from the API. Must be 'load', 'open', or 'collapse'. (optional) + """ + filter = django_filters.ModelChoiceFilter + widget = widgets.APISelect + + def __init__(self, query_params=None, initial_params=None, null_option=None, disabled_indicator=None, + fetch_trigger=None, empty_label=None, *args, **kwargs): + self.query_params = query_params or {} + self.initial_params = initial_params or {} + self.null_option = null_option + self.disabled_indicator = disabled_indicator + self.fetch_trigger = fetch_trigger + + # to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference + # by widget_attrs() + self.to_field_name = kwargs.get('to_field_name') + self.empty_option = empty_label or "" + + super().__init__(*args, **kwargs) + + def widget_attrs(self, widget): + attrs = { + 'data-empty-option': self.empty_option + } + + # Set value-field attribute if the field specifies to_field_name + if self.to_field_name: + attrs['value-field'] = self.to_field_name + + # Set the string used to represent a null option + if self.null_option is not None: + attrs['data-null-option'] = self.null_option + + # Set the disabled indicator, if any + if self.disabled_indicator is not None: + attrs['disabled-indicator'] = self.disabled_indicator + + # Set the fetch trigger, if any. + if self.fetch_trigger is not None: + attrs['data-fetch-trigger'] = self.fetch_trigger + + # Attach any static query parameters + if (len(self.query_params) > 0): + widget.add_query_params(self.query_params) + + return attrs + + def get_bound_field(self, form, field_name): + bound_field = BoundField(form, self, field_name) + + # Set initial value based on prescribed child fields (if not already set) + if not self.initial and self.initial_params: + filter_kwargs = {} + for kwarg, child_field in self.initial_params.items(): + value = form.initial.get(child_field.lstrip('$')) + if value: + filter_kwargs[kwarg] = value + if filter_kwargs: + self.initial = self.queryset.filter(**filter_kwargs).first() + + # Modify the QuerySet of the field before we return it. Limit choices to any data already bound: Options + # will be populated on-demand via the APISelect widget. + data = bound_field.value() + if data: + field_name = getattr(self, 'to_field_name') or 'pk' + filter = self.filter(field_name=field_name) + try: + self.queryset = filter.filter(self.queryset, data) + except (TypeError, ValueError): + # Catch any error caused by invalid initial data passed from the user + self.queryset = self.queryset.none() + else: + self.queryset = self.queryset.none() + + # Set the data URL on the APISelect widget (if not already set) + widget = bound_field.field.widget + if not widget.attrs.get('data-url'): + app_label = self.queryset.model._meta.app_label + model_name = self.queryset.model._meta.model_name + data_url = reverse('{}-api:{}-list'.format(app_label, model_name)) + widget.attrs['data-url'] = data_url + + return bound_field + + +class DynamicModelChoiceField(DynamicModelChoiceMixin, forms.ModelChoiceField): + """ + Dynamic selection field for a single object, backed by NetBox's REST API. + """ + def clean(self, value): + """ + When null option is enabled and "None" is sent as part of a form to be submitted, it is sent as the + string 'null'. This will check for that condition and gracefully handle the conversion to a NoneType. + """ + if self.null_option is not None and value == settings.FILTERS_NULL_CHOICE_VALUE: + return None + return super().clean(value) + + +class DynamicModelMultipleChoiceField(DynamicModelChoiceMixin, forms.ModelMultipleChoiceField): + """ + A multiple-choice version of `DynamicModelChoiceField`. + """ + filter = django_filters.ModelMultipleChoiceFilter + widget = widgets.APISelectMultiple + + def clean(self, value): + """ + When null option is enabled and "None" is sent as part of a form to be submitted, it is sent as the + string 'null'. This will check for that condition and gracefully handle the conversion to a NoneType. + """ + if self.null_option is not None and settings.FILTERS_NULL_CHOICE_VALUE in value: + value = [v for v in value if v != settings.FILTERS_NULL_CHOICE_VALUE] + return [None, *value] + return super().clean(value) diff --git a/netbox/utilities/forms/fields/expandable.py b/netbox/utilities/forms/fields/expandable.py new file mode 100644 index 00000000000..214775f03a9 --- /dev/null +++ b/netbox/utilities/forms/fields/expandable.py @@ -0,0 +1,54 @@ +import re + +from django import forms + +from utilities.forms.constants import * +from utilities.forms.utils import expand_alphanumeric_pattern, expand_ipaddress_pattern + +__all__ = ( + 'ExpandableIPAddressField', + 'ExpandableNameField', +) + + +class ExpandableNameField(forms.CharField): + """ + A field which allows for numeric range expansion + Example: 'Gi0/[1-3]' => ['Gi0/1', 'Gi0/2', 'Gi0/3'] + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if not self.help_text: + self.help_text = """ + Alphanumeric ranges are supported for bulk creation. Mixed cases and types within a single range + are not supported. Example: [ge,xe]-0/0/[0-9] + """ + + def to_python(self, value): + if not value: + return '' + if re.search(ALPHANUMERIC_EXPANSION_PATTERN, value): + return list(expand_alphanumeric_pattern(value)) + return [value] + + +class ExpandableIPAddressField(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'] + """ + + 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' + + 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)) + elif ':' in value and re.search(IP6_EXPANSION_PATTERN, value): + return list(expand_ipaddress_pattern(value, 6)) + return [value] diff --git a/netbox/utilities/forms/fields/fields.py b/netbox/utilities/forms/fields/fields.py new file mode 100644 index 00000000000..c2357a6e88b --- /dev/null +++ b/netbox/utilities/forms/fields/fields.py @@ -0,0 +1,127 @@ +import json + +from django import forms +from django.db.models import Count +from django.forms.fields import JSONField as _JSONField, InvalidJSONInput +from netaddr import AddrFormatError, EUI + +from utilities.forms import widgets +from utilities.validators import EnhancedURLValidator + +__all__ = ( + 'ColorField', + 'CommentField', + 'JSONField', + 'LaxURLField', + 'MACAddressField', + 'SlugField', + 'TagFilterField', +) + + +class CommentField(forms.CharField): + """ + A textarea with support for Markdown rendering. Exists mostly just to add a standard `help_text`. + """ + widget = forms.Textarea + # TODO: Port Markdown cheat sheet to internal documentation + help_text = """ + + + Markdown syntax is supported + """ + + def __init__(self, *, help_text=help_text, required=False, **kwargs): + super().__init__(help_text=help_text, required=required, **kwargs) + + +class SlugField(forms.SlugField): + """ + Extend Django's built-in SlugField to automatically populate from a field called `name` unless otherwise specified. + + Parameters: + slug_source: Name of the form field from which the slug value will be derived + """ + widget = widgets.SlugWidget + help_text = "URL-friendly unique shorthand" + + def __init__(self, *, slug_source='name', help_text=help_text, **kwargs): + super().__init__(help_text=help_text, **kwargs) + + self.widget.attrs['slug-source'] = slug_source + + +class ColorField(forms.CharField): + """ + A field which represents a color value in hexadecimal `RRGGBB` format. Utilizes NetBox's `ColorSelect` widget to + render choices. + """ + widget = widgets.ColorSelect + + +class TagFilterField(forms.MultipleChoiceField): + """ + A filter field for the tags of a model. Only the tags used by a model are displayed. + + :param model: The model of the filter + """ + widget = widgets.StaticSelectMultiple + + def __init__(self, model, *args, **kwargs): + def get_choices(): + tags = model.tags.annotate( + count=Count('extras_taggeditem_items') + ).order_by('name') + return [ + (str(tag.slug), '{} ({})'.format(tag.name, tag.count)) for tag in tags + ] + + # Choices are fetched each time the form is initialized + super().__init__(label='Tags', choices=get_choices, required=False, *args, **kwargs) + + +class LaxURLField(forms.URLField): + """ + Modifies Django's built-in URLField to remove the requirement for fully-qualified domain names + (e.g. http://myserver/ is valid) + """ + default_validators = [EnhancedURLValidator()] + + +class JSONField(_JSONField): + """ + Custom wrapper around Django's built-in JSONField to avoid presenting "null" as the default text. + """ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if not self.help_text: + self.help_text = 'Enter context data in JSON format.' + self.widget.attrs['placeholder'] = '' + + def prepare_value(self, value): + if isinstance(value, InvalidJSONInput): + return value + if value is None: + return '' + return json.dumps(value, sort_keys=True, indent=4) + + +class MACAddressField(forms.Field): + """ + Validates a 48-bit MAC address. + """ + widget = forms.CharField + default_error_messages = { + 'invalid': 'MAC address must be in EUI-48 format', + } + + def to_python(self, value): + value = super().to_python(value) + + # Validate MAC address format + try: + value = EUI(value.strip()) + except AddrFormatError: + raise forms.ValidationError(self.error_messages['invalid'], code='invalid') + + return value From ccb3a7528114b9c42f59e579687585218522828e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 31 Jan 2022 15:52:36 -0500 Subject: [PATCH 132/271] Move fieldsets out of Meta for model forms --- netbox/circuits/forms/models.py | 25 ++--- netbox/dcim/forms/models.py | 114 ++++++++++++---------- netbox/extras/forms/models.py | 61 ++++++------ netbox/ipam/forms/models.py | 80 ++++++++------- netbox/netbox/forms/base.py | 6 ++ netbox/templates/generic/object_edit.html | 4 +- netbox/templates/users/preferences.html | 2 +- netbox/tenancy/forms/models.py | 14 +-- netbox/users/forms.py | 20 ++-- netbox/virtualization/forms/models.py | 26 ++--- netbox/wireless/forms/models.py | 24 ++--- 11 files changed, 206 insertions(+), 170 deletions(-) diff --git a/netbox/circuits/forms/models.py b/netbox/circuits/forms/models.py index bf5d92e8532..2246573ba64 100644 --- a/netbox/circuits/forms/models.py +++ b/netbox/circuits/forms/models.py @@ -27,15 +27,16 @@ class ProviderForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Provider', ('name', 'slug', 'asn', 'tags')), + ('Support Info', ('account', 'portal_url', 'noc_contact', 'admin_contact')), + ) + class Meta: model = Provider fields = [ 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', 'tags', ] - fieldsets = ( - ('Provider', ('name', 'slug', 'asn', 'tags')), - ('Support Info', ('account', 'portal_url', 'noc_contact', 'admin_contact')), - ) widgets = { 'noc_contact': SmallTextarea( attrs={'rows': 5} @@ -63,14 +64,15 @@ class ProviderNetworkForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Provider Network', ('provider', 'name', 'service_id', 'description', 'tags')), + ) + class Meta: model = ProviderNetwork fields = [ 'provider', 'name', 'service_id', 'description', 'comments', 'tags', ] - fieldsets = ( - ('Provider Network', ('provider', 'name', 'service_id', 'description', 'tags')), - ) class CircuitTypeForm(NetBoxModelForm): @@ -100,16 +102,17 @@ class CircuitForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Circuit', ('provider', 'cid', 'type', 'status', 'install_date', 'commit_rate', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = Circuit fields = [ 'cid', 'type', 'provider', 'status', 'install_date', 'commit_rate', 'description', 'tenant_group', 'tenant', 'comments', 'tags', ] - fieldsets = ( - ('Circuit', ('provider', 'cid', 'type', 'status', 'install_date', 'commit_rate', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) help_texts = { 'cid': "Unique circuit ID", 'commit_rate': "Committed rate", diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 80e78594070..92f74036a4b 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -134,19 +134,20 @@ class SiteForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Site', ( + 'name', 'slug', 'status', 'region', 'group', 'facility', 'asns', 'time_zone', 'description', 'tags', + )), + ('Tenancy', ('tenant_group', 'tenant')), + ('Contact Info', ('physical_address', 'shipping_address', 'latitude', 'longitude')), + ) + class Meta: model = Site fields = ( 'name', 'slug', 'status', 'region', 'group', 'tenant_group', 'tenant', 'facility', 'asns', 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', 'tags', ) - fieldsets = ( - ('Site', ( - 'name', 'slug', 'status', 'region', 'group', 'facility', 'asns', 'time_zone', 'description', 'tags', - )), - ('Tenancy', ('tenant_group', 'tenant')), - ('Contact Info', ('physical_address', 'shipping_address', 'latitude', 'longitude')), - ) widgets = { 'physical_address': SmallTextarea( attrs={ @@ -208,17 +209,18 @@ class LocationForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Location', ( + 'region', 'site_group', 'site', 'parent', 'name', 'slug', 'description', 'tags', + )), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = Location fields = ( 'region', 'site_group', 'site', 'parent', 'name', 'slug', 'description', 'tenant_group', 'tenant', 'tags', ) - fieldsets = ( - ('Location', ( - 'region', 'site_group', 'site', 'parent', 'name', 'slug', 'description', 'tags', - )), - ('Tenancy', ('tenant_group', 'tenant')), - ) class RackRoleForm(NetBoxModelForm): @@ -347,16 +349,17 @@ class RackReservationForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Reservation', ('region', 'site', 'location', 'rack', 'units', 'user', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = RackReservation fields = [ 'region', 'site_group', 'site', 'location', 'rack', 'units', 'user', 'tenant_group', 'tenant', 'description', 'tags', ] - fieldsets = ( - ('Reservation', ('region', 'site', 'location', 'rack', 'units', 'user', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) class ManufacturerForm(NetBoxModelForm): @@ -386,21 +389,22 @@ class DeviceTypeForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Device Type', ( + 'manufacturer', 'model', 'slug', 'part_number', 'tags', + )), + ('Chassis', ( + 'u_height', 'is_full_depth', 'subdevice_role', 'airflow', + )), + ('Images', ('front_image', 'rear_image')), + ) + class Meta: model = DeviceType fields = [ 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', 'airflow', 'front_image', 'rear_image', 'comments', 'tags', ] - fieldsets = ( - ('Device Type', ( - 'manufacturer', 'model', 'slug', 'part_number', 'tags', - )), - ('Chassis', ( - 'u_height', 'is_full_depth', 'subdevice_role', 'airflow', - )), - ('Images', ('front_image', 'rear_image')), - ) widgets = { 'subdevice_role': StaticSelect(), 'front_image': ClearableFileInput(attrs={ @@ -745,14 +749,15 @@ class PowerPanelForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Power Panel', ('region', 'site_group', 'site', 'location', 'name', 'tags')), + ) + class Meta: model = PowerPanel fields = [ 'region', 'site_group', 'site', 'location', 'name', 'tags', ] - fieldsets = ( - ('Power Panel', ('region', 'site_group', 'site', 'location', 'name', 'tags')), - ) class PowerFeedForm(NetBoxModelForm): @@ -800,17 +805,18 @@ class PowerFeedForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Power Panel', ('region', 'site', 'power_panel')), + ('Power Feed', ('rack', 'name', 'status', 'type', 'mark_connected', 'tags')), + ('Characteristics', ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')), + ) + class Meta: model = PowerFeed fields = [ 'region', 'site_group', 'site', 'power_panel', 'rack', 'name', 'status', 'type', 'mark_connected', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization', 'comments', 'tags', ] - fieldsets = ( - ('Power Panel', ('region', 'site', 'power_panel')), - ('Power Feed', ('rack', 'name', 'status', 'type', 'mark_connected', 'tags')), - ('Characteristics', ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')), - ) widgets = { 'status': StaticSelect(), 'type': StaticSelect(), @@ -1101,16 +1107,17 @@ class InventoryItemTemplateForm(BootstrapMixin, forms.ModelForm): widget=forms.HiddenInput ) + fieldsets = ( + ('Inventory Item', ('device_type', 'parent', 'name', 'label', 'role', 'description')), + ('Hardware', ('manufacturer', 'part_id')), + ) + class Meta: model = InventoryItemTemplate fields = [ 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'description', 'component_type', 'component_id', ] - fieldsets = ( - ('Inventory Item', ('device_type', 'parent', 'name', 'label', 'role', 'description')), - ('Hardware', ('manufacturer', 'part_id')), - ) widgets = { 'device_type': forms.HiddenInput(), } @@ -1271,6 +1278,17 @@ class InterfaceForm(InterfaceCommonForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Interface', ('device', 'name', 'type', 'speed', 'duplex', 'label', 'description', 'tags')), + ('Addressing', ('vrf', 'mac_address', 'wwn')), + ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), + ('Related Interfaces', ('parent', 'bridge', 'lag')), + ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')), + ('Wireless', ( + 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'wireless_lan_group', 'wireless_lans', + )), + ) + class Meta: model = Interface fields = [ @@ -1278,17 +1296,6 @@ class InterfaceForm(InterfaceCommonForm, NetBoxModelForm): 'mgmt_only', 'mark_connected', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'wireless_lans', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', ] - fieldsets = ( - ('Interface', ('device', 'name', 'type', 'speed', 'duplex', 'label', 'description', 'tags')), - ('Addressing', ('vrf', 'mac_address', 'wwn')), - ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), - ('Related Interfaces', ('parent', 'bridge', 'lag')), - ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')), - ('Wireless', ( - 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'wireless_lan_group', - 'wireless_lans', - )), - ) widgets = { 'device': forms.HiddenInput(), 'type': StaticSelect(), @@ -1432,16 +1439,17 @@ class InventoryItemForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Inventory Item', ('device', 'parent', 'name', 'label', 'role', 'description', 'tags')), + ('Hardware', ('manufacturer', 'part_id', 'serial', 'asset_tag')), + ) + class Meta: model = InventoryItem fields = [ 'device', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'component_type', 'component_id', 'tags', ] - fieldsets = ( - ('Inventory Item', ('device', 'parent', 'name', 'label', 'role', 'description', 'tags')), - ('Hardware', ('manufacturer', 'part_id', 'serial', 'asset_tag')), - ) widgets = { 'device': forms.HiddenInput(), } diff --git a/netbox/extras/forms/models.py b/netbox/extras/forms/models.py index 5c29a83816c..c391665b36e 100644 --- a/netbox/extras/forms/models.py +++ b/netbox/extras/forms/models.py @@ -30,16 +30,17 @@ class CustomFieldForm(BootstrapMixin, forms.ModelForm): limit_choices_to=FeatureQuery('custom_fields') ) + fieldsets = ( + ('Custom Field', ('name', 'label', 'type', 'object_type', 'weight', 'required', 'description')), + ('Assigned Models', ('content_types',)), + ('Behavior', ('filter_logic',)), + ('Values', ('default', 'choices')), + ('Validation', ('validation_minimum', 'validation_maximum', 'validation_regex')), + ) + class Meta: model = CustomField fields = '__all__' - fieldsets = ( - ('Custom Field', ('name', 'label', 'type', 'object_type', 'weight', 'required', 'description')), - ('Assigned Models', ('content_types',)), - ('Behavior', ('filter_logic',)), - ('Values', ('default', 'choices')), - ('Validation', ('validation_minimum', 'validation_maximum', 'validation_regex')), - ) widgets = { 'type': StaticSelect(), 'filter_logic': StaticSelect(), @@ -52,13 +53,14 @@ class CustomLinkForm(BootstrapMixin, forms.ModelForm): limit_choices_to=FeatureQuery('custom_links') ) + fieldsets = ( + ('Custom Link', ('name', 'content_type', 'weight', 'group_name', 'button_class', 'enabled', 'new_window')), + ('Templates', ('link_text', 'link_url')), + ) + class Meta: model = CustomLink fields = '__all__' - fieldsets = ( - ('Custom Link', ('name', 'content_type', 'weight', 'group_name', 'button_class', 'enabled', 'new_window')), - ('Templates', ('link_text', 'link_url')), - ) widgets = { 'button_class': StaticSelect(), 'link_text': forms.Textarea(attrs={'class': 'font-monospace'}), @@ -77,14 +79,15 @@ class ExportTemplateForm(BootstrapMixin, forms.ModelForm): limit_choices_to=FeatureQuery('export_templates') ) + fieldsets = ( + ('Export Template', ('name', 'content_type', 'description')), + ('Template', ('template_code',)), + ('Rendering', ('mime_type', 'file_extension', 'as_attachment')), + ) + class Meta: model = ExportTemplate fields = '__all__' - fieldsets = ( - ('Export Template', ('name', 'content_type', 'description')), - ('Template', ('template_code',)), - ('Rendering', ('mime_type', 'file_extension', 'as_attachment')), - ) widgets = { 'template_code': forms.Textarea(attrs={'class': 'font-monospace'}), } @@ -96,18 +99,19 @@ class WebhookForm(BootstrapMixin, forms.ModelForm): limit_choices_to=FeatureQuery('webhooks') ) + fieldsets = ( + ('Webhook', ('name', 'content_types', 'enabled')), + ('Events', ('type_create', 'type_update', 'type_delete')), + ('HTTP Request', ( + 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', + )), + ('Conditions', ('conditions',)), + ('SSL', ('ssl_verification', 'ca_file_path')), + ) + class Meta: model = Webhook fields = '__all__' - fieldsets = ( - ('Webhook', ('name', 'content_types', 'enabled')), - ('Events', ('type_create', 'type_update', 'type_delete')), - ('HTTP Request', ( - 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', - )), - ('Conditions', ('conditions',)), - ('SSL', ('ssl_verification', 'ca_file_path')), - ) labels = { 'type_create': 'Creations', 'type_update': 'Updates', @@ -123,14 +127,15 @@ class WebhookForm(BootstrapMixin, forms.ModelForm): class TagForm(BootstrapMixin, forms.ModelForm): slug = SlugField() + fieldsets = ( + ('Tag', ('name', 'slug', 'color', 'description')), + ) + class Meta: model = Tag fields = [ 'name', 'slug', 'color', 'description' ] - fieldsets = ( - ('Tag', ('name', 'slug', 'color', 'description')), - ) class ConfigContextForm(BootstrapMixin, forms.ModelForm): diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py index e86fe1dab33..68016a0e54c 100644 --- a/netbox/ipam/forms/models.py +++ b/netbox/ipam/forms/models.py @@ -53,17 +53,18 @@ class VRFForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('VRF', ('name', 'rd', 'enforce_unique', 'description', 'tags')), + ('Route Targets', ('import_targets', 'export_targets')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = VRF fields = [ 'name', 'rd', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tenant_group', 'tenant', 'tags', ] - fieldsets = ( - ('VRF', ('name', 'rd', 'enforce_unique', 'description', 'tags')), - ('Route Targets', ('import_targets', 'export_targets')), - ('Tenancy', ('tenant_group', 'tenant')), - ) labels = { 'rd': "RD", } @@ -78,15 +79,16 @@ class RouteTargetForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Route Target', ('name', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = RouteTarget fields = [ 'name', 'description', 'tenant_group', 'tenant', 'tags', ] - fieldsets = ( - ('Route Target', ('name', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) class RIRForm(NetBoxModelForm): @@ -113,15 +115,16 @@ class AggregateForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Aggregate', ('prefix', 'rir', 'date_added', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = Aggregate fields = [ 'prefix', 'rir', 'date_added', 'description', 'tenant_group', 'tenant', 'tags', ] - fieldsets = ( - ('Aggregate', ('prefix', 'rir', 'date_added', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) help_texts = { 'prefix': "IPv4 or IPv6 network", 'rir': "Regional Internet Registry responsible for this prefix", @@ -146,15 +149,16 @@ class ASNForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('ASN', ('asn', 'rir', 'sites', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = ASN fields = [ 'asn', 'rir', 'sites', 'tenant_group', 'tenant', 'description', 'tags' ] - fieldsets = ( - ('ASN', ('asn', 'rir', 'sites', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) help_texts = { 'asn': "AS number", 'rir': "Regional Internet Registry responsible for this prefix", @@ -248,17 +252,18 @@ class PrefixForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Prefix', ('prefix', 'status', 'vrf', 'role', 'is_pool', 'mark_utilized', 'description', 'tags')), + ('Site/VLAN Assignment', ('region', 'site_group', 'site', 'vlan_group', 'vlan')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = Prefix fields = [ 'prefix', 'vrf', 'site', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', 'description', 'tenant_group', 'tenant', 'tags', ] - fieldsets = ( - ('Prefix', ('prefix', 'status', 'vrf', 'role', 'is_pool', 'mark_utilized', 'description', 'tags')), - ('Site/VLAN Assignment', ('region', 'site_group', 'site', 'vlan_group', 'vlan')), - ('Tenancy', ('tenant_group', 'tenant')), - ) widgets = { 'status': StaticSelect(), } @@ -279,15 +284,16 @@ class IPRangeForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('IP Range', ('vrf', 'start_address', 'end_address', 'role', 'status', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = IPRange fields = [ 'vrf', 'start_address', 'end_address', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags', ] - fieldsets = ( - ('IP Range', ('vrf', 'start_address', 'end_address', 'role', 'status', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) widgets = { 'status': StaticSelect(), } @@ -562,16 +568,17 @@ class FHRPGroupForm(NetBoxModelForm): label='Status' ) + fieldsets = ( + ('FHRP Group', ('protocol', 'group_id', 'description', 'tags')), + ('Authentication', ('auth_type', 'auth_key')), + ('Virtual IP Address', ('ip_vrf', 'ip_address', 'ip_status')) + ) + class Meta: model = FHRPGroup fields = ( 'protocol', 'group_id', 'auth_type', 'auth_key', 'description', 'ip_vrf', 'ip_address', 'ip_status', 'tags', ) - fieldsets = ( - ('FHRP Group', ('protocol', 'group_id', 'description', 'tags')), - ('Authentication', ('auth_type', 'auth_key')), - ('Virtual IP Address', ('ip_vrf', 'ip_address', 'ip_status')) - ) def save(self, *args, **kwargs): instance = super().save(*args, **kwargs) @@ -699,17 +706,18 @@ class VLANGroupForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('VLAN Group', ('name', 'slug', 'description', 'tags')), + ('Child VLANs', ('min_vid', 'max_vid')), + ('Scope', ('scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster')), + ) + class Meta: model = VLANGroup fields = [ 'name', 'slug', 'description', 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster', 'min_vid', 'max_vid', 'tags', ] - fieldsets = ( - ('VLAN Group', ('name', 'slug', 'description', 'tags')), - ('Child VLANs', ('min_vid', 'max_vid')), - ('Scope', ('scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster')), - ) widgets = { 'scope_type': StaticSelect, } diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 63582a2d9c1..3fa85f1f758 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -19,7 +19,13 @@ __all__ = ( class NetBoxModelForm(BootstrapMixin, CustomFieldsMixin, forms.ModelForm): """ Base form for creating & editing NetBox models. Adds support for custom fields. + + Attributes: + fieldsets: An iterable of two-tuples which define a heading and field set to display per section of + the rendered form (optional). If not defined, the all fields will be rendered as a single section. """ + fieldsets = () + def _get_content_type(self): return ContentType.objects.get_for_model(self._meta.model) diff --git a/netbox/templates/generic/object_edit.html b/netbox/templates/generic/object_edit.html index 5dc8f995d85..fbf7fd39475 100644 --- a/netbox/templates/generic/object_edit.html +++ b/netbox/templates/generic/object_edit.html @@ -33,7 +33,7 @@ {% csrf_token %} {% block form %} - {% if form.Meta.fieldsets %} + {% if form.fieldsets %} {# Render hidden fields #} {% for field in form.hidden_fields %} @@ -41,7 +41,7 @@ {% endfor %} {# Render grouped fields according to Form #} - {% for group, fields in form.Meta.fieldsets %} + {% for group, fields in form.fieldsets %}
    {{ group }}
    diff --git a/netbox/templates/users/preferences.html b/netbox/templates/users/preferences.html index 2a34f1b3f3c..b9b0be66501 100644 --- a/netbox/templates/users/preferences.html +++ b/netbox/templates/users/preferences.html @@ -8,7 +8,7 @@ {% csrf_token %} - {% for group, fields in form.Meta.fieldsets %} + {% for group, fields in form.fieldsets %}
    {{ group }}
    diff --git a/netbox/tenancy/forms/models.py b/netbox/tenancy/forms/models.py index 313b5541786..5fe299cadbe 100644 --- a/netbox/tenancy/forms/models.py +++ b/netbox/tenancy/forms/models.py @@ -52,14 +52,15 @@ class TenantForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Tenant', ('name', 'slug', 'group', 'description', 'tags')), + ) + class Meta: model = Tenant fields = ( 'name', 'slug', 'group', 'description', 'comments', 'tags', ) - fieldsets = ( - ('Tenant', ('name', 'slug', 'group', 'description', 'tags')), - ) # @@ -105,14 +106,15 @@ class ContactForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Contact', ('group', 'name', 'title', 'phone', 'email', 'address', 'tags')), + ) + class Meta: model = Contact fields = ( 'group', 'name', 'title', 'phone', 'email', 'address', 'comments', 'tags', ) - fieldsets = ( - ('Contact', ('group', 'name', 'title', 'phone', 'email', 'address', 'tags')), - ) widgets = { 'address': SmallTextarea(attrs={'rows': 3}), } diff --git a/netbox/users/forms.py b/netbox/users/forms.py index 5a99adc5afa..49c0808539b 100644 --- a/netbox/users/forms.py +++ b/netbox/users/forms.py @@ -40,20 +40,20 @@ class UserConfigFormMetaclass(forms.models.ModelFormMetaclass): class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass): + fieldsets = ( + ('User Interface', ( + 'pagination.per_page', + 'pagination.placement', + 'ui.colormode', + )), + ('Miscellaneous', ( + 'data_format', + )), + ) class Meta: model = UserConfig fields = () - fieldsets = ( - ('User Interface', ( - 'pagination.per_page', - 'pagination.placement', - 'ui.colormode', - )), - ('Miscellaneous', ( - 'data_format', - )), - ) def __init__(self, *args, instance=None, **kwargs): diff --git a/netbox/virtualization/forms/models.py b/netbox/virtualization/forms/models.py index 883fcd363b9..ecd909ec21a 100644 --- a/netbox/virtualization/forms/models.py +++ b/netbox/virtualization/forms/models.py @@ -90,15 +90,16 @@ class ClusterForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Cluster', ('name', 'type', 'group', 'region', 'site_group', 'site', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + class Meta: model = Cluster fields = ( 'name', 'type', 'group', 'tenant', 'region', 'site_group', 'site', 'comments', 'tags', ) - fieldsets = ( - ('Cluster', ('name', 'type', 'group', 'region', 'site_group', 'site', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) class ClusterAddDevicesForm(BootstrapMixin, forms.Form): @@ -206,20 +207,21 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm): required=False ) + fieldsets = ( + ('Virtual Machine', ('name', 'role', 'status', 'tags')), + ('Cluster', ('cluster_group', 'cluster')), + ('Tenancy', ('tenant_group', 'tenant')), + ('Management', ('platform', 'primary_ip4', 'primary_ip6')), + ('Resources', ('vcpus', 'memory', 'disk')), + ('Config Context', ('local_context_data',)), + ) + class Meta: model = VirtualMachine fields = [ 'name', 'status', 'cluster_group', 'cluster', 'role', 'tenant_group', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'tags', 'local_context_data', ] - fieldsets = ( - ('Virtual Machine', ('name', 'role', 'status', 'tags')), - ('Cluster', ('cluster_group', 'cluster')), - ('Tenancy', ('tenant_group', 'tenant')), - ('Management', ('platform', 'primary_ip4', 'primary_ip6')), - ('Resources', ('vcpus', 'memory', 'disk')), - ('Config Context', ('local_context_data',)), - ) help_texts = { 'local_context_data': "Local config context data overwrites all sources contexts in the final rendered " "config context", diff --git a/netbox/wireless/forms/models.py b/netbox/wireless/forms/models.py index 30a4a23524a..2ed4a5766e5 100644 --- a/netbox/wireless/forms/models.py +++ b/netbox/wireless/forms/models.py @@ -45,16 +45,17 @@ class WirelessLANForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Wireless LAN', ('ssid', 'group', 'description', 'tags')), + ('VLAN', ('vlan',)), + ('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')), + ) + class Meta: model = WirelessLAN fields = [ 'ssid', 'group', 'description', 'vlan', 'auth_type', 'auth_cipher', 'auth_psk', 'tags', ] - fieldsets = ( - ('Wireless LAN', ('ssid', 'group', 'description', 'tags')), - ('VLAN', ('vlan',)), - ('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')), - ) widgets = { 'auth_type': StaticSelect, 'auth_cipher': StaticSelect, @@ -141,18 +142,19 @@ class WirelessLinkForm(NetBoxModelForm): required=False ) + fieldsets = ( + ('Side A', ('site_a', 'location_a', 'device_a', 'interface_a')), + ('Side B', ('site_b', 'location_b', 'device_b', 'interface_b')), + ('Link', ('status', 'ssid', 'description', 'tags')), + ('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')), + ) + class Meta: model = WirelessLink fields = [ 'site_a', 'location_a', 'device_a', 'interface_a', 'site_b', 'location_b', 'device_b', 'interface_b', 'status', 'ssid', 'description', 'auth_type', 'auth_cipher', 'auth_psk', 'tags', ] - fieldsets = ( - ('Side A', ('site_a', 'location_a', 'device_a', 'interface_a')), - ('Side B', ('site_b', 'location_b', 'device_b', 'interface_b')), - ('Link', ('status', 'ssid', 'description', 'tags')), - ('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')), - ) widgets = { 'status': StaticSelect, 'auth_type': StaticSelect, From 353e132cf95b82b9d61cbadc7c34e054c3030b88 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 31 Jan 2022 16:03:26 -0500 Subject: [PATCH 133/271] Replace filter_groups with fieldsets on filter forms --- netbox/circuits/forms/filtersets.py | 30 +-- netbox/dcim/forms/filtersets.py | 247 +++++++++++----------- netbox/extras/forms/filtersets.py | 69 +++--- netbox/ipam/forms/filtersets.py | 114 +++++----- netbox/templates/inc/filter_list.html | 31 +-- netbox/tenancy/forms/filtersets.py | 8 - netbox/virtualization/forms/filtersets.py | 36 ++-- netbox/wireless/forms/filtersets.py | 9 +- 8 files changed, 270 insertions(+), 274 deletions(-) diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 18f914b587d..e7e5287a6de 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -18,11 +18,11 @@ __all__ = ( class ProviderFilterForm(NetBoxModelFilterSetForm): model = Provider - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['asn'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region_id', 'site_group_id', 'site_id')), + ('ASN', ('asn',)), + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -51,9 +51,9 @@ class ProviderFilterForm(NetBoxModelFilterSetForm): class ProviderNetworkFilterForm(NetBoxModelFilterSetForm): model = ProviderNetwork - field_groups = ( - ('q', 'tag'), - ('provider_id',), + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('provider_id', 'service_id')), ) provider_id = DynamicModelMultipleChoiceField( queryset=Provider.objects.all(), @@ -74,13 +74,13 @@ class CircuitTypeFilterForm(NetBoxModelFilterSetForm): class CircuitFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Circuit - field_groups = [ - ['q', 'tag'], - ['provider_id', 'provider_network_id'], - ['type_id', 'status', 'commit_rate'], - ['region_id', 'site_group_id', 'site_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Provider', ('provider_id', 'provider_network_id')), + ('Attributes', ('type_id', 'status', 'commit_rate')), + ('Location', ('region_id', 'site_group_id', 'site_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) type_id = DynamicModelMultipleChoiceField( queryset=CircuitType.objects.all(), required=False, diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index e9aa3ec3faf..180d0c4e744 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -126,12 +126,11 @@ class SiteGroupFilterForm(NetBoxModelFilterSetForm): class SiteFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Site - field_groups = [ - ['q', 'tag'], - ['status', 'region_id', 'group_id'], - ['tenant_group_id', 'tenant_id'], - ['asn_id'] - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('status', 'region_id', 'group_id', 'asn_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) status = forms.MultipleChoiceField( choices=SiteStatusChoices, required=False, @@ -157,11 +156,11 @@ class SiteFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class LocationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Location - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id', 'parent_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Parent', ('region_id', 'site_group_id', 'site_id', 'parent_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -200,13 +199,13 @@ class RackRoleFilterForm(NetBoxModelFilterSetForm): class RackFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Rack - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_id', 'location_id'], - ['status', 'role_id'], - ['type', 'width', 'serial', 'asset_tag'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region_id', 'site_id', 'location_id')), + ('Function', ('status', 'role_id')), + ('Hardware', ('type', 'width', 'serial', 'asset_tag')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -273,12 +272,12 @@ class RackElevationFilterForm(RackFilterForm): class RackReservationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = RackReservation - field_groups = [ - ['q', 'tag'], - ['user_id'], - ['region_id', 'site_id', 'location_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('User', ('user_id',)), + ('Rack', ('region_id', 'site_id', 'location_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -316,11 +315,14 @@ class ManufacturerFilterForm(NetBoxModelFilterSetForm): class DeviceTypeFilterForm(NetBoxModelFilterSetForm): model = DeviceType - field_groups = [ - ['q', 'tag'], - ['manufacturer_id', 'part_number', 'subdevice_role', 'airflow'], - ['console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Hardware', ('manufacturer_id', 'part_number', 'subdevice_role', 'airflow')), + ('Components', ( + 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', + 'pass_through_ports', + )), + ) manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -386,11 +388,14 @@ class DeviceTypeFilterForm(NetBoxModelFilterSetForm): class ModuleTypeFilterForm(NetBoxModelFilterSetForm): model = ModuleType - field_groups = [ - ['q', 'tag'], - ['manufacturer_id', 'part_number'], - ['console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Hardware', ('manufacturer_id', 'part_number')), + ('Components', ( + 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', + 'pass_through_ports', + )), + ) manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -462,17 +467,17 @@ class PlatformFilterForm(NetBoxModelFilterSetForm): class DeviceFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = Device - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id'], - ['status', 'role_id', 'airflow', 'serial', 'asset_tag', 'mac_address'], - ['manufacturer_id', 'device_type_id', 'platform_id'], - ['tenant_group_id', 'tenant_id'], - [ - 'has_primary_ip', 'virtual_chassis_member', 'console_ports', 'console_server_ports', 'power_ports', - 'power_outlets', 'interfaces', 'pass_through_ports', 'local_context_data', - ], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), + ('Operation', ('status', 'role_id', 'airflow', 'serial', 'asset_tag', 'mac_address')), + ('Hardware', ('manufacturer_id', 'device_type_id', 'platform_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ('Components', ( + 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports', + )), + ('Miscellaneous', ('has_primary_ip', 'virtual_chassis_member', 'local_context_data')) + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -616,11 +621,10 @@ class DeviceFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxMo class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = Module - field_groups = [ - ['q', 'tag'], - ['manufacturer_id', 'module_type_id'], - ['serial', 'asset_tag'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Hardware', ('manufacturer_id', 'module_type_id', 'serial', 'asset_tag')), + ) manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -647,11 +651,11 @@ class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxMo class VirtualChassisFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = VirtualChassis - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region_id', 'site_group_id', 'site_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -676,12 +680,12 @@ class VirtualChassisFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Cable - field_groups = [ - ['q', 'tag'], - ['site_id', 'rack_id', 'device_id'], - ['type', 'status', 'color', 'length', 'length_unit'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('site_id', 'rack_id', 'device_id')), + ('Attributes', ('type', 'status', 'color', 'length', 'length_unit')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -739,9 +743,9 @@ class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class PowerPanelFilterForm(NetBoxModelFilterSetForm): model = PowerPanel - field_groups = ( - ('q', 'tag'), - ('region_id', 'site_group_id', 'site_id', 'location_id') + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region_id', 'site_group_id', 'site_id', 'location_id')) ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -776,12 +780,11 @@ class PowerPanelFilterForm(NetBoxModelFilterSetForm): class PowerFeedFilterForm(NetBoxModelFilterSetForm): model = PowerFeed - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['power_panel_id', 'rack_id'], - ['status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region_id', 'site_group_id', 'site_id', 'power_panel_id', 'rack_id')), + ('Attributes', ('status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization')), + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -856,11 +859,11 @@ class PowerFeedFilterForm(NetBoxModelFilterSetForm): class ConsolePortFilterForm(DeviceComponentFilterForm): model = ConsolePort - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'speed'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'type', 'speed')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) type = forms.MultipleChoiceField( choices=ConsolePortTypeChoices, required=False, @@ -876,11 +879,11 @@ class ConsolePortFilterForm(DeviceComponentFilterForm): class ConsoleServerPortFilterForm(DeviceComponentFilterForm): model = ConsoleServerPort - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'speed'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'type', 'speed')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) type = forms.MultipleChoiceField( choices=ConsolePortTypeChoices, required=False, @@ -896,11 +899,11 @@ class ConsoleServerPortFilterForm(DeviceComponentFilterForm): class PowerPortFilterForm(DeviceComponentFilterForm): model = PowerPort - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'type')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) type = forms.MultipleChoiceField( choices=PowerPortTypeChoices, required=False, @@ -911,11 +914,11 @@ class PowerPortFilterForm(DeviceComponentFilterForm): class PowerOutletFilterForm(DeviceComponentFilterForm): model = PowerOutlet - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'type')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) type = forms.MultipleChoiceField( choices=PowerOutletTypeChoices, required=False, @@ -926,13 +929,13 @@ class PowerOutletFilterForm(DeviceComponentFilterForm): class InterfaceFilterForm(DeviceComponentFilterForm): model = Interface - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'kind', 'type', 'speed', 'duplex', 'enabled', 'mgmt_only'], - ['vrf_id', 'mac_address', 'wwn'], - ['rf_role', 'rf_channel', 'rf_channel_width', 'tx_power'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'kind', 'type', 'speed', 'duplex', 'enabled', 'mgmt_only')), + ('Addressing', ('vrf_id', 'mac_address', 'wwn')), + ('Wireless', ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) kind = forms.MultipleChoiceField( choices=InterfaceKindChoices, required=False, @@ -1009,11 +1012,11 @@ class InterfaceFilterForm(DeviceComponentFilterForm): class FrontPortFilterForm(DeviceComponentFilterForm): - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'color'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'type', 'color')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) model = FrontPort type = forms.MultipleChoiceField( choices=PortTypeChoices, @@ -1028,11 +1031,11 @@ class FrontPortFilterForm(DeviceComponentFilterForm): class RearPortFilterForm(DeviceComponentFilterForm): model = RearPort - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'color'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'type', 'color')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) type = forms.MultipleChoiceField( choices=PortTypeChoices, required=False, @@ -1046,11 +1049,11 @@ class RearPortFilterForm(DeviceComponentFilterForm): class ModuleBayFilterForm(DeviceComponentFilterForm): model = ModuleBay - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'position'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'position')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) tag = TagFilterField(model) position = forms.CharField( required=False @@ -1059,21 +1062,21 @@ class ModuleBayFilterForm(DeviceComponentFilterForm): class DeviceBayFilterForm(DeviceComponentFilterForm): model = DeviceBay - field_groups = [ - ['q', 'tag'], - ['name', 'label'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) tag = TagFilterField(model) class InventoryItemFilterForm(DeviceComponentFilterForm): model = InventoryItem - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'manufacturer_id', 'serial', 'asset_tag', 'discovered'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('name', 'label', 'manufacturer_id', 'serial', 'asset_tag', 'discovered')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id')), + ) role_id = DynamicModelMultipleChoiceField( queryset=InventoryItemRole.objects.all(), required=False, diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 330bb91e349..760f873c3f8 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -28,11 +28,10 @@ __all__ = ( class CustomFieldFilterForm(FilterForm): - field_groups = [ - ['q'], - ['type', 'content_types'], - ['weight', 'required'], - ] + fieldsets = ( + (None, ('q',)), + ('Attributes', ('type', 'content_types', 'weight', 'required')), + ) content_types = ContentTypeMultipleChoiceField( queryset=ContentType.objects.all(), limit_choices_to=FeatureQuery('custom_fields'), @@ -56,10 +55,10 @@ class CustomFieldFilterForm(FilterForm): class CustomLinkFilterForm(FilterForm): - field_groups = [ - ['q'], - ['content_type', 'enabled', 'new_window', 'weight'], - ] + fieldsets = ( + (None, ('q',)), + ('Attributes', ('content_type', 'enabled', 'new_window', 'weight')), + ) content_type = ContentTypeChoiceField( queryset=ContentType.objects.all(), limit_choices_to=FeatureQuery('custom_fields'), @@ -83,10 +82,10 @@ class CustomLinkFilterForm(FilterForm): class ExportTemplateFilterForm(FilterForm): - field_groups = [ - ['q'], - ['content_type', 'mime_type', 'file_extension', 'as_attachment'], - ] + fieldsets = ( + (None, ('q',)), + ('Attributes', ('content_type', 'mime_type', 'file_extension', 'as_attachment')), + ) content_type = ContentTypeChoiceField( queryset=ContentType.objects.all(), limit_choices_to=FeatureQuery('custom_fields'), @@ -108,11 +107,11 @@ class ExportTemplateFilterForm(FilterForm): class WebhookFilterForm(FilterForm): - field_groups = [ - ['q'], - ['content_types', 'http_method', 'enabled'], - ['type_create', 'type_update', 'type_delete'], - ] + fieldsets = ( + (None, ('q',)), + ('Attributes', ('content_types', 'http_method', 'enabled')), + ('Events', ('type_create', 'type_update', 'type_delete')), + ) content_types = ContentTypeMultipleChoiceField( queryset=ContentType.objects.all(), limit_choices_to=FeatureQuery('custom_fields'), @@ -160,13 +159,13 @@ class TagFilterForm(FilterForm): class ConfigContextFilterForm(FilterForm): - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['device_type_id', 'platform_id', 'role_id'], - ['cluster_type_id', 'cluster_group_id', 'cluster_id'], - ['tenant_group_id', 'tenant_id'] - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region_id', 'site_group_id', 'site_id')), + ('Device', ('device_type_id', 'platform_id', 'role_id')), + ('Cluster', ('cluster_type_id', 'cluster_group_id', 'cluster_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')) + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -243,11 +242,11 @@ class LocalConfigContextFilterForm(forms.Form): class JournalEntryFilterForm(FilterForm): model = JournalEntry - field_groups = [ - ['q'], - ['created_before', 'created_after', 'created_by_id'], - ['assigned_object_type_id', 'kind'] - ] + fieldsets = ( + (None, ('q',)), + ('Creation', ('created_before', 'created_after', 'created_by_id')), + ('Attributes', ('assigned_object_type_id', 'kind')) + ) created_after = forms.DateTimeField( required=False, label=_('After'), @@ -283,11 +282,11 @@ class JournalEntryFilterForm(FilterForm): class ObjectChangeFilterForm(FilterForm): model = ObjectChange - field_groups = [ - ['q'], - ['time_before', 'time_after', 'action'], - ['user_id', 'changed_object_type_id'], - ] + fieldsets = ( + (None, ('q',)), + ('Time', ('time_before', 'time_after')), + ('Attributes', ('action', 'user_id', 'changed_object_type_id')), + ) time_after = forms.DateTimeField( required=False, label=_('After'), diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 4301a1810b2..bf780a7d015 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -41,11 +41,11 @@ IPADDRESS_MASK_LENGTH_CHOICES = add_blank_choice([ class VRFFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = VRF - field_groups = [ - ['q', 'tag'], - ['import_target_id', 'export_target_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Route Targets', ('import_target_id', 'export_target_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) import_target_id = DynamicModelMultipleChoiceField( queryset=RouteTarget.objects.all(), required=False, @@ -61,11 +61,11 @@ class VRFFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class RouteTargetFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = RouteTarget - field_groups = [ - ['q', 'tag'], - ['importing_vrf_id', 'exporting_vrf_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('VRF', ('importing_vrf_id', 'exporting_vrf_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) importing_vrf_id = DynamicModelMultipleChoiceField( queryset=VRF.objects.all(), required=False, @@ -93,11 +93,11 @@ class RIRFilterForm(NetBoxModelFilterSetForm): class AggregateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Aggregate - field_groups = [ - ['q', 'tag'], - ['family', 'rir_id'], - ['tenant_group_id', 'tenant_id'] - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('family', 'rir_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) family = forms.ChoiceField( required=False, choices=add_blank_choice(IPAddressFamilyChoices), @@ -114,12 +114,11 @@ class AggregateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class ASNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = ASN - field_groups = [ - ['q'], - ['rir_id'], - ['tenant_group_id', 'tenant_id'], - ['site_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Assignment', ('rir_id', 'site_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) rir_id = DynamicModelMultipleChoiceField( queryset=RIR.objects.all(), required=False, @@ -130,6 +129,7 @@ class ASNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): required=False, label=_('Site') ) + tag = TagFilterField(model) class RoleFilterForm(NetBoxModelFilterSetForm): @@ -139,13 +139,13 @@ class RoleFilterForm(NetBoxModelFilterSetForm): class PrefixFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Prefix - field_groups = [ - ['q', 'tag'], - ['within_include', 'family', 'status', 'role_id', 'mask_length', 'is_pool', 'mark_utilized'], - ['vrf_id', 'present_in_vrf_id'], - ['region_id', 'site_group_id', 'site_id'], - ['tenant_group_id', 'tenant_id'] - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Addressing', ('within_include', 'family', 'status', 'role_id', 'mask_length', 'is_pool', 'mark_utilized')), + ('VRF', ('vrf_id', 'present_in_vrf_id')), + ('Location', ('region_id', 'site_group_id', 'site_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) mask_length__lte = forms.IntegerField( widget=forms.HiddenInput() ) @@ -230,11 +230,11 @@ class PrefixFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class IPRangeFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = IPRange - field_groups = [ - ['q', 'tag'], - ['family', 'vrf_id', 'status', 'role_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attriubtes', ('family', 'vrf_id', 'status', 'role_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) family = forms.ChoiceField( required=False, choices=add_blank_choice(IPAddressFamilyChoices), @@ -263,12 +263,12 @@ class IPRangeFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = IPAddress - field_groups = [ - ['q', 'tag'], - ['parent', 'family', 'status', 'role', 'mask_length', 'assigned_to_interface'], - ['vrf_id', 'present_in_vrf_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('parent', 'family', 'status', 'role', 'mask_length', 'assigned_to_interface')), + ('VRF', ('vrf_id', 'present_in_vrf_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) parent = forms.CharField( required=False, widget=forms.TextInput( @@ -323,10 +323,10 @@ class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class FHRPGroupFilterForm(NetBoxModelFilterSetForm): model = FHRPGroup - field_groups = ( - ('q', 'tag'), - ('protocol', 'group_id'), - ('auth_type', 'auth_key'), + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('protocol', 'group_id')), + ('Authentication', ('auth_type', 'auth_key')), ) protocol = forms.MultipleChoiceField( choices=FHRPGroupProtocolChoices, @@ -352,11 +352,11 @@ class FHRPGroupFilterForm(NetBoxModelFilterSetForm): class VLANGroupFilterForm(NetBoxModelFilterSetForm): - field_groups = [ - ['q', 'tag'], - ['region', 'sitegroup', 'site', 'location', 'rack'], - ['min_vid', 'max_vid'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region', 'sitegroup', 'site', 'location', 'rack')), + ('VLAN ID', ('min_vid', 'max_vid')), + ) model = VLANGroup region = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), @@ -396,12 +396,12 @@ class VLANGroupFilterForm(NetBoxModelFilterSetForm): class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = VLAN - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['group_id', 'status', 'role_id', 'vid'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Location', ('region_id', 'site_group_id', 'site_id')), + ('Attributes', ('group_id', 'status', 'role_id', 'vid')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -450,9 +450,9 @@ class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class ServiceTemplateFilterForm(NetBoxModelFilterSetForm): model = ServiceTemplate - field_groups = ( - ('q', 'tag'), - ('protocol', 'port'), + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('protocol', 'port')), ) protocol = forms.ChoiceField( choices=add_blank_choice(ServiceProtocolChoices), diff --git a/netbox/templates/inc/filter_list.html b/netbox/templates/inc/filter_list.html index e6a1e6a28ed..4276764d1dd 100644 --- a/netbox/templates/inc/filter_list.html +++ b/netbox/templates/inc/filter_list.html @@ -7,21 +7,22 @@ {% for field in filter_form.hidden_fields %} {{ field }} {% endfor %} - {% if filter_form.field_groups %} - {# List filters by group #} - {% for group in filter_form.field_groups %} -
    - {% for name in group %} - {% with field=filter_form|get_item:name %} - {% render_field field %} - {% endwith %} - {% endfor %} -
    - {% if not forloop.last %} -
    + {# List filters by group #} + {% for heading, fields in filter_form.fieldsets %} +
    + {% if heading %} +
    {{ heading }}
    {% endif %} - {% endfor %} - {% else %} + {% for name in fields %} + {% with field=filter_form|get_item:name %} + {% render_field field %} + {% endwith %} + {% endfor %} +
    + {% if not forloop.last %} +
    + {% endif %} + {% empty %} {# List all non-customfield filters as declared in the form class #} {% for field in filter_form.visible_fields %} {% if not filter_form.custom_fields or field.name not in filter_form.custom_fields %} @@ -30,7 +31,7 @@
    {% endif %} {% endfor %} - {% endif %} + {% endfor %} {% if filter_form.custom_fields %} {# List all custom field filters #}
    diff --git a/netbox/tenancy/forms/filtersets.py b/netbox/tenancy/forms/filtersets.py index 8fb4b50ff4a..73e30cc774f 100644 --- a/netbox/tenancy/forms/filtersets.py +++ b/netbox/tenancy/forms/filtersets.py @@ -29,10 +29,6 @@ class TenantGroupFilterForm(NetBoxModelFilterSetForm): class TenantFilterForm(NetBoxModelFilterSetForm): model = Tenant - field_groups = ( - ('q', 'tag'), - ('group_id',), - ) group_id = DynamicModelMultipleChoiceField( queryset=TenantGroup.objects.all(), required=False, @@ -63,10 +59,6 @@ class ContactRoleFilterForm(NetBoxModelFilterSetForm): class ContactFilterForm(NetBoxModelFilterSetForm): model = Contact - field_groups = ( - ('q', 'tag'), - ('group_id',), - ) group_id = DynamicModelMultipleChoiceField( queryset=ContactGroup.objects.all(), required=False, diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 292cd661d4c..8e3dcd14305 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -32,12 +32,12 @@ class ClusterGroupFilterForm(NetBoxModelFilterSetForm): class ClusterFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Cluster - field_groups = [ - ['q', 'tag'], - ['group_id', 'type_id'], - ['region_id', 'site_group_id', 'site_id'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('group_id', 'type_id')), + ('Location', ('region_id', 'site_group_id', 'site_id')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) type_id = DynamicModelMultipleChoiceField( queryset=ClusterType.objects.all(), required=False, @@ -74,13 +74,13 @@ class ClusterFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class VirtualMachineFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = VirtualMachine - field_groups = [ - ['q', 'tag'], - ['cluster_group_id', 'cluster_type_id', 'cluster_id'], - ['region_id', 'site_group_id', 'site_id'], - ['status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'local_context_data'], - ['tenant_group_id', 'tenant_id'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Cluster', ('cluster_group_id', 'cluster_type_id', 'cluster_id')), + ('Location', ('region_id', 'site_group_id', 'site_id')), + ('Attriubtes', ('status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'local_context_data')), + ('Tenant', ('tenant_group_id', 'tenant_id')), + ) cluster_group_id = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), required=False, @@ -154,11 +154,11 @@ class VirtualMachineFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, class VMInterfaceFilterForm(NetBoxModelFilterSetForm): model = VMInterface - field_groups = [ - ['q', 'tag'], - ['cluster_id', 'virtual_machine_id'], - ['enabled', 'mac_address'], - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Virtual Machine', ('cluster_id', 'virtual_machine_id')), + ('Attributes', ('enabled', 'mac_address')), + ) cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False, diff --git a/netbox/wireless/forms/filtersets.py b/netbox/wireless/forms/filtersets.py index 3c46caf21e9..8dcb48673f4 100644 --- a/netbox/wireless/forms/filtersets.py +++ b/netbox/wireless/forms/filtersets.py @@ -26,10 +26,11 @@ class WirelessLANGroupFilterForm(NetBoxModelFilterSetForm): class WirelessLANFilterForm(NetBoxModelFilterSetForm): model = WirelessLAN - field_groups = [ - ('q', 'tag'), - ('group_id',), - ] + fieldsets = ( + (None, ('q', 'tag')), + ('Attributes', ('ssid', 'group_id',)), + ('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')), + ) ssid = forms.CharField( required=False, label='SSID' From d1672f8818de1f712854dd22011c8a7b99e9a193 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 31 Jan 2022 16:15:40 -0500 Subject: [PATCH 134/271] Move nullable_fields out of Meta for bulk edit forms --- netbox/circuits/forms/bulk_edit.py | 24 ++-- netbox/dcim/forms/bulk_edit.py | 139 ++++++++--------------- netbox/extras/forms/bulk_edit.py | 15 +-- netbox/ipam/forms/bulk_edit.py | 69 ++++------- netbox/tenancy/forms/bulk_edit.py | 15 +-- netbox/utilities/forms/forms.py | 7 +- netbox/virtualization/forms/bulk_edit.py | 27 ++--- netbox/wireless/forms/bulk_edit.py | 13 ++- 8 files changed, 110 insertions(+), 199 deletions(-) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index f17df130206..9c20a2fe7f7 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -47,10 +47,9 @@ class ProviderBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) - class Meta: - nullable_fields = ( - 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', - ) + nullable_fields = ( + 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', + ) class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): @@ -75,10 +74,9 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) - class Meta: - nullable_fields = ( - 'service_id', 'description', 'comments', - ) + nullable_fields = ( + 'service_id', 'description', 'comments', + ) class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): @@ -91,8 +89,7 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class CircuitBulkEditForm(NetBoxModelBulkEditForm): @@ -131,7 +128,6 @@ class CircuitBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) - class Meta: - nullable_fields = ( - 'tenant', 'commit_rate', 'description', 'comments', - ) + nullable_fields = ( + 'tenant', 'commit_rate', 'description', 'comments', + ) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 13e9d945bc0..a126d22f97c 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -71,8 +71,7 @@ class RegionBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('parent', 'description') + nullable_fields = ('parent', 'description') class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): @@ -89,8 +88,7 @@ class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('parent', 'description') + nullable_fields = ('parent', 'description') class SiteBulkEditForm(NetBoxModelBulkEditForm): @@ -131,10 +129,9 @@ class SiteBulkEditForm(NetBoxModelBulkEditForm): widget=StaticSelect() ) - class Meta: - nullable_fields = ( - 'region', 'group', 'tenant', 'asns', 'description', 'time_zone', - ) + nullable_fields = ( + 'region', 'group', 'tenant', 'asns', 'description', 'time_zone', + ) class LocationBulkEditForm(NetBoxModelBulkEditForm): @@ -162,8 +159,7 @@ class LocationBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('parent', 'tenant', 'description') + nullable_fields = ('parent', 'tenant', 'description') class RackRoleBulkEditForm(NetBoxModelBulkEditForm): @@ -179,8 +175,7 @@ class RackRoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('color', 'description') + nullable_fields = ('color', 'description') class RackBulkEditForm(NetBoxModelBulkEditForm): @@ -277,10 +272,9 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) - class Meta: - nullable_fields = ( - 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'comments', - ) + nullable_fields = ( + 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'comments', + ) class RackReservationBulkEditForm(NetBoxModelBulkEditForm): @@ -315,8 +309,7 @@ class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): @@ -346,8 +339,7 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): widget=StaticSelect() ) - class Meta: - nullable_fields = ('part_number', 'airflow') + nullable_fields = ('part_number', 'airflow') class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): @@ -363,8 +355,7 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('part_number',) + nullable_fields = ('part_number',) class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): @@ -385,8 +376,7 @@ class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('color', 'description') + nullable_fields = ('color', 'description') class PlatformBulkEditForm(NetBoxModelBulkEditForm): @@ -408,8 +398,7 @@ class PlatformBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('manufacturer', 'napalm_driver', 'description') + nullable_fields = ('manufacturer', 'napalm_driver', 'description') class DeviceBulkEditForm(NetBoxModelBulkEditForm): @@ -467,10 +456,9 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm): label='Serial Number' ) - class Meta: - nullable_fields = ( - 'tenant', 'platform', 'serial', 'airflow', - ) + nullable_fields = ( + 'tenant', 'platform', 'serial', 'airflow', + ) class ModuleBulkEditForm(NetBoxModelBulkEditForm): @@ -495,8 +483,7 @@ class ModuleBulkEditForm(NetBoxModelBulkEditForm): label='Serial Number' ) - class Meta: - nullable_fields = ('serial',) + nullable_fields = ('serial',) class CableBulkEditForm(NetBoxModelBulkEditForm): @@ -538,10 +525,9 @@ class CableBulkEditForm(NetBoxModelBulkEditForm): widget=StaticSelect() ) - class Meta: - nullable_fields = ( - 'type', 'status', 'tenant', 'label', 'color', 'length', - ) + nullable_fields = ( + 'type', 'status', 'tenant', 'label', 'color', 'length', + ) def clean(self): super().clean() @@ -565,8 +551,7 @@ class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('domain',) + nullable_fields = ('domain',) class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): @@ -604,8 +589,7 @@ class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): } ) - class Meta: - nullable_fields = ('location',) + nullable_fields = ('location',) class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): @@ -663,10 +647,7 @@ class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) - class Meta: - nullable_fields = ( - 'location', 'comments', - ) + nullable_fields = ('location', 'comments') # @@ -688,8 +669,7 @@ class ConsolePortTemplateBulkEditForm(BulkEditForm): widget=StaticSelect() ) - class Meta: - nullable_fields = ('label', 'type', 'description') + nullable_fields = ('label', 'type', 'description') class ConsoleServerPortTemplateBulkEditForm(BulkEditForm): @@ -710,8 +690,7 @@ class ConsoleServerPortTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('label', 'type', 'description') + nullable_fields = ('label', 'type', 'description') class PowerPortTemplateBulkEditForm(BulkEditForm): @@ -742,8 +721,7 @@ class PowerPortTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('label', 'type', 'maximum_draw', 'allocated_draw', 'description') + nullable_fields = ('label', 'type', 'maximum_draw', 'allocated_draw', 'description') class PowerOutletTemplateBulkEditForm(BulkEditForm): @@ -779,8 +757,7 @@ class PowerOutletTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('label', 'type', 'power_port', 'feed_leg', 'description') + nullable_fields = ('label', 'type', 'power_port', 'feed_leg', 'description') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -817,8 +794,7 @@ class InterfaceTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'description') class FrontPortTemplateBulkEditForm(BulkEditForm): @@ -842,8 +818,7 @@ class FrontPortTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class RearPortTemplateBulkEditForm(BulkEditForm): @@ -867,8 +842,7 @@ class RearPortTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class ModuleBayTemplateBulkEditForm(BulkEditForm): @@ -884,8 +858,7 @@ class ModuleBayTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('label', 'position', 'description') + nullable_fields = ('label', 'position', 'description') class DeviceBayTemplateBulkEditForm(BulkEditForm): @@ -901,8 +874,7 @@ class DeviceBayTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'description') class InventoryItemTemplateBulkEditForm(BulkEditForm): @@ -926,8 +898,7 @@ class InventoryItemTemplateBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description') + nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description') # @@ -947,8 +918,7 @@ class ConsolePortBulkEditForm( widget=BulkEditNullBooleanSelect ) - class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'description') class ConsoleServerPortBulkEditForm( @@ -964,8 +934,7 @@ class ConsoleServerPortBulkEditForm( widget=BulkEditNullBooleanSelect ) - class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'description') class PowerPortBulkEditForm( @@ -981,8 +950,7 @@ class PowerPortBulkEditForm( widget=BulkEditNullBooleanSelect ) - class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'description') class PowerOutletBulkEditForm( @@ -1004,8 +972,7 @@ class PowerOutletBulkEditForm( widget=BulkEditNullBooleanSelect ) - class Meta: - nullable_fields = ('label', 'type', 'feed_leg', 'power_port', 'description') + nullable_fields = ('label', 'type', 'feed_leg', 'power_port', 'description') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -1084,12 +1051,10 @@ class InterfaceBulkEditForm( label='VRF' ) - class Meta: - nullable_fields = ( - 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'description', 'mode', - 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', - 'vrf', - ) + nullable_fields = ( + 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'description', 'mode', + 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'vrf', + ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -1154,8 +1119,7 @@ class FrontPortBulkEditForm( widget=forms.MultipleHiddenInput() ) - class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'description') class RearPortBulkEditForm( @@ -1167,8 +1131,7 @@ class RearPortBulkEditForm( widget=forms.MultipleHiddenInput() ) - class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'description') class ModuleBayBulkEditForm( @@ -1180,8 +1143,7 @@ class ModuleBayBulkEditForm( widget=forms.MultipleHiddenInput() ) - class Meta: - nullable_fields = ('label', 'position', 'description') + nullable_fields = ('label', 'position', 'description') class DeviceBayBulkEditForm( @@ -1193,8 +1155,7 @@ class DeviceBayBulkEditForm( widget=forms.MultipleHiddenInput() ) - class Meta: - nullable_fields = ('label', 'description') + nullable_fields = ('label', 'description') class InventoryItemBulkEditForm( @@ -1214,8 +1175,7 @@ class InventoryItemBulkEditForm( required=False ) - class Meta: - nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description') + nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description') # @@ -1235,5 +1195,4 @@ class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('color', 'description') + nullable_fields = ('color', 'description') diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 362592acea1..b09bfc6122f 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -33,8 +33,7 @@ class CustomFieldBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class CustomLinkBulkEditForm(BulkEditForm): @@ -92,8 +91,7 @@ class ExportTemplateBulkEditForm(BulkEditForm): widget=BulkEditNullBooleanSelect() ) - class Meta: - nullable_fields = ('description', 'mime_type', 'file_extension') + nullable_fields = ('description', 'mime_type', 'file_extension') class WebhookBulkEditForm(BulkEditForm): @@ -135,8 +133,7 @@ class WebhookBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('secret', 'conditions', 'ca_file_path') + nullable_fields = ('secret', 'conditions', 'ca_file_path') class TagBulkEditForm(BulkEditForm): @@ -152,8 +149,7 @@ class TagBulkEditForm(BulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class ConfigContextBulkEditForm(BulkEditForm): @@ -174,8 +170,7 @@ class ConfigContextBulkEditForm(BulkEditForm): max_length=100 ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class JournalEntryBulkEditForm(BulkEditForm): diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 6370513188b..9a56501d2d7 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -49,10 +49,7 @@ class VRFBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'tenant', 'description', - ) + nullable_fields = ('tenant', 'description') class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): @@ -69,10 +66,7 @@ class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'tenant', 'description', - ) + nullable_fields = ('tenant', 'description') class RIRBulkEditForm(NetBoxModelBulkEditForm): @@ -89,8 +83,7 @@ class RIRBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('is_private', 'description') + nullable_fields = ('is_private', 'description') class ASNBulkEditForm(NetBoxModelBulkEditForm): @@ -116,13 +109,7 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'date_added', 'description', - ) - widgets = { - 'date_added': DatePicker(), - } + nullable_fields = ('date_added', 'description') class AggregateBulkEditForm(NetBoxModelBulkEditForm): @@ -147,13 +134,7 @@ class AggregateBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'date_added', 'description', - ) - widgets = { - 'date_added': DatePicker(), - } + nullable_fields = ('date_added', 'description') class RoleBulkEditForm(NetBoxModelBulkEditForm): @@ -169,8 +150,7 @@ class RoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class PrefixBulkEditForm(NetBoxModelBulkEditForm): @@ -232,10 +212,9 @@ class PrefixBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'site', 'vrf', 'tenant', 'role', 'description', - ) + nullable_fields = ( + 'site', 'vrf', 'tenant', 'role', 'description', + ) class IPRangeBulkEditForm(NetBoxModelBulkEditForm): @@ -266,10 +245,9 @@ class IPRangeBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'vrf', 'tenant', 'role', 'description', - ) + nullable_fields = ( + 'vrf', 'tenant', 'role', 'description', + ) class IPAddressBulkEditForm(NetBoxModelBulkEditForm): @@ -311,10 +289,9 @@ class IPAddressBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'vrf', 'role', 'tenant', 'dns_name', 'description', - ) + nullable_fields = ( + 'vrf', 'role', 'tenant', 'dns_name', 'description', + ) class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): @@ -348,8 +325,7 @@ class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('auth_type', 'auth_key', 'description') + nullable_fields = ('auth_type', 'auth_key', 'description') class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): @@ -378,8 +354,7 @@ class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('site', 'description') + nullable_fields = ('site', 'description') class VLANBulkEditForm(NetBoxModelBulkEditForm): @@ -428,10 +403,9 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'site', 'group', 'tenant', 'role', 'description', - ) + nullable_fields = ( + 'site', 'group', 'tenant', 'role', 'description', + ) class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): @@ -456,8 +430,7 @@ class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class ServiceBulkEditForm(ServiceTemplateBulkEditForm): diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py index f3cc2c33d08..a3695c10e8c 100644 --- a/netbox/tenancy/forms/bulk_edit.py +++ b/netbox/tenancy/forms/bulk_edit.py @@ -31,8 +31,7 @@ class TenantGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('parent', 'description') + nullable_fields = ('parent', 'description') class TenantBulkEditForm(NetBoxModelBulkEditForm): @@ -45,8 +44,7 @@ class TenantBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('group',) + nullable_fields = ('group',) # @@ -67,8 +65,7 @@ class ContactGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('parent', 'description') + nullable_fields = ('parent', 'description') class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): @@ -81,8 +78,7 @@ class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class ContactBulkEditForm(NetBoxModelBulkEditForm): @@ -110,5 +106,4 @@ class ContactBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('group', 'title', 'phone', 'email', 'address', 'comments') + nullable_fields = ('group', 'title', 'phone', 'email', 'address', 'comments') diff --git a/netbox/utilities/forms/forms.py b/netbox/utilities/forms/forms.py index d9a6c2b294b..67a2bcb740f 100644 --- a/netbox/utilities/forms/forms.py +++ b/netbox/utilities/forms/forms.py @@ -69,14 +69,11 @@ class BulkEditMixin: """ Base form for editing multiple objects in bulk """ + nullable_fields = () + def __init__(self, model, *args, **kwargs): super().__init__(*args, **kwargs) self.model = model - self.nullable_fields = () - - # Copy any nullable fields defined in Meta - if hasattr(self, 'Meta') and hasattr(self.Meta, 'nullable_fields'): - self.nullable_fields = self.Meta.nullable_fields # diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index dd846029a8d..e4f6ab25c9a 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -33,8 +33,7 @@ class ClusterTypeBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): @@ -47,8 +46,7 @@ class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('description',) + nullable_fields = ('description',) class ClusterBulkEditForm(NetBoxModelBulkEditForm): @@ -89,10 +87,9 @@ class ClusterBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) - class Meta: - nullable_fields = ( - 'group', 'site', 'comments', 'tenant', - ) + nullable_fields = ( + 'group', 'site', 'comments', 'tenant', + ) class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): @@ -144,10 +141,9 @@ class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) - class Meta: - nullable_fields = ( - 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', - ) + nullable_fields = ( + 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', + ) class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): @@ -197,10 +193,9 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ( - 'parent', 'bridge', 'mtu', 'description', - ) + nullable_fields = ( + 'parent', 'bridge', 'mtu', 'description', + ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/netbox/wireless/forms/bulk_edit.py b/netbox/wireless/forms/bulk_edit.py index 2d2a3ff1436..0a3f0364eb5 100644 --- a/netbox/wireless/forms/bulk_edit.py +++ b/netbox/wireless/forms/bulk_edit.py @@ -29,8 +29,7 @@ class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) - class Meta: - nullable_fields = ('parent', 'description') + nullable_fields = ('parent', 'description') class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): @@ -68,8 +67,9 @@ class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): label='Pre-shared key' ) - class Meta: - nullable_fields = ('ssid', 'group', 'vlan', 'description', 'auth_type', 'auth_cipher', 'auth_psk') + nullable_fields = ( + 'ssid', 'group', 'vlan', 'description', 'auth_type', 'auth_cipher', 'auth_psk', + ) class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): @@ -102,5 +102,6 @@ class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): label='Pre-shared key' ) - class Meta: - nullable_fields = ('ssid', 'description', 'auth_type', 'auth_cipher', 'auth_psk') + nullable_fields = ( + 'ssid', 'description', 'auth_type', 'auth_cipher', 'auth_psk', + ) From bfb1a82754cc66b223d4d0905451680eb7a01849 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 31 Jan 2022 16:23:23 -0500 Subject: [PATCH 135/271] Update docstrings for base form classes --- netbox/netbox/forms/base.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 3fa85f1f758..2de15c6b84d 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -18,7 +18,7 @@ __all__ = ( class NetBoxModelForm(BootstrapMixin, CustomFieldsMixin, forms.ModelForm): """ - Base form for creating & editing NetBox models. Adds support for custom fields. + Base form for creating & editing NetBox models. Extends Django's ModelForm to add support for custom fields. Attributes: fieldsets: An iterable of two-tuples which define a heading and field set to display per section of @@ -65,6 +65,9 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditMixin, """ Base form for modifying multiple NetBox objects (of the same type) in bulk via the UI. Adds support for custom fields and adding/removing tags. + + Attributes: + nullable_fields: A list of field names indicating which fields support being set to null/empty """ add_tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -100,9 +103,13 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditMixin, class NetBoxModelFilterSetForm(BootstrapMixin, CustomFieldsMixin, forms.Form): """ - Base form for FilerSet forms. These are used to filter object lists in the NetBox UI. + Base form for FilerSet forms. These are used to filter object lists in the NetBox UI. Note that the + corresponding FilterSet *must* provide a `q` filter. - The corresponding FilterSet *must* provide a `q` filter. + Attributes: + model: The model class associated with the form + fieldsets: An iterable of two-tuples which define a heading and field set to display per section of + the rendered form (optional). If not defined, the all fields will be rendered as a single section. """ q = forms.CharField( required=False, From 3621b1a0d09a52996c72e5c7c14a502214b0362a Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 1 Feb 2022 11:00:18 -0500 Subject: [PATCH 136/271] Set model as attribute on bulk edit forms --- netbox/circuits/forms/bulk_edit.py | 4 +++ netbox/dcim/forms/bulk_edit.py | 30 +++++++++++++++++++++++ netbox/extras/forms/customfields.py | 7 +++++- netbox/ipam/forms/bulk_edit.py | 13 ++++++++++ netbox/netbox/forms/base.py | 6 +++-- netbox/netbox/views/generic/bulk_views.py | 4 +-- netbox/tenancy/forms/bulk_edit.py | 5 ++++ netbox/utilities/forms/forms.py | 19 ++++---------- netbox/virtualization/forms/bulk_edit.py | 5 ++++ netbox/wireless/forms/bulk_edit.py | 3 +++ 10 files changed, 77 insertions(+), 19 deletions(-) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 9c20a2fe7f7..43419a871f6 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -47,6 +47,7 @@ class ProviderBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) + model = Provider nullable_fields = ( 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', ) @@ -74,6 +75,7 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) + model = ProviderNetwork nullable_fields = ( 'service_id', 'description', 'comments', ) @@ -89,6 +91,7 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = CircuitType nullable_fields = ('description',) @@ -128,6 +131,7 @@ class CircuitBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) + model = Circuit nullable_fields = ( 'tenant', 'commit_rate', 'description', 'comments', ) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index a126d22f97c..c7fbcf3f152 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -71,6 +71,7 @@ class RegionBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Region nullable_fields = ('parent', 'description') @@ -88,6 +89,7 @@ class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = SiteGroup nullable_fields = ('parent', 'description') @@ -129,6 +131,7 @@ class SiteBulkEditForm(NetBoxModelBulkEditForm): widget=StaticSelect() ) + model = Site nullable_fields = ( 'region', 'group', 'tenant', 'asns', 'description', 'time_zone', ) @@ -159,6 +162,7 @@ class LocationBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Location nullable_fields = ('parent', 'tenant', 'description') @@ -175,6 +179,7 @@ class RackRoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = RackRole nullable_fields = ('color', 'description') @@ -272,6 +277,7 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) + model = Rack nullable_fields = ( 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'comments', ) @@ -298,6 +304,8 @@ class RackReservationBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = RackReservation + class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( @@ -309,6 +317,7 @@ class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Manufacturer nullable_fields = ('description',) @@ -339,6 +348,7 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): widget=StaticSelect() ) + model = DeviceType nullable_fields = ('part_number', 'airflow') @@ -355,6 +365,7 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = ModuleType nullable_fields = ('part_number',) @@ -376,6 +387,7 @@ class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = DeviceRole nullable_fields = ('color', 'description') @@ -398,6 +410,7 @@ class PlatformBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Platform nullable_fields = ('manufacturer', 'napalm_driver', 'description') @@ -456,6 +469,7 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm): label='Serial Number' ) + model = Device nullable_fields = ( 'tenant', 'platform', 'serial', 'airflow', ) @@ -483,6 +497,7 @@ class ModuleBulkEditForm(NetBoxModelBulkEditForm): label='Serial Number' ) + model = Module nullable_fields = ('serial',) @@ -525,6 +540,7 @@ class CableBulkEditForm(NetBoxModelBulkEditForm): widget=StaticSelect() ) + model = Cable nullable_fields = ( 'type', 'status', 'tenant', 'label', 'color', 'length', ) @@ -551,6 +567,7 @@ class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = VirtualChassis nullable_fields = ('domain',) @@ -589,6 +606,7 @@ class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): } ) + model = PowerPanel nullable_fields = ('location',) @@ -647,6 +665,7 @@ class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) + model = PowerFeed nullable_fields = ('location', 'comments') @@ -918,6 +937,7 @@ class ConsolePortBulkEditForm( widget=BulkEditNullBooleanSelect ) + model = ConsolePort nullable_fields = ('label', 'description') @@ -934,6 +954,7 @@ class ConsoleServerPortBulkEditForm( widget=BulkEditNullBooleanSelect ) + model = ConsoleServerPort nullable_fields = ('label', 'description') @@ -950,6 +971,7 @@ class PowerPortBulkEditForm( widget=BulkEditNullBooleanSelect ) + model = PowerPort nullable_fields = ('label', 'description') @@ -972,6 +994,7 @@ class PowerOutletBulkEditForm( widget=BulkEditNullBooleanSelect ) + model = PowerOutlet nullable_fields = ('label', 'type', 'feed_leg', 'power_port', 'description') def __init__(self, *args, **kwargs): @@ -1051,6 +1074,7 @@ class InterfaceBulkEditForm( label='VRF' ) + model = Interface nullable_fields = ( 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'description', 'mode', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'vrf', @@ -1119,6 +1143,7 @@ class FrontPortBulkEditForm( widget=forms.MultipleHiddenInput() ) + model = FrontPort nullable_fields = ('label', 'description') @@ -1131,6 +1156,7 @@ class RearPortBulkEditForm( widget=forms.MultipleHiddenInput() ) + model = RearPort nullable_fields = ('label', 'description') @@ -1143,6 +1169,7 @@ class ModuleBayBulkEditForm( widget=forms.MultipleHiddenInput() ) + model = ModuleBay nullable_fields = ('label', 'position', 'description') @@ -1155,6 +1182,7 @@ class DeviceBayBulkEditForm( widget=forms.MultipleHiddenInput() ) + model = DeviceBay nullable_fields = ('label', 'description') @@ -1175,6 +1203,7 @@ class InventoryItemBulkEditForm( required=False ) + model = InventoryItem nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description') @@ -1195,4 +1224,5 @@ class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = InventoryItemRole nullable_fields = ('color', 'description') diff --git a/netbox/extras/forms/customfields.py b/netbox/extras/forms/customfields.py index c3a44f47b03..bb8028eec70 100644 --- a/netbox/extras/forms/customfields.py +++ b/netbox/extras/forms/customfields.py @@ -10,7 +10,12 @@ __all__ = ( class CustomFieldsMixin: """ Extend a Form to include custom field support. + + Attributes: + model: The model class """ + model = None + def __init__(self, *args, **kwargs): self.custom_fields = {} @@ -22,7 +27,7 @@ class CustomFieldsMixin: """ Return the ContentType of the form's model. """ - if not hasattr(self, 'model'): + if not getattr(self, 'model', None): raise NotImplementedError(f"{self.__class__.__name__} must specify a model class.") return ContentType.objects.get_for_model(self.model) diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 9a56501d2d7..6002c1fe4fa 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -49,6 +49,7 @@ class VRFBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = VRF nullable_fields = ('tenant', 'description') @@ -66,6 +67,7 @@ class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = RouteTarget nullable_fields = ('tenant', 'description') @@ -83,6 +85,7 @@ class RIRBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = RIR nullable_fields = ('is_private', 'description') @@ -109,6 +112,7 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = ASN nullable_fields = ('date_added', 'description') @@ -134,6 +138,7 @@ class AggregateBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Aggregate nullable_fields = ('date_added', 'description') @@ -150,6 +155,7 @@ class RoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Role nullable_fields = ('description',) @@ -212,6 +218,7 @@ class PrefixBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Prefix nullable_fields = ( 'site', 'vrf', 'tenant', 'role', 'description', ) @@ -245,6 +252,7 @@ class IPRangeBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = IPRange nullable_fields = ( 'vrf', 'tenant', 'role', 'description', ) @@ -289,6 +297,7 @@ class IPAddressBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = IPAddress nullable_fields = ( 'vrf', 'role', 'tenant', 'dns_name', 'description', ) @@ -325,6 +334,7 @@ class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = FHRPGroup nullable_fields = ('auth_type', 'auth_key', 'description') @@ -354,6 +364,7 @@ class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = VLANGroup nullable_fields = ('site', 'description') @@ -403,6 +414,7 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = VLAN nullable_fields = ( 'site', 'group', 'tenant', 'role', 'description', ) @@ -430,6 +442,7 @@ class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = ServiceTemplate nullable_fields = ('description',) diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 2de15c6b84d..9cd6bbd4710 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -5,7 +5,7 @@ from django.db.models import Q from extras.choices import CustomFieldFilterLogicChoices, CustomFieldTypeChoices from extras.forms.customfields import CustomFieldsMixin from extras.models import CustomField, Tag -from utilities.forms import BootstrapMixin, BulkEditMixin, CSVModelForm +from utilities.forms import BootstrapMixin, CSVModelForm from utilities.forms.fields import DynamicModelMultipleChoiceField __all__ = ( @@ -61,7 +61,7 @@ class NetBoxModelCSVForm(CSVModelForm, NetBoxModelForm): return customfield.to_form_field(for_csv_import=True) -class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditMixin, forms.Form): +class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, forms.Form): """ Base form for modifying multiple NetBox objects (of the same type) in bulk via the UI. Adds support for custom fields and adding/removing tags. @@ -69,6 +69,8 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, BulkEditMixin, Attributes: nullable_fields: A list of field names indicating which fields support being set to null/empty """ + nullable_fields = () + add_tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index a042a3cff43..3db44ec913e 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -529,7 +529,7 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): initial_data['virtual_machine'] = request.GET.get('virtual_machine') if '_apply' in request.POST: - form = self.form(model, request.POST, initial=initial_data) + form = self.form(request.POST, initial=initial_data) restrict_form_fields(form, request.user) if form.is_valid(): @@ -566,7 +566,7 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): logger.debug("Form validation failed") else: - form = self.form(model, initial=initial_data) + form = self.form(initial=initial_data) restrict_form_fields(form, request.user) # Retrieve objects being edited diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py index a3695c10e8c..c6d0be882e8 100644 --- a/netbox/tenancy/forms/bulk_edit.py +++ b/netbox/tenancy/forms/bulk_edit.py @@ -31,6 +31,7 @@ class TenantGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = TenantGroup nullable_fields = ('parent', 'description') @@ -44,6 +45,7 @@ class TenantBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Tenant nullable_fields = ('group',) @@ -65,6 +67,7 @@ class ContactGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = ContactGroup nullable_fields = ('parent', 'description') @@ -78,6 +81,7 @@ class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = ContactRole nullable_fields = ('description',) @@ -106,4 +110,5 @@ class ContactBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = Contact nullable_fields = ('group', 'title', 'phone', 'email', 'address', 'comments') diff --git a/netbox/utilities/forms/forms.py b/netbox/utilities/forms/forms.py index 67a2bcb740f..05138df708d 100644 --- a/netbox/utilities/forms/forms.py +++ b/netbox/utilities/forms/forms.py @@ -10,7 +10,6 @@ from .widgets import APISelect, APISelectMultiple, ClearableFileInput, StaticSel __all__ = ( 'BootstrapMixin', 'BulkEditForm', - 'BulkEditMixin', 'BulkRenameForm', 'ConfirmationForm', 'CSVModelForm', @@ -65,17 +64,6 @@ class BootstrapMixin: field.widget.attrs['class'] = ' '.join((css, 'form-select')).strip() -class BulkEditMixin: - """ - Base form for editing multiple objects in bulk - """ - nullable_fields = () - - def __init__(self, model, *args, **kwargs): - super().__init__(*args, **kwargs) - self.model = model - - # # Form classes # @@ -94,8 +82,11 @@ class ConfirmationForm(BootstrapMixin, ReturnURLForm): confirm = forms.BooleanField(required=True, widget=forms.HiddenInput(), initial=True) -class BulkEditForm(BootstrapMixin, BulkEditMixin, forms.Form): - pass +class BulkEditForm(BootstrapMixin, forms.Form): + """ + Provides bulk edit support for objects. + """ + nullable_fields = () class BulkRenameForm(BootstrapMixin, forms.Form): diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index e4f6ab25c9a..b3bf8adf81a 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -33,6 +33,7 @@ class ClusterTypeBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = ClusterType nullable_fields = ('description',) @@ -46,6 +47,7 @@ class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = ClusterGroup nullable_fields = ('description',) @@ -87,6 +89,7 @@ class ClusterBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) + model = Cluster nullable_fields = ( 'group', 'site', 'comments', 'tenant', ) @@ -141,6 +144,7 @@ class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): label='Comments' ) + model = VirtualMachine nullable_fields = ( 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', ) @@ -193,6 +197,7 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = VMInterface nullable_fields = ( 'parent', 'bridge', 'mtu', 'description', ) diff --git a/netbox/wireless/forms/bulk_edit.py b/netbox/wireless/forms/bulk_edit.py index 0a3f0364eb5..91c34e4b143 100644 --- a/netbox/wireless/forms/bulk_edit.py +++ b/netbox/wireless/forms/bulk_edit.py @@ -29,6 +29,7 @@ class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): required=False ) + model = WirelessLANGroup nullable_fields = ('parent', 'description') @@ -67,6 +68,7 @@ class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): label='Pre-shared key' ) + model = WirelessLAN nullable_fields = ( 'ssid', 'group', 'vlan', 'description', 'auth_type', 'auth_cipher', 'auth_psk', ) @@ -102,6 +104,7 @@ class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): label='Pre-shared key' ) + model = WirelessLink nullable_fields = ( 'ssid', 'description', 'auth_type', 'auth_cipher', 'auth_psk', ) From d38620bad2cf38fb3ba3c9be3bd9a46d003fefc6 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 1 Feb 2022 11:05:48 -0500 Subject: [PATCH 137/271] Fix bulk nullification of custom fields --- netbox/netbox/forms/base.py | 19 ++++++++++++++----- netbox/netbox/views/generic/bulk_views.py | 6 ++++-- netbox/tenancy/forms/bulk_edit.py | 8 ++++---- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 9cd6bbd4710..723ae00e260 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -71,6 +71,10 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, forms.Form): """ nullable_fields = () + pk = forms.ModelMultipleChoiceField( + queryset=None, + widget=forms.MultipleHiddenInput + ) add_tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -80,6 +84,10 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, forms.Form): required=False ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['pk'].queryset = self.model.objects.all() + def _get_form_field(self, customfield): return customfield.to_form_field(set_initial=False, enforce_required=False) @@ -89,18 +97,19 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, forms.Form): """ nullable_custom_fields = [] for customfield in self._get_custom_fields(self._get_content_type()): + field_name = f'cf_{customfield.name}' + self.fields[field_name] = self._get_form_field(customfield) + # Record non-required custom fields as nullable if not customfield.required: - nullable_custom_fields.append(customfield.name) - - self.fields[customfield.name] = self._get_form_field(customfield) + nullable_custom_fields.append(field_name) # Annotate the field in the list of CustomField form fields - self.custom_fields[customfield.name] = customfield + self.custom_fields[field_name] = customfield # Annotate nullable custom fields (if any) on the form instance if nullable_custom_fields: - self.custom_fields = (*self.custom_fields, *nullable_custom_fields) + self.nullable_fields = (*self.nullable_fields, *nullable_custom_fields) class NetBoxModelFilterSetForm(BootstrapMixin, CustomFieldsMixin, forms.Form): diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 3db44ec913e..a3e9b48c192 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -481,10 +481,12 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): # Update custom fields for name in custom_fields: + assert name.startswith('cf_') + cf_name = name[3:] # Strip cf_ prefix if name in form.nullable_fields and name in nullified_fields: - obj.custom_field_data[name] = None + obj.custom_field_data[cf_name] = None elif name in form.changed_data: - obj.custom_field_data[name] = form.fields[name].prepare_value(form.cleaned_data[name]) + obj.custom_field_data[cf_name] = form.fields[name].prepare_value(form.cleaned_data[name]) obj.full_clean() obj.save() diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py index c6d0be882e8..9de4969fbf6 100644 --- a/netbox/tenancy/forms/bulk_edit.py +++ b/netbox/tenancy/forms/bulk_edit.py @@ -36,10 +36,10 @@ class TenantGroupBulkEditForm(NetBoxModelBulkEditForm): class TenantBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Tenant.objects.all(), - widget=forms.MultipleHiddenInput() - ) + # pk = forms.ModelMultipleChoiceField( + # queryset=Tenant.objects.all(), + # widget=forms.MultipleHiddenInput() + # ) group = DynamicModelChoiceField( queryset=TenantGroup.objects.all(), required=False From 5af18c2d8a595d78441465befc3cb187d2c3d89b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 1 Feb 2022 11:40:23 -0500 Subject: [PATCH 138/271] Move pk field declaration under NetBoxModelBulkEditForm --- netbox/circuits/forms/bulk_edit.py | 16 --- netbox/dcim/forms/bulk_edit.py | 120 ----------------------- netbox/ipam/forms/bulk_edit.py | 57 +---------- netbox/netbox/forms/base.py | 2 +- netbox/tenancy/forms/bulk_edit.py | 20 ---- netbox/virtualization/forms/bulk_edit.py | 20 ---- netbox/wireless/forms/bulk_edit.py | 12 --- 7 files changed, 2 insertions(+), 245 deletions(-) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 43419a871f6..8c1502d8402 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -15,10 +15,6 @@ __all__ = ( class ProviderBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Provider.objects.all(), - widget=forms.MultipleHiddenInput - ) asn = forms.IntegerField( required=False, label='ASN' @@ -54,10 +50,6 @@ class ProviderBulkEditForm(NetBoxModelBulkEditForm): class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ProviderNetwork.objects.all(), - widget=forms.MultipleHiddenInput - ) provider = DynamicModelChoiceField( queryset=Provider.objects.all(), required=False @@ -82,10 +74,6 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=CircuitType.objects.all(), - widget=forms.MultipleHiddenInput - ) description = forms.CharField( max_length=200, required=False @@ -96,10 +84,6 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): class CircuitBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Circuit.objects.all(), - widget=forms.MultipleHiddenInput - ) type = DynamicModelChoiceField( queryset=CircuitType.objects.all(), required=False diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index c7fbcf3f152..787f0339aac 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -58,10 +58,6 @@ __all__ = ( class RegionBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Region.objects.all(), - widget=forms.MultipleHiddenInput - ) parent = DynamicModelChoiceField( queryset=Region.objects.all(), required=False @@ -76,10 +72,6 @@ class RegionBulkEditForm(NetBoxModelBulkEditForm): class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) parent = DynamicModelChoiceField( queryset=SiteGroup.objects.all(), required=False @@ -94,10 +86,6 @@ class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): class SiteBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Site.objects.all(), - widget=forms.MultipleHiddenInput - ) status = forms.ChoiceField( choices=add_blank_choice(SiteStatusChoices), required=False, @@ -138,10 +126,6 @@ class SiteBulkEditForm(NetBoxModelBulkEditForm): class LocationBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Location.objects.all(), - widget=forms.MultipleHiddenInput - ) site = DynamicModelChoiceField( queryset=Site.objects.all(), required=False @@ -167,10 +151,6 @@ class LocationBulkEditForm(NetBoxModelBulkEditForm): class RackRoleBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RackRole.objects.all(), - widget=forms.MultipleHiddenInput - ) color = ColorField( required=False ) @@ -184,10 +164,6 @@ class RackRoleBulkEditForm(NetBoxModelBulkEditForm): class RackBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Rack.objects.all(), - widget=forms.MultipleHiddenInput - ) region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, @@ -284,10 +260,6 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): class RackReservationBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RackReservation.objects.all(), - widget=forms.MultipleHiddenInput() - ) user = forms.ModelChoiceField( queryset=User.objects.order_by( 'username' @@ -308,10 +280,6 @@ class RackReservationBulkEditForm(NetBoxModelBulkEditForm): class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Manufacturer.objects.all(), - widget=forms.MultipleHiddenInput - ) description = forms.CharField( max_length=200, required=False @@ -322,10 +290,6 @@ class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=DeviceType.objects.all(), - widget=forms.MultipleHiddenInput() - ) manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False @@ -353,10 +317,6 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ModuleType.objects.all(), - widget=forms.MultipleHiddenInput() - ) manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False @@ -370,10 +330,6 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=DeviceRole.objects.all(), - widget=forms.MultipleHiddenInput - ) color = ColorField( required=False ) @@ -392,10 +348,6 @@ class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): class PlatformBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Platform.objects.all(), - widget=forms.MultipleHiddenInput - ) manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False @@ -415,10 +367,6 @@ class PlatformBulkEditForm(NetBoxModelBulkEditForm): class DeviceBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Device.objects.all(), - widget=forms.MultipleHiddenInput() - ) manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False @@ -476,10 +424,6 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm): class ModuleBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Module.objects.all(), - widget=forms.MultipleHiddenInput() - ) manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False @@ -502,10 +446,6 @@ class ModuleBulkEditForm(NetBoxModelBulkEditForm): class CableBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Cable.objects.all(), - widget=forms.MultipleHiddenInput - ) type = forms.ChoiceField( choices=add_blank_choice(CableTypeChoices), required=False, @@ -558,10 +498,6 @@ class CableBulkEditForm(NetBoxModelBulkEditForm): class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VirtualChassis.objects.all(), - widget=forms.MultipleHiddenInput() - ) domain = forms.CharField( max_length=30, required=False @@ -572,10 +508,6 @@ class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=PowerPanel.objects.all(), - widget=forms.MultipleHiddenInput - ) region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, @@ -611,10 +543,6 @@ class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=PowerFeed.objects.all(), - widget=forms.MultipleHiddenInput - ) power_panel = DynamicModelChoiceField( queryset=PowerPanel.objects.all(), required=False @@ -928,10 +856,6 @@ class ConsolePortBulkEditForm( form_from_model(ConsolePort, ['label', 'type', 'speed', 'mark_connected', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=ConsolePort.objects.all(), - widget=forms.MultipleHiddenInput() - ) mark_connected = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect @@ -945,10 +869,6 @@ class ConsoleServerPortBulkEditForm( form_from_model(ConsoleServerPort, ['label', 'type', 'speed', 'mark_connected', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=ConsoleServerPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) mark_connected = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect @@ -962,10 +882,6 @@ class PowerPortBulkEditForm( form_from_model(PowerPort, ['label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=PowerPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) mark_connected = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect @@ -979,10 +895,6 @@ class PowerOutletBulkEditForm( form_from_model(PowerOutlet, ['label', 'type', 'feed_leg', 'power_port', 'mark_connected', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=PowerOutlet.objects.all(), - widget=forms.MultipleHiddenInput() - ) device = forms.ModelChoiceField( queryset=Device.objects.all(), required=False, @@ -1016,10 +928,6 @@ class InterfaceBulkEditForm( ]), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=Interface.objects.all(), - widget=forms.MultipleHiddenInput() - ) device = forms.ModelChoiceField( queryset=Device.objects.all(), required=False, @@ -1138,11 +1046,6 @@ class FrontPortBulkEditForm( form_from_model(FrontPort, ['label', 'type', 'color', 'mark_connected', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=FrontPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) - model = FrontPort nullable_fields = ('label', 'description') @@ -1151,11 +1054,6 @@ class RearPortBulkEditForm( form_from_model(RearPort, ['label', 'type', 'color', 'mark_connected', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=RearPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) - model = RearPort nullable_fields = ('label', 'description') @@ -1164,11 +1062,6 @@ class ModuleBayBulkEditForm( form_from_model(DeviceBay, ['label', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=ModuleBay.objects.all(), - widget=forms.MultipleHiddenInput() - ) - model = ModuleBay nullable_fields = ('label', 'position', 'description') @@ -1177,11 +1070,6 @@ class DeviceBayBulkEditForm( form_from_model(DeviceBay, ['label', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=DeviceBay.objects.all(), - widget=forms.MultipleHiddenInput() - ) - model = DeviceBay nullable_fields = ('label', 'description') @@ -1190,10 +1078,6 @@ class InventoryItemBulkEditForm( form_from_model(InventoryItem, ['label', 'role', 'manufacturer', 'part_id', 'description']), NetBoxModelBulkEditForm ): - pk = forms.ModelMultipleChoiceField( - queryset=InventoryItem.objects.all(), - widget=forms.MultipleHiddenInput() - ) role = DynamicModelChoiceField( queryset=InventoryItemRole.objects.all(), required=False @@ -1212,10 +1096,6 @@ class InventoryItemBulkEditForm( # class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=InventoryItemRole.objects.all(), - widget=forms.MultipleHiddenInput - ) color = ColorField( required=False ) diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 6002c1fe4fa..3e7bc88a470 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -31,10 +31,6 @@ __all__ = ( class VRFBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VRF.objects.all(), - widget=forms.MultipleHiddenInput() - ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False @@ -54,10 +50,6 @@ class VRFBulkEditForm(NetBoxModelBulkEditForm): class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RouteTarget.objects.all(), - widget=forms.MultipleHiddenInput() - ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False @@ -72,10 +64,6 @@ class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): class RIRBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RIR.objects.all(), - widget=forms.MultipleHiddenInput - ) is_private = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect @@ -90,10 +78,6 @@ class RIRBulkEditForm(NetBoxModelBulkEditForm): class ASNBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ASN.objects.all(), - widget=forms.MultipleHiddenInput() - ) sites = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False @@ -117,10 +101,6 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): class AggregateBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Aggregate.objects.all(), - widget=forms.MultipleHiddenInput() - ) rir = DynamicModelChoiceField( queryset=RIR.objects.all(), required=False, @@ -143,10 +123,6 @@ class AggregateBulkEditForm(NetBoxModelBulkEditForm): class RoleBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Role.objects.all(), - widget=forms.MultipleHiddenInput - ) weight = forms.IntegerField( required=False ) @@ -160,10 +136,6 @@ class RoleBulkEditForm(NetBoxModelBulkEditForm): class PrefixBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Prefix.objects.all(), - widget=forms.MultipleHiddenInput() - ) region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False @@ -225,10 +197,6 @@ class PrefixBulkEditForm(NetBoxModelBulkEditForm): class IPRangeBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=IPRange.objects.all(), - widget=forms.MultipleHiddenInput() - ) vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -259,10 +227,6 @@ class IPRangeBulkEditForm(NetBoxModelBulkEditForm): class IPAddressBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=IPAddress.objects.all(), - widget=forms.MultipleHiddenInput() - ) vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -304,10 +268,6 @@ class IPAddressBulkEditForm(NetBoxModelBulkEditForm): class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=FHRPGroup.objects.all(), - widget=forms.MultipleHiddenInput() - ) protocol = forms.ChoiceField( choices=add_blank_choice(FHRPGroupProtocolChoices), required=False, @@ -339,10 +299,6 @@ class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VLANGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) site = DynamicModelChoiceField( queryset=Site.objects.all(), required=False @@ -369,10 +325,6 @@ class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): class VLANBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VLAN.objects.all(), - widget=forms.MultipleHiddenInput() - ) region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False @@ -421,10 +373,6 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ServiceTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) protocol = forms.ChoiceField( choices=add_blank_choice(ServiceProtocolChoices), required=False, @@ -447,7 +395,4 @@ class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): class ServiceBulkEditForm(ServiceTemplateBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Service.objects.all(), - widget=forms.MultipleHiddenInput() - ) + model = Service diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 723ae00e260..a685482567f 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -72,7 +72,7 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, forms.Form): nullable_fields = () pk = forms.ModelMultipleChoiceField( - queryset=None, + queryset=None, # Set from self.model on init widget=forms.MultipleHiddenInput ) add_tags = DynamicModelMultipleChoiceField( diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py index 9de4969fbf6..bda7e698931 100644 --- a/netbox/tenancy/forms/bulk_edit.py +++ b/netbox/tenancy/forms/bulk_edit.py @@ -18,10 +18,6 @@ __all__ = ( # class TenantGroupBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=TenantGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) parent = DynamicModelChoiceField( queryset=TenantGroup.objects.all(), required=False @@ -36,10 +32,6 @@ class TenantGroupBulkEditForm(NetBoxModelBulkEditForm): class TenantBulkEditForm(NetBoxModelBulkEditForm): - # pk = forms.ModelMultipleChoiceField( - # queryset=Tenant.objects.all(), - # widget=forms.MultipleHiddenInput() - # ) group = DynamicModelChoiceField( queryset=TenantGroup.objects.all(), required=False @@ -54,10 +46,6 @@ class TenantBulkEditForm(NetBoxModelBulkEditForm): # class ContactGroupBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ContactGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) parent = DynamicModelChoiceField( queryset=ContactGroup.objects.all(), required=False @@ -72,10 +60,6 @@ class ContactGroupBulkEditForm(NetBoxModelBulkEditForm): class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ContactRole.objects.all(), - widget=forms.MultipleHiddenInput - ) description = forms.CharField( max_length=200, required=False @@ -86,10 +70,6 @@ class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): class ContactBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Contact.objects.all(), - widget=forms.MultipleHiddenInput() - ) group = DynamicModelChoiceField( queryset=ContactGroup.objects.all(), required=False diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index b3bf8adf81a..df664c46db7 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -24,10 +24,6 @@ __all__ = ( class ClusterTypeBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ClusterType.objects.all(), - widget=forms.MultipleHiddenInput - ) description = forms.CharField( max_length=200, required=False @@ -38,10 +34,6 @@ class ClusterTypeBulkEditForm(NetBoxModelBulkEditForm): class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ClusterGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) description = forms.CharField( max_length=200, required=False @@ -52,10 +44,6 @@ class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): class ClusterBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Cluster.objects.all(), - widget=forms.MultipleHiddenInput() - ) type = DynamicModelChoiceField( queryset=ClusterType.objects.all(), required=False @@ -96,10 +84,6 @@ class ClusterBulkEditForm(NetBoxModelBulkEditForm): class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VirtualMachine.objects.all(), - widget=forms.MultipleHiddenInput() - ) status = forms.ChoiceField( choices=add_blank_choice(VirtualMachineStatusChoices), required=False, @@ -151,10 +135,6 @@ class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VMInterface.objects.all(), - widget=forms.MultipleHiddenInput() - ) virtual_machine = forms.ModelChoiceField( queryset=VirtualMachine.objects.all(), required=False, diff --git a/netbox/wireless/forms/bulk_edit.py b/netbox/wireless/forms/bulk_edit.py index 91c34e4b143..70360d6efea 100644 --- a/netbox/wireless/forms/bulk_edit.py +++ b/netbox/wireless/forms/bulk_edit.py @@ -16,10 +16,6 @@ __all__ = ( class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=WirelessLANGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) parent = DynamicModelChoiceField( queryset=WirelessLANGroup.objects.all(), required=False @@ -34,10 +30,6 @@ class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=WirelessLAN.objects.all(), - widget=forms.MultipleHiddenInput - ) group = DynamicModelChoiceField( queryset=WirelessLANGroup.objects.all(), required=False @@ -75,10 +67,6 @@ class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=WirelessLink.objects.all(), - widget=forms.MultipleHiddenInput - ) ssid = forms.CharField( max_length=SSID_MAX_LENGTH, required=False, From 74c4f12b274cefbf8fe89571be440ff734c8ecca Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 1 Feb 2022 14:29:52 -0500 Subject: [PATCH 139/271] Closes #8509: CSRF_TRUSTED_ORIGINS is now a discrete configuration parameter --- docs/configuration/optional-settings.md | 15 +++++++++++++++ docs/release-notes/version-3.2.md | 1 + netbox/netbox/settings.py | 3 +-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/configuration/optional-settings.md b/docs/configuration/optional-settings.md index 110ca932210..081e4b776ab 100644 --- a/docs/configuration/optional-settings.md +++ b/docs/configuration/optional-settings.md @@ -66,6 +66,21 @@ CORS_ORIGIN_WHITELIST = [ --- +## CSRF_TRUSTED_ORIGINS + +Default: `[]` + +Defines a list of trusted origins for unsafe (e.g. `POST`) requests. This is a pass-through to Django's [`CSRF_TRUSTED_ORIGINS`](https://docs.djangoproject.com/en/4.0/ref/settings/#std:setting-CSRF_TRUSTED_ORIGINS) setting. Note that each host listed must specify a scheme (e.g. `http://` or `https://). + +```python +CSRF_TRUSTED_ORIGINS = ( + 'http://netbox.local', + 'https://netbox.local', +) +``` + +--- + ## DEBUG Default: False diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 1b4a7ef8713..7168a13d00b 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -92,6 +92,7 @@ A new REST API endpoint has been added at `/api/ipam/vlan-groups//available- * [#7748](https://github.com/netbox-community/netbox/issues/7748) - Remove legacy contact fields from site model * [#8031](https://github.com/netbox-community/netbox/issues/8031) - Remove automatic redirection of legacy slug-based URLs * [#8195](https://github.com/netbox-community/netbox/issues/8195), [#8454](https://github.com/netbox-community/netbox/issues/8454) - Use 64-bit integers for all primary keys +* [#8509](https://github.com/netbox-community/netbox/issues/8509) - `CSRF_TRUSTED_ORIGINS` is now a discrete configuration parameter (rather than being populated from `ALLOWED_HOSTS`) ### REST API Changes diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 2c33ec862b9..4ca24fbf112 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -80,6 +80,7 @@ if BASE_PATH: CORS_ORIGIN_ALLOW_ALL = getattr(configuration, 'CORS_ORIGIN_ALLOW_ALL', False) CORS_ORIGIN_REGEX_WHITELIST = getattr(configuration, 'CORS_ORIGIN_REGEX_WHITELIST', []) CORS_ORIGIN_WHITELIST = getattr(configuration, 'CORS_ORIGIN_WHITELIST', []) +CSRF_TRUSTED_ORIGINS = getattr(configuration, 'CSRF_TRUSTED_ORIGINS', []) DATE_FORMAT = getattr(configuration, 'DATE_FORMAT', 'N j, Y') DATETIME_FORMAT = getattr(configuration, 'DATETIME_FORMAT', 'N j, Y g:i a') DEBUG = getattr(configuration, 'DEBUG', False) @@ -404,8 +405,6 @@ MESSAGE_TAGS = { LOGIN_URL = f'/{BASE_PATH}login/' LOGIN_REDIRECT_URL = f'/{BASE_PATH}' -CSRF_TRUSTED_ORIGINS = ALLOWED_HOSTS - DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # Exclude potentially sensitive models from wildcard view exemption. These may still be exempted From ef75f7e65030121e22a63e30e1c76f4d1f31c9ba Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 1 Feb 2022 13:01:28 -0500 Subject: [PATCH 140/271] Upgrade to Django 4.0 --- requirements.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index cb6d4b6c90a..26a0151e014 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Django==3.2.12 +Django==4.0.2 django-cors-headers==3.11.0 django-debug-toolbar==3.2.4 django-filter==21.1 @@ -9,11 +9,13 @@ django-prometheus==2.2.0 django-redis==5.2.0 django-rq==2.5.1 django-tables2==2.4.1 -django-taggit==2.0.0 +django-taggit==2.1.0 django-timezone-field==4.2.3 djangorestframework==3.12.4 drf-yasg[validation]==1.20.0 -graphene_django==2.15.0 +#graphene_django==2.15.0 +# Installing from PR origin temporarily +git+git://github.com/MisterGlass/graphene-django.git gunicorn==20.1.0 Jinja2==3.0.3 Markdown==3.3.6 From 7611cfddae9f127ccad934923198bf09fe7ddb95 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 1 Feb 2022 13:20:03 -0500 Subject: [PATCH 141/271] Tweak related names in old migrations to avoid creating new ones --- netbox/dcim/migrations/0002_squashed.py | 18 ++++---- netbox/dcim/migrations/0003_squashed_0130.py | 16 +++---- netbox/dcim/migrations/0146_modules.py | 46 +++++++++---------- .../0149_inventoryitem_templates.py | 2 +- netbox/extras/migrations/0001_squashed.py | 4 +- .../extras/migrations/0002_squashed_0059.py | 22 ++++----- .../0068_configcontext_cluster_types.py | 2 +- 7 files changed, 55 insertions(+), 55 deletions(-) diff --git a/netbox/dcim/migrations/0002_squashed.py b/netbox/dcim/migrations/0002_squashed.py index a1b6db30a14..c7325210eca 100644 --- a/netbox/dcim/migrations/0002_squashed.py +++ b/netbox/dcim/migrations/0002_squashed.py @@ -58,7 +58,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='rearporttemplate', name='device_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rearporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AddField( model_name='rearport', @@ -73,7 +73,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='rearport', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rearports', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='rearport', @@ -128,7 +128,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='powerporttemplate', name='device_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='powerporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AddField( model_name='powerport', @@ -148,7 +148,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='powerport', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='powerports', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='powerport', @@ -173,7 +173,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='poweroutlettemplate', name='device_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlettemplates', to='dcim.devicetype'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AddField( model_name='poweroutlettemplate', @@ -198,7 +198,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='poweroutlet', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlets', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='poweroutlet', @@ -258,7 +258,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='inventoryitem', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='inventoryitems', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='inventoryitem', @@ -278,7 +278,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='interfacetemplate', name='device_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interfacetemplates', to='dcim.devicetype'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AddField( model_name='interface', @@ -298,7 +298,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='interface', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interfaces', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='interface', diff --git a/netbox/dcim/migrations/0003_squashed_0130.py b/netbox/dcim/migrations/0003_squashed_0130.py index 48ea238d93b..592aaf9a878 100644 --- a/netbox/dcim/migrations/0003_squashed_0130.py +++ b/netbox/dcim/migrations/0003_squashed_0130.py @@ -165,7 +165,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='frontporttemplate', name='device_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AddField( model_name='frontporttemplate', @@ -185,7 +185,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='frontport', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontports', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='frontport', @@ -210,12 +210,12 @@ class Migration(migrations.Migration): migrations.AddField( model_name='devicebaytemplate', name='device_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='devicebaytemplates', to='dcim.devicetype'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AddField( model_name='devicebay', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='devicebays', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='devicebay', @@ -290,7 +290,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='consoleserverporttemplate', name='device_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AddField( model_name='consoleserverport', @@ -310,7 +310,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='consoleserverport', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverports', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='consoleserverport', @@ -320,7 +320,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='consoleporttemplate', name='device_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AddField( model_name='consoleport', @@ -340,7 +340,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='consoleport', name='device', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleports', to='dcim.device'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device'), ), migrations.AddField( model_name='consoleport', diff --git a/netbox/dcim/migrations/0146_modules.py b/netbox/dcim/migrations/0146_modules.py index cdc7960a490..0b0282c802a 100644 --- a/netbox/dcim/migrations/0146_modules.py +++ b/netbox/dcim/migrations/0146_modules.py @@ -45,37 +45,37 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='consoleporttemplate', name='device_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AlterField( model_name='consoleserverporttemplate', name='device_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AlterField( model_name='frontporttemplate', name='device_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='frontporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AlterField( model_name='interfacetemplate', name='device_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interfacetemplates', to='dcim.devicetype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AlterField( model_name='poweroutlettemplate', name='device_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlettemplates', to='dcim.devicetype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AlterField( model_name='powerporttemplate', name='device_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='powerporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.AlterField( model_name='rearporttemplate', name='device_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rearporttemplates', to='dcim.devicetype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), ), migrations.CreateModel( name='ModuleType', @@ -107,7 +107,7 @@ class Migration(migrations.Migration): ('label', models.CharField(blank=True, max_length=64)), ('position', models.CharField(blank=True, max_length=30)), ('description', models.CharField(blank=True, max_length=200)), - ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modulebays', to='dcim.device')), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.device')), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), ], options={ @@ -138,72 +138,72 @@ class Migration(migrations.Migration): migrations.AddField( model_name='consoleport', name='module', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleports', to='dcim.module'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.module'), ), migrations.AddField( model_name='consoleporttemplate', name='module_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleporttemplates', to='dcim.moduletype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.moduletype'), ), migrations.AddField( model_name='consoleserverport', name='module', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverports', to='dcim.module'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.module'), ), migrations.AddField( model_name='consoleserverporttemplate', name='module_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverporttemplates', to='dcim.moduletype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.moduletype'), ), migrations.AddField( model_name='frontport', name='module', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='frontports', to='dcim.module'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.module'), ), migrations.AddField( model_name='frontporttemplate', name='module_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='frontporttemplates', to='dcim.moduletype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.moduletype'), ), migrations.AddField( model_name='interface', name='module', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interfaces', to='dcim.module'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.module'), ), migrations.AddField( model_name='interfacetemplate', name='module_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interfacetemplates', to='dcim.moduletype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.moduletype'), ), migrations.AddField( model_name='poweroutlet', name='module', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlets', to='dcim.module'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.module'), ), migrations.AddField( model_name='poweroutlettemplate', name='module_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlettemplates', to='dcim.moduletype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.moduletype'), ), migrations.AddField( model_name='powerport', name='module', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='powerports', to='dcim.module'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.module'), ), migrations.AddField( model_name='powerporttemplate', name='module_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='powerporttemplates', to='dcim.moduletype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.moduletype'), ), migrations.AddField( model_name='rearport', name='module', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rearports', to='dcim.module'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.module'), ), migrations.AddField( model_name='rearporttemplate', name='module_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rearporttemplates', to='dcim.moduletype'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.moduletype'), ), migrations.AlterUniqueTogether( name='consoleporttemplate', @@ -244,7 +244,7 @@ class Migration(migrations.Migration): ('label', models.CharField(blank=True, max_length=64)), ('position', models.CharField(blank=True, max_length=30)), ('description', models.CharField(blank=True, max_length=200)), - ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modulebaytemplates', to='dcim.devicetype')), + ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype')), ], options={ 'ordering': ('device_type', '_name'), diff --git a/netbox/dcim/migrations/0149_inventoryitem_templates.py b/netbox/dcim/migrations/0149_inventoryitem_templates.py index 7ef34768052..f0b1f3cff53 100644 --- a/netbox/dcim/migrations/0149_inventoryitem_templates.py +++ b/netbox/dcim/migrations/0149_inventoryitem_templates.py @@ -30,7 +30,7 @@ class Migration(migrations.Migration): ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), ('level', models.PositiveIntegerField(editable=False)), ('component_type', models.ForeignKey(blank=True, limit_choices_to=models.Q(('app_label', 'dcim'), ('model__in', ('consoleporttemplate', 'consoleserverporttemplate', 'frontporttemplate', 'interfacetemplate', 'poweroutlettemplate', 'powerporttemplate', 'rearporttemplate'))), null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')), - ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='inventoryitemtemplates', to='dcim.devicetype')), + ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype')), ('manufacturer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='inventory_item_templates', to='dcim.manufacturer')), ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='child_items', to='dcim.inventoryitemtemplate')), ('role', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='inventory_item_templates', to='dcim.inventoryitemrole')), diff --git a/netbox/extras/migrations/0001_squashed.py b/netbox/extras/migrations/0001_squashed.py index 916dab7b446..ea89400e16e 100644 --- a/netbox/extras/migrations/0001_squashed.py +++ b/netbox/extras/migrations/0001_squashed.py @@ -99,8 +99,8 @@ class Migration(migrations.Migration): fields=[ ('object_id', models.IntegerField(db_index=True)), ('id', models.BigAutoField(primary_key=True, serialize=False)), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extras_taggeditem_tagged_items', to='contenttypes.contenttype')), - ('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extras_taggeditem_items', to='extras.tag')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_tagged_items', to='contenttypes.contenttype')), + ('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(app_label)s_%(class)s_items', to='extras.tag')), ], ), migrations.CreateModel( diff --git a/netbox/extras/migrations/0002_squashed_0059.py b/netbox/extras/migrations/0002_squashed_0059.py index 9098d286f01..98bed255a54 100644 --- a/netbox/extras/migrations/0002_squashed_0059.py +++ b/netbox/extras/migrations/0002_squashed_0059.py @@ -75,57 +75,57 @@ class Migration(migrations.Migration): migrations.AddField( model_name='configcontext', name='cluster_groups', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_cluster_groups_+', to='virtualization.ClusterGroup'), + field=models.ManyToManyField(blank=True, related_name='+', to='virtualization.ClusterGroup'), ), migrations.AddField( model_name='configcontext', name='clusters', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_clusters_+', to='virtualization.Cluster'), + field=models.ManyToManyField(blank=True, related_name='+', to='virtualization.Cluster'), ), migrations.AddField( model_name='configcontext', name='device_types', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_device_types_+', to='dcim.DeviceType'), + field=models.ManyToManyField(blank=True, related_name='+', to='dcim.DeviceType'), ), migrations.AddField( model_name='configcontext', name='platforms', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_platforms_+', to='dcim.Platform'), + field=models.ManyToManyField(blank=True, related_name='+', to='dcim.Platform'), ), migrations.AddField( model_name='configcontext', name='regions', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_regions_+', to='dcim.Region'), + field=models.ManyToManyField(blank=True, related_name='+', to='dcim.Region'), ), migrations.AddField( model_name='configcontext', name='roles', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_roles_+', to='dcim.DeviceRole'), + field=models.ManyToManyField(blank=True, related_name='+', to='dcim.DeviceRole'), ), migrations.AddField( model_name='configcontext', name='site_groups', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_site_groups_+', to='dcim.SiteGroup'), + field=models.ManyToManyField(blank=True, related_name='+', to='dcim.SiteGroup'), ), migrations.AddField( model_name='configcontext', name='sites', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_sites_+', to='dcim.Site'), + field=models.ManyToManyField(blank=True, related_name='+', to='dcim.Site'), ), migrations.AddField( model_name='configcontext', name='tags', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_tags_+', to='extras.Tag'), + field=models.ManyToManyField(blank=True, related_name='+', to='extras.Tag'), ), migrations.AddField( model_name='configcontext', name='tenant_groups', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_tenant_groups_+', to='tenancy.TenantGroup'), + field=models.ManyToManyField(blank=True, related_name='+', to='tenancy.TenantGroup'), ), migrations.AddField( model_name='configcontext', name='tenants', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_tenants_+', to='tenancy.Tenant'), + field=models.ManyToManyField(blank=True, related_name='+', to='tenancy.Tenant'), ), migrations.AlterUniqueTogether( name='webhook', diff --git a/netbox/extras/migrations/0068_configcontext_cluster_types.py b/netbox/extras/migrations/0068_configcontext_cluster_types.py index 40c7887e3db..abe90013ec9 100644 --- a/netbox/extras/migrations/0068_configcontext_cluster_types.py +++ b/netbox/extras/migrations/0068_configcontext_cluster_types.py @@ -12,6 +12,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='configcontext', name='cluster_types', - field=models.ManyToManyField(blank=True, related_name='_extras_configcontext_cluster_types_+', to='virtualization.ClusterType'), + field=models.ManyToManyField(blank=True, related_name='+', to='virtualization.ClusterType'), ), ] From 630ff2abb4f9368bb2329579b0b0d6c00af3bd3d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 1 Feb 2022 13:31:53 -0500 Subject: [PATCH 142/271] Remove dependency on is_safe_url() --- netbox/netbox/views/generic/object_views.py | 10 +++------- netbox/users/views.py | 19 +++++++++---------- netbox/utilities/views.py | 9 +++------ 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 316c3a1ee7d..a078f565c9f 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -9,7 +9,6 @@ from django.forms.widgets import HiddenInput from django.shortcuts import redirect, render from django.urls import reverse from django.utils.html import escape -from django.utils.http import is_safe_url from django.utils.safestring import mark_safe from extras.signals import clear_webhooks @@ -259,9 +258,7 @@ class ObjectImportView(GetReturnURLMixin, BaseObjectView): if '_addanother' in request.POST: return redirect(request.get_full_path()) - return_url = form.cleaned_data.get('return_url') - if return_url is not None and is_safe_url(url=return_url, allowed_hosts=request.get_host()): - return redirect(return_url) + self.get_return_url(request, obj) return redirect(self.get_return_url(request, obj)) else: @@ -507,10 +504,9 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): messages.success(request, msg) return_url = form.cleaned_data.get('return_url') - if return_url is not None and is_safe_url(url=return_url, allowed_hosts=request.get_host()): + if return_url and return_url.startswith('/'): return redirect(return_url) - else: - return redirect(self.get_return_url(request, obj)) + return redirect(self.get_return_url(request, obj)) else: logger.debug("Form validation failed") diff --git a/netbox/users/views.py b/netbox/users/views.py index cd3c34aa9b5..43c65eada13 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -10,7 +10,6 @@ from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.decorators import method_decorator -from django.utils.http import is_safe_url from django.views.decorators.debug import sensitive_post_parameters from django.views.generic import View from social_core.backends.utils import load_backends @@ -78,17 +77,17 @@ class LoginView(View): }) def redirect_to_next(self, request, logger): - if request.method == "POST": - redirect_to = request.POST.get('next', settings.LOGIN_REDIRECT_URL) + data = request.POST if request.method == "POST" else request.GET + redirect_url = data.get('next', settings.LOGIN_REDIRECT_URL) + + if redirect_url and redirect_url.startswith('/'): + logger.debug(f"Redirecting user to {redirect_url}") else: - redirect_to = request.GET.get('next', settings.LOGIN_REDIRECT_URL) + if redirect_url: + logger.warning(f"Ignoring unsafe 'next' URL passed to login form: {redirect_url}") + redirect_url = reverse('home') - if redirect_to and not is_safe_url(url=redirect_to, allowed_hosts=request.get_host()): - logger.warning(f"Ignoring unsafe 'next' URL passed to login form: {redirect_to}") - redirect_to = reverse('home') - - logger.debug(f"Redirecting user to {redirect_to}") - return HttpResponseRedirect(redirect_to) + return HttpResponseRedirect(redirect_url) class LogoutView(View): diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index efea0b867d9..858e7b4913f 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -1,10 +1,7 @@ from django.contrib.auth.mixins import AccessMixin from django.core.exceptions import ImproperlyConfigured -from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.urls.exceptions import NoReverseMatch -from django.utils.http import is_safe_url -from django.views.generic import View from .permissions import resolve_permission @@ -103,9 +100,9 @@ class GetReturnURLMixin: # First, see if `return_url` was specified as a query parameter or form data. Use this URL only if it's # considered safe. - query_param = request.GET.get('return_url') or request.POST.get('return_url') - if query_param and is_safe_url(url=query_param, allowed_hosts=request.get_host()): - return query_param + return_url = request.GET.get('return_url') or request.POST.get('return_url') + if return_url and return_url.startswith('/'): + return return_url # Next, check if the object being modified (if any) has an absolute URL. if obj is not None and obj.pk and hasattr(obj, 'get_absolute_url'): From 0e95ca7b69148525cedd91c99dfaa81fc3d68332 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 1 Feb 2022 14:10:25 -0500 Subject: [PATCH 143/271] Fix ProgrammingError exception when annotating config context data --- netbox/extras/querysets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/querysets.py b/netbox/extras/querysets.py index 982f33d0206..21727d3d480 100644 --- a/netbox/extras/querysets.py +++ b/netbox/extras/querysets.py @@ -82,7 +82,7 @@ class ConfigContextModelQuerySet(RestrictedQuerySet): self._get_config_context_filters() ).annotate( _data=EmptyGroupByJSONBAgg('data', ordering=['weight', 'name']) - ).values("_data") + ).values("_data").order_by() ) ).distinct() From 6575af6b93f32a2b2bac93458ef26621797ed0e8 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 3 Feb 2022 13:25:27 -0500 Subject: [PATCH 144/271] Fix saving interfaces --- netbox/templates/dcim/interface_edit.html | 7 ++++++- .../virtualization/vminterface_edit.html | 15 ++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/netbox/templates/dcim/interface_edit.html b/netbox/templates/dcim/interface_edit.html index e45cdd685c7..4c7545ee632 100644 --- a/netbox/templates/dcim/interface_edit.html +++ b/netbox/templates/dcim/interface_edit.html @@ -2,13 +2,18 @@ {% load form_helpers %} {% block form %} + {# Render hidden fields #} + {% for field in form.hidden_fields %} + {{ field }} + {% endfor %} +
    Interface
    {% if form.instance.device %}
    - +
    diff --git a/netbox/templates/virtualization/vminterface_edit.html b/netbox/templates/virtualization/vminterface_edit.html index 687c6c090c0..de882557432 100644 --- a/netbox/templates/virtualization/vminterface_edit.html +++ b/netbox/templates/virtualization/vminterface_edit.html @@ -2,17 +2,22 @@ {% load form_helpers %} {% block form %} + {# Render hidden fields #} + {% for field in form.hidden_fields %} + {{ field }} + {% endfor %} +
    Interface
    {% if form.instance.virtual_machine %} -
    - -
    - -
    +
    + +
    +
    +
    {% endif %} {% render_field form.name %} {% render_field form.description %} From ac1c0b071550a3ab30f0a4fa5b3104f71cc9cd40 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 3 Feb 2022 13:52:42 -0500 Subject: [PATCH 145/271] #8054: Allow replacing default static choices --- docs/configuration/optional-settings.md | 16 ++++++++++++---- netbox/utilities/choices.py | 14 ++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/docs/configuration/optional-settings.md b/docs/configuration/optional-settings.md index 081e4b776ab..384d368fa90 100644 --- a/docs/configuration/optional-settings.md +++ b/docs/configuration/optional-settings.md @@ -174,11 +174,11 @@ EXEMPT_VIEW_PERMISSIONS = ['*'] ## FIELD_CHOICES -Default: Empty dictionary +Some static choice fields on models can be configured with custom values. This is done by defining `FIELD_CHOICES` as a dictionary mapping model fields to their choices. Each choice in the list must have a database value and a human-friendly label, and may optionally specify a color. (A list of available colors is provided below.) -Some static choice fields on models can be configured with custom values. This is done by defining `FIELD_CHOICES` as a dictionary mapping model fields to their choices list. Each choice in the list must have a database value and a human-friendly label, and may optionally specify a color. (A list of available colors is provided below.) +The choices provided can either replace the stock choices provided by NetBox, or append to them. To _replace_ the available choices, specify the app, model, and field name separated by dots. For example, the site model would be referenced as `dcim.Site.status`. To _extend_ the available choices, append a plus sign to the end of this string (e.g. `dcim.Site.status+`). -For example, to specify a custom set of choices for the site status field: +For example, the following configuration would replace the default site status choices with the options Foo, Bar, and Baz: ```python FIELD_CHOICES = { @@ -190,7 +190,15 @@ FIELD_CHOICES = { } ``` -These will be appended to the stock choices for the field. +Appending a plus sign to the field identifier would instead _add_ these choices to the ones already offered: + +```python +FIELD_CHOICES = { + 'dcim.Site.status+': ( + ... + ) +} +``` The following model field support configurable choices: diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index b500f5b9d43..415c11ddf0e 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -8,12 +8,14 @@ class ChoiceSetMeta(type): def __new__(mcs, name, bases, attrs): # Extend static choices with any configured choices - key = attrs.get('key') - if key: - try: - attrs['CHOICES'].extend(settings.FIELD_CHOICES[key]) - except KeyError: - pass + replace_key = attrs.get('key') + extend_key = f'{replace_key}+' if replace_key else None + if replace_key and replace_key in settings.FIELD_CHOICES: + # Replace the stock choices + attrs['CHOICES'] = settings.FIELD_CHOICES[replace_key] + elif extend_key and extend_key in settings.FIELD_CHOICES: + # Extend the stock choices + attrs['CHOICES'].extend(settings.FIELD_CHOICES[extend_key]) # Define choice tuples and color maps attrs['_choices'] = [] From 60e87cd4966c2478bf13c8ea53a969604e79fff3 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 4 Feb 2022 09:59:53 -0500 Subject: [PATCH 146/271] Enable the use of fieldsets on bulk edit forms --- netbox/circuits/forms/bulk_edit.py | 15 ++- netbox/dcim/forms/bulk_edit.py | 109 +++++++++++++++++- netbox/ipam/forms/bulk_edit.py | 44 +++++++ netbox/netbox/forms/base.py | 2 + netbox/netbox/views/generic/bulk_views.py | 2 +- .../templates/generic/object_bulk_edit.html | 72 ++++++++++-- netbox/tenancy/forms/bulk_edit.py | 12 ++ netbox/virtualization/forms/bulk_edit.py | 19 +++ netbox/wireless/forms/bulk_edit.py | 11 ++ 9 files changed, 273 insertions(+), 13 deletions(-) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 8c1502d8402..8fc76e94045 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -44,6 +44,9 @@ class ProviderBulkEditForm(NetBoxModelBulkEditForm): ) model = Provider + fieldsets = ( + (None, ('asn', 'account', 'portal_url', 'noc_contact', 'admin_contact')), + ) nullable_fields = ( 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', ) @@ -56,7 +59,8 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): ) service_id = forms.CharField( max_length=100, - required=False + required=False, + label='Service ID' ) description = forms.CharField( max_length=200, @@ -68,6 +72,9 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): ) model = ProviderNetwork + fieldsets = ( + (None, ('provider', 'service_id', 'description')), + ) nullable_fields = ( 'service_id', 'description', 'comments', ) @@ -80,6 +87,9 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): ) model = CircuitType + fieldsets = ( + (None, ('description',)), + ) nullable_fields = ('description',) @@ -116,6 +126,9 @@ class CircuitBulkEditForm(NetBoxModelBulkEditForm): ) model = Circuit + fieldsets = ( + (None, ('type', 'provider', 'status', 'tenant', 'commit_rate', 'description')), + ) nullable_fields = ( 'tenant', 'commit_rate', 'description', 'comments', ) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 787f0339aac..41982480d83 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -68,6 +68,9 @@ class RegionBulkEditForm(NetBoxModelBulkEditForm): ) model = Region + fieldsets = ( + (None, ('parent', 'description')), + ) nullable_fields = ('parent', 'description') @@ -82,6 +85,9 @@ class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): ) model = SiteGroup + fieldsets = ( + (None, ('parent', 'description')), + ) nullable_fields = ('parent', 'description') @@ -120,6 +126,9 @@ class SiteBulkEditForm(NetBoxModelBulkEditForm): ) model = Site + fieldsets = ( + (None, ('status', 'region', 'group', 'tenant', 'asns', 'time_zone', 'description')), + ) nullable_fields = ( 'region', 'group', 'tenant', 'asns', 'description', 'time_zone', ) @@ -147,6 +156,9 @@ class LocationBulkEditForm(NetBoxModelBulkEditForm): ) model = Location + fieldsets = ( + (None, ('site', 'parent', 'tenant', 'description')), + ) nullable_fields = ('parent', 'tenant', 'description') @@ -160,6 +172,9 @@ class RackRoleBulkEditForm(NetBoxModelBulkEditForm): ) model = RackRole + fieldsets = ( + (None, ('color', 'description')), + ) nullable_fields = ('color', 'description') @@ -254,6 +269,11 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): ) model = Rack + fieldsets = ( + ('Rack', ('status', 'role', 'tenant', 'serial', 'asset_tag')), + ('Location', ('region', 'site_group', 'site', 'location')), + ('Hardware', ('type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit')), + ) nullable_fields = ( 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'comments', ) @@ -277,6 +297,9 @@ class RackReservationBulkEditForm(NetBoxModelBulkEditForm): ) model = RackReservation + fieldsets = ( + (None, ('user', 'tenant', 'description')), + ) class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): @@ -286,6 +309,9 @@ class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): ) model = Manufacturer + fieldsets = ( + (None, ('description',)), + ) nullable_fields = ('description',) @@ -313,6 +339,9 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): ) model = DeviceType + fieldsets = ( + (None, ('manufacturer', 'part_number', 'u_height', 'is_full_depth', 'airflow')), + ) nullable_fields = ('part_number', 'airflow') @@ -326,6 +355,9 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): ) model = ModuleType + fieldsets = ( + (None, ('manufacturer', 'part_number')), + ) nullable_fields = ('part_number',) @@ -344,6 +376,9 @@ class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): ) model = DeviceRole + fieldsets = ( + (None, ('color', 'vm_role', 'description')), + ) nullable_fields = ('color', 'description') @@ -363,6 +398,9 @@ class PlatformBulkEditForm(NetBoxModelBulkEditForm): ) model = Platform + fieldsets = ( + (None, ('manufacturer', 'napalm_driver', 'description')), + ) nullable_fields = ('manufacturer', 'napalm_driver', 'description') @@ -418,6 +456,11 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm): ) model = Device + fieldsets = ( + ('Device', ('device_role', 'status', 'tenant', 'platform')), + ('Location', ('site', 'location')), + ('Hardware', ('manufacturer', 'device_type', 'airflow', 'serial')), + ) nullable_fields = ( 'tenant', 'platform', 'serial', 'airflow', ) @@ -442,6 +485,9 @@ class ModuleBulkEditForm(NetBoxModelBulkEditForm): ) model = Module + fieldsets = ( + (None, ('manufacturer', 'module_type', 'serial')), + ) nullable_fields = ('serial',) @@ -481,6 +527,10 @@ class CableBulkEditForm(NetBoxModelBulkEditForm): ) model = Cable + fieldsets = ( + (None, ('type', 'status', 'tenant', 'label')), + ('Attributes', ('color', 'length', 'length_unit')), + ) nullable_fields = ( 'type', 'status', 'tenant', 'label', 'color', 'length', ) @@ -504,6 +554,9 @@ class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): ) model = VirtualChassis + fieldsets = ( + (None, ('domain',)), + ) nullable_fields = ('domain',) @@ -539,6 +592,9 @@ class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): ) model = PowerPanel + fieldsets = ( + (None, ('region', 'site_group', 'site', 'location')), + ) nullable_fields = ('location',) @@ -594,6 +650,10 @@ class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): ) model = PowerFeed + fieldsets = ( + (None, ('power_panel', 'rack', 'status', 'type', 'mark_connected')), + ('Power', ('supply', 'phase', 'voltage', 'amperage', 'max_utilization')) + ) nullable_fields = ('location', 'comments') @@ -862,6 +922,9 @@ class ConsolePortBulkEditForm( ) model = ConsolePort + fieldsets = ( + (None, ('type', 'label', 'speed', 'description', 'mark_connected')), + ) nullable_fields = ('label', 'description') @@ -875,6 +938,9 @@ class ConsoleServerPortBulkEditForm( ) model = ConsoleServerPort + fieldsets = ( + (None, ('type', 'label', 'speed', 'description', 'mark_connected')), + ) nullable_fields = ('label', 'description') @@ -888,6 +954,10 @@ class PowerPortBulkEditForm( ) model = PowerPort + fieldsets = ( + (None, ('type', 'label', 'description', 'mark_connected')), + ('Power', ('maximum_draw', 'allocated_draw')), + ) nullable_fields = ('label', 'description') @@ -907,6 +977,10 @@ class PowerOutletBulkEditForm( ) model = PowerOutlet + fieldsets = ( + (None, ('type', 'label', 'description', 'mark_connected')), + ('Power', ('feed_leg', 'power_port')), + ) nullable_fields = ('label', 'type', 'feed_leg', 'power_port', 'description') def __init__(self, *args, **kwargs): @@ -923,8 +997,9 @@ class PowerOutletBulkEditForm( class InterfaceBulkEditForm( form_from_model(Interface, [ - 'label', 'type', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected', - 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', + 'label', 'type', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'mgmt_only', + 'mark_connected', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', + 'tx_power', ]), NetBoxModelBulkEditForm ): @@ -956,7 +1031,7 @@ class InterfaceBulkEditForm( ) speed = forms.IntegerField( required=False, - widget=SelectSpeedWidget(attrs={'readonly': None}), + widget=SelectSpeedWidget(), label='Speed' ) mgmt_only = forms.NullBooleanField( @@ -983,6 +1058,14 @@ class InterfaceBulkEditForm( ) model = Interface + fieldsets = ( + (None, ('type', 'label', 'speed', 'duplex', 'description')), + ('Addressing', ('vrf', 'mac_address', 'wwn')), + ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')), + ('Related Interfaces', ('parent', 'bridge', 'lag')), + ('802.1Q Switching', ('mode', 'untagged_vlan', 'tagged_vlans')), + ('Wireless', ('rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width')), + ) nullable_fields = ( 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'description', 'mode', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'vrf', @@ -1047,6 +1130,9 @@ class FrontPortBulkEditForm( NetBoxModelBulkEditForm ): model = FrontPort + fieldsets = ( + (None, ('type', 'label', 'color', 'description', 'mark_connected')), + ) nullable_fields = ('label', 'description') @@ -1055,14 +1141,20 @@ class RearPortBulkEditForm( NetBoxModelBulkEditForm ): model = RearPort + fieldsets = ( + (None, ('type', 'label', 'color', 'description', 'mark_connected')), + ) nullable_fields = ('label', 'description') class ModuleBayBulkEditForm( - form_from_model(DeviceBay, ['label', 'description']), + form_from_model(ModuleBay, ['label', 'position', 'description']), NetBoxModelBulkEditForm ): model = ModuleBay + fieldsets = ( + (None, ('label', 'position', 'description')), + ) nullable_fields = ('label', 'position', 'description') @@ -1071,6 +1163,9 @@ class DeviceBayBulkEditForm( NetBoxModelBulkEditForm ): model = DeviceBay + fieldsets = ( + (None, ('label', 'description')), + ) nullable_fields = ('label', 'description') @@ -1088,6 +1183,9 @@ class InventoryItemBulkEditForm( ) model = InventoryItem + fieldsets = ( + (None, ('label', 'role', 'manufacturer', 'part_id', 'description')), + ) nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description') @@ -1105,4 +1203,7 @@ class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm): ) model = InventoryItemRole + fieldsets = ( + (None, ('color', 'description')), + ) nullable_fields = ('color', 'description') diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 3e7bc88a470..66b4ba0fc1f 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -46,6 +46,9 @@ class VRFBulkEditForm(NetBoxModelBulkEditForm): ) model = VRF + fieldsets = ( + (None, ('tenant', 'enforce_unique', 'description')), + ) nullable_fields = ('tenant', 'description') @@ -60,6 +63,9 @@ class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): ) model = RouteTarget + fieldsets = ( + (None, ('tenant', 'description')), + ) nullable_fields = ('tenant', 'description') @@ -74,6 +80,9 @@ class RIRBulkEditForm(NetBoxModelBulkEditForm): ) model = RIR + fieldsets = ( + (None, ('is_private', 'description')), + ) nullable_fields = ('is_private', 'description') @@ -97,6 +106,9 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): ) model = ASN + fieldsets = ( + (None, ('sites', 'rir', 'tenant', 'description')), + ) nullable_fields = ('date_added', 'description') @@ -119,6 +131,9 @@ class AggregateBulkEditForm(NetBoxModelBulkEditForm): ) model = Aggregate + fieldsets = ( + (None, ('rir', 'tenant', 'date_added', 'description')), + ) nullable_fields = ('date_added', 'description') @@ -132,6 +147,9 @@ class RoleBulkEditForm(NetBoxModelBulkEditForm): ) model = Role + fieldsets = ( + (None, ('weight', 'description')), + ) nullable_fields = ('description',) @@ -191,6 +209,11 @@ class PrefixBulkEditForm(NetBoxModelBulkEditForm): ) model = Prefix + fieldsets = ( + (None, ('tenant', 'status', 'role', 'description')), + ('Site', ('region', 'site_group', 'site')), + ('Addressing', ('vrf', 'prefix_length', 'is_pool', 'mark_utilized')), + ) nullable_fields = ( 'site', 'vrf', 'tenant', 'role', 'description', ) @@ -221,6 +244,9 @@ class IPRangeBulkEditForm(NetBoxModelBulkEditForm): ) model = IPRange + fieldsets = ( + (None, ('status', 'role', 'vrf', 'tenant', 'description')), + ) nullable_fields = ( 'vrf', 'tenant', 'role', 'description', ) @@ -262,6 +288,10 @@ class IPAddressBulkEditForm(NetBoxModelBulkEditForm): ) model = IPAddress + fieldsets = ( + (None, ('status', 'role', 'tenant', 'description')), + ('Addressing', ('vrf', 'mask_length', 'dns_name')), + ) nullable_fields = ( 'vrf', 'role', 'tenant', 'dns_name', 'description', ) @@ -295,6 +325,10 @@ class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): ) model = FHRPGroup + fieldsets = ( + (None, ('protocol', 'group_id', 'description')), + ('Authentication', ('auth_type', 'auth_key')), + ) nullable_fields = ('auth_type', 'auth_key', 'description') @@ -321,6 +355,9 @@ class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): ) model = VLANGroup + fieldsets = ( + (None, ('site', 'min_vid', 'max_vid', 'description')), + ) nullable_fields = ('site', 'description') @@ -367,6 +404,10 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): ) model = VLAN + fieldsets = ( + (None, ('status', 'role', 'tenant', 'description')), + ('Site & Group', ('region', 'site_group', 'site', 'group')), + ) nullable_fields = ( 'site', 'group', 'tenant', 'role', 'description', ) @@ -391,6 +432,9 @@ class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): ) model = ServiceTemplate + fieldsets = ( + (None, ('protocol', 'ports', 'description')), + ) nullable_fields = ('description',) diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index a685482567f..0666fbe580f 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -67,6 +67,8 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, forms.Form): fields and adding/removing tags. Attributes: + fieldsets: An iterable of two-tuples which define a heading and field set to display per section of + the rendered form (optional). If not defined, the all fields will be rendered as a single section. nullable_fields: A list of field names indicating which fields support being set to null/empty """ nullable_fields = () diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index a3e9b48c192..8a6d1e49fb6 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -578,9 +578,9 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): return redirect(self.get_return_url(request)) return render(request, self.template_name, { + 'model': model, 'form': form, 'table': table, - 'obj_type_plural': model._meta.verbose_name_plural, 'return_url': self.get_return_url(request), **self.get_extra_context(request), }) diff --git a/netbox/templates/generic/object_bulk_edit.html b/netbox/templates/generic/object_bulk_edit.html index 31bc07ac444..6d286f58ca7 100644 --- a/netbox/templates/generic/object_bulk_edit.html +++ b/netbox/templates/generic/object_bulk_edit.html @@ -3,7 +3,7 @@ {% load form_helpers %} {% load render_table from django_tables2 %} -{% block title %}Editing {{ table.rows|length }} {{ obj_type_plural|bettertitle }}{% endblock %} +{% block title %}Editing {{ table.rows|length }} {{ model|meta:"verbose_name_plural" }}{% endblock %} {% block tabs %}
    + + + + diff --git a/netbox/templates/virtualization/vminterface_edit.html b/netbox/templates/virtualization/vminterface_edit.html index de882557432..bc479e9d970 100644 --- a/netbox/templates/virtualization/vminterface_edit.html +++ b/netbox/templates/virtualization/vminterface_edit.html @@ -22,6 +22,7 @@ {% render_field form.name %} {% render_field form.description %} {% render_field form.mac_address %} + {% render_field form.vrf %} {% render_field form.mtu %} {% render_field form.tags %} {% render_field form.enabled %} diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 866b8f9bb9d..3d345106213 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -3,7 +3,7 @@ from rest_framework import serializers from dcim.api.nested_serializers import NestedDeviceRoleSerializer, NestedPlatformSerializer, NestedSiteSerializer from dcim.choices import InterfaceModeChoices -from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer +from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer, NestedVRFSerializer from ipam.models import VLAN from netbox.api import ChoiceField, SerializedPKRelatedField from netbox.api.serializers import PrimaryModelSerializer @@ -116,6 +116,7 @@ class VMInterfaceSerializer(PrimaryModelSerializer): required=False, many=True ) + vrf = NestedVRFSerializer(required=False, allow_null=True) count_ipaddresses = serializers.IntegerField(read_only=True) count_fhrp_groups = serializers.IntegerField(read_only=True) @@ -123,8 +124,8 @@ class VMInterfaceSerializer(PrimaryModelSerializer): model = VMInterface fields = [ 'id', 'url', 'display', 'virtual_machine', 'name', 'enabled', 'parent', 'bridge', 'mtu', 'mac_address', - 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags', 'custom_fields', 'created', 'last_updated', - 'count_ipaddresses', 'count_fhrp_groups', + 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', 'custom_fields', 'created', + 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', ] def validate(self, data): diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 894045c1a95..471589ba540 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -80,7 +80,8 @@ class VirtualMachineViewSet(ConfigContextQuerySetMixin, CustomFieldModelViewSet) class VMInterfaceViewSet(ModelViewSet): queryset = VMInterface.objects.prefetch_related( - 'virtual_machine', 'parent', 'tags', 'untagged_vlan', 'tagged_vlans', 'ip_addresses', 'fhrp_group_assignments', + 'virtual_machine', 'parent', 'tags', 'untagged_vlan', 'tagged_vlans', 'vrf', 'ip_addresses', + 'fhrp_group_assignments', ) serializer_class = serializers.VMInterfaceSerializer filterset_class = filtersets.VMInterfaceFilterSet diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index 28b23e8a80e..6eae56c1306 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -3,6 +3,7 @@ from django.db.models import Q from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup from extras.filtersets import LocalConfigContextFilterSet +from ipam.models import VRF from netbox.filtersets import OrganizationalModelFilterSet, NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter @@ -273,6 +274,17 @@ class VMInterfaceFilterSet(NetBoxModelFilterSet): mac_address = MultiValueMACAddressFilter( label='MAC address', ) + vrf_id = django_filters.ModelMultipleChoiceFilter( + field_name='vrf', + queryset=VRF.objects.all(), + label='VRF', + ) + vrf = django_filters.ModelMultipleChoiceFilter( + field_name='vrf__rd', + queryset=VRF.objects.all(), + to_field_name='rd', + label='VRF (RD)', + ) class Meta: model = VMInterface diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 6bd2f2d4ef3..d5d33df2aef 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -3,7 +3,7 @@ from django import forms from dcim.choices import InterfaceModeChoices from dcim.constants import INTERFACE_MTU_MAX, INTERFACE_MTU_MIN from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup -from ipam.models import VLAN +from ipam.models import VLAN, VRF from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant from utilities.forms import ( @@ -190,15 +190,20 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): queryset=VLAN.objects.all(), required=False ) + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) model = VMInterface fieldsets = ( - (None, ('mtu', 'enabled', 'description')), + (None, ('mtu', 'enabled', 'vrf', 'description')), ('Related Interfaces', ('parent', 'bridge')), ('802.1Q Switching', ('mode', 'untagged_vlan', 'tagged_vlans')), ) nullable_fields = ( - 'parent', 'bridge', 'mtu', 'description', + 'parent', 'bridge', 'mtu', 'vrf', 'description', ) def __init__(self, *args, **kwargs): diff --git a/netbox/virtualization/forms/bulk_import.py b/netbox/virtualization/forms/bulk_import.py index cefc2219dd7..aa1b203e398 100644 --- a/netbox/virtualization/forms/bulk_import.py +++ b/netbox/virtualization/forms/bulk_import.py @@ -1,5 +1,6 @@ from dcim.choices import InterfaceModeChoices from dcim.models import DeviceRole, Platform, Site +from ipam.models import VRF from netbox.forms import NetBoxModelCSVForm from tenancy.models import Tenant from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField @@ -121,11 +122,18 @@ class VMInterfaceCSVForm(NetBoxModelCSVForm): required=False, help_text='IEEE 802.1Q operational mode (for L2 interfaces)' ) + vrf = CSVModelChoiceField( + queryset=VRF.objects.all(), + required=False, + to_field_name='rd', + help_text='Assigned VRF' + ) class Meta: model = VMInterface fields = ( 'virtual_machine', 'name', 'parent', 'bridge', 'enabled', 'mac_address', 'mtu', 'description', 'mode', + 'vrf', ) def clean_enabled(self): diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 8e3dcd14305..7702a23ae5c 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -3,6 +3,7 @@ from django.utils.translation import gettext as _ from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup from extras.forms import LocalConfigContextFilterForm +from ipam.models import VRF from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm from utilities.forms import ( @@ -157,7 +158,7 @@ class VMInterfaceFilterForm(NetBoxModelFilterSetForm): fieldsets = ( (None, ('q', 'tag')), ('Virtual Machine', ('cluster_id', 'virtual_machine_id')), - ('Attributes', ('enabled', 'mac_address')), + ('Attributes', ('enabled', 'mac_address', 'vrf_id')), ) cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), @@ -182,4 +183,9 @@ class VMInterfaceFilterForm(NetBoxModelFilterSetForm): required=False, label='MAC address' ) + vrf_id = DynamicModelMultipleChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) tag = TagFilterField(model) diff --git a/netbox/virtualization/forms/models.py b/netbox/virtualization/forms/models.py index ecd909ec21a..e488ac23a01 100644 --- a/netbox/virtualization/forms/models.py +++ b/netbox/virtualization/forms/models.py @@ -6,7 +6,7 @@ from dcim.forms.common import InterfaceCommonForm from dcim.forms.models import INTERFACE_MODE_HELP_TEXT from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup from extras.models import Tag -from ipam.models import IPAddress, VLAN, VLANGroup +from ipam.models import IPAddress, VLAN, VLANGroup, VRF from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.forms import ( @@ -313,6 +313,11 @@ class VMInterfaceForm(InterfaceCommonForm, NetBoxModelForm): 'available_on_virtualmachine': '$virtual_machine', } ) + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False @@ -322,7 +327,7 @@ class VMInterfaceForm(InterfaceCommonForm, NetBoxModelForm): model = VMInterface fields = [ 'virtual_machine', 'name', 'parent', 'bridge', 'enabled', 'mac_address', 'mtu', 'description', 'mode', - 'tags', 'untagged_vlan', 'tagged_vlans', + 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', ] widgets = { 'virtual_machine': forms.HiddenInput(), diff --git a/netbox/virtualization/migrations/0028_vminterface_vrf.py b/netbox/virtualization/migrations/0028_vminterface_vrf.py new file mode 100644 index 00000000000..a188e1c609b --- /dev/null +++ b/netbox/virtualization/migrations/0028_vminterface_vrf.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-02-07 14:39 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0056_standardize_id_fields'), + ('virtualization', '0027_standardize_id_fields'), + ] + + operations = [ + migrations.AddField( + model_name='vminterface', + name='vrf', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='vminterfaces', to='ipam.vrf'), + ), + ] diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index dda1d0bee04..42d333d550e 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -384,6 +384,14 @@ class VMInterface(NetBoxModel, BaseInterface): object_id_field='assigned_object_id', related_query_name='vminterface' ) + vrf = models.ForeignKey( + to='ipam.VRF', + on_delete=models.SET_NULL, + related_name='vminterfaces', + null=True, + blank=True, + verbose_name='VRF' + ) fhrp_group_assignments = GenericRelation( to='ipam.FHRPGroupAssignment', content_type_field='interface_type', diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index e1156627ae0..4dc6bb9177f 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -168,6 +168,9 @@ class VMInterfaceTable(BaseInterfaceTable): name = tables.Column( linkify=True ) + vrf = tables.Column( + linkify=True + ) tags = columns.TagColumn( url_name='virtualization:vminterface_list' ) @@ -176,7 +179,7 @@ class VMInterfaceTable(BaseInterfaceTable): model = VMInterface fields = ( 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'created', 'last_updated', + 'vrf', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description') diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index 4a9b67bf064..f6c07fa549d 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -2,7 +2,7 @@ from django.urls import reverse from rest_framework import status from dcim.choices import InterfaceModeChoices -from ipam.models import VLAN +from ipam.models import VLAN, VRF from utilities.testing import APITestCase, APIViewTestCases from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -234,6 +234,13 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): ) VLAN.objects.bulk_create(vlans) + vrfs = ( + VRF(name='VRF 1'), + VRF(name='VRF 2'), + VRF(name='VRF 3'), + ) + VRF.objects.bulk_create(vrfs) + cls.create_data = [ { 'virtual_machine': virtualmachine.pk, @@ -241,6 +248,7 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): 'mode': InterfaceModeChoices.MODE_TAGGED, 'tagged_vlans': [vlans[0].pk, vlans[1].pk], 'untagged_vlan': vlans[2].pk, + 'vrf': vrfs[0].pk, }, { 'virtual_machine': virtualmachine.pk, @@ -249,6 +257,7 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): 'bridge': interfaces[0].pk, 'tagged_vlans': [vlans[0].pk, vlans[1].pk], 'untagged_vlan': vlans[2].pk, + 'vrf': vrfs[1].pk, }, { 'virtual_machine': virtualmachine.pk, @@ -257,5 +266,6 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): 'parent': interfaces[1].pk, 'tagged_vlans': [vlans[0].pk, vlans[1].pk], 'untagged_vlan': vlans[2].pk, + 'vrf': vrfs[2].pk, }, ] diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index 8c8f6671f58..bcd2c469968 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -1,7 +1,7 @@ from django.test import TestCase from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup -from ipam.models import IPAddress +from ipam.models import IPAddress, VRF from tenancy.models import Tenant, TenantGroup from utilities.testing import ChangeLoggedFilterSetTests from virtualization.choices import * @@ -414,6 +414,13 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): ) Cluster.objects.bulk_create(clusters) + vrfs = ( + VRF(name='VRF 1', rd='65000:1'), + VRF(name='VRF 2', rd='65000:2'), + VRF(name='VRF 3', rd='65000:3'), + ) + VRF.objects.bulk_create(vrfs) + vms = ( VirtualMachine(name='Virtual Machine 1', cluster=clusters[0]), VirtualMachine(name='Virtual Machine 2', cluster=clusters[1]), @@ -422,9 +429,9 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): VirtualMachine.objects.bulk_create(vms) interfaces = ( - VMInterface(virtual_machine=vms[0], name='Interface 1', enabled=True, mtu=100, mac_address='00-00-00-00-00-01'), - VMInterface(virtual_machine=vms[1], name='Interface 2', enabled=True, mtu=200, mac_address='00-00-00-00-00-02'), - VMInterface(virtual_machine=vms[2], name='Interface 3', enabled=False, mtu=300, mac_address='00-00-00-00-00-03'), + VMInterface(virtual_machine=vms[0], name='Interface 1', enabled=True, mtu=100, mac_address='00-00-00-00-00-01', vrf=vrfs[0]), + VMInterface(virtual_machine=vms[1], name='Interface 2', enabled=True, mtu=200, mac_address='00-00-00-00-00-02', vrf=vrfs[1]), + VMInterface(virtual_machine=vms[2], name='Interface 3', enabled=False, mtu=300, mac_address='00-00-00-00-00-03', vrf=vrfs[2]), ) VMInterface.objects.bulk_create(interfaces) @@ -478,3 +485,10 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): 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) + + def test_vrf(self): + vrfs = VRF.objects.all()[:2] + params = {'vrf_id': [vrfs[0].pk, vrfs[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'vrf': [vrfs[0].rd, vrfs[1].rd]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index 7dc5660fd49..8edc14f00df 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -4,7 +4,7 @@ from netaddr import EUI from dcim.choices import InterfaceModeChoices from dcim.models import DeviceRole, Platform, Site -from ipam.models import VLAN +from ipam.models import VLAN, VRF from utilities.testing import ViewTestCases, create_tags from virtualization.choices import * from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -263,6 +263,13 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): ) VLAN.objects.bulk_create(vlans) + vrfs = ( + VRF(name='VRF 1'), + VRF(name='VRF 2'), + VRF(name='VRF 3'), + ) + VRF.objects.bulk_create(vrfs) + tags = create_tags('Alpha', 'Bravo', 'Charlie') cls.form_data = { @@ -276,6 +283,7 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'mode': InterfaceModeChoices.MODE_TAGGED, 'untagged_vlan': vlans[0].pk, 'tagged_vlans': [v.pk for v in vlans[1:4]], + 'vrf': vrfs[0].pk, 'tags': [t.pk for t in tags], } @@ -290,14 +298,15 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'mode': InterfaceModeChoices.MODE_TAGGED, 'untagged_vlan': vlans[0].pk, 'tagged_vlans': [v.pk for v in vlans[1:4]], + 'vrf': vrfs[0].pk, 'tags': [t.pk for t in tags], } cls.csv_data = ( - "virtual_machine,name", - "Virtual Machine 2,Interface 4", - "Virtual Machine 2,Interface 5", - "Virtual Machine 2,Interface 6", + f"virtual_machine,name,vrf.pk", + f"Virtual Machine 2,Interface 4,{vrfs[0].pk}", + f"Virtual Machine 2,Interface 5,{vrfs[0].pk}", + f"Virtual Machine 2,Interface 6,{vrfs[0].pk}", ) cls.bulk_edit_data = { From 2157f93f364affcc2367f2e10c17950be25bc5a5 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 7 Feb 2022 10:47:07 -0500 Subject: [PATCH 153/271] Clean up merge conflict remnants --- docs/release-notes/version-3.1.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 7536ebeb4bb..27aaa4b4c45 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -1,8 +1,5 @@ # NetBox v3.1 -<<<<<<< HEAD -## v3.1.7 (FUTURE) -======= ## v3.1.7 (2022-02-03) ### Enhancements @@ -29,7 +26,6 @@ * [#8499](https://github.com/netbox-community/netbox/issues/8499) - Content types REST API endpoint should not require model permission * [#8512](https://github.com/netbox-community/netbox/issues/8512) - Correct file permissions to allow execution of housekeeping script * [#8527](https://github.com/netbox-community/netbox/issues/8527) - Fix display of changelog retention period ->>>>>>> develop --- From 9ac769e4f851356cdcd4991542d40cba47339bf7 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 7 Feb 2022 11:32:02 -0500 Subject: [PATCH 154/271] Pull graphene-django from v2 branch --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 26a0151e014..1239ed20585 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,7 +15,7 @@ djangorestframework==3.12.4 drf-yasg[validation]==1.20.0 #graphene_django==2.15.0 # Installing from PR origin temporarily -git+git://github.com/MisterGlass/graphene-django.git +git+git://github.com/graphql-python/graphene-django.git@v2 gunicorn==20.1.0 Jinja2==3.0.3 Markdown==3.3.6 From 049acde5b0082aa94b7c81d236bd85adcb14f580 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 7 Feb 2022 12:57:02 -0500 Subject: [PATCH 155/271] Closes #8572: Add a pre_run() method for reports --- docs/customization/reports.md | 2 +- docs/release-notes/version-3.2.md | 1 + netbox/extras/reports.py | 13 +++++++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/customization/reports.md b/docs/customization/reports.md index ed4faf371de..3bf6bd8d919 100644 --- a/docs/customization/reports.md +++ b/docs/customization/reports.md @@ -95,7 +95,7 @@ The following methods are available to log results within a report: The recording of one or more failure messages will automatically flag a report as failed. It is advised to log a success for each object that is evaluated so that the results will reflect how many objects are being reported on. (The inclusion of a log message is optional for successes.) Messages recorded with `log()` will appear in a report's results but are not associated with a particular object or status. Log messages also support using markdown syntax and will be rendered on the report result page. -To perform additional tasks, such as sending an email or calling a webhook, after a report has been run, extend the `post_run()` method. The status of the report is available as `self.failed` and the results object is `self.result`. +To perform additional tasks, such as sending an email or calling a webhook, before or after a report is run, extend the `pre_run()` and/or `post_run()` methods, respectively. The status of a completed report is available as `self.failed` and the results object is `self.result`. By default, reports within a module are ordered alphabetically in the reports list page. To return reports in a specific order, you can define the `report_order` variable at the end of your module. The `report_order` variable is a tuple which contains each Report class in the desired order. Any reports that are omitted from this list will be listed last. diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index f60f6b81e76..9b9fd61b5ea 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -84,6 +84,7 @@ A new REST API endpoint has been added at `/api/ipam/vlan-groups//available- * [#8295](https://github.com/netbox-community/netbox/issues/8295) - Webhook URLs can now be templatized * [#8296](https://github.com/netbox-community/netbox/issues/8296) - Allow disabling custom links * [#8307](https://github.com/netbox-community/netbox/issues/8307) - Add `data_type` indicator to REST API serializer for custom fields +* [#8572](https://github.com/netbox-community/netbox/issues/8572) - Add a `pre_run()` method for reports ### Other Changes diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index f53c0ecd047..2eb6584c9ae 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -226,6 +226,9 @@ class Report(object): job_result.status = JobResultStatusChoices.STATUS_RUNNING job_result.save() + # Perform any post-run tasks + self.pre_run() + try: for method_name in self.test_methods: @@ -253,8 +256,14 @@ class Report(object): # Perform any post-run tasks self.post_run() - def post_run(self): + def pre_run(self): """ - Extend this method to include any tasks which should execute after the report has been run. + Extend this method to include any tasks which should execute *before* the report is run. + """ + pass + + def post_run(self): + """ + Extend this method to include any tasks which should execute *after* the report is run. """ pass From d816f797a415e2e652b3f311650771b43bedf4af Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 7 Feb 2022 14:31:49 -0500 Subject: [PATCH 156/271] Clean up release notes --- docs/release-notes/version-3.2.md | 101 ++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 27 deletions(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index 9b9fd61b5ea..8fc733e04ae 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -8,80 +8,126 @@ ### Breaking Changes * Automatic redirection of legacy slug-based URL paths has been removed. -* The `asn` field has been removed from the site model. Please use the ASN model introduced in NetBox v3.1 to track ASN assignments for sites. -* The `asn` query filter for sites now matches against the AS number of assigned ASNs. -* The `contact_name`, `contact_phone`, and `contact_email` fields have been removed from the site model. Please use the new contact model introduced in NetBox v3.1 to store contact information for sites. +* The `asn` field has been removed from the site model. Please replicate any site ASN assignments to the ASN model introduced in NetBox v3.1 prior to upgrading. +* The `asn` query filter for sites now matches against the AS number of assigned ASN objects. +* The `contact_name`, `contact_phone`, and `contact_email` fields have been removed from the site model. Please replicate any data remaining in these fields to the contact model introduced in NetBox v3.1 prior to upgrading. +* A `pre_run()` method has been added to the base Report class. While unlikely to affect most installations, you may need to alter any reports which already use this name for a method. ### New Features #### Plugins Framework Extensions ([#8333](https://github.com/netbox-community/netbox/issues/8333)) -NetBox's plugins framework has been extended considerably in this release. Changes include: +NetBox's plugins framework has been extended considerably in this release. Additions include: -* Seven generic view classes are now officially supported for use by plugins. -* `NetBoxModel` is available for subclassing to enable various NetBox features, such as custom fields and change logging. -* `NetBoxModelFilterSet` is available to extend NetBox's dynamic filtering ability to plugin models. +* Officially-supported generic view classes for common CRUD operations: + * `ObjectView` + * `ObjectEditView` + * `ObjectDeleteView` + * `ObjectListView` + * `BulkImportView` + * `BulkEditView` + * `BulkDeleteView` +* The `NetBoxModel` base class, which enables various NetBox features, including: + * Change logging + * Custom fields + * Custom links + * Custom validation + * Export templates + * Journaling + * Tags + * Webhooks +* Four base form classes for manipulating objects via the UI: + * `NetBoxModelForm` + * `NetBoxModelCSVForm` + * `NetBoxModelBulkEditForm` + * `NetBoxModelFilterSetForm` +* The `NetBoxModelFilterSet` base class for plugin filter sets +* The `NetBoxTable` base class for rendering object tables with `django-tables2` +* Plugins can now extend NetBox's GraphQL API with their own schema No breaking changes to previously supported components have been introduced in this release. However, plugin authors are encouraged to audit their code for misuse of unsupported components, as much of NetBox's internal code base has been reorganized. #### Modules & Module Types ([#7844](https://github.com/netbox-community/netbox/issues/7844)) -Several new models have been added to support field-replaceable device modules, such as those within a chassis-based switch or router. Similar to devices, each module is instantiated from a user-defined module type, and can have components associated with it. These components become available to the parent device once the module has been installed within a module bay. This makes it very convenient to replicate the addition and deletion of device components as modules are installed and removed. +Several new models have been added to represent field-replaceable device modules, such as line cards installed within a chassis-based switch or router. Similar to devices, each module is instantiated from a user-defined module type, and can have components (interfaces, console ports, etc.) associated with it. These components become available to the parent device once the module has been installed within a module bay. This makes it very convenient to replicate the addition and deletion of device components as modules are installed and removed. Automatic renaming of module components is also supported. When a new module is created, any occurrence of the string `{module}` in a component name will be replaced with the position of the module bay into which the module is being installed. #### Custom Object Fields ([#7006](https://github.com/netbox-community/netbox/issues/7006)) -Two new types of custom field have been added: object and multi-object. These can be used to associate objects with other objects in NetBox. For example, you might create a custom field named `primary_site` on the tenant model so that a particular site can be associated with each tenant as its primary. The multi-object custom field type allows for the assignment of one or more objects of the same type. +Two new types of custom field have been introduced: object and multi-object. These can be used to associate an object in NetBox with some other arbitrary object(s) regardless of its type. For example, you might create a custom field named `primary_site` on the tenant model so that a particular site can be associated with each tenant as its primary. The multi-object custom field type allows for the assignment of one or more objects of the same type. -Custom field object assignment is fully supported in the REST API, and functions similarly to normal foreign key relations. Nested representations are provided for each custom field object. +Custom field object assignment is fully supported in the REST API, and functions similarly to built-in foreign key relations. Nested representations are provided automatically for each custom field object. #### Custom Status Choices ([#8054](https://github.com/netbox-community/netbox/issues/8054)) -Custom choices can be now added to most status fields in NetBox. This is done by defining the `FIELD_CHOICES` configuration parameter to map field identifiers to an iterable of custom choices. These choices are populated automatically when NetBox initializes. For example, the following will add three custom choices for the site status field: +Custom choices can be now added to most status fields in NetBox. This is done by defining the `FIELD_CHOICES` configuration parameter to map field identifiers to an iterable of custom choices an (optionally) colors. These choices are populated automatically when NetBox initializes. For example, the following will add three custom choices for the site status field, each with a designated color: ```python FIELD_CHOICES = { 'dcim.Site.status': ( - ('foo', 'Foo'), - ('bar', 'Bar'), - ('baz', 'Baz'), + ('foo', 'Foo', 'red'), + ('bar', 'Bar', 'green'), + ('baz', 'Baz', 'blue'), ) } ``` +This will replace all default choices for this field with those listed. If instead the intent is to _extend_ the current choices, this can be done by adding a plus sign (`+`) to the end of the field identifier. For example, the following will add a single extra choice while retaining the defaults provided by NetBox: + +```python +FIELD_CHOICES = { + 'dcim.Site.status+': ( + ('fubar', 'FUBAR', 'red'), + ) +} +``` + +#### Improved User Preferences ([#7759](https://github.com/netbox-community/netbox/issues/7759)) + +A robust new mechanism for managing user preferences is included in this release. The user preferences form has been improved for better usability, and administrators can now define default preferences for all users with the [`DEFAULT_USER_PREFERENCES`](../configuration/dynamic-settings.md##default_user_preferences) configuration parameter. For example, this can be used to define the columns which appear by default in a table: + +```python +DEFAULT_USER_PREFERENCES = { + 'tables': { + 'IPAddressTable': { + 'columns': ['address', 'status', 'created', 'description'] + } + } +} +``` + #### Inventory Item Roles ([#3087](https://github.com/netbox-community/netbox/issues/3087)) -A new model has been introduced to represent function roles for inventory items, similar to device roles. The assignment of roles to inventory items is optional. +A new model has been introduced to represent functional roles for inventory items, similar to device roles. The assignment of roles to inventory items is optional. #### Inventory Item Templates ([#8118](https://github.com/netbox-community/netbox/issues/8118)) -Inventory items can now be templatized on a device type similar to the other component types. This enables users to better pre-model fixed hardware components. +Inventory items can now be templatized on a device type similar to other components (such as interfaces or console ports). This enables users to better pre-model fixed hardware components. -Inventory item templates can be arranged hierarchically within a device type, and may be assigned to other components. These relationships will be mirrored when instantiating inventory items on a newly-created device. +Inventory item templates can be arranged hierarchically within a device type, and may be assigned to other templated components. These relationships will be mirrored when instantiating inventory items on a newly-created device. For example, if defining an optic assigned to an interface template on a device type, the instantiated device will mimic this relationship between the optic and interface. #### Service Templates ([#1591](https://github.com/netbox-community/netbox/issues/1591)) -A new service template model has been introduced to assist in standardizing the definition and application of layer four services to devices and virtual machines. As an alternative to manually defining a name, protocol, and port(s) each time a service is created, a user now has the option of selecting a pre-defined template from which these values will be populated. +A new service template model has been introduced to assist in standardizing the definition and association of layer four services with devices and virtual machines. As an alternative to manually defining a name, protocol, and port(s) each time a service is created, a user now has the option of selecting a pre-defined template from which these values will be populated. #### Automatic Provisioning of Next Available VLANs ([#2658](https://github.com/netbox-community/netbox/issues/2658)) -A new REST API endpoint has been added at `/api/ipam/vlan-groups//available-vlans/`. A GET request to this endpoint will return a list of available VLANs within the group. A POST request can be made to this endpoint specifying the name(s) of one or more VLANs to create within the group, and their VLAN IDs will be assigned automatically. +A new REST API endpoint has been added at `/api/ipam/vlan-groups//available-vlans/`. A GET request to this endpoint will return a list of available VLANs within the group. A POST request can be made specifying the name(s) of one or more VLANs to create within the group, and their VLAN IDs will be assigned automatically from the available pool. ### Enhancements -* [#5429](https://github.com/netbox-community/netbox/issues/5429) - Enable toggling the placement of table paginators +* [#5429](https://github.com/netbox-community/netbox/issues/5429) - Enable toggling the placement of table pagination controls * [#6954](https://github.com/netbox-community/netbox/issues/6954) - Remember users' table ordering preferences * [#7650](https://github.com/netbox-community/netbox/issues/7650) - Add support for local account password validation * [#7679](https://github.com/netbox-community/netbox/issues/7679) - Add actions menu to all object tables * [#7681](https://github.com/netbox-community/netbox/issues/7681) - Add `service_id` field for provider networks -* [#7759](https://github.com/netbox-community/netbox/issues/7759) - Improved the user preferences form * [#7784](https://github.com/netbox-community/netbox/issues/7784) - Support cluster type assignment for config contexts * [#7846](https://github.com/netbox-community/netbox/issues/7846) - Enable associating inventory items with device components -* [#7852](https://github.com/netbox-community/netbox/issues/7852) - Enable assigning interfaces to VRFs -* [#7853](https://github.com/netbox-community/netbox/issues/7853) - Add `speed` and `duplex` fields to interface model +* [#7852](https://github.com/netbox-community/netbox/issues/7852) - Enable the assignment of interfaces to VRFs +* [#7853](https://github.com/netbox-community/netbox/issues/7853) - Add `speed` and `duplex` fields to device interface model * [#8168](https://github.com/netbox-community/netbox/issues/8168) - Add `min_vid` and `max_vid` fields to VLAN group -* [#8295](https://github.com/netbox-community/netbox/issues/8295) - Webhook URLs can now be templatized +* [#8295](https://github.com/netbox-community/netbox/issues/8295) - Jinja2 rendering is now supported for webhook URLs * [#8296](https://github.com/netbox-community/netbox/issues/8296) - Allow disabling custom links * [#8307](https://github.com/netbox-community/netbox/issues/8307) - Add `data_type` indicator to REST API serializer for custom fields * [#8572](https://github.com/netbox-community/netbox/issues/8572) - Add a `pre_run()` method for reports @@ -104,7 +150,8 @@ A new REST API endpoint has been added at `/api/ipam/vlan-groups//available- * `/api/dcim/module-bays/` * `/api/dcim/module-bay-templates/` * `/api/dcim/module-types/` - * `/api/extras/service-templates/` + * `/api/ipam/service-templates/` + * `/api/ipam/vlan-groups//available-vlans/` * circuits.ProviderNetwork * Added `service_id` field * dcim.ConsolePort @@ -117,7 +164,7 @@ A new REST API endpoint has been added at `/api/ipam/vlan-groups//available- * Added `module`, `speed`, `duplex`, and `vrf` fields * dcim.InventoryItem * Added `component_type`, `component_id`, and `role` fields - * Added read-only `component` field + * Added read-only `component` field (GFK) * dcim.PowerPort * Added `module` field * dcim.PowerOutlet @@ -129,7 +176,7 @@ A new REST API endpoint has been added at `/api/ipam/vlan-groups//available- * extras.ConfigContext * Add `cluster_types` field * extras.CustomField - * Added `object_type` field + * Added `data_type` and `object_type` fields * extras.CustomLink * Added `enabled` field * ipam.VLANGroup From 26db326483c7c3c084a1f4f02a07884a86e9a9e9 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 7 Feb 2022 15:09:09 -0500 Subject: [PATCH 157/271] Fix field group header --- netbox/templates/generic/object_bulk_edit.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/templates/generic/object_bulk_edit.html b/netbox/templates/generic/object_bulk_edit.html index 6d286f58ca7..b955a516248 100644 --- a/netbox/templates/generic/object_bulk_edit.html +++ b/netbox/templates/generic/object_bulk_edit.html @@ -48,7 +48,7 @@
    - {% if group %}{{ group }}{% else %}{{ model|meta:"verbose_name" }}{% endif %} + {% if group %}{{ group }}{% else %}{{ model|meta:"verbose_name"|bettertitle }}{% endif %}
    {% for name in fields %} From 624eda297f1e240061b02997ddec2b19ef99f1cf Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 7 Feb 2022 16:50:17 -0500 Subject: [PATCH 158/271] Clean up and document object, object list templates --- netbox/dcim/views.py | 7 +-- netbox/netbox/views/generic/bulk_views.py | 4 +- netbox/templates/dcim/device/base.html | 8 +--- netbox/templates/dcim/devicetype/base.html | 8 +--- netbox/templates/dcim/moduletype.html | 2 - netbox/templates/dcim/moduletype/base.html | 8 +--- netbox/templates/generic/object.html | 28 ++++++++++-- netbox/templates/generic/object_list.html | 53 ++++++++++++++-------- netbox/templates/ipam/aggregate/base.html | 7 +-- netbox/templates/ipam/iprange/base.html | 7 +-- netbox/templates/ipam/prefix/base.html | 7 +-- 11 files changed, 67 insertions(+), 72 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index c70f3307491..1df1eb1acc3 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -803,7 +803,6 @@ class DeviceTypeView(generic.ObjectView): return { 'instance_count': instance_count, - 'active_tab': 'devicetype', } @@ -953,11 +952,10 @@ class ModuleTypeView(generic.ObjectView): queryset = ModuleType.objects.prefetch_related('manufacturer') def get_extra_context(self, request, instance): - # instance_count = Module.objects.restrict(request.user).filter(device_type=instance).count() + instance_count = Module.objects.restrict(request.user).filter(module_type=instance).count() return { - # 'instance_count': instance_count, - 'active_tab': 'moduletype', + 'instance_count': instance_count, } @@ -1570,7 +1568,6 @@ class DeviceView(generic.ObjectView): return { 'services': services, 'vc_members': vc_members, - 'active_tab': 'device', } diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 8a6d1e49fb6..69ab4219983 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -7,7 +7,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldDoesNotExist, ValidationError from django.db import transaction, IntegrityError from django.db.models import ManyToManyField, ProtectedError -from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput, Textarea +from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django_tables2.export import TableExport @@ -178,7 +178,7 @@ class ObjectListView(BaseMultiObjectView): }) context = { - 'content_type': content_type, + 'model': model, 'table': table, 'permissions': permissions, 'action_buttons': self.action_buttons, diff --git a/netbox/templates/dcim/device/base.html b/netbox/templates/dcim/device/base.html index 4d24717cd66..ff139ee4aa0 100644 --- a/netbox/templates/dcim/device/base.html +++ b/netbox/templates/dcim/device/base.html @@ -95,13 +95,7 @@ {% endif %} {% endblock %} -{% block tab_items %} - - +{% block extra_tabs %} {% with tab_name='device-bays' devicebay_count=object.devicebays.count %} {% if active_tab == tab_name or devicebay_count %} - +{% block extra_tabs %} {% with tab_name='device-bay-templates' devicebay_count=object.devicebaytemplates.count %} {% if active_tab == tab_name or devicebay_count %}
    - {% comment %} - {% endcomment %}
    AS Number{{ object.asn }}{{ object.asn_with_asdot }}
    RIR
    VRF + {% if object.vrf %} + {{ object.vrf }} + {% else %} + None + {% endif %} +
    Description {{ object.description|placeholder }} Part Number {{ object.part_number|placeholder }}
    Instances {{ instance_count }}
    diff --git a/netbox/templates/dcim/moduletype/base.html b/netbox/templates/dcim/moduletype/base.html index 70a447499b0..f5713efc373 100644 --- a/netbox/templates/dcim/moduletype/base.html +++ b/netbox/templates/dcim/moduletype/base.html @@ -43,13 +43,7 @@ {% endif %} {% endblock %} -{% block tab_items %} - - +{% block extra_tabs %} {% with interface_count=object.interfacetemplates.count %} {% if interface_count %}
  • elements) + object_identifier: Unique identifier for the object + extra_controls: Additional action buttons to display + extra_tabs: Additional tabs to include + content: Page content + +Context: + object: The object instance being viewed +{% endcomment %} + {% block header %}
    {# Breadcrumbs #} @@ -66,11 +78,15 @@ {% block tabs %}